• 过程式编程语言:
    • 顺序执行
    • 选择执行
    • 循环执行

判断语句

条件选择if语句

选择执行:

注意:if语句可嵌套
#单分支
if 判断条件;then
	条件为真的分支代码
fi


#双分支
if 判断条件; then
	条件为真的分支代码
else
	条件为假的分支代码
fi


#多分支
if 判断条件1; then
	条件1为真的分支代码
elif 判断条件2; then
	条件2为真的分支代码
elif 判断条件3; then
	条件3为真的分支代码
else
	以上条件都为假的分支代码
fi
#逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
URL=www.hanjy.cn
if ping -c1 -W2 $URL &> /dev/null; then 
	echo '$URL is UP' 
else 
	echo '$URL is  DOWN!' 
	exit 1 
fi

条件判断:case语句

case支持glob风格的通配符:

  • *: 任意长度任意字符
  • ?: 任意单个字符
  • []:指定范围内的任意单个字符
  • a|b: a或b
case 变量引用 in
PAT1)
	分支1
;;
PAT2)
	分支2
;;
	...
*)
	默认分支
esac
read -p "请输入选项[0-3]: " num
case $num in
        0 )
                echo 您输入的是0
                ;;
        1 )
                echo 您输入的是1
                ;;
        2 )
                echo 您输入的是2
                ;;
        3 )
                echo 您输入的是3
                ;;
        * )
                echo 输入范围有误
esac

循环

  • 循环执行
    • 将某代码段重复运行多次
    • 重复运行多少次
      • 循环次数事先已知
      • 循环次数事先未知
    • 有进入条件和退出条件
  • for, while, until

for循环

for 变量名 in 列表;do
	循环体
done



列表生成方式:
	(1) 直接给出列表
	(2) 整数列表:
		(a) {start..end}
		(b) $(seq [start [step]] end) 
	(3) 返回列表的命令
		$(COMMAND)
	(4) 使用glob,如:*.sh
	(5) 变量引用;
		$@, $*

执行机制:
依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束

image-1656397790967

for i ;
do
	echo $i
done

bash for.sh 1 2 3 4 5 6

#双小括号方法,即((…))格式,也可以用于算术运算
#双小括号方法也可以使bash Shell实现C语言风格的变量操作
	I=10
	((I++)) 
for循环的特殊格式:

for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
do
	循环体
done

控制变量初始化:仅在运行到循环代码段时执行一次
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断

for循环示例

#!/bin/bash
for ((i=1;i<=9;i++)) 
do
    for ((j=1;j<=$i;j++))
    do
        let num=$[i*j]
        echo -e "${j}x${i}=$num \t\c"
    done
    echo
done
#!/bin/bash

red(){
echo -e "\033[41m   \033[0m\c"
}
yellow(){
echo -e "\033[43m   \033[0m\c"
}
for I in `seq 4`;do
  for i in `seq 8`;do
    let num=$[${i}%2]
    if [ $num -eq 0 ];then
      red
    else
      yellow
    fi
    if [ $i -eq 8 ];then
      echo 
    fi
  done
  for j in `seq 8`;do
    let num1=$[${j}%2]
    if [ $num1 -eq 0 ];then
      yellow
    else
      red
    fi
    if [ $j -eq 8 ];then
        echo 
    fi
  done
done

while循环

while CONDITION; do
	循环体
done

#while循环的特殊用法(遍历文件的每一行)行读取
while read line 
do
	循环体
done<filename

cat filename|while read line 
do 
	循环体
done

image-1656407865939

  • CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环
  • 因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正
  • 进入条件:CONDITION为true
  • 退出条件:CONDITION为false

until循环

until CONDITION; do
	循环体
done

进入条件: CONDITION 为false
退出条件: CONDITION 为true

循环控制语句continue

  • 用于循环体中
  • continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层
i=0
while  (( i<=6 )) ; do
        let i++
        if [ "$i" -eq 3 ]; then
                continue
        fi
        echo $i
done

循环控制语句break

  • 用于循环体中
  • break [N]:提前结束第N层循环,最内层为第1层
i=0
while  (( i<=6 )) ; do
       let i++
       if [ "$i" -eq 3 ]; then
               break
       fi
       echo $i
done

循环控制shift命令

  • shift [n]
  • 用于将参量列表 list 左移指定次数,缺省为左移一次
  • 参量列表 list 一旦被移动,最左端的那个参数就从列表中删除。while 循环遍历位置参量列表时,常用到 shift
while [ $# -gt 0 ]    # or (( $# > 0 ))
do
	echo $*
   shift
done

bash while.sh 1 2 3 4 

1 2 3 4
2 3 4
3 4
4

无限循环

while true; do   
	循环体
done

while ; ; do   
	循环体
done

until false; do
	循环体
Done


select循环与菜单

select variable in list 
do 
	循环体命令
done
  • select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示 PS3 提示符,等待用户输入
  • 用户输入菜单列表中的某个数字,执行相应的命令
  • 用户输入被保存在内置变量 REPLY 中
  • select 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 命令终止脚本。也可以按 ctrl+c 退出循环
  • select 经常和 case 联合使用
  • 与 for 循环类似,可以省略 in list,此时使用位置参数例如:
PS3=请输入:
select name
do
        case $name in
                "$1")
                        echo $name
                        break
                        ;;
                "$2")
                        echo $name
                        break
                        ;;
                *)
                        echo "输入错误请重新输入"
        esac
done

bash select.sh test1 test2

 
PS3=请输入:
select name  in "test1" "test2"
do
	case $name in
		"test1")
			echo $name
			break
 			;;
		"test2")
			echo $name
			break
			;;
		*)
			echo "输入错误请重新输入"
	esac
done