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

SHELLcase流程控制和for、while循环语句的使用

2016-05-19 11:51 886 查看
本节所讲内容:

case : 流程控制语句
循环语句for…done语句
使用(())
扩展shell中算数运算算使用方法

循环语句嵌套

case : 流控制语句
适用于多分支
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
……
*)
默认命令序列
esac

执行流程:
首先使用“变量值”与模式1进行比较,若取值相同则执行模式1后的命令序列,直到遇见双分号“;;”后跳转至esac,表示分支结束;若与模式1不相匹配,则继续与模式2 进行比较,若取值相同则执行模式2 后的命令序列,直到遇见双分号“;;”后跳转至esac,表示结束分支,……依次类推,若找不到任何匹配的值,则执行默认模式“*)”后的命令序列,直到遇见esac后结束分支
[root@xuegod60 ~]# vimcase.sh

#!/bin/bash

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

echo " 1) Copy "

echo " 2) Delete "

echo " 3) Backup "

echo " 4) Quit "

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

read -p "PleaseInput your selection" op

case $op in

1)

echo "Your selection is Copy"

;;

2)

echo "Your selection isDelete"

;;

3)

echo "Your selection isBackup"

;;

4)

echo "Program is stopping!"

;;

*)

echo "Invaild selection!"

;;

esac

[root@xuegod60 ~]# chmod+x case.sh

[root@xuegod60 ~]#./case.sh

******************************************

1) Copy

2) Delete

3) Backup

4) Quit

******************************************

循环语句for…done语句
格式:
for 变量 in
名字表

do
命令列表
done

批量添加用户
先准备一个员工名称列表文件
[root@xuegod60 ~]# vimname.txt

swk

zbj

swj

txz

执行:

[root@xuegod60 ~]# vimfor.sh

#!/bin/bash

ULIST=$(cat/root/name.txt)

for UNAME in $ULIST

do

useradd $UNAME

echo "123456" | passwd--stdin $UNAME &> /dev/null

done

[root@xuegod60 ~]# chmod+x for.sh

[root@xuegod60 ~]#./for.sh

[root@xuegod60 ~]# tail/etc/passwd

avahi:x:70:70:AvahimDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

sshd:x:74:74:Privilege-separatedSSH:/var/empty/sshd:/sbin/nologin

ntp:x:38:38::/etc/ntp:/sbin/nologin

tcpdump:x:72:72::/:/sbin/nologin

rm:x:1000:1000:rm:/home/rm:/bin/bash

swk:x:1001:1001::/home/swk:/bin/bash

zbj:x:1002:1002::/home/zbj:/bin/bash

swj:x:1003:1003::/home/swj:/bin/bash

txz:x:1004:1004::/home/txz:/bin/bash

While循环语句
格式:
while 条件
do
命令
done

注意:
避免陷入死循环
While true
While false

求10以内的自然数的平方值。如: 1*1=1 2*2=4 3*3=9 。。。
[root@xuegod60 ~]# vimsquare.sh

#!/bin/bash

num=1

while [ $num -lt 10 ]

do

square=$(expr $num \* $num)

echo $square

let num++

done

[root@xuegod60 ~]# chmod+x square.sh

[root@xuegod60 ~]#./square.sh

1

4

9

16

25

36

49

64

81

没有开发基础,了解一下:

使用(()) 扩展shell中算数运算的使用方法
使用 ”[] ”时候,必须保证运算符与算数之间有空格。四则运算也只能借助:expr命令完成。今天讲的双括号”(())”结构语句,就是对shell中算数及赋值运算的扩展。
使用方法:
语法:
((表达式1,表达式2…))
特点:
1、在双括号结构中,所有表达式可以像c语言一样,如:a++,b--等。 a=a+1
2、在双括号结构中,所有变量可以不加入:“$”符号前缀。
3、双括号可以进行逻辑运算,四则运算
4、双括号结构 扩展了for,while,if条件测试运算
5、支持多个表达式运算,各个表达式之间用逗号“,”分开
例:
依次输出小于100的2的幂值,1 2 4 8 1632 64

echo "The while loopexample."

echo

VAR1=1

while ((VAR1<100))

do

echo "Value of the variable is :$VAR1"

((VAR1=VAR1*2))

done

echo

echo "The loopexecution is finished"

[root@xuegod60 test]# chmod +x\(\(\)\).sh

[root@xuegod60 test]#./\(\(\)\).sh

The while loop example.

Value of the variable is : 1

Value of the variable is : 2

Value of the variable is : 4

Value of the variable is : 8

Value of the variable is : 16

Value of the variable is : 32

Value of the variable is : 64

The loop execution is finished

循环语句嵌套:
#!/bin/bash
for 变量1 in
do
for 变量2 in
do
命令2
done
命令1
done
例1:使用特殊符号打印三角形。要求整个程序要有交互,运行时可以自动输入打印的行数和用于描绘三角形的特殊符号。执行结果如下:
Please Enter the line number:5
Please Enter the char number:*
*
**
***
****
*****

[root@xuegod60 test]# vimsanjao.sh#!/bin/sh

read -p "Please Enter theline number:" Line

read -p "Please Enter thechar number:" char

a=1

while [ $a -le $Line ]

do

b=1

while [ $b -le $a ]

do

echo -n "$char"

b=`expr $b + 1`

done

echo

a=`expr $a + 1`

done

执行

[root@xuegod60 test]# ./sanjao.sh

Please Enter the line number:5

Please Enter the char number:*

*

**

***

****

*****

例2:

*

***

*****

分析:
1、外层控制输出几行
2、内层循环1:每行输出空格的个数
内层循环2:每行输出的*的个数

每行*个数:2n-1

每行空格个数:总行数-当前行号

#!/bin/sh

read -p "Please Enter anumber:" Line #获取号行

for ((i=1; i<=Line; i++)) #使用行号来控制一共循环的次数

do

for ((j=Line-i; j>0; j--)); # 指定每一行输出的空格数。第一行需要输出2个空格,第二行需要输出1个,第三行输出0个空格

。 得出结论,空格数等于: 总行数Line-当前行号

do

echo -n ' '

done

for ((h=1; h<=((2*i-1)); h++)) #第一行一个*,第二行两个*,第三个5个*。 每个*数等于: 当前行号x2-1

do

echo -n '*' #输出内容时,不换行

done

echo

done
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: