shell编程入门(2)
shell的结构分为三大类:顺序结构、分支结构和循环结构
1. if语句
语法格式:
if
<语句序列A>
then
<语句序列B>
fi
如果语句序列A中的最后一个命令的返回值为0,则执行语句序列B中的命令,然后继续执行fi以后的命令;如果语句序列A中的最后一个命令的返回值为非0,则跳转到fi并且继续执行fi以后的命令,注意,在这里A执行结果为0认为是真。
if test –f funfilethen echo funfile exists fi
if [ -f funfile ]; then echo funfile exists echo hello fi
2. if-else语句
语法格式:
if
语句序列A
then
语句序列B
else
语句序列C
fi
如果语句序列A中的最后一个命令的返回值为0,则执行语句序列B中的命令,然后继续执行fi以后的命令;如果语句序列A中的最后一个命令的返回值为非0,则执行语句序列C中的命令,然后继续执行fi以后的命令。
任何命令的返回值都可以作为判断条件,也可以嵌套if语句,但必须保证if 和 fi配对。
if [ “$X” –lt 10 ]; then echo X is less than 10 else if [ “$X” –gt 10 ]; then echo X is greater than 10 else echo X is equal to 10 fi fi
也可以使用一种简写形式:elif来代替一个else if 嵌套。
3. case结构
语法结构:
case 单词 in
模式A)
语句序列A
;;
模式B)
语句序列B
;;
…
esac
分支选择是顺序地对单词和所提供的模式进行比较,如果一致,就执行后面的语句序列,然后跳转到esac,并执行后续的语句。典型情况下,单词是一个变量,而模式可以使用?, *等通配符。
case “$1” in start) start ;; stop) stop ;; *) echo “usage: $0 {start|stop}” ;; esac
4. while语句
语法格式:
while
语句序列A
do
语句序列B
done
语句功能:依次执行语句序列A中的命令,如果语句序列A最后一个命令的返回值为0,则执行语句序列B,回到步骤1,重复上面的过程,直到语句序列A中的最后一个命令的返回值为非0。
x=1 while ((x <= 10)) do echo x is $x let x=x+1 done
这里解释一下let命令,let在shell中执行算数运算。命名的参数可以在算术表达式中直接利用名称访问,不要前面带有“$”符号。当访问命名参数时,就作为算术表达式计算它的值。算术表达式按长整数进行求值,并且不检查溢出。当然,用0作除数就产生错误。let的替代表示形式是:((算数表达式))
5. until语句
语法结构:
until
语句序列A
do
语句序列B
done
until语句和while语句只有在测试条件上是相反的,其他的都一样。
6. for语句
语法结构
for var in list
do
语句序列A
done
1.如果list中还包含有token,则转到步骤2,否则结束;2.var被设置为list中的下一个token;3.语句序列A中的命令被执行;4.返回步骤1
注意:这里var的更新是每次循环后都替换为list中的下一个变量,不同于C语言中的循环计数
echo file list: for i in *; do echo $i done
7. continue和break语句
如果在循环体中使用continue则跳出本次循环,进入下一次循环;使用break则跳出整个循环。
8. shell函数
函数是脚本内的脚本,使用函数比起使用一个新的脚本可以大大加快调用速度。
有两种函数格式:
(1)function 函数名
{
…
}
(2)函数名()
{
…
}
调用函数就像调用一个shell脚本或者命令一样,直接在写函数名字,如果需要,还可以跟参数。shell查找命令的顺序是:别名,关键字,函数,内部命令,脚本和可执行程序,所以函数可能屏蔽外部脚本或者程序。
可以给函数传递参数,在函数中处理和在普通脚本中处理参数基本一样,使用$1等位置参数,或者$*,$#等,但¡在函数中的$0并不表示函数名,而仍然是脚本的文件名。
start() { echo “第一个参数:$1” echo “$0: $*” }
调用
start a b c
如果不作特殊说明,在函数内访问的变量是整个脚本共享的变量,如果要定义只在函数内有效的局部变量,则需要使用local语句。