test测试命令大全,范围:整数测试、字符串测试、文件测试。
整数测试
test v1 -eq v2 #测试两个数是否相等 test v1 -gt v2 #测试是否v1>v2 test v1 -ge v2 #测试是否v1>=v2 test v1 -lt v2 #测试是否v1<v2 test v1 -le v2 #测试是否v1<=v2 test v1 -ne v2 #测试两个数是否不相等
字符串测试
test str1=str2 #测试字符串是否相等 test str1!=str2 #测试字符串是否不相等 test str1 #测试字符串是否不为空 test -n str1 #测试字符串是否不为空 test -z str1 #测试字符串是否为空
文件测试
test -d file #指定文件是否是目录 test -f file #指定文件是否是常规文件 test -x file #指定文件是否可执行 test -r file #指定文件是否可读 test -w file #指定文件是否可写 test -a file #指定文件是否存在 test -s file #文件的大小是否非0
另注:通常test命令不单独使用,而是与if语句连用。
流程控制语句
一、if-else分支结构
if语法格式:
if 条件
then
逻辑块(通常都是些命令)
fi
写成一行:适用于终端写法:
if 条件;then 逻辑;fi
if-else语法格式:
if 条件
then
逻辑块(通常都是些命令)
else
逻辑块
fi
# 练习1:读入一个数,如果大于50,输出1;否则,输出0 read -p "请输入一个数" num if test $num -gt 50 then echo "1" else echo "0" fiif else-if else 语法格式:
if 条件1
then
逻辑块(通常都是些命令)
elif 条件2
then
逻辑块
else
逻辑块
fi
# 练习2:输入一个学生的成绩,如果大于等于90,输出“A”;如果大于等于80,输出“B”;如果大于等于70,输出“C”;否则,输出“D”; read -p "请输入学生的成绩" sc if [ $sc -ge 90 ] #test测试命令的另一种写法,需要注意[]内左右都要有空格 then echo "A" elif [ $sc -ge 80 ] then echo "B" elif [ $sc -ge 70 ] then echo "C" else echo "D" fi
分支结构也可以进行嵌套,多个条件联合时,有选项:
-a:逻辑与 当两个条件都成立时,结果为true
-o:逻辑或 两个条件只要有一个成立,结果为true
# 练习3:输入两个数a,b,当a>=b并且a是偶数时,输出a-b的值;如果a<b或者a是奇数时,输出a,b的值 read -p "a:" a read -p "b:" b if [ $a -ge $b -a $[$a % 2] -eq 0 ] then echo `expr $[a-b]` elif [ $a -lt $b -o $[$a % 2] -ne 0 ] then echo "a=$a,b=$b" fi
二、case多选择语句
case语句会匹配一个值和一个模式,匹配成功,执行相应的逻辑块
语法:
case 值 in
模式1)
逻辑块
;;
模式2)
逻辑块
;;
esac
# 改编上述练习2 read -p "请输入学生的成绩" sc nu=0 if [ $sc -ge 90 ] #test测试命令的另一种写法,需要注意[]内左右都要有空格 then nu=1 elif [ $sc -ge 80 ] then nu=2 elif [ $sc -ge 70 ] then nu=3 else nu=4 fi case $nu in 1) echo "A";; 2) echo "B";; 3) echo "C";; 4) echo "D";; esac
三、for循环结构
格式:
for 变量 in 名字表
do
逻辑
done
写成一行:
for 变量 in 列表;do 逻辑;done;
# 练习:输出1-10 for num in {1..10} do echo "num:$num" done
# 可以直接在命令行中输出一行 for num in {1..10};do echo "$num";done;
四、select表单循环
语法:
select 变量 in 列表
do
逻辑块
done
# 练习:输出1-10 select num in {1..10} do echo "num:$num" done
# 可以直接在命令行中输出一行 select num in {1..10};do echo "$num";done;
select与for循环的不同之处在于,select输出时,输出对象前面会有序列。
五、while循环
语法:
while 条件
do
逻辑块
done
# 练习:循环输出1-10 w=1 while [ $w -le 10 ] do echo "$w" w=$[$w+1] done
六、无限循环
语法:
while :
do
逻辑块
done
或者
while true
do
逻辑块
done
七、until循环
until循环执行到逻辑为true时停止
语法:
until 条件
do
逻辑块
done
#---until循环 # 计算1到100的和,也就是当条件>100之后 终止 num=1 sum=0 until test $num -gt 100 do sum=$[sum+num] num=$[num+1] done echo "1-100的和:$sum"
八、break与continue
如果想要提前结束循环(即想跳出循环)使用关键字break
如果想结束当次循环,进行下一次循环,使用关键字continue
# 习题1: 输出100次”hello shell“,当输出到50次时,跳出循环 i=1 while [ $i -le 100 ] do echo "第$i次:hello world" i=$[i+1] if test $i -gt 50 then break fi done
# 习题2:输入一个数, 判断是不是素数 read -p "请输入一个数" num temp=$[num/2] i=2 flag=0 while [ $i -le $temp ] do if test $[num%i] -eq 0 then flag=1 fi i=$[i+1] done if test $flag -eq 0 then echo "$num是素数" elif test $flag -eq 1 then echo "$num不是素数" fi
# 习题3: 计算1到100的和,排除 25 50 75 这三个数 sum=0 for i in {1..100} do if [ $i -eq 25 -o $i -eq 50 -o $i -eq 75 ] then continue fi sum=`expr $sum + $i` done echo "$sum"
九、shift指令
作用:参数左移,每执行一次,参数序列顺次左移一个位置,$#的值少一个,多数用于分别处理每一个参数,移出去的参数不再可用。
# 判断是否有位置参数,如果没有,输出 "没有参数" # 如果有位置参数,计算位置参数的和 sum=0 if [ $# -ne 0 ] then echo "位置参数的个数:$#" while [ $# -gt 0 ] do sum=$[$sum + $1] shift done echo "位置参数的和:$sum" else echo "没有位置参数" fi
# 输入 ./file.sh 1 2 3 4 5 # 输出 位置参数的个数:5 位置参数的和:15
函数的应用
一、基础
在shell脚本中,我们也可以定义函数,封装逻辑,进行调用。
语法:
[function] functionName(){
逻辑
}
调用时,不带( ),直接写functionName即可。
# 练习:计算1-100的和 sum=0 function sum(){ for i in {1..100} do sum=`expr $sum + $i` done echo "1-100的和:$sum" } sum
说明:1、关键字function可以不写;2、return关键字,可加可不加,看需求。如果加,返回值只能是0-255的数字;如果不加,最后一条命令的结果作为返回值。
# 练习:计算1-100的和 a=0 function num(){ for b in {1..100} do a=$[a+b] done return $a } num result=$? echo "result:$result"
输入输出重定向:
通常情况下:系统命令会从终端接收输入数据,再将需要输出的信息发送给终端。有时,我们可能会需要指定输入的位置,或者指定输出的位置,这就是“重定向”的概念。
重定向命令 说明command > file 将输出重定向到file
command < file 将输入重定向到file
command >> file 将输出以追加的方式重定向到file
shell文件引入外部脚本:
概念:Shell脚本内部也可以引用其他外部脚本这样可以很方便的封装一些公用的代码作为一个独立的文件。
Shell脚本引用外部脚本语法如下:
. fileName # .与文件之间一定要有空格
或者
source fileName
Shell脚本调试:
1、sh -x script
这将执行该脚本并显示所有变量的值
2、sh -n script
不执行脚本只是检查语法的模式,将返回所有语法错误