| 知乎专栏 |
表 2.1. 文件目录表达式
| Primary | 意义 |
|---|---|
| [ -a FILE ] | 如果 FILE 存在则为真。 |
| [ -b FILE ] | 如果 FILE 存在且是一个块特殊文件则为真。 |
| [ -c FILE ] | 如果 FILE 存在且是一个字特殊文件则为真。 |
| [ -d FILE ] | 如果 FILE 存在且是一个目录则为真。 |
| [ -e FILE ] | 如果 FILE 存在则为真。 |
| [ -f FILE ] | 如果 FILE 存在且是一个普通文件则为真。 |
| [ -g FILE ] | 如果 FILE 存在且已经设置了SGID则为真。 |
| [ -h FILE ] | 如果 FILE 存在且是一个符号连接则为真。 |
| [ -k FILE ] | 如果 FILE 存在且已经设置了粘制位则为真。 |
| [ -p FILE ] | 如果 FILE 存在且是一个名字管道(F如果O)则为真。 |
| [ -r FILE ] | 如果 FILE 存在且是可读的则为真。 |
| [ -s FILE ] | 如果 FILE 存在且大小不为0则为真。 |
| [ -t FD ] | 如果文件描述符 FD 打开且指向一个终端则为真。 |
| [ -u FILE ] | 如果 FILE 存在且设置了SUID (set user ID)则为真。 |
| [ -w FILE ] | 如果 FILE 如果 FILE 存在且是可写的则为真。 |
| [ -x FILE ] | 如果 FILE 存在且是可执行的则为真。 |
| [ -O FILE ] | 如果 FILE 存在且属有效用户ID则为真。 |
| [ -G FILE ] | 如果 FILE 存在且属有效用户组则为真。 |
| [ -L FILE ] | 如果 FILE 存在且是一个符号连接则为真。 |
| [ -N FILE ] | 如果 FILE 存在 and has been mod如果ied since it was last read则为真。 |
| [ -S FILE ] | 如果 FILE 存在且是一个套 |
| [ FILE1 -nt FILE2 ] | 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。 |
| [ FILE1 -ot FILE2 ] | 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。 |
| [ FILE1 -ef FILE2 ] | 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。 |
表 2.2. 字符串表达式
| Primary | 意义 |
|---|---|
| [ -o OPTIONNAME ] | 如果 shell选项 “OPTIONNAME” 开启则为真。 |
| [ -z STRING ] | “STRING” 的长度为零则为真。 |
| [ -n STRING ] or [ STRING ] | “STRING” 的长度为非零 non-zero则为真。 |
| [ STRING1 == STRING2 ] | 如果2个字符串相同则为真。 |
| [ STRING1 != STRING2 ] | 如果字符串不相等则为真。 |
| [ STRING1 < STRING2 ] | 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。 |
| [ STRING1 > STRING2 ] | 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。 |
| [ ARG1 OP ARG2 ] | “OP” 为 -eq, -ne, -lt, -le, -gt or -ge. |
[ -z "$VAR" ] && VAR="some default" [ ! "$VAR" ] && VAR="some default" [ "$VAR" ] || VAR="some default"
Arithmetic relational operators
-lt (<)
-gt (>)
-le (<=)
-ge (>=)
-eq (==)
-ne (!=)
表 2.3. 组合表达式
| 操作 | 效果 |
|---|---|
| [ ! EXPR ] | 如果 EXPR 是false则为真。 |
| [ ( EXPR ) ] | 返回 EXPR的值。这样可以用来忽略正常的操作符优先级。 |
| [ EXPR1 -a EXPR2 ] | 如果 EXPR1 and EXPR2 全真则为真。 |
| [ EXPR1 -o EXPR2 ] | 如果 EXPR1 或者 EXPR2 为真则为真。 |
if [ ! -d /directory/to/check ]; then
mkdir -p /directory/toc/check
fi
if [ -z "$VAR" ]; then
VAR="some default"
fi
例 2.4. Basic conditional example if .. then
#!/bin/bash if [ "foo" = "foo" ]; then echo expression evaluated as true fi
例 2.5. Conditionals with variables
#!/bin/bash
T1="foo"
T2="bar"
if [ "$T1" = "$T2" ]; then
echo expression evaluated as true
else
echo expression evaluated as false
fi
(( $# != 1 )) && bool=0 || bool=${1}
[[ -f /tmp/test ]] && echo "True" || echo "False"
case 高级用法, 匹配 Yes,YES,YeS,yES,yEs ...
read -p "Do you want to continue [Y/n]?" BOOLEAN
case $BOOLEAN in
[yY][eE][sS])
echo 'Thanks' $BOOLEAN
;;
[yY]|[nN])
echo 'Thanks' $BOOLEAN
;;
'T'|'F')
echo 'Thanks' $BOOLEAN
;;
[Tt]ure|[Ff]alse)
echo 'Thanks' $BOOLEAN
;;
*)
exit 1
;;
esac
例 2.6. case
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
condrestart)
condrestart
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
exit 1
esac