Shell 进阶(一)for 和 case的用法

流程控制
过程式编程语言:
顺序执行
选择执行
循环执行

1.条件选择if语句
选择执行:
注意:if语句可嵌套
单分支
if 判断条件;then
条件为真的分支代码
fi
单分支相当于cmd1 && cmd2

双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
双分支相当于 cmd1 && cmd2 || cmd3 但是cmd2必须成功

多分支
if 判断条件1; then
条件1为真的分支代码
elif 判断条件2; then
条件2为真的分支代码
elif 判断条件3; then
条件3为真的分支代码
else
以上条件都为假的分支代码
fi

逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句

If示例
1.根据命令的退出状态来执行命令
if ping -c1 -W2 station1 &> /dev/null; then
echo ‘Station1 is UP’
elif grep “station1” ~/maintenance.txt &> /dev/null; then
echo ‘Station1 is undergoing maintenance‘
else
echo ‘Station1 is unexpectedly DOWN!’
exit 1
fi

2.age.shell输入一个年龄数值,显示相应的信息(18岁以下 好好学习天天向上,60岁以下努力工作,60岁以后享受生活,其他输入你不是地球人)

3.写一个脚本areyourich.sh 完成如下逻辑

4.条件判断:case语句

case示例:
1.写个脚本,numcase.sh 输入一个数字,属于1、2、3就显示1,2,3;属于4,5,6就显示4,5,6;属于7,8,9就显示7,8,9;否则就显示“other digit”
read -p “Please input a digit: ” num
case $num in
1|2|3)
echo 1,2,3
;;
4|5|6)
echo 4,5,6
;;
7|8|9)
echo 7,8,9
;;
*)
echo “other digit”
;;
esac

2.写个脚本,menucase.sh。列出菜单点菜
001.rice–2 RMB
002.noodles–15 RMB
003.dumpligs—18 RMB
004.beer— 6RMB

练习
1、编写脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息

2、编写脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息

3、编写脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)

4、编写脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数
正整数:[[ “ num"= [19][09]+ n u m "=   [ 1 − 9 ] [ 0 − 9 ] + ]]

5.循环–循环条件已知的
循环执行
将某代码段重复运行多次
重复运行多少次
循环次数事先已知
循环次数事先未知
有进入条件和退出条件
for, while, until

6.for循环语法一:
for 变量名 in 列表;do
循环体
done
执行机制:
依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束

for循环示例
1.写个脚本sum100-for.sh,,先列出1-100的数字,然后求1-100累加和
for num in {1..100}; do echo “num= num;donesum=0;fornumin1..100;dosum= n u m ” ; d o n e s u m = 0 ; f o r n u m i n 1..100 ; d o s u m = [sum+num]; done;echo sum=$sum

列表生成方式:
(1) 直接给出列表
(2) 整数列表:
(a) {start..end}
(b) (seq [start [step]] end)  
seq 1 2 10   #1-10,步进值=2  
(3) 返回列表的命令
(seq [start [step]] end)  seq 1 2 10   #1-10,步进值=2  (3) 返回列表的命令
(COMMAND)
(4) 使用glob(通配符),如:*.sh
(5) 变量引用;
@ @ *

列表生成脚本示例:
1.写脚本creatuser100-magedu.sh,创建user1…..user100 ,初始密码为magedu,并且首次登录必须修改密码
for i in seg 1 100;do
useradd useri &>/dev/null  
echo magedu | passwd –stdin user
i &>/dev/null  echo magedu | passwd –stdin user
i &>/dev/null
passwd -e user i i >/dev/null
done

2.写脚本scanip.sh,扫描当前网段哪些IP是up的,并记录到文件./ipist.log,顺序执行太慢,所以要用并发执行{}&

./iplist.log #每次追加IP,需要先清空一次免得重复
read -p “Please input network ID (eg:192.168.0.0): ” net
net=echo $net | cut -d. -f1-3 #用户自定义
for i in seq 1 254;do
{if ping -c1 -W1 net. n e t . i &> /dev/null; then
echo “The host net. n e t . i is up”
echo net. n e t . i > ./iplist.log
else echo “The host net. n e t . i is down”
fi} &
done
wait #wait命令,当脚本执行完之后自动回车,显示提示符免得执行完了却不出现提示符

3.写个脚本netid.sh,让用户输入IP地址和子网掩码,计算出网络ID。
read -p “Please input a ip address: ” ip
read -p “Please input a netmask: ” netmask
for i in {1..4} ; do
net=echo $ip | cut -d. -f$i
mask=echo $netmask | cut -d. -f$i
if [ ieq1];thennetid= i − e q 1 ] ; t h e n n e t i d = [net&mask]
else
netid= netid. n e t i d . [net&mask]
fi
done
echo Network ID is $netid

练习:用for实现
1、判断/var/目录下所有文件的类型

2、添加10个用户user1-user10,密码为8位随机字符

3、/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start

4、编写脚本,提示输入正整数n的值,计算1+2+…+n的总和

5、计算100以内所有能被3整除的整数之和

6、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态

7、打印九九乘法表 for99sheet.sh
for i in {1..9};do
for j in seq $i;do
echo -e “ j j ∗ i= (( ( ( j*$i))\t\c”
done
echo
done

8、在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html
随机数:tr -dc ‘0-9a-zA-Z’ < /dev/urandom | head -c8
或者 openssl rand -base64 8
for i in {1..10};do touch $itr -dc '0-9a-zA-Z' < /dev/urandom | head -c8.html;done

9、打印等腰三角形

10.做一个国际象棋棋盘chess.sh
思路:行数和列数 i和j,取模(余数)相同的格子颜色是一样的
for i in {1..8} ; do
temp1= [ [ i % 2 ]

for j in {1..8}; do
temp2= [ [ j % 2 ]
if [ temp1eq t e m p 1 − e q temp2 ];then
echo -e -n “\033[47m \033[0m”
else
echo -e -n “\033[41m \033[0m”
fi
done
echo
done

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值