Shell脚本test命令大全、流程控制语句以及函数的应用

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"
fi
if 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
不执行脚本只是检查语法的模式,将返回所有语法错误

猜你喜欢

转载自blog.csdn.net/mine_cun/article/details/80291050
今日推荐