欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2.1.1 Shell脚本常用语句

程序员文章站 2024-03-23 21:48:28
...

条件判断

if 语句

    if 语句通过判断条件的返回值真假来执行不同的分支中的命令。

    语法

if 判断条件1 ;then
	判断条件1为真执行的COMMAND
elif 判断条件2 ;then         #可以有任意个,没有或者多个
	判断条件2为真执行的COMMAND
else                        #只能且必须存在一个
	当以上判断条件皆为假时执行的COMMAND
fi

    当 if 语句判断到一个条件为真时,那么将执行其中的命令,并且不再继续判断后续的语句。

case 语句

    case 语句通过匹配判断条件的模式来执行不同分支中的命令。

    语法

case 变量引用 in
模式1)
	匹配模式1时执行的COMMAND
	;;
模式2)
	匹配模式1时执行的COMMAND
	;;
	...     #可以有任意个匹配模式
*)              #可有可无,但是为了保证判断语句的强壮性,建议添加
	当变量没有匹配到以上的模式时执行的COMMAND
	;;
esac

    case 语句的匹配模式使用 glob 风格的通配符

循环控制

for 语句

    语法

    for 语句会将列表中的元素依次赋给语句中的变量,每一次赋值执行一次循环体,直到列表中元素耗尽。

#shell风格
for 变量 in 列表 ;do
	循环体
done

    for 语句中控制变量初始值在整个循环中只会执行一次,而控制变量修正则会每次循环都执行一次,当循环控制条件为时,循环停止。

#C语言风格
for ((控制变量初始值;循环控制条件;控制变量修正)) ;do
	循环体
done

    范例:打印等腰三角形

#!/bin/bash
read -p "line number is: " line
for ((l=1;l<=line;l++)) ;do
	space=$(printf "%-$[$line-$l]s")
	echo -e  "${space}\c" 
	star=$(printf "%-$[$l*2-1]s" "*")
	echo "${star// /*}"
done

while 语句

    while 语句会在循环控制条件为真时进入循环。每次循环开始时判断循环条件,在循环条件为假时退出循环

    语法

while 循环控制条件 ;do
	循环体    #一般在循环体中会对循环控制变量进行修正
done

    当然,如果循环判断条件永远为真,那么将会陷入死循环

while true ;do	
	循环体
done

    while 语句可以配合 read 语句进行逐行处理

    语法

#对命令的标准输出进行逐行处理
命令 | while read ;do
	循环体
done

#对文件中的内容进行逐行处理
while read ;do
	循环体
done < 文件

until 语句

    until 语句会在循环控制条件为假时进入循环。每次循环开始时判断循环条件,在循环条件为真时退出循环

    语法

while 循环控制条件 ;do
	循环体    #一般在循环体中会对循环控制变量进行修正
done
    当然,如果循环判断条件永远为假,那么将会陷入死循环
until false ;do	
	循环体
done

    

    范例1:打印九九乘法表
#!/bin/sh  
for i in $(seq 9) ;do
	for j in $(seq $i) ; do  
		let over=$[i*j]
		echo -ne "${j}x${i}=$over\t"
	done
	echo
done
    范例2:计算100以内所有奇数的和
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ] ;do
	let sum+=i
	let i+=2
done
echo $sum


break 语句

    当循环执行到 break 语句时,会退出指定循环。

    语法:break [N]

    N 为循环嵌套层次,当前循环为第1层,缺省为退出当前循环。

    范例:打印200以内的斐波那契数列

#!/bin/bash
read num

for ((stp=0;stp>=0;stp++)) ;do
	if [ $stp -eq 0 ] ;then
		res2=$stp
		echo $res2
	elif [ $stp -eq 1 ] ;then
		res1=$stp
		echo $res1
	else
		res=$[$res1+$res2]
		if [ $res -le $num ] ;then
			echo "$res"
			res2=$res1
			res1=$res
		else
			break
		fi
	fi
done

continue 语句

    当循环执行到 continue 语句时,会跳出指定循环,开始下轮循环

    语法:continue [N]

    N 为循环嵌套层次,当前循环为第1层,缺省为跳出当前循环。

shift 语句

    shift 语句用于将参数列表中的参数移动指定次数。

    当参数移动时,处于最左端的参数将被移除

    范例:打印数字等腰三角形

#!/bin/bash
while [ $# -gt 0 ] ;do
	echo $*
	shift
done

功能语句

    select 语句

    select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准输出上,并显示 PS3 提示符,等待用户输入。

    语法

select 变量 in 列表 ;do
	循环体   #一般为条件判断语句
done

    输入对应的数字,会将列表中对应的数据赋值给变量,也可以使用位置变量,而输入的数字则会保存在 REPLY 变量中。另外,select 语句为无限循环语句,在使用 select 语句时最好设置 break 或 exit 等退出循环的方法。

    范例:

#!/bin/bash
list="C语言 Python PHP Java PowerShell 退出"

select language in $list ;do
	case $language in
		C语言)
			echo "万物始于C语言"
			;;
		Python)
			echo "简而美"
			;;
		PHP)
			echo "PHP是天下最好的语言??"
			;;
		Java)
			echo "啥都做"
			;;
		PowerShell)
			echo "这才是最好的语言!!"
			;;
		退出)
			exit
			;;
	esac
done

    trap 语句用于捕捉信号后执行触发行为,而不执行系统原有操作。信号可以是全称,简写,也可以是数字。

    语法:trap '触发后行为' 信号

    触发后行为:

CMD:执行制定的命令

NULL:忽略信号操作

-:恢复系统原有操作