if else
包括三种形式:
if condition
then
command1
command2
...
commandN
fi
# condition 可以用test也可以用[ ]
if condition
then
command1
...
else
command
...
fi
if condition
then
command1
elif condition
command2
else
comand3
...
fi
while 循环
while 用于不断执行一系列命令,也可以用于从输入文件读取数据,其语法格式为:
while condition
do
command
...
done
这里用到了 bash 的 let 命令,它用于执行一个或多个表达式,变量计算过程中不需要加上 $ 来表示变量;下面简单讲一下它与 expr 的区别:
由于shell程序中的操作默认都是字符串操作,在进行数学运算时可能会得到意想不到的结果,如下:
从上面这里例子可以看出,shell中的字符串连接只需要将字符串放在一起就可以了,因此为了执行上面的数学表达式,就需要使用 let 或者 expr:
从上面的语法来看,对于 let ,其后面的操作符与操作数之间不能存在空格,如第29行的 = 和 + 之间;而对于 expr 来说, 除了要加上反引号外,其操作符和左右两边操作数之间一定要存在空格!!此外,expr 中的括号() 、乘法符号* 都需要用 \ 转义,并且用空格隔开,如下:
s = `expr \( 2 + 6 \) \* 3`
echo $s
while 还可以通过 read 函数来从键盘读取数据:
这里将键盘的输入赋给变量 FILM,而且这是一个无限循环,没有循环的终止条件;
下面利用while来按行读取文件,格式如下:
while read line
do
command...
done <$file
# $file为文件名
# 上面的操作将文件中读取到的每一行赋给变量 line
也可以通过 cat 命令,然后使用管道符号,如下:
for 循环
一般格式为:
for var in item1 item2...itemN
do
command1
...
done
当变量在列表里时,for循环就执行命令,命令可以是任何有效的shell命令或者语句,如下:
for还有一种常用的形式,格式如下:
for (( assignment; condition; next ))
do
command1
...
done
#这里for 后面的条件需要加双括号
下面用 for 循环来循环读取文件中的每一行:
结果如下:
until 循环
until 循环执行一系列命令直至条件为 true 时停止,语法格式如下:
until condition
do
command1
...
done
case 语句
case...esac语法格式如下:
case var in
模式1)
command1
command2
...
;;
模式2)
command
...
;;
*)
default command
...
;;
esac
#模式可以使用方括号来表示一个范围,如[0-9],还可以使用 | 来表示或
case 的每个分支的模式都要在最右边加一个右括号,在每个分支的命令后用 ;; 隔开表示break,即分支执行结束,esac作为case 语句的结束标志;
最后用 * 来表示 default 的情况,当所有分支都没有匹配上时会执行 * 分支的命令;
跳出循环
break 和 continue
前者是终止这层循环,后者是跳出本次循环转而进入下一次循环,例子如下:
将上面的break 改为 continue,然后再在 continue 后面加上一条语句:
运行代码时发现第10行的语句永远不会执行,这就是continue的作用;
exit 和 return
exit 是 shell 的内建命令,用于退出当前的 shell 进程,使用格式如下:
exit [<n>]
可以指定退出状态n,取值范围为0-255,一般情况下 0 表示正常退出,非0表示异常退出;状态码 n 可以不指定,默认是上一条命令的状态退出码;
return 一般用于函数的方法体中,用来返回函数的返回值,格式如下:
funcname()
{
...
return [int]
}
可以看到,当函数返回值为5时,将函数作为 if 的条件,此时条件是 false,这是因为在shell 语言中 0 代表true,非0代表false;