1.shell 条件判断
命令:test 或 [
使用 "["时,需使用"]" 结尾,和判断语句之间需要空格
如:判断 demo.c 文件是否存在
…
if [-f demo.c]
then
fi
或
…
if test -f demo.c
then
fi
1.1 字符串比较
string1 = string2 相同为真
string1 != string2 不同为真
-n string 字符串不为空为真
-z string 为 null 为真
1.2 算术比较
exp1 -eq exp2 相等为真
exp1 -ne exp2 不等为真
exp1 -gt exp2 exp1 大于 exp2 为真
exp1 -ge exp2 exp1 大于等于 exp2 为真
exp1 -lt exp2 exp1 小于 exp2 为真
exp1 -le exp2 exp1 小于等于 exp2 为真
!exp 取反,exp 结果为假结果为真
1.3 文件条件测试
-d file 如果文件是一个目录则结果为真
-e file 如果文件存在则结果为真,历史上 - e 选项不可移植,通常用 - f 替代
-f file 如果文件是普通文件则结果为真
-g file 如果文件的 set-group-id 位被设置则结果为真
-r file 如果文件可读则结果为真
-s file 如果文件的大小不为 0 则结果为真
-u file 如果文件的 set-user-id 位被设置则结果为真
-w file 如果文件可写则结果为真
-x file 如果未经可执行则结果为真
2 控制结构
2.1 if 语句
默认情况下,所有 shell 变量值均被认为是字符串,for 特别适用于对一系列字符串进行循环处理.
if condition1
then
statements1
elif condition2
then
statements2
else
statements3
fi
2.2 for
for var in values
do
statements
done
2.3 while
适用于不知道循环次数
和 while 类似
while condition do
statements
done
2.4 until
pattern [ | pattern ] …) statements;;
until condition
do
statement
done
2.7 case
case var in
pattern [ | pattern ] …) statements;;
…
esac
例 1
例2
#!/bin/sh
echo "Is it morning? Enter yes or no"
read timeofday
case "$timeofday" in
yes) echo "morning" ;;
no) echo "afternoon" ;;
y) echo "morning" ;;
n) echo "afternoon";;
*) echo "default ,no pattern"
esac
exit 0
每个 case 条目语句需要使用 ";;" 作为结束符,但不是必须的,最后一个 case 条目可省略 ";;",case 执行它找到的第一个匹配而不是最佳匹配,所以一般把最佳匹配放在最开始.
#!/bin/sh
echo "Is it morning? Enter yes or no"
read timeofday
case "$timeofday" in
yes | y | Yes | YES ) echo "Morning";;
n* | N* ) echo "Afternoon";;
* ) echo "not recognizied";;
esac
exit 0
2.8 AND 列表
Statement1 && statement2 && statement3 && …
执行逻辑为,只有在前面所有的命令都执行成功的情况下才执行后一条命令,从左开始顺序执行每条命令,如果一个命令返回的是 true,右边的 statement 才能够执行,直到一条命令返回 false,或者列表的所有命令都执行完毕.
输出:
#!/bin/sh
touch file_one
rm -f file_two
if [-f file_one] && echo "hello" && [-f file_two] && echo "there" then echo "in if" else echo "in else" fi
exit 0
hello
in else
解析:touch 和 rm 命令确保当前目录中的有关文件处于已知状态,然后 && 列表执行 [-f file_one] 语句,返回 true,继续执行 echo "hello",echo 命令总是返回 true,继续执行第三个测试[-f file_two],测试失败,执行结束,AND 列表返回 false,if 语句执行它的 else 部分2.9 OR 列表
Statement1 || statement2 || statement3 || …
从左开始顺序执行每条命令,如果一条命令返回的是 false,右边的命令才能被执行,直到一条命令返回 true,或所有命令都执行完毕.
输出:
#!/bin/sh
rm -f file_one
if [-f file_one] || echo "hello" || echo "there" then echo "in if" else echo "in else" fi
exit 0
hello
in if
解析:[-f file_one] 执行失败,继续执行 echo 语句,返回 true,后面的命令无需执行,OR 列表返回 true,if 语句执行 then 部分.
来源: http://www.bubuko.com/infodetail-2458225.html