第10章 sh编程
0.结构与理解
sh代码在包含sh语句的文本文件中,通常以 #!开头,文件为.sh
创建并编写.sh文件后发现不是可执行程序,询问gpt如何执行:
学习得知,第一种添加权限的方法,chmod
是一个用于修改文件权限的命令,而 +x
是 chmod
命令的一个选项,表示为文件添加可执行权限。
第二种是用sh命令的方法,不需要./路径名,直接从当前文件夹运行。
在执行单行命令时,按以下步骤执行:
(1)参数替换
(2)命令替换
(3)通配符扩展
参数替换过程中,$x替换为它的值只执行一次,即不能再次替换任何产生的$符号;在命令替换中先执行一次计算;
于是有eval命令:相当于将$x替换到底,然后直接让sh执行生成的命令行。可以省去一些替换语句,但也有可能使代码变得难以理解。
1.参数与变量(只有字符串类型变量)
位置参数的定义在调用程序时申明,直接写在程序名后 $0~$9,${10}~${n}
任何符号都能作为sh变量,定义时直接A,调用时用$A。
2.sh命令
特殊字符:
$:
-
$@
:表示所有位置参数的列表。$#
:表示位置参数的数量。$?
:表示上一个命令的退出状态码。$$
:表示当前脚本的进程ID。$USER
:表示当前用户的用户名。$HOME
:表示当前用户的主目录路径。$PWD
:表示当前工作目录的路径。$S
执行sh进程的PID。
\ “” '':
通常\用于引用单个字符,''单引号用于引用长字符串,没有替换;“”双引号内会发生替换,保留空格。
指令:
sh语句包含了所有unix/linux命令
echo命令:将参数字符串作为行回显到stdout。它通常将相邻的多个空格压缩为一个空格,除非有引号。
expr命令:expr str1 op str2,具体解释如下
在书上的例子有I=$(expr $I + 1),疑惑为何要给expr的结果加$,询问gpt:
给 expr
命令的结果加上 $
是为了在Shell脚本中获取并引用 expr
命令的输出结果。在Shell中,$
符号用于引用变量的值。
当使用 expr
命令执行数学运算或其他操作时,它的结果将被打印到标准输出(stdout)。为了将这个结果存储到一个Shell变量中或在脚本中进一步使用,我们可以使用 $
符号来引用 expr
命令的输出
内置命令:
read命令:等待来自stdin的输入行,讲输入行划分为几个标记,分配给列出的变量。
命令替换:当sh遇到'cmd'或$(cmd)时,会先执行cmd,然后用执行的结果字符串替换$(cmd)。
sh函数:
由于sh逐行执行命令,所以必须在任何可执行语句之前定义sh脚本中的所有函数。
通配符:
*:可扩展到当前目录中的所有文件
?:查询某文件名中的字符
[ ]:查询文件名中包含[ ]中任意字符的
控制语句:
*在sh中,0为TRUE,而非0为FALSE
循环结构:有for语句、while语句和until-do语句。for语句在每次迭代中变量接受一个参数字符串值,并执行关键字do和done之间的命令。while也类似,在条件符合情况下执行do-done关键字中的命令。until-do语句类似于C语言中的do-until语句,不论如何会先执行一次do-done中的命令
苏格拉底挑战:
程序设计语言的必备要素和技能:
-
语法和语义:掌握语言的基本语法规则和关键字,理解语句的执行逻辑和含义。
-
数据类型和变量:熟悉数据类型的概念和不同类型的使用,了解变量的定义、赋值和使用方法。
-
控制流:理解和使用条件语句、循环语句和分支语句,以控制程序的执行流程。
-
函数和模块化:熟悉函数的定义和调用,理解模块化编程的概念和方法,以提高代码的可重用性和可维护性。
-
数据结构和算法:了解常见的数据结构(如数组、列表、字典等)和基本算法,能够选择和使用适当的数据结构和算法来解决问题。
-
错误处理和异常处理:学习如何处理错误和异常情况,以增强程序的健壮性和可靠性。
-
调试和问题解决能力:培养调试代码和解决问题的能力,能够找到和修复程序中的错误和异常情况。