使用test 内建函数
test命令是 shell 环境中用于测试条件表达式的工具。
它的返回值可以是 true,false,0或1。基本语法为:
test EXPRESSION
如果我们需要多个表达式,可以使用AND
,OR
,对应的选项为-a
,-o
。
test EXPRESSION -a EXPRESSION
test EXPRESSION -o EXPRESSION
其实,在实际应用中,test 有种非常简洁的方式,就是被中括号包含的条件表达式。这种方式更加常用。语法如下:
[ EXPRESION ]
test 的用法很多,例如,可以比较两个字符串是否相等:
[ $USER = root ]
我们还可以test 的选项来判断一个字符串的长度是否为0。
[ -z $1 ]
上面的代码的含义是,如果没有参数输入的话,返回 true。
test 还可以用来比较数字的大小。例如:
[ $# -gt 0 ]
除此而外,还可以判断文件的类型。例如,我们想查找类型为符号链接的文件,然后删除。可以使用如下脚本:
# [ -h $HOME/bin ] &&rm $HOME/bin
其他常用的选项如下:
- -d:文件是否为目录
- -e:文件是否存在
- -x:文件是否可以执行
- -f:文件是否为常规文件
- -r:文件是否可读
- -p:文件是否为命名管道
- -b:文件是否为块设备文件
- -c:文件是否为字符设备文件
使用 if 条件判断语句
if 语句的基本格式为:
if conditon ; then
statement 1
statement 2
fi
我们可以看一个具体的例子:
#!/bin/bash
if [ $# -lt 1 ] ; then
echo "Usage: $0 "
exit 1
fi
echo "Hello $1"
exit 0
在运行此脚本时,如果没有输入参数,则提示正确的使用方法,非正常退出;否则,打印输入的参数,程序正常退出。
if 语句还可以使用 else 条件分支。具体的语法为:
if conditon ; then
statement
else
statement
fi
我们新建一个脚本文件 hello6.sh,来展示 if else 的用法。
#!/bin/bash
if [ $# -lt 1 ] ; then
read -p "Enter a name: "
name=$REPLY
else
name=$1
fi
echo "Hello $name"
exit 0
当没有输入参数时,程序提示需要输入一个 name;如果输入了的话,就会打印出来。
最后一种 if 的情况,也是最完整的 if 条件语句。语法如下;
if condition; then
statement
elif condition; then
statement
else
statement
fi
再举个例子,新建脚本 backup2.sh,我们使用 tar 命令来备份压缩指定的目录,根据输入的参数“H”,“M”,“L”,可以执行不同的压缩级别。
如果输入的参数为“H”,则使用 bzip2的压缩方式;
如果输入的参数为“M”,则使用 gzip 的压缩方式;
如果输入的参数为“L”,则使用 tar 命令对文件打包,不压缩。
#!/bin/bash
# this sciprt dirs’ location are defualt under $HOME
read -p "Choose H, M or L compression " file_compression
read -p "Which directory do you want to backup to " dir_name
read -p "Which directory do you went to backup: " tobe_backup_name
# The next lines creates the directory if it does not exist
test -d $HOME/$dir_name || mkdir -m 700 $HOME/$dir_name
backup_dir=$HOME/$dir_name
tar_l="-cvf $backup_dir/b.tar $HOME/$tobe_backup_name"
tar_m="-czvf $backup_dir/b.tar.gz $HOME/$tobe_backup_name"
tar_h="-cjvf $backup_dir/b.tar.bzip2 $HOME/$tobe_backup_name"
if [ $file_compression = "L" ] ; then
tar_opt=$tar_l
elif [ $file_compression = "M" ]; then
tar_opt=$tar_m
else
tar_opt=$tar_h
fi
tar $tar_opt
exit 0
使用 case 选择语句
如果 if else 分支太多的话,可以考虑使用 case 语句,case 语句提供了更加简洁的机制。
case 语句的语法结构为:
case expression in
case1)
statement1
statement2
;;
case2)
statement1
statement2
;;
*)
statement1
;;
esac
还是举个简单的例子,新建脚本文件 grade.sh。
#!/bin/bash
# Script to evaluate grades
# Usage: grade.sh studentName grade
if [ ! $# -eq2 ] ; then
echo "You must provide
exit 2
fi
case $2 in
[A-C]|[a-c])
echo "$1 is a star pupil"
;;
[Dd])
echo "$1 needs to try a little harder!"
;;
[E-F]|[e-f])
echo "$1 could do a lot better next year"
;;
*)
echo "Grade could not be evaluated for $1"
esac
exit 0
运行结果如下: