条件控制
if/else控制
if/else
语句和C语言的基本类似, 一般使用方法是:
if condition
then
statements
[elif condition
then
statements ...]
[else
statements]
if
逻辑操作的非与或分别是!
&&
||
这与C语言完全一致, 不过这是在[ ]外部使用. 如果在[ ] 内部, 则必须换成-n
-a
-o
, 对应英文的缩写.
条件测试
Linux的每个命令或函数, 在退出时都会返回一个状态给调用者, 用来表示退出状态. 退出状态是0表示成功退出, 否则是有问题. 调用exit
命令返回退出状态. 如果是函数, 注意exit
和return
语句是不同的. 举个例子:
建立1.sh文件
add()
{
let r=$1+$2
return $r
}
add_1()
{
exit 0
}
执行source ./1.sh
之后,
add 2 3
echo $? # 这一条输出5
add_1 # 终端直接退出
可以看出, return返回的一个具体计算值, 而exit是返回了一个状态.
但是, Linux shell的if
条件只能用于测试内容的退出状态, 而不是表达式或者函数的返回值, 比如新建一个文件1.sh
#!/bin/bash
add()
{
let r=$1+$2
return $r
}
#!/bin/bash
if add $1 $2
then
echo add ok
else
echo add no
fi
分别输入:
source 1.sh
source 2.sh 1 2
程序会输出:
add no
即使返回值是3, 但是仍然无法通过if条件测试, 印证了if只能测试退出状态, 而不是返回值. 而Linux中, 命令只要没有错误, 退出状态也是0, 表达式计算也相当于一个命令. 所以如果要进行表达式的值测试, 就不能直接带入if条件, 而是使用条件测试命令.
test
命令就是这样的. test命令还可以用[ ] 来表示, 不过这样的话, 运算操作符号需要由 -alpha来表示, 比如<=
成为\le
. test Expression
, 如果表达式返回true, 则返回一个0退出值, 否则返回一个非零退出值, 如果无参数, 任然返回一个非零退出值.
举个例子:
#!/bin/bash
if test "2>3"
then
echo no pass
else
echo pass
fi
if [ "2>3" ] # 注意这里的弱引用, 否则就是重定向操作了!!!!!!!!!
then
echo no pass
else
echo pass
fi
结果输出:
no pass
no pass
两个语句是等价的, 但是注意[ ]两侧的空格是必须的!!! 上述命令是, 如果条件通过测试, 那么test返回0, 就不执行if
内部的语句了.
一些常用的参数检查为:
同样的, 条件测试语句可以和其他的逻辑条件语句搭配使用.
case分支
case expression in
pattern 1)
statements;;
pattern 2)
statements;;
pattern3 | pattern4)
statements;;
esac
任何一个分支, 都可以由管道连接多个pattern, 只要有一个匹配上了, 那么就执行相应的statement
比如:
case $1 in
*.jpg) gqview $1;;
*.txt) gvim $1;;
*.avi | *.wmv) mplayer $1;;
*.pdf) acroread $1;;
*) echo $1: echo "Unkown type";;
循环
for循环
for
循环的基本操作:
for name [in list]
do
...
done
list是名称列表, 也可以通过模式匹配等获取.
比如:
for file in *.txt
do
cat $file # 注意变量的符号
done
如果是命令操作, 需要添加``
符号
for file `find . -iname *.txt`
do # 遍历当前目录及其子目录所有文件
cat $file
done
如果[in list]
被省略, 则默认为$@
所有的参数, 比如:
for name in $@
do
case $name in
-f) ...;;
-d) ...;;
esac
done
while/until循环
while循环, 当condition为真执行循环
while condition
do
statements
done
until循环, condition为真跳出循环
until condition
do
statements
done
注意如果使用命令 函数或表达式等, 需要条件测试!!!
比如:
#!/bin/bash
path=$PATH
while [ -n $path ]
do
ls -ld $[path%%:*]
path=${path#*:}
done
跳出循环使用break
语句即可