test
test是shell中最常用的操作运算,通常的用法是使用一个方括号来表示判断,如果为真则返回 1,为假则返回 0.可以将其用在条件 判断或循环中,如:
if [expression -r expression] ; then ....
while [expression -r expression] ; then ....
until [expression -r expression] ; then ....
一般test判断语句分为以下几种:
文件运算,常用的有:
[-d file] 如果文件为一个目录,则为真 [-e file] 如果文件存在,则为真 [-f file] 如果文件为一个普通文件,则为真 [-w file] 如果文件可写,则为真 [-O file] 如果文件存在并且归该用户所有,则为真 [file1 -ef file2] 测试以判断两个文件是否与同一个设备相连,是否拥有相同的 inode 编号 [file1 -nt file2] 测试以判断第一个文件是否比第二个文件更新(由修改日期决定) [file1 -ot file2] 测试以判断第一个文件是否比第二个文件更旧字符串运算,常用的有
test string 测试以判断字符串是否不为空 [-n string] 测试以判断字符串是否不为空;字符串必须为 test 所识别 [-z string] 测试以判断字符串是否为空;字符串必须为 test 所识别 [string1 = string2] 测试以判断 string1 是否与 string2 相同 [string1 != string2] 测试以判断 string1 是否与 string2 不同整数比较运算
[int1 -eq int2] 如果 int1 等于 int2,则为真 [int1 -ge int2] 如果 int1 大于或等于 int2,则为真 [int1 -gt int2] 如果 int1 大于 int2,则为真 [int1 -le int2] 如果 int1 小于或等于 int2,则为真 [int1 -lt int2] 如果 int1 小于 int2,则为真 [int1 -ne int2] 如果 int1 不等于 int2,则为真布尔运算符
test ! expr 如果表达式评估为假,则为真 [expr1 -a expr2] 如果 expr1 和 expr2 评估为真,则为真 [expr1 -o expr2] 如果 expr1 或 expr2 评估为真,则为真
shell控制流
if、then、elif、else、fi,条件判断
if [ -f /bin/bash ] then echo "/bin/bash is a file" else echo "/bin/bash is NOT a file" fi if :; then echo "always true"; fi
如上例中如果要在一行中表示多行表达式,必须用分号隔开,如果条件判断中出现 : ,则表示条件判断始终为真。
case、esac,多路选择
case "$YES_OR_NO" in yes|y|Yes|YES) echo "Good Morning!";; [nN]*) echo "Good Afternoon!";; *) echo "Sorry, $YES_OR_NO not recognized. Enter yes or no." exit 1;; esac exit 0for、while,循环执行
for FRUIT in apple banana pear; do echo "I like $FRUIT" done COUNTER=1 while [ "$COUNTER" -lt 10 ]; do echo "Here we go again" COUNTER=$(($COUNTER+1)) done
shell的参数
shell参数为shell编程提供了很大的灵活性
$0 shell的命令名称,相当于C语言main函数的argv[0] $1、$2... 这些称为位置参数(Positional Parameter),相当于C语言main函数的argv[1]、argv[2]... $# shell的参数个数,相当于C语言main函数的argc - 1 $@ 表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。 $? 上一条命令的Exit Status $$ 当前Shell的进程号
shell中还有一个比较有用的命令:shift,shift n表示参数列表左移n位,但是$0不变,不带参数默认shift 1。
shell函数
shell函数和c语言很像,但是它没有参数列表也没有返回值,参数是在调用的时候传入的,执行结果为0还是1来作为返回值
is_directory() { DIR_NAME=$1 if [ ! -d $DIR_NAME ]; then return 1 else return 0 fi } for DIR in "$@"; do if is_directory "$DIR" then : else echo "$DIR doesn't exist. Creating it now..." mkdir $DIR > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "Cannot create directory $DIR" exit 1 fi fi done
warden中的shell命令
本部分中的命令是从warden的源代码中摘出来的,为了能够顺利地看懂warden源代码,我将这些拦路虎一一列出来。
set,在set之后使用-o参数将特殊特性打开.使用+o参数将关闭某些特性,可以set -o查看当前的shell变量设置情况
set -o errexit 如果一个命令返回一个非0退出状态值(失败),就退出。 set -o nounset 在扩展一个没有的设置的变量的时候,显示错误的信息。 set -o xtrace 打开调试回响模式shopt,是set命令的一个拓展,“-u”开关表示一个复位的选项,“-s”表示选项当前被设置(打开)。可以使用shopt -p来查看当前的设置。
shopt -s nullglob 设置nullglob选项,bash允许没有匹配任何文件的文件名模式扩展成一个空串,而不是它们本身unshare,在指定的环境下执行命令,而不影响上一级的环境。
grep -q -i ubuntu /etc/issue 判断系统是否是ubuntu
lsb_release -cs 得到系统的版本类型
mknod,建立设备特殊文件:
mknod DEVNAME {b | c} MAJOR MINORDEVNAME表示设备文件名,b|c分别代表块设备和字符设备,MAJOR、MINOR风别表示主设备号和次设备号。
mount,linux下挂载文件系统
mount [-t vfstype] [-o options] device dir-t后面接的是文件系统的类型,-o表示文件系统的类型(ro只读|rw读写),device要挂载的设备,dir表示挂载点