条件判断
if基础结构
if后面可以跟任意数量的命令。这时,所有命令都会执行,但是判断真伪只看最后一个命令,即使前面所有命令都失败,只要最后一个命令返回0,就会执行then的部分
- 当
then
单独一行时不需要分号
#!/bin/bash
if commands; then
commands
[elif commands; then
commands...]
[else
commands]
fi
示例
#!/bin/bash
echo -n "输入一个1到3之间的数字(包含两端)> "
read character
if [ "$character" = "1" ]; then
echo 1
elif [ "$character" = "2" ]; then
echo 2
elif [ "$character" = "3" ]; then
echo 3
else
echo 输入不符合要求
fi
case结构
用于多值判断,可以为每个值指定对应的命令,跟包含多个elif的if结构等价,语义更好
#!/bin/bash
echo -n "输入一个1到3之间的数字(包含两端)> "
read character
case $character in
1 ) echo 1
;;
2 ) echo 2
;;
3 ) echo 3
;;
* ) echo 输入不符合要求 # 通配符可以匹配其他字符和没有输入字符的情况
esac
test 命令
test命令执行成功(返回值为0);表达式为伪,test命令执行失败(返回值为1)
语法结构
// 写法一
test expression
// 写法二
[ expression ]
// 写法三
[[ expression ]] // 支持正则
例子:判断文件(夹)是否存在
#! /bin/bash
if test -e /tmp/foo.txt ; then
echo "Found foo.txt"
fi
文件(夹)判断
[ -a file ]:如果 file 存在,则为true【同 [ -e file ]】
[ -d file ]:如果 file 存在并且是一个
目录
,则为true
[ -r file ]:如果 file 存在并且
可读
(当前用户有可读权限),则为true
[ -w file ]:如果 file 存在并且
可写
(当前用户拥有可写权限),则为true
[ -x file ]:如果 file 存在并且
可执行
(有效用户有执行/搜索权限),则为true
示例
#! /bin/bash
FILE=~/.bashrc
if [ -e "$FILE" ]; then
if [ -d "$FILE" ]; then
echo "$FILE is a directory."
fi
if [ -r "$FILE" ]; then
echo "$FILE is readable."
fi
if [ -w "$FILE" ]; then
echo "$FILE is writable."
fi
if [ -x "$FILE" ]; then
echo "$FILE is executable."
fi
else
echo "$FILE does not exist"
exit 1
fi
WARNING
上面代码中,$FILE要放在双引号之中,这样可以防止变量**$FILE为空,从而出错。因为$FILE如果为空,这时[ -e $FILE ]就变成[ -e ],这会被判断为真。而$FILE**放在双引号之中,[ -e "$FILE" ]就变成[ -e "" ],这会被判断为伪
字符串判断
[ string ]:如果string不为空(长度大于0),则判断为真
[ string1 = string2 ]:如果string1和string2相同,则判断为真【等价于: [ string1 == string2 ]】
[ string1 != string2 ]:如果string1和string2不相同,则判断为真
整数判断
[ integer1 -eq integer2 ]:如果integer1等于integer2,则为true。
[ integer1 -ne integer2 ]:如果integer1不等于integer2,则为true。
[ integer1 -le integer2 ]:如果integer1小于或等于integer2,则为true。
[ integer1 -lt integer2 ]:如果integer1小于integer2,则为true。
[ integer1 -ge integer2 ]:如果integer1大于或等于integer2,则为true。
[ integer1 -gt integer2 ]:如果integer1大于integer2,则为true。