shell scripts的控制逻辑结构自结

1.选择结构

        ——》if...then式

                    a)最复杂的情形:                    

if [条件表达式1]; then
    当条件表达式1成立时,可以进行的命令工作内容
elif [条件表达式2]; then
    当条件表达式2成立时,可以进行的命令工作内容
else
    当条件表达式1和2均不成立时,可以进行的命令工作内容
fi

                    b)例子:

#!/bin/bash
read -p "Please input (Y/N): " yn

if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then
	echo "OK,continue..."
elif [ "$yn" == "N" ] || [ "$yn" == "n" ]; then
	echo "Oh,interrupt!"
else
	echo "I don't know what your choice is"
fi

 

        ——》case...esac式

                    a)情形:

case $variable in
   "第一个变量内容")
        程序段
        ;;
   "第二个变量内容")
        程序段
        ;;
   *)
        程序段
        ;;
esac

                   b)例子:

#!/bin/bash
case $1 in
 "hello")
     echo "Hello,how are you?"
     ;;
 "")
     echo "You must input parameter,ex> {$0 someword}"
     ;;
 *)
     echo "Usage $0 {hello}"
     ;;
esac

 

2.循环结构

        ——》while-do-done

                    a)情形:

while [ 条件表达式 ]
do
	程序段
done

                    b)例子:

while [ "$yn" != "yes" -a "$yn" != "YES" ]
do
	read -p "Please input yes/YES to stop this program: " yn
done
echo "OK!you input the correct answer."

        ——》until-do-done

                     a)情形:

until [条件表达式]
do
	程序段
done

                     b)例子:

until [ "$yn" == "yes" -a "$yn" == "YES" ]
do
	read -p "Please input yes/YES to stop this program: " yn
done
echo "OK!you input the correct answer."

        ——》for-do-done固定循环

                     a)情形:

for variable in cond1 cond2 cond3 ...
do
	程序段
done

                     b)例子:

for variable in $(seq 1 14)
do
        echo "The number is: $variable"
done

        ——》for-do-done的数值处理

                     a)情形:

for((初始值; 限制条件; 执行步长))
do
	程序段
done

                     b)例子:

#1
sum=0;
for((i=1; i<=100; i=i+1))
do
        sum=$((sum+$i))
done
echo "The sum is: $sum"

#2
sum=0
for((i=1; i<=100; i=$(($i+1))))
do
        sum=$((sum+$i))
done
echo "The sum is: $sum"
Question:#1和#2经过验证都是正确的。可为什么在#1中执行步长可以写成i=i+1呢?严格来说是i=$(($i+1))的啊
Answer:难道说,这里的i相当于是declare -i i吗

 备注:

关于循环遍历的几个举例:

##遍历目录下面有哪些文件或目录
(1)for file in ./*    #遍历当前目录下有哪些文件或目录
(2)for file in *      #同上
(3)for file in `ls -1 pack_wzj`  #遍历目录pack_wzj下有哪些文件
(4)for file in $(ls -1 pack_wzj  #同上

##遍历文件中内容
(1)for file in $(cat list)  #逐行遍历文件list中的内容
(2)for file in `cat list`   #同上
(3)
cat list | while read _line  # 同上
do
        echo $_line
done
(4)
while read _line         #同上,如果list文件中有多列,此处_line可以写成多个变量,例如while read name age;
do
        echo $_line
done < list

备注:

(A)read是一个命令哦

(B)通过使用ps aux | grep pattern | awk '{print $2}' | while read line   可以找到符合条件的进程号列表,然后进行批量处理。例如,

ps aux | grep -v grep | awk '{print $2}' | while read line; do kill -9 $line; done

(C)使用for快速批量处理的命令

for x in `cat hostlist`; do ( ssh $x "cd /home/wahaha/ && ls -l | tail -1" )& done
for x in `get_instance_by_service AS-MATRIX.NOVA.hz`; do { ssh $x "cd /home/wahaha/ && ls -l | tail -1"; }& done

3.关于条件表达式的一点闲话

if中的条件判断式用的就是[ ]判断符号,因为[ ]用户和test命令几乎一样,所以如果不知道[ ]中某个符号的含义,就是man test看看喽。

多个条件形成一个复合表达式的方式有两种:

            a)写在一个[ ]内:例如,[ exp1 -o exp2 ]

            b)通过逻辑操作符连接多个[ ]:例如,[ exp1 ] || [ exp2 ],[ exp1 ] && [ exp2 ]

Remarks:

            a)例如,[ "$variable" == "Y" -o "$variable" == "y"]与[ "$variable" == "Y" ] || [ "$variable" == "y" ]的含义是一样的

            b)[ exp1 ] || [ exp2 ],[ exp1 ] && [ exp2 ]中的||,&&与cmd1 || cmd2,cmd1 && cmd2中的||,&& 意涵是不一样的。在[ exp1 ] || [ exp2 ],[ exp1 ] && [ exp2 ]中||,&&是逻辑操作符的含义

你可能感兴趣的:(shell scripts的控制逻辑结构自结)