五、until循环
until命令刚好与while命令相反。until命令需要指定一条测试命令,这条命令通常产生一个非零的状态值。只要测试命令的退出状态非零,bash shell就会执行列在循环体内的命令。一旦测试条件返回0退出状态,循环停止。所以until命令的格式为:
until 条件; do
循环体
done
下面是一个使用until命令的例子:
num=100
until [ $num -eq 0 ]; do
echo $num
num=$[ $num - 25 ]
done
执行结果为:
六、控制循环命令:break命令和continue命令
其实循环开始之后可以不继续循环,break和continue命令可以帮助我们控制循环内部发生的事情。但两者有不同的使用方法,下面介绍如何使用这两个命令来控制循环操作。
1、break命令
break命令是在处理过程中跳出循环的一种简单方法。可以使用break命令退出任何类型的循环,包括while循环和until循环。break的常用格式为break n,n表明要跳出的循环级别。默认情况n=1,代表跳出当前循环。如果将n设置为2,break命令将停止外循环的下一级循环:
下面举例说明:
当n=1时
for (( a = 1; a < 4; a++ )) ; do
echo "outer loop:$a"
for(( b = 1;b < 10;b++ )); do
if [ $b -eq 3 ]; then
break
fi
echo " Inner loop:$b"
done
done
脚本执行结果为:
内部的break控制了内部循环的次数,但外循环会继续按指定进行。
当n=2时
for (( a = 1; a < 4; a++ )) ; do
echo "outer loop:$a"
for(( b = 1;b < 10;b++ )); do
if [ $b -gt 3 ]; then
break 2
fi
echo " Inner loop:$b"
done
done
脚本执行结果为:
此时,执行break命令是外循环停止。
2、continue 命令
它可以提前结束当前一次的循环,但却不跳出循环,而是执行下一次的循环。
下面介绍一个简单的例子。
for (( i = 1; i < 10; i++ ))
do
if [ $i -gt 3 ] && [ $i - lt 8] ; then
continue
fi
echo "Number:$i"
done
执行结果为:
当if语句的条件满足时,continue命令生效,跳过该循环中余下的命令,进入下一次的循环。
在while循环和until循环中也可以使用continue命令。但谨记,当shell执行continue命令是,它跳过余下的命令。
七、条件测试
条件测试是一种检测if-then语句中不用条件的方法。它有几种基本格式:
[ expression ]
` expression `
test expression
bash的条件测试类型可分为三种:数值比较,字符串比较,文件比较。
下面介绍在每种类型的使用方法。
1、数值比较
数值比较时常有双目操作浮:N1 操作符 N2。数值测试还能用于判断数值和变量。
基本的双目操作符有:
N1 -eq N2:判断N1是否等于N2
N1 -ne N2:判断N1是否不等于N2
N1 -gt N2:判断N1是否大于N2
N1 -lt N2:判断N1是否小于N2
N1 -ge N2:判断N1是否大于等于N2
N1 -le N2:判断N1是否小于等于N2
下面介绍一个例子进行说明。
使用命令取出用户的ID号,并保存至变量MYID中;如果 ID号等于0,说明这是管理员;如果ID号大于等于1并且小于等于499,说明这是系统用户;否则就说明这是普通用户。
MYID=`id -u user1`
if [ $MYID -eq 0 ]; then
echo "Admin."
elif [ $MYID -ge 1 ] && [ $MYID -le 499 ]; then
echo "Sys user."
else
echo "Common user."
fi
2、字符串比较
字符串测试的常用操作符有:
str1 > str2 判断str1是否大于str2
str1 < str2 判断str1是否小于str2
str1 = str2 判断str1是否等于str2
str1 != str2 判断str1是否不等于str2
-n str1 判断str2是否不为空,不空为真,为真则假
-z str2 判断str2是否为空,为空则真,不空为假
在比较两字符串大小时,大于和小于符号一定要转义,否则shell会将它们当做重定向符号,将字符串看做文件名。另外字符串比较是最好用""括起来。
例子:比较字符串baseball和hockey的大小。
var1=baseball
var2=hockey
if [ " $var1" \> "$var2" ]; then
echo "$var1 is greater than $var2."
else
echo "$var1 is less than $var2."
fi
脚本执行结果:
3、文件比较
文件比较是shell脚本中最强大和最常用的一类比较。文件比较命令能够测试Linux文件系统上的文件状态和路径。
文件比较的几种常用用法:
-e /path/to 判断文件是否存在
-f /path/to 判断文件是否存在并且是一个文件
-d /path/to 判断文件是否存在并且是一个目录
-r /path/to 判断文件是否存在并且可读
-w /path/to 判断文件是否存在并可写
-x /path/to 判断文件是否存在并且可执行
-s /path/to 判断文件是否存在并且不为空
下面以一个例子说明:
FILE=/tmp/test
if [ -e $FILE ]; then
if [ -f $FILE ]; then
echo "It is a file."
else
echo "It isn't a file."
if [ -f $FILE/a.sh ]; then
echo "$FILE/a.sh is a file."
fi
fi
else
echo "$FILE is not exist."
fi
八、函数
编写比较复杂的shell脚本时,完成具体任务的代码可能需要重复使用。但重复编写相同的脚本代码令人厌烦。所以重复代码块最好只需编写一次,然后在脚本的任意位置就可以引用这个代码块,而不必重复编写。bash shell提供满足这种要求的特征。函数是被赋予名称的脚本代码块,可以在代码的任意位置重用。每当需要在脚本中使用这样的代码块时,只需引用该代码块被赋予的函数名称即可。下面讲述如何创建和使用函数。
1、创建函数
在bash shell脚本中创建函数可以使用两种格式。一种是使用关键字function,后跟代码块的函数名:
function name {
commands
}
name属性定义可该函数的唯一名称。脚本中自定义的每个函数都必须赋予唯一的名称。
脚本中定义函数还有另一种格式,它更接近一般编程语言定义函数的方式:
name() {
commands
}
2、使用函数
要在脚本中使用函数,相应函数名需要在脚本行中指定。
下面先看一个小例子。使用两种方法定义函数 。
function test1 {
echo "The first method!"
}
test2(){
echo "The second method!"
}
test1
test2
脚本执行结果为:
The first method!
The second method!
3、返回值
默认情况下,函数的退出状态是函数的最后一条命令返回的退出状态。函数执行完毕之后,可以使用$?来确定函数的退出状态。
以试图查看一个不存在的文件为例。
test1(){
ls -l testfile
echo ”Trying to open the file.“
}
test1
echo "The exit status is:$?"
脚本执行结果为:
从执行结果可以看出,虽然函数中有一条命令运行失败,但是最后的echo语句执行成功,所以函数的退出状态仍然是0。因此,使用函数的默认退出状态是一种危险的做法。此时我们可以使用return命令或使用函数输出。
1)使用return命令
使用return命令可以使函数以特定退出状态退出函数。
show() {
read -p "Enter a number:" Num
return $ [ $Num * 2 ]
}
show
echo "The new number is :$?"
此时$?的值就是用户输入数字的2倍。
但是使用return时,退出状态必须小于256,所以函数结果生成的整数值必须小于256。数据大于256将返回错误值。如果想要返回更大的整数值或字符串,就不能使用return方法。要使用第二种方法。
2)使用函数输出
正如命令输出可以捕获并存放在shell变量中一样,函数的输出也可以捕获并存放在shell变量中。这种方法可以从函数获取任意类型的输出并给变量赋值: result=`show`
show() {
read -p "Enter a number:" Num
echo $ [ $Num * 2 ]
}
result=`show`
echo "The new number is:$result"
执行脚本:
4、在函数中使用变量
函数可以使用标准参数环境变量来表示命令行传递给函数的参数。例如,函数名在变量$0中定义,函数命令行的其他参数使用变量$1和$2等定义。专用变量$#可以用来确定传递给函数的参数数目。
在脚本中指定函数时,必须在函数所在命令行提供参数,如:jage 10 23
jage (){
if [ $# -eq 0 ] || [ $# -gt 2 ]; then
echo "-1"
elif [ $# -eq 1 ]; then
echo "$ [ $1 + $1 ]"
else
echo"$ [ $1 + $2 ]"
fi
}
jage
jage 10
jage 10 15
jage 10 15 25
执行脚本:
Linux脚本编程常用的知识点到此介绍完毕。能否熟练的掌握就在于是否常练习了。孰能生巧,多练习可以能够更快的领会个知识点的精髓。