【Linux学习笔记】Shell 基础(3) — Shell流程控制语句

时间:2022-09-08 16:25:30


与C语言一样,shell也有自己的流程控制语句(条件判断、循环控制、循环跳出),下面就结合一些例子,总结一下shell中的流程控制。


注意:下面的测试代码都是在 ubuntu12.04 下 bash 环境下测试。


一、条件判断语句

      1)if else语句

      shell中if else语句一共有三种结构:

      if ... fi ;

      if ... else ... fi ;

      if ... elif ... else ... fi ;

      

#!/bin/bash

# if 语句

flag=2
flag_tmp=2

if [ $flag -eq $flag_tmp ]
then
echo "flag = $flag"
fi

if [ $flag -eq 1 ]
then
echo "hello tianmt"
else
echo "good night"
fi


if [ $flag -lt 1 ]
then
echo "< 1"
elif [ $flag -eq 2 ]
then
echo "= 2"
elif [ $flag -gt 1 ]
then
echo "> 1"
fi

if test $flag -eq $flag_tmp; then echo 'flag is equal flag_tmp'; fi
if test $[2*3] -eq $[1+5]; then echo 'flag is equal flag_tmp'; fi
if [ $[2*3] -eq $[1+5] ]; then echo 'flag is equal flag_tmp'; fi

      注意:(1) if 语句必须以 fi 结束;

                (2) [ ] 中间的语句必须与 方括号两边都有 空格 才能执行,否则属于语法错误;

                (3) 所有的语句可以以 分号 分割,写到一行去执行;


      2)case esac语句(与 C 语言里的switch...case语句一样)

      

#!/bin/bash

#case esac 1

echo "input a num in 1~4"

read num
case $num in
1) echo 'you input 1'
;;
2) echo "you input 2"
;;
3) echo "you input 3"
;;
4) echo 'you input 4'
;;
*) echo "input error"
;;
esac

read word
case $word in
a) echo 'you input a'
;;
b) echo "you input b"
;;
c) echo "you input c"
;;
d) echo 'you input d'
;;
*) echo "input error"
;;
esac

#!/bin/bash

#case esac 2

option="${1}"

case ${option} in
-f) FILE="${2}"
echo "File name is $FILE"
;;
-d) DIR="${2}"
echo "Dir name is $DIR"
;;
*)
echo "`basename ${0}`:usage: [-f file] | [-d directory]"
exit 1 # Command to come out of the program with status 1
;;
esac

para="${1}"

case ${para} in
-f) file="${2}"
echo "file name is $file"
echo "file name is ${2}"
;;
-d) path="${2}"
echo "path name is $path"
;;
*)
echo "usage :"
;;
esac

     注意:(1) 以 case 开头, 以 esac 结尾;

               (2) * 与 C 语言里的 default 一样,属于最后的默认处理方式;

               (3) ;; 与 C 语言里的 break 相同,属于结束一个分支;


二、循环执行语句

      1)for循环

       for循环的格式:

for 变量 in 列表
do
command1
command2
...
commandN
done


#!/bin/bash

#for

#bash 3.0
for flag in {1..10}
do
echo "$flag"
done

#bash 4.0
for flag in {1..10..1}
do
echo "$flag"
done

for flag in {1..20..2}
do
echo $flag
done

name=(lilei lily lucy jim john james)
for n in ${name[*]}
do
echo "$n"
done

#echo array
echo ${name[*]}

#输出当前目录下的所有文件相当于 ls
for i in *
do
echo $i
done

#(())

for((i=0;i<10;i++))
do
echo $i
done

#seq
for i in `seq 15 35`
do
echo $i
done

      注意:in 后面的列表可以是数字、字符串等组成的序列,通过空格分隔各个值,当然 in 可有可无,是可选的。


      2)while循环


#!/bin/bash

#while

flag=9
while [ $flag -gt 0 ]
do
let flag=$flag-1
echo "flag = $flag"
done

while [ $flag -lt 10 ]
do
flag=` expr $flag + 1 `
echo "flag = $flag"
done

#读取键盘信息
while read line
do
if [ $line = 'exit' ]
then
echo "exit ok"
break
fi
echo "read info is $line"
done


      注意:expr 那条语句,前后为``,Esc下面的那个,而且 `` 与中间的语句必须在两边都有 空格 才能不会出错。

      3)until循环

#!/bin/bash

# until

flag=0

until [ $flag -ge 10 ]
do
echo "flag = $flag"
let flag=$flag+1
done

until [ ! $flag -ge 1 ]
do
echo "flag = $flag"
flag=` expr $flag - 1 `
done

三、循环跳出语句

      1)break语句

#!/bin/bash

#break

i=11
while [ $i -lt 100 ]
do
if [ $i -eq 15 ]
then
break
fi
echo $i
let i=$i+1
done

echo "********************************************"

#break n

i1=1
while [ $i1 -le 5 ]
do
i2=11
while [ $i2 -lt 20 ]
do
if [ $i2 -eq 16 ]
then
echo "break 2"
break 2
#echo "break"
#break
fi
echo $i2
let i2=$i2+1
done
echo $i1
let i1=$i1+1
done

      注意:break 为终止语句的上一层循环,break n 为终止 语句的上 n 层循环。


      2)continue语句

#!/bin/bash
#continue
j=11
while [ $j -lt 20 ]
do
if [ $j -eq 13 ]
then
let j=$j+1
continue
fi
echo $j
let j=$j+1
done

echo "********************************************"

#continue n
j1=1
while [ $j1 -lt 11 ]
do
j2=11
while [ $j2 -lt 20 ]
do
if [ $j2 -eq 17 ]
then
let j1=$j1+1
continue 2
fi
echo "j2 = $j2"
let j2=$j2+1
done

echo "j1 = $j1"
let j1=$j1+1
done

      注意:continue 为跳出上一层循环,继续执行下一次循环,而 continue n 为跳出上n层循环,继续执行。