shell 编程值循环语句

一.循环语句

1.for 语句的结构

(1)for in 循环

读取不同的变量值,用来逐个执行同一组命令

for   变量名   in   取值列表                         for     收件人     in    邮件地址列表

do                                                              do

  命令序列                                                     发送邮件

done                                                          done

[root@localhost opt]# for i in 1 2 3 4 5
> do 
> echo "进行了 $i 次跳舞 "
> done
进行了 1 次跳舞 
进行了 2 次跳舞 
进行了 3 次跳舞 
进行了 4 次跳舞 
进行了 5 次跳舞 
[root@localhost opt]# vim name.txt
A
.....
L
[root@localhost opt]# for name in `cat name.txt`
>do
> echo $name
> done
A
.....
L
[root@localhost opt]# for name in `cat name.txt`
> do
> useradd $name
> done
     #进入/etc/passwd 文件中可以查看到创建的用户
[root@localhost opt]# vim /etc/passwd
A:x:1001:1001::/home/A:/bin/bash
B:x:1002:1002::/home/B:/bin/bash
C:x:1003:1003::/home/C:/bin/bash
D:x:1004:1004::/home/D:/bin/bash
E:x:1005:1005::/home/E:/bin/bash
F:x:1006:1006::/home/F:/bin/bash
G:x:1007:1007::/home/G:/bin/bash
H:x:1008:1008::/home/H:/bin/bash
I:x:1009:1009::/home/I:/bin/bash
J:x:1010:1010::/home/J:/bin/bash
K:x:1011:1011::/home/K:/bin/bash
L:x:1012:1012::/home/L:/bin/bash

[root@localhost opt]# for name in `cat name.txt`
> do
> echo 123456 | passwd --stdin $name
> done
更改用户 A 的密码 。
passwd:所有的身份验证令牌已经成功更新。
.......
更改用户 L 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost opt]# for name in `cat name.txt`
> do
> echo 123456 | passwd --stdin $name &> /dev/null   #加上混合输出可以省略提示
> done
[root@localhost opt]# for i in {1..10}
> do
> echo "进行 $i 次跳舞"
> done
进行 1 次跳舞
进行 2 次跳舞
进行 3 次跳舞
进行 4 次跳舞
进行 5 次跳舞
进行 6 次跳舞
进行 7 次跳舞
进行 8 次跳舞
进行 9 次跳舞
进行 10 次跳舞

(2)for ((变量=初始值;变量范围;变量的迭代方式))  循环

格式:for ((i=1;i<10;i++))

[root@localhost opt]# for ((i=1; i<10; i++)); do echo $i; done
1
2
3
4
5
6
7
8
9
[root@localhost opt]# echo $i
10
[root@localhost opt]# echo $i
10

 for循环实现多线程

for ((i=1; i<=10; i++))
do
  {
    命令序列
     ....
  }&          #将每次循环的进程都放入后台自行运行
done
wait          #等待上面所有循环的进程都执行完毕后再执行后面的命令
   命令序列

IFS  for循环取值列表分隔符 
set | grep IFS  -->  IFS=$' \t\n'    默认包含 空格、制表符、换行符

求字符串分片  ${变量:下标:长度}     #下标从0开始
求字符串长度  ${#变量}
求随机数      $RANDOM         #0~32767
求0到N-1之间的随机数    $[RANDOM % N] 

2.for 循环的实践

要创建 .sh 结尾的脚本;且完成循环的配置后要给脚本文件加上 x 执行权限(使用chmod +x)

(1)计算从1到100所有整数的和

#!/bin/bash
#计算从1到100所有整数的和
 
sum=0
for i in {1..100};
do
    sum=$(($i+$sum))
done
    echo "$sum"

(2)求提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和

#!/bin/bash
#提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和
 
# 提示用户输入一个小于100的整数
read -p "请输入一个小于100的整数:" number
 
# 初始化求和变量为0
sum=0
 
# 使用for循环计算从1到用户输入数字的整数和
for (( i=1; i<=$number; i++ )); do
    sum=$((sum + i))
done
 
# 输出结果
echo "从1到 $number 的所有整数的和为:$sum"

(3)求从1到100所有整数的偶数和、奇数和

#!/bin/bash  
#求从1到100所有整数的偶数和、奇数和
  
# 初始化偶数和奇数的和为0  
JSsum=0  
OSsum=0
  
# 使用for循环遍历从1到100的所有整数
for i in {1..100}  
do  
    # 检查当前数字是偶数还是奇数  
    if (( $i % 2 == 0 )); then  
        # 如果是偶数,则加到偶数和上  
        OSsum=$((OSsum + i))  
    else  
        # 如果是奇数,则加到奇数和上  
        JSsum=$((JSsum + i))  
    fi  
done  
  
# 输出结果  
echo "从1到100的所有整数的偶数和为:$OSsum"  
echo "从1到100的所有整数的奇数和为:$JSsum"

(4)编写能够自动生成一个6位随机密码的脚本

#!/bin/bash
#编写能够自动生成一个6位随机密码的脚本
 
STR="0123456789qwertyuiopasdfghjklzxcvbnm"
 
for ((i=1;i<=6;i++))
do
  num=$[RANDOM % ${#STR}]
  passwd=${STR:num:1}
 
  password+=$passwd
done
 
echo "6位随机密码为 $password"

3.while 语句的结构

while  条件测试操作                              while  未猜中正确价值

do                                                          do

  命令序列                                                 反复猜测商品价格

done                                                      done

while 循环
while [ 条件表达式 ]          #条件成立时才会循环执行do里面的命令序列
do
    命令序列
    ....
    变量的迭代方式
done

从文件读取行内容循环
cat 文件 | while read 变量
do
    命令序列
    ....
done

while read 变量
do
    命令序列
    ....
done < 文件

[root@localhost for]# a=1
[root@localhost for]# while [ $a -le 10 ]
> do
> echo $a
> let a++
> done
1
2
3
4
5
6
7
8
9
10
[root@localhost for]# echo $a
11

4.while 循环的实践

(1)计算从1到100所有整数的和

#!/bin/bash
#计算从1到100所有整数的和
 
a=1
sum=0
while [ $a -le 100 ]
do
  sum=$[ sum + $a ]
  let a++
done
 
echo "1到100的和为 $sum"

(2)提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和

#!/bin/bash
#提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和
 
a=1
sum=0
read -p "请输入一个小于100的整数:" num
 
if [ $num -ge 1 ] && [ $num -le 100 ];then
 
while [ $a -le $num ]
do
  let sum+=a
  let a++
done
 
echo "从1到该数之间所有整数的和为:$sum "
else
  echo "输入有误!"
fi

(3)求从1到100所有整数的偶数和、奇数和

#!/bin/bash 
#求从1到100所有整数的偶数和、奇数和
 
a=1
 
jisum=0
ousum=0
while [ $a -le 100 ]
do
  b=$[ a % 2 ]
  if [ $b -eq 0 ];then
    let ousum+=$a
  else
    let jisum+=$a
  fi
  let a++
done
 
echo -e "从1到100的所有整数的偶数和为:$ousum\n 奇数和为:$jisum"  

 (4)用户输入密码,脚本判断密码是否正确,正确密码为123456,输入正确提示正确信息,连>续输错3次则报警

#!/bin/bash
#用户输入密码,脚本判断密码是否正确,正确密码为123456,输入正确提示正确信息,连续输错3次则报警
i=1
while [ $i -le 3 ]
 do
   read -p "请输入密码:" passwd
   if [ "$passwd" == "123456" ];then
    echo "密码正确"
    exit 0
   else
     echo "密码错误"
   fi
   let i++
 done
echo "警告,密码已输错三次"

(5)编写能够自动生成一个6位随机密码的脚本

#!/bin/bash
#编写能够自动生成一个6位随机密码的脚本
 
i=0
STR="0123456789qwertyuiopasdfghjklzxcvbnm"
 
while [ $i -lt 6 ]
do
  num=$[RANDOM % ${#STR}]
  passwd=${STR:num:1}
  password+=$passwd
 
let i++
done
echo "6位随机密码为 $password"

5.until 语句的结构

重复测试某个条件,只要条件不成立就反复执行(和while相反)

until 条件测试操作                     while 未超过10

do                                                   do

   命令序列                                         数字依次递增

done                                              done

拓展:常用转义符

echo  -n 表示不换行输出

echo -e 输出转义字符,将转义后的内容输出到屏幕上

\b 转义后相当于按退格键(backspacp),但前提是 "\b" 后面存在字符: "\b" 表示删除前一个字符,”

\b\b“ 表示删除前两个字符

\c  不换行输出,在 ”\c“ 之后面不存在字符的情况下,作用相当于 echo -n ;但是当 ”\c“ 后面任然

存在字符时,"\c" 后面的字符将不会输出。

\n 换行,被输出的字符从 ”\n“ 处开始另起一行

\f 换行,但是换行后的新行的开头位置连接着上一行的行尾

\v  与\f 相同

\t 转以后表示插入tab,即横向制表符

\r 光标移至行首,但是不会换行,相当于使用”\r“ 以后的字符覆盖”\r“之前同等长度的字符;但是当"\r" 后面不存在的任何字符,”\r“前面的字符不会被覆盖

\\ 表示插入” \ “ 本身

6.多重循环

(1)将一个点分十进制格式的IP地址转换成点分二进制格式

#!/bin/bash
#将一个点分十进制格式的IP地址转换成点分二进制格式
IP="192.168.80.30"
 
n=0
 
#外循环分割出IP的每段数值
for ((i=1; i<=4; i++))
do
     num=${IP%%.*}
     IP=${IP#*.}
     #echo $num
     #每次开始内循环前将result变量值清空 
     result=''
     #内循环使用余数倒排法进行数值转换
     for j in {1..8}
     do
         yushu=$[num % 2]
         num=$[num / 2]
 
         result=$yushu$result
     done
     let n++
     #使用n变量作为计数器,当n=4即转换IP的第4段数值后不再使用echo -n
     if [ $n -lt 4 ];then
         echo -n ${result}.
     else
         echo $result
     fi
done

 (2)输出PATH环境变量的目录里所有以se开头的不可执行文件

#!/bin/bash
#输出PATH环境变量的目录里所有以se开头的不可执行文件
IFS_OLD=$IFS
IFS=$IFS':'
 
for folder in $PATH
do
   file=$(find $folder -name "se*" 2> /dev/null)
   for i in $file
   do
       if [ ! -x $i ];then
           echo $i
       fi
   done
done
 
IFS=$IFS_OLD

(3)输出一个99乘法表

(4)输出一个正直角三角形

#!/bin/bash
#正直角三角形
 
#外循环控制三角的行数
for ((a=9; a>=1; a--))
do
    #内循环控制每行输出的 * 的数量,第一行输出一个*,每行递增
    for ((b=9; b>=a; b--))
    do 
        echo -n "*"
    done
    echo ""
done

 (5)输出一个倒直角三角形 

#!/bin/bash
#倒直角三角形
 
#外循环控制行数
for ((a=1; a<=9; a++))
do
    #内循环控制每行输出的*数量,第一行输出最多,每行做递减
    for ((b=9; b>=a; b--))
    do
        echo -n "*"
    done
    echo ""
done

(6)输出一个等腰三角形

#!/bin/bash
#等腰三角形
 
read -p "请输入三角形的大小数值:" num
 
#控制三角形的行数
for ((a=1; a<=num; a++))
do
    #输出倒三角每行的空格数,第一行4个,第二行3个,每行做递减
    for ((i=num; i>a; i--))
    do
        echo -n " "
    done
    #输出等腰三角每行的*数,第一行输出1个,第二行3个,第三行5个,以此类推
    c=$[(a*2)-1]
    for ((b=1; b<=c; b++))
    do
        echo -n "*"
    done
    echo ""
done

(7)输出一个菱形

#!/bin/bash
#菱形
read -p "请输入大小数值:" num
 
for ((a=1; a<=num; a++))
do
    for ((i=num; i>a; i--))
    do
        echo -n " "
    done
    c=$[(a*2)-1]
    for ((b=1; b<=c; b++))
    do
        echo -n "*"
    done
    echo ""
done
 
 
for ((a=num-1; a>=1; a--))
do
    #输出空格正三角
    for ((b=num; b>a; b--))
    do
        echo -n " "
    done
 
    #输出倒等腰三角
    c=$[(a*2)-1]
    for ((i=1; i<=c; i++))
    do
        echo -n "*"
    done
    echo ""
done

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值