本节所讲内容:
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