前言
在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其它命令相同,当面对各种列表重复任务时,使用循环语句可以很好的解决类似问题
一、for循环
1、批量创建用户
创建包含用户名文件
[root@pc1 ~]# vi 1.txt
aaa
bbb
ccc创建shell脚本
[root@pc1 ~]# vi sh
#!/bin/bash
a=`cat /root/1.txt`
for uname in $a
do
useradd $uname
echo 123456 | passwd --stdin $uname &>/dev/null
done
2、批量删除用户
删除用户时备份用户目录及目录下所有文件)
创建包含要删除用户名的文件
[root@pc1 ~]# vi 1.txt
aaa
bbb
ccc创建要备份到的目录
[root@pc1 ~]# mkdir /userhome_back创建shell脚本
[root@pc1 ~]# vi sh
#!/bin/bash
a=`cat /root/1.txt`
for uname in $a
do
b=$(ls -lh /home/$uname | awk '{print $2}')
if [[ $b != 0 ]]
then cp -r /home/$uname /userhome_back &>/dev/null
fi
userdel -r $uname
done
3、识别执行文件
找出某目录下的具有执行权限文件
[root@pc1 ~]# vi sh
#!/bin/bash
a=`ls -l $1 | awk '{print $9}'`
for wenjian in $a
do
[ -d /root/$wenjian ]
if [ $? -eq 0 ]
then continue
fi
[ -x /root/$wenjian ]
if [ $? -eq 0 ]
then echo /root/$wenjian 该文件具有执行权限
fi
done[root@pc1 ~]# sh sh 目录
4、识别文件和目录
列出某目录下的所有文件及目录以及有执行权限的文件
[root@pc1 ~]# vi sh
#!/bin/bash
ls -l $1 | awk '{print $9}' > $1/mulu.txt
a=`cat $1/mulu.txt`
for b in $a
do
test -f $1/$b
if [ $? -eq 0 ]
then test -x $1/$b
else echo $1/$b 是目录
continue
fi
if [ $? -eq 0 ]
then echo $1/$b 是有执行权限的文件
else echo $1/$b 是没有执行权限的文件
fi
done[root@pc1 ~]# sh sh 目录
5、ping多个主机
检测多个ip主机是否可以ping通
创建要ping的ip列表文件
[root@pc1 ~]# vi 1.txt
192.168.1.1
114.114.114.114
baidu.com创建shell脚本
[root@pc1 ~]# vi sh
#!/bin/bash
a=`cat $1`
for b in $a
do
ping -c 3 -i 0.2 -W 3 $b &>/dev/null
if [[ $? -eq 0 ]]
then echo $b 可以ping通
else echo $b 无法ping通
fi
done[root@pc1 ~]# sh sh 1.txt
6、计算工资
计算多个员工工资
创建员工名字及加班天数列表文件
[root@pc1 ~]# vi 1.txt
张三:3
李四:3
王五:5
赵六:6创建shell脚本
[root@pc1 ~]# vi sh
#!/bin/bash
dixin=8000
a=`cat $1 | awk -F: '{print $1}'`
for b in $a
do
tianshu=$(cat $1 | grep $b | awk -F: '{print $2}')
gongzi=$(expr "$dixin" + 100 \* "$tianshu")
echo $b工资为:$gongzi
done[root@pc1 ~]# sh sh 1.txt
张三工资为:8300
李四工资为:8300
王五工资为:8500
赵六工资为:8600
二、while循环
1、创建用户
批量创建名称有顺序规律的用户
[root@pc1 ~]# vi sh
#!/bin/bash
a=1
while [ $a -le 10 ]
do
name="yh$a"
useradd $name
echo 123456 | passwd --stdin $uname &>/dev/null
let a++
done[root@pc1 ~]# sh sh
[root@pc1 ~]# cat /etc/passwd | tail -10
yh1:x:1024:1024::/home/yh1:/bin/bash
yh2:x:1025:1025::/home/yh2:/bin/bash
yh3:x:1026:1026::/home/yh3:/bin/bash
yh4:x:1027:1027::/home/yh4:/bin/bash
yh5:x:1028:1028::/home/yh5:/bin/bash
yh6:x:1029:1029::/home/yh6:/bin/bash
yh7:x:1030:1030::/home/yh7:/bin/bash
yh8:x:1031:1031::/home/yh8:/bin/bash
yh9:x:1032:1032::/home/yh9:/bin/bash
yh10:x:1033:1033::/home/yh10:/bin/bash
2、删除用户
批量删除名称有顺序规律的用户(备份用户目录及目录下所有文件)
创建要备份到的目录
[root@pc1 ~]# mkdir /userhome_back创建shell脚本
[root@pc1 ~]# vi sh
#!/bin/bash
a=1
while [ $a -le 10 ]
do
name="yh$a"
b=$(ls -l /home/$name | awk '{print $2}')
if [ "$b" != 0 ]
then cp -r /home/$name /userhome_back &>/dev/null
fi
userdel -r $name
let a++
done
3、猜价格
猜测商品价格
[root@pc1 ~]# vi sh
#!/bin/bash
a=666
TIMES=0
echo 商品价格为0~1000
while true
do
read -p "输入你猜测的价格:" b
let TIMES++
if [ $b -eq $a ]
then echo 价格正确,商品价格为$a,你输入了$TIMES次
exit 0
elif [ $b -gt $a ]
then echo 过高
else echo 过低
fi
done
三、until循环
1、创建顺序用户
批量创建名称有顺序规律的用户
[root@pc1 ~]# vi sh
#!/bin/bash
a=1
until [ $a -ge 10 ]
do
name="yh$a"
useradd $name
echo 123456 | passwd --stdin $uname &>/dev/null
let a++
done[root@pc1 ~]# sh sh
2、计算整数和
计算1~10的和(1+2+3+.....+10)
[root@pc1 ~]# vi sh
#!/bin/bash
a=0
b=0
until [ $a -eq $1 ]
do
let a=$a+1
let b=$a+$b
done
echo 从1到"$1"的和为:$b[root@pc1 ~]# sh sh 10
从1到10的和为:55
3、计算奇数和
计算1~11的奇数和(算奇数不能用偶数做为结束数值)
[root@pc1 ~]# vi sh
#!/bin/bash
a=-1
b=0
until [ $a -eq $1 ]
do
let a=$a+2
let b=$a+$b
done
echo 从1到"$1"的奇数和为:$b[root@pc1 ~]# sh sh 11
从1到11的奇数和为:36或
[root@pc1 ~]# vi sh
#!/bin/bash
a=1
b=0
until [ $a -gt $1 ]
do
let b=$a+$b
let a=$a+2
done
echo 从1到"$1"的奇数和为:$b[root@pc1 ~]# sh sh 11
从1到11的奇数和为:36
4、计算偶数和
计算1~10的偶数和(算偶数不能用奇数做为结束数值)
[root@pc1 ~]# vi sh
#!/bin/bash
a=0
b=0
until [ $a -eq $1 ]
do
let a=$a+2
let b=$a+$b
done
echo 从1到"$1"的偶数和为:$b[root@pc1 ~]# sh sh 10
从1到10的偶数和为:30
四、多循环语句
1、整数运算格式
[root@pc1 ~]# a=$(expr 3 \* 3)
[root@pc1 ~]# echo $a
9[root@pc1 ~]# a=$((3*3))
[root@pc1 ~]# echo $a
9[root@pc1 ~]# a=$[3*3]
[root@pc1 ~]# echo $a
9[root@pc1 ~]# let a=3*3
[root@pc1 ~]# echo $a
9
2、echo用法
echo
-n 不换行输出,不显示行尾的换行符
-e 允许对列出的加反斜线转义的字符进行解释,将转义后的内容输出\b 退格符,"\b"表示删除前一个字符,"\b\b"表示删除前两个字符
\c 不换行输出,在"\c"后面不存在字符的情况下,作用相当于echo -n;但是当"\c"后面存在字符时,"\c"后面的字符将不会被输出
\f 换页符,换行后的新行的开头位置连接着上一行的行尾
\n 换行符,换行,被输出的字符从"\n"处开始另起一行
\r 回车符,光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖
\t 水平制表符,表示插入tab,即横向制表符
\v 纵向制表符
\\ 表示插入"\"本身
3、乘法表
[root@pc1 ~]# vi sh
#!/bin/bash
for ((a=1;a<=9;a=a+1))
do
for ((b=1;b<=a;b++))
do
echo -ne ""$b"x"$a"="$((a*b))" \t"
done
echo
done[root@pc1 ~]# sh sh
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81或
[root@pc1 ~]# vi sh
#!/bin/bash
for a in {1..9}
do
for b in {1..9}
do
if [ $b -le $a ]
then echo -ne "$b"×"$a"=$((a*b))\\t
fi
done
echo
done[root@pc1 ~]# sh sh
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
4、正方形
[root@pc1 ~]# vi sh
#!/bin/bash
for ((a=1;a<=3;a++))
do
for ((b=1;b<=3;b++))
do
echo -n "* "
done
echo
done[root@pc1 ~]# sh sh
5、长方形
[root@pc1 ~]# vi sh
#!/bin/bash
for ((a=1;a<=3;a++))
do
for ((b=1;b<=6;b++))
do
echo -n "* "
done
echo
done
6、直角三角形
[root@pc1 ~]# vi sh
#!/bin/bash
for ((a=1;a<=6;a++))
do
for ((b=1;b<=a;b++))
do
echo -n "* "
done
echo
done[root@pc1 ~]# sh sh
*
* *
* * *
* * * *
* * * * *
* * * * * *或
[root@pc1 ~]# vi sh
#!/bin/bash
a=1
while [ $a -le 6 ]
do
b=1
while [ $b -le $a ]
do
echo -n "* "
b=$(($b+1))
done
echo
a=$(($a+1))
done[root@pc1 ~]# sh sh
*
* *
* * *
* * * *
* * * * *
* * * * * *或
[root@pc1 ~]# vi sh
#!/bin/bash
for ((a=1;a<=6;a++))
do
for ((b=1;b<$a;b++))
do
echo -n
done
for ((c=7-$b;c>0;c--))
do
echo -n "* "
done
echo
done[root@pc1 ~]# sh sh
* * * * * *
* * * * *
* * * *
* * *
* *
*
7、等腰三角形
[root@pc1 ~]# vi sh
#!/bin/bash
for ((a=1;a<=6;a++))
do
for ((b=1;b<$a;b++))
do
echo -n " "
done
for ((c=7-$b;c>0;c--))
do
echo -n "* "
done
echo
done[root@pc1 ~]# sh sh
* * * * * *
* * * * *
* * * *
* * *
* *
*或
[root@pc1 ~]# vi sh
#!/bin/bash
for ((a=1;a<6;a++))
do
for ((b=6;b>=a;b--))
do
echo -n " "
done
for ((c=1;c<=a;c++))
do
echo -n "* "
done
echo
done[root@pc1 ~]# sh sh
*
* *
* * *
* * * *
* * * * *
8、菱形
[root@pc1 ~]# vi sh
#!/bin/bash
read -p "请输入菱形边长:" z
for a in `seq 1 $z`
do
for ((b=$z-1;b>=$a;b--))
do
echo -n " "
done
for ((c=1;c<=$a;c++))
do
echo -n "* "
done
echo
donefor a in `seq 1 $z`
do
for ((f=1;f<=$a;f++))
do
echo -n " "
done
for ((e=$z-1;e>=$a;e--))
do
echo -n "* "
done
echo
done[root@pc1 ~]# sh sh
请输入菱形边长:3
*
* *
* * *
* *
*
9、梯形
[root@pc1 ~]# vi sh
#!/bin/bash
read -p "输入梯形高度:" z
for ((a=1;a<=$z;a++))
do
for ((b=$z;b>=$a;b--))
do
echo -n " "
done
for ((c=1;c<=$a*2;c++))
do
echo -n "*"
done
for ((d=1;d<=$a*2;d++))
do
echo -n "*"
done
echo
done[root@pc1 ~]# sh sh
输入梯形高度:3
****
********
************
结语
shell作为一种脚本编程语言,包含了循环、分支等其它程序控制结构,从而能够轻松完成更加复杂、强大的功能
版权声明:本文为博主「1风天云月」的原创文章,版权归原作者所有。
阿里云链接:https://developer.aliyun.com/article/871949
CSDN链接:https://blog.csdn.net/le616616/article/details/122953961