您的位置:首页 > 运维架构 > Shell

shell scripts的控制逻辑结构自结

2013-12-09 15:13 399 查看
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 ]中||,&&是逻辑操作符的含义
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: