- 首个字符必须为字母(a-z,A-Z)
- 中间不能有空格,可以使用下划线(_)
- 不能使用标点符号
- 不能使用bash里的关键字(可用help命令查看保留关键字)
要给变量赋值可以写成: 变量名=值
Shell脚本中有许多变量是系统自动设定的,我们将在用到这些变量时再作说明。除了只在脚本内有效的普通shell变量外,还有环境变量,即那些由export关键字处理过的变量。本文不讨论环境变量,因为它们一般只在登录脚本中用到。
shell里的流程控制
if语句
if ....; then .... elif ....; then .... else .... fi
大多数情况下,可以使用测试命令来对条件进行测试,比如可以比较字符串、判断文件是否存在及是否可读等等……通常用” [ ] “来表示条件测试,注意这里的空格很重要,要确保方括号前后的空格。
- [ -f "somefile" ] :判断是否是一个文件
- [ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
- [ -n "$var" ] :判断$var变量是否有值
- [ "$a" = "$b" ] :判断$a和$b是否相等
执行man test可以查看所有测试表达式可以比较和判断的类型。
&&和||操作符
熟悉C语言的朋友可能会喜欢下面的表达式:
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"
这 里的 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句,你也可以把它看作逻辑运算里的与操作。上述脚本表示如果/etc/shadow文件存在,则 打印“This computer uses shadow passwords”。同样shell编程中还可以用或操作(||)。
case语句
case表达式可以用来匹配一个给定的字符串,而不是数字(可别和C语言里的switch…case混淆)。
case ... in ...) do something here esac
select语句
select表达式是bash的一种扩展应用,擅长于交互式场合。用户可以从一组不同的值中进行选择:
select var in ... ; do break; done .... now $var can be used ....
下面是一个简单的示例:
#!/bin/sh echo "What is your favourite OS?" select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do break; done echo "You have selected $var"
如果 以上脚本运行出现 select :NOT FOUND 将 #!/bin/sh 改为 #!/bin/bash 该脚本的运行结果如下:
What is your favourite OS? 1) Linux 2) Gnu Hurd 3) Free BSD 4) Other #? 1 You have selected Linux
while/for循环
在shell中,可以使用如下循环:
while ...; do .... done
只要测试表达式条件为真,则while循环将一直运行。关键字”break”用来跳出循环,而关键字”continue”则可以跳过一个循环的余下部分,直接跳到下一次循环中。
for循环会查看一个字符串列表(字符串用空格分隔),并将其赋给一个变量:
for var in ....; do .... done
shell中的一些特殊符号
引号
单引号可以防止任何变量的扩展;
双鱼和可以防止通配符扩展但允许变量扩展;
$$ = PID号
shell把执行此shell进程的PID号存储在参数$$中;
$? : 退出状态
一个进程无论何种原因停止运行,他都要向父进程返回一个退出状态,“$?”存储这上一个命令的退出状态码:
0返回值:命令成功执行;
非0返回值:命令执行失败;
$#
命令行参数个数;
$0~%n
命令行第n个参数;
$*和$@
“$*”将位置参数看成一个参数;
“$@”将位置参数看成多个参数;
例如:
bb1 a b c;
set $* 将a b c看成一个参数;即,$1=a b c;
set $@将a b c看成三个参数;即,$1=a, $2=b, $3=c
shell中的函数
如果你写过比较复杂的脚本,就会发现可能在几个地方使用了相同的代码,这时如果用上函数,会方便很多。函数的大致样子如下:
functionname() { # inside the body $1 is the first argument given to the function # $2 the second ... body }
你需要在每个脚本的开始对函数进行声明。
命令行参数
我 们已经见过$* 和 $1, $2 … $9 等特殊变量,这些特殊变量包含了用户从命令行输入的参数。迄今为止,我们仅仅了解了一些简单的命令行语法(比如一些强制性的参数和查看帮助的-h选项)。 但是在编写更复杂的程序时,您可能会发现您需要更多的自定义的选项。通常的惯例是在所有可选的参数之前加一个减号,后面再加上参数值 (比如文件名)。
脚本调试
最简单的调试方法当然是使用echo命令。你可以在任何怀疑出错的地方用echo打印变量值,这也是大部分shell程序员花费80%的时间用于调试的原因。Shell脚本的好处在于无需重新编译,而插入一个echo命令也不需要多少时间。
shell也有一个真正的调试模式,如果脚本”strangescript”出错,可以使用如下命令进行调试:
sh -x strangescript
上述命令会执行该脚本,同时显示所有变量的值。
shell还有一个不执行脚本只检查语法的模式,命令如下:
sh -n your_script
这个命令会返回所有语法错误。