1、脚本的定义
脚本不是复杂的程序,它是按行解释的。脚本第一行总是以 #!/bin/sh开始,这段脚本通知shell使用系统上的Bourne shell解释器。
脚本都可能有注释,加注释需要此行的第一个字符为#,解释器对此行不予解释。
脚本从上到下执行,运行脚本前需要增加其执行权限。确保正确建立脚本路径,这样只 用文件名就可以运行它了。
2、条件测试
Test命令用于测试字符串,文件状态和数字。
test一般两种格式,即:
test condition
或
[condition]
例:
test -w filename.txt 检测文件是否可写
[ -w filename.txt ] 检测文件是否可写
使用方括号时,要注意在条件两边加上空格
- d 目录
- s 文件长度大于0、非空
- f 正规文件
- w 可写
- L 符号连接
- u 文件有suid位设置
- r 可读
- x 可执行
使用两种方法测试文件是否可写并用最后退出状态测试是否成功(echo $?)。记住, 0表示 成功,其他为失败。
测试文件状态是否为OK,但是有时要比较两个文件状态。 shell提供三种逻辑操作完成此功能。
-a 逻辑与,操作符两边均为真,结果为真,否则为假。
-o 逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。
例:
[ -w test.txt -a -d /etc/app ] 两个条件为真则为真
echo $?
0 为真
字符串测试是错误捕获很重要的一部分,特别在测试用户输入或比较变量时尤为重要。 字符串测试有5种格式。
test "string"
test string_operator "string"
test "string" string_operator "string"
[ string_opertor "string" ]
[ "string" string_opertor "string" ]
string_operator可为:
= 两个字符串相等。
!= 两个字符串不等。
-z 空串。
-n 非空串
测试数值可以使用许多操作符,一般格式如下:
[ "number" numeric_operator "number" ]
numeric_operator可为:
-eq 数值相等。
-ne 数值不相等。
-gt 第一个数大于第二个数。
-lt 第一个数小于第二个数。
-le 第一个数小于等于第二个数。
-ge 第一个数大于等于第二个数。
expr命令一般用于整数值,但也可用于字符串。一般格式为:
expr argument operator argument
operator = [+、-、*、/]
使用乘号时,必须用反斜线屏蔽其特定含义。因为 shell可能会误解显示星号的意义。
控制流结构
所有功能脚本必须有能力进行判断,也必须有能力基于一定条件处理相关命令。
在书写正确脚本前,大概讲一下退出状态。任何命令进行时都将返回一个退出状态。如 果要观察其退出状态,使用最后状态命令:
$ echo $?
要退出当前进程,shell提供命令exit,一般格式为:
exit n
如果只在命令提示符下键入exit,假定没有在当前状态创建另一个shell,将退出当前shell。 如果在脚本中键入exit,shell将试图(通常是这样)返回上一个命令返回值。有许多退出脚本值,但其中相对于脚本和一般系统命令最重要的有两种,即: 退出状态0 退出成功,无错误。 退出状态1 退出失败,某处有错误。
if、then、else语句提供条件测试。测试可以基于各种条件。例如文件的权限、长度、数 值或字符串的比较。这些测试返回值或者为真( 0),或者为假(1)。基于此结果,可以进行 相关操作。在讲到条件测试时已经涉及了一些测试语法。
case语句允许匹配模式、单词或值。一旦模式或值匹配,就可以基于这个匹配条件作其他声明。
for 循环 每次处理依次列表内信息,直至循环耗尽。
Until 循环 此循环语句不常使用,until循环直至条件为真。条件部分在循环末尾部分。
While 循环 while循环当条件为真时,循环执行,条件部分在循环头。 流控制语句的任何循环均可嵌套使用,例如可以在一个 for循环中嵌入另一个for循环。
if语句测试条件,测试条件返回真(0)或假(1)后,可相应执行一系列语句。 if语句结构对错误检查非常有用。其格式为:
if 条件1
then 命令1
elif 条件2
then 命令2
else 命令3
fi
使用if语句时,必须将then部分放在新行,否则会产生错误。如果要不分行,必须使用命令分隔符。
if 条件;then 命令
fi
grep "" filename.txt > dev/null 2 > &1
有时需要知道脚本运行是交互模式(终端模式)还是非交互模式(cron或a t)。脚本也许需要这个信息以决定从哪里取得输入以及输出到哪里,使用test命令并带有- t选项很容易确认 这一点。如果test返回值为1,则为交互模式。
下一个if语句有可能是使用最广泛的: if 条件
then 命令1
else 命令2
fi 使用if语句的else部分可在条件测试为假时采取适当动作