RHEL之(八)Red Hat Linux Shell编程基础 IV :脚本任务控制(上)
七、脚本任务控制
1:Bash特殊变量
(1)预定义变量:位置参数
预定义变量0:脚本自身名称(文件名) $0
预定义变量1:脚本的第一个参数 $1
预定义变量2:脚本的第二个参数 $2
……
预定义变量10:脚本的第十个参数 ${10} //花括号
Tips:不是$10或者$(10)
例:使用$0参数来获取命令行启动的脚本名:
使用basename命令返回不带路径的文件名:
参数如果含有空格的字符串,请用引号括起来(单引号或双引号均可):
(2)$*和$@
两者都是引用脚本内的所有参数,但是略有差别。
在使用$*的时候,所有参数将被视为一个单词;
而使用$@时,每个参数都被视为单独的单词。
(3)$#:表示传递给脚本的命令行参数数量,该值可用于验证是否任何参数或者正确的参数传递到脚本中。
Tips:在这两个脚本中,传递的参数数目都是4个,只是使用$*时,系统将他们当做一个单词,而使用$@时,系统将他们当做4个单词
(4)${ } 的简单用法
预定义变量:
我们可以用 ${ } 来分别替换获得不同的值:
${file#*/}:拿掉第一条 / 及其左边的字符串
${file##*/}:拿掉最后一条 / 及其左边的字符串
${file%%/*}:拿掉第一条 / 及其右边的字符串(空值)
${file%/*}:拿掉最后一条 / 及其右边的字符串
Tips:简单记忆法
#是去掉左边(在键盘上#在$的左边)
%是去掉右边(在键盘上%在$的右边)
单一符号是最小匹配,两个符号是最大匹配。 (#是从左往右,%是从右往左)
变量值的字符串替换:
${file/s/S}:将第一个s替换成S
${file//s/S}:将全部s替换成S
2:评估退出代码(返回状态码)
(1)定义
每个命令执行后都会返回一个退出状态,通常也被称为返回状态码或者退出代码(return code或者exit code)。如果命令执行成功,则退出时的退出代码为0;如果命令执行不成功,则退出时的退出代码不为0,命令的退出代码将传递到父进程并存储在 $? 变量中,所以,已执行命令的退出代码可以通过显示 $? 的值来检索。
(2)范围
退出代码是一个0-255之间的整数值,在命令结束运行的时候由命令传递给Shell,对于需要进行检索的命令,必须在其运行完毕之后立刻查看或者使用 $? 变量,因为它的值会变成由shell所执行的最后一条命令的退出代码。
(3)Linux退出代码(返回状态码)
Return Code 含义
0 命令成功执行
1 一般性未知错误
2 不适合的Shell命令
126 命令不可执行
127 未找到命令
128 无效的退出参数
128+x Linux信号严重错误
130 通过Ctrl+C中断退出的
255 正常范围以外的退出状态码
例如:
(4)exit命令
在脚本中使用退出代码exit,脚本将在其处理所有内容后退出,有时候可能需要在中途退出脚本,比如在遇到错误条件的时候,可以通过在脚本中使用exit命令来实现这一目的。当脚本遇到exit命令时,脚本将立即退出并跳过对脚本其余内容的处理。我们也可以使用可选的0-255整数值来执行exit命令,exit命令允许我们在脚本结束时指定一个退出代码,如果不使用任何调用exit命令,那么脚本将退出并且将最后执行的命令的状态退出代码传递给父进程。
3:测试脚本输入
我们可以使用Bash的测试命令语法 [ <testexpression> ] 来尝试执行完整性检查,与所有命令一样,测试命令也会在完成后生成一个退出代码,也是存储在 $? 。0代表测试成功,而非零值表示测试失败。
比较测试表达式使用二进制比较运算符,这些运算符预期2个对象,运算符每测一个,并对2个对象进行求值以获得等式或不等式,Bash使用另外一组运算符进行字符串和数字比较,使用以下语法:
[ <item1> <binary comparison operator> <item2> ]
(1)Bash的数字比较:仅限于整数比较
Tips:
gt (greater than)=大于
lt (less than)=小于
ge (greater equal)=大于等于
le (less equal)=小于等于
eq (equal)=等于
ne (not equal)=不等于
(2)Bash的字符串比较
当开始比较字符串大小时,必须注意以下问题:
A. 大于号和小于号必须转义,否则shell会把他们当做重定向符号,把字符串值当做文件名
\>:大于
\<:小于
B.大于和小于顺序和sort命令所采用不同
在比较测试中,大写字母被认为是小于小写字母的(因为小写字母的ASCII顺序在大写字母之后)
sort恰恰相反,当你将的字符串放进文件中并用sort命令排序时,小写字母先出现
这是因为比较测试中使用的是ASCII顺序,根据每个字符的ASCII数值来决定结果,sort命令使用的是系统本地化语言设置中定义的排序顺序。本地化设置指定了在排序顺序中小写字母出现在大写字母前。
C.Bash字符串求值(一元运算符)
4:测试文件和目录
5:复合逻辑运算符
Bash的逻辑AND运算符(即&&)允许用户执行复合条件测试以了解这2个条件是否均成立;
另一方面,逻辑OR运算符(即||)允许用户测试这2个条件的一个是否成立。
逻辑与的格式:
command1 && command2 [ && command3 ...]
command1 -a command2 [ -a command3 ...]
说明:
1:命令之间使用 && 连接,实现逻辑与的功能;
2:只有在 && 左边的命令返回真(命令返回值 $? == 0),&&右边的命令才会被执行;
3:只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。
逻辑或的格式:
command1 || command2 [ || command3 ...]
command1 -o command2 [ -o command3 ...]
说明:
1:命令之间使用 || 连接,实现逻辑或的功能。
2:只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。
3:只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。
文件与目录的比较例子