shell脚本基础知识梳理<四>:流程控制 for
admin
2023-03-12 15:42:06
0

for语句的使用格式
for var in n1,n2,nn
do
指令1
指令2
...
done

for var in item1 item2 ... itemN; do command1; command2… done;

实例1
#!/bin/bash
#使用字面字符串
for x in centos ubuntu gentoo opnesuse
do
echo "$x";
done

#若列表中包含空格字符必须使用引号包含起来
for x in Linux "Gnu Hurd" FreeBSD "Mac OS X"
do
echo "$x";
done
#eval 变量引用
for x in ls "df -h" "du -sh"
do
echo "===$x==" ; eval $x
done

运行结果
[root@localhost shell]# sh for1.sh
centos
ubuntu
gentoo
opnesuse
Linux
Gnu Hurd
FreeBSD
Mac OS X
===ls==
case2.sh case4.sh for1.sh if-elif.sh liu myshell1.sh
case3.sh case.sh if-elif-if-else.sh if-if.sh liub qq
===df -h==
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 27G 5.9G 22G 22% /
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 98M 0 98M 0% /run/user/0
===du -sh==
36K .
[root@localhost shell]#

实例2

!/bin/bash
#使用变量
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in $weekdays ; do
echo "Weekday $((i++)) : $day"
done

#默认是空格若不设定输出的结果是

#Linux
#'Gnu
#Hur'
#FeeBSD
#'Mac
#OS
#X'
#Others

#设定IFS

IFS=:
OSlist="Linux:'Gnu Hur':FeeBSD:'Mac OS X'"
for x in $OSlist Others; do
echo "$x"
done

运行结果
[root@localhost shell]# sh for2.sh
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri
Linux
'Gnu Hur'
FeeBSD
'Mac OS X'
Others
[root@localhost shell]#

实例3

#!/bin/bash
#使用位置变量$@, in $@可以省略

i=1
for day;do
echo -n "位置参数 $((i++)): $day "
case $day in
[Mm]on|[Tt]ue|[Ww]ed|[Tt]hu|[Ff]ri)
echo " (weekday)"
;;
[Ss]at|[Ss]un)
echo " (weekeno)"
;;
*)
echo " (Invalid weekday)"
;;
esac
done

输出结果

[root@zabbix shell]# sh for3.sh mon tue wed thu fri sat sun
位置参数 1: mon (weekday)
位置参数 2: tue (weekday)
位置参数 3: wed (weekday)
位置参数 4: thu (weekday)
位置参数 5: fri (weekday)
位置参数 6: sat (weekeno)
位置参数 7: sun (weekeno)

实例4

#!/bin/bash
#使用文件名或目录
for frname in *
do
#使用命令替换成小写文件名并赋予给变量fn;
fn=$(echo $frname | tr A-Z a-z)
#判断新生产的文件名是否与原名相同,若不同改成小写
if [[ $frname != $fn ]];then mv $frname $fn;fi
#[[ $frname != $fn ]]&& mv $frname $fn
#[[ $frname == $fn ]] || mv $frname $fn
done

运行结果

[root@zabbix shell]# touch ABC
[root@zabbix shell]# mkdir qwe
[root@zabbix shell]# sh for4.sh
[root@zabbix shell]# ll
总用量 8
-rw-r--r-- 1 root root 0 8月 26 15:23 abc
-rw-r--r-- 1 root root 330 8月 26 15:11 for3.sh
-rw-r--r-- 1 root root 218 8月 26 15:23 for4.sh
drwxr-xr-x 2 root root 6 8月 26 15:23 qwe

实例5

#!/bin/bash
for i in *.zip
do
#去掉尾部是.zip部分
j="${i%.zip}";mkdir "$j" && unzip -d "$j" "$i"
echo $j
#j="${i%.zip}"
#echo $j
done

执行结果

[root@zabbix shell]# sh for5.sh
Archive: adf.zip
extracting: adf/abc
inflating: adf/for3.sh
inflating: adf/for4.sh
extracting: adf/qq.zip
creating: adf/qwe/
extracting: adf/we.zip
adf
Archive: qq.zip
extracting: qq/abc
inflating: qq/for3.sh
inflating: qq/for4.sh
creating: qq/qwe/
extracting: qq/we.zip
qq
Archive: we.zip
extracting: we/abc
inflating: we/for3.sh
inflating: we/for4.sh
creating: we/qwe/
we

实例 6

!/bin/bash
#用命令的执行结果作为列表
i=1
for usrname in awk -F: '{print $1}' /etc/passwd
do
echo "Username $((i++)) : $usrname"
done
echo "***"
for line in $(cat /etc/yum.conf|egrep -v "^/|^#")
do
echo "$line"
done

echo "seq 生成序列"
for suffix in $(seq 5)
do
echo "192.168.1.${suffix}"
done

echo "***"
for f in $(ls /var/);do
echo $f
done

执行结果

Username 10 : operator
Username 11 : games
Username 12 : ftp
Username 13 : nobody
Username 14 : systemd-network
Username 15 : dbus
Username 16 : polkitd
Username 17 : sshd
Username 18 : postfix
Username 19 : chrony
Username 20 : www
Username 21 : mysql
Username 22 : saslauth
Username 23 : zabbix
Username 24 : grafana
Username 25 : ntp


[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_repo
rt_page.php?category=yum
distroverpkg=centos-release


192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5


adm
cache
crash
db
empty
games
gopher

实例7

#!/bin/bash
#判断host
for host in cat /etc/hosts
do
if ping -c1 -w2 $host &>/dev/null
then
echo "Host (${host}) is active."
else
echo "Host (${host}) is down."
fi
done

执行结果

root@zabbix shell]# sh for7.sh
Host (127.0.0.1) is active.
Host (localhost) is active.

实例8

#!/bin/bash
#使用数值
myip="192.168.0"
for num in {1..5}
do
echo "IPAddr $num: $myip.$num"
done

#步长
for num in {1..10..2}
do
echo "Number: $num"
done

执行结果

[root@zabbix shell]# sh for8.sh
IPAddr 1: 192.168.0.1
IPAddr 2: 192.168.0.2
IPAddr 3: 192.168.0.3
IPAddr 4: 192.168.0.4
IPAddr 5: 192.168.0.5
Number: 1
Number: 3
Number: 5
Number: 7
Number: 9

实例 9

#!/bin/bash
for x in {1..5}
do
useradd user${x}
#stdin是接收echo后面的字符串作为密码。stdin是非交换直接传入密码
#passwd 默认是要用终端作为标准输入。加上--stdin可以用任意的做标准输入
echo "centos"|passwd --stdin user${x}
#使用户第一登陆修改密码;chage密码失效命令 -d 上次更改的时间
chage -d 0 user${x}
done

执行结果

[root@localhost shell]# sh for3.sh
Changing password for user user1.
passwd: all authentication tokens updated successfully.
Changing password for user user2.
passwd: all authentication tokens updated successfully.
Changing password for user user3.
passwd: all authentication tokens updated successfully.
Changing password for user user4.
passwd: all authentication tokens updated successfully.
Changing password for user user5.
passwd: all authentication tokens updated successfully.
[root@localhost shell]# ls /home/
user1 user2 user3 user4 user5

重新开个终端用新的用户等如: user1
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user user1.
Changing password for user1.
(current) UNIX password:

实例 10

!/bin/bash
#for嵌套
for i in 0 1;do
for suffix in {1..5}
do
ip=192.168.$i.${suffix}
if ping -c1 -w2 $ip &>/dev/null
then
echo "$ip is active."
else
echo "Host ($ip) is down."
fi
done
done

执行结果

[root@localhost shell]# sh for4.sh
Host (192.168.0.1) is down.
Host (192.168.0.2) is down.
Host (192.168.0.3) is down.
Host (192.168.0.4) is down.
Host (192.168.0.5) is down.
Host (192.168.1.1) is down.
Host (192.168.1.2) is down.
Host (192.168.1.3) is down.
Host (192.168.1.4) is down.
Host (192.168.1.5) is down.

实例 11

#!/bin/bash
#C语言方式
for ((i=0;i<10;i++))
do
echo $i;
done

for (( i=1; i <= 10; i++ ))
do
echo "$i: $RANDOM"
done

for ((i=1,j=10; i <=5 ; i++, j=j+5))
do
echo "number $i: $j"
done

执行结果

[root@localhost shell]# sh for-c.sh
0
1
2
3
4
5
6
7
8
9
1: 15561
2: 14731
3: 31575
4: 15783
5: 17317
6: 3162
7: 5176
8: 4272
9: 5116
10: 2811
number 1: 10
number 2: 15
number 3: 20
number 4: 25
number 5: 30

实例 12

#!/bin/bash
#
#C语言格式for
s=0
for ((i=1;i<=100;i++))
do
let s=$s+$i
done
echo sum(1..100)=$s

for ((s=0,i=1;i<=100;i++))
do
((s+=i))
done
echo sum(1..100)=$s

for ((s=0,i=1;i<=100;s+=i,i++))
do
:
done
echo sum(1..100)=$s

执行结果

[root@localhost shell]# sh for-c2.sh
sum(1..100)=5050
sum(1..100)=5050
sum(1..100)=5050

相关内容

热门资讯

老人在直播间疯狂刷火箭 周佳欣、郑凯丹、朱娅、蒋婉、黄铃、王佳、李婉晴/文64岁的王雅达又往直播间里刷了一枚“火箭”。屏幕上...
汉坦病毒阳性乘客在乌斯怀亚港登... 自世卫组织(WHO)5月6日公布荷兰泛海探险公司(Oceanwide Expeditions)旗下极...
冰箱不制冷的原因有哪几种 冰箱的电压在正常的情况下,压缩机没有正常的运转,而且有噪声和旋转的声音,压缩机一旦出现故障,冰箱就会...
电视有哪几种方法 电视是我们生活中非常重要的一种媒介,它可以为我们带来大量的信息、乐趣和娱乐。在现代社会中,电视的使用...
装修风格有哪几种(今年流行的装... 摘要:装修的方式有很多种,下面这些就是我们在装修中常用的一种。①现代风,也叫功能派风,这个装修风格的...
大红鹰瓷砖哪里生产的 最佳回答 大红鹰瓷砖是广东佛山非常有名的一个瓷砖老品牌,据说这个品牌的瓷砖是在1974年成立的,老一...
走廊墙面怎么装饰 走廊的装修一定要简洁,因为是每天都会路过的地方,一般走廊装修都只是刷一个白墙或者是对走廊的颜色进行处...
苏巧慧阵营影射李四川家族涉黑,... 海峡导报综合报道 新北市长选战硝烟渐起,身处苏巧慧阵营的新北市议员翁震州发文质疑李四川家族在小琉球做...
红场阅兵后,普京同军官握手致意 据凤凰卫视报道,5月9日,俄罗斯胜利日阅兵接近尾声,普京与军官一一握手致意。
车间里走出“准工程师”——黄河... 3500元项目津贴,三个真实项目研发经历,一份实习期月薪8000多元的录用通知——这是工学部2022...