shell循环语句

Posted 段小宝 

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell循环语句相关的知识,希望对你有一定的参考价值。

双撇号与 $() 里面可以是可执行命令
$[] 和 $(()) 里面可以使算数表达式

一、echo 操作

1.1 echo 命令属性

echo 输出默认自带换行符

常用参数:

-n:不要在最后自动换行;

-e:若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出(允许解释加反斜线的转义字符):

  • \\a 发出警告声;
  • \\b 删除前一个字符,相当于退格(backspace)键,前提是 \\b 后存在字符;
  • \\c 不换行输出,最后不加上换行符号,相当于 echo -n;
  • \\f 换行但光标仍旧停留在原来的位置;
  • \\n 换行且光标移至行首;
  • \\r 光标移至行首,但不换行,相当于使用"\\r"以后的字符覆盖"\\r"之前同等长度的字符;但是当"’\\r"后面不存在任何字符时," \\r"前面的字符不会被覆盖
  • \\t 插入tab;
  • \\v 与 \\f 相同;
  • \\\\ 表示插入\\字符本身;

在这里插入图片描述\\b 、\\r 等转义符的数量 尽量和 字符数量一致

例:通过一条 echo 语句完成磁盘的格式化。

echo -e "n\\np\\n\\n\\n\\nw\\n" | fdisk /dev/sdb
n新建 回车 p主分区 回车 分区号回车 起始回车 大小回车 w保存回车

1.2 结合echo实现其他功能

功能一:字符串截取1

//从最后倒数到最短的匹配部分(用%)后面的逗号的地方被删除
i=`echo "11,22,33,44"`
echo ${i%,*}
11,22,33

//从最后倒数到最长的匹配部分(用%%)后面的逗号的地方都被删除
echo $ { i%%,* }
11

//从开头到最短的匹配部分(用)后面的逗号的地方被删除
echo $ { i#*}
22,33,44

//从开头到最长的匹配部分(用##)后面的逗号的地方被删除
echo $ { i##*}
44

在这里插入图片描述
功能二:字符串截取2

下标从0开始
在这里插入图片描述

功能三:获取变量长度
在这里插入图片描述

二、for 循环

2.1 单层 for

for 语句用来 遍历 集合或列表。
shell 中有两种用法:

for i in $(seq 1 5);
for ((i=1;i<=5;i+=2));
在这里插入图片描述
在这里插入图片描述
操作:
●批量添加未存在的用户
◆用户名存放在users.txt文件中,每行一个初始密码均设为123456

新增 users.txt 文件,vim users.txt 录入用户
在这里插入图片描述
vim adduser.sh
chmod +x adduser.sh

#!/bin/bash

USERS=`cat ~/adduser.txt`
echo "文件中的用户有:" $USERS

for u in $USERS
do
 if [ `cat /etc/passwd | grep $u` ];then
        echo $u "用户已存在"
        echo ""
 else
        echo "开始新增用户 $u":
        echo ""
        useradd $u &> /dev/null
        echo "123456" | passwd --stdin $u &> /dev/null
 fi
done

实验结果
在这里插入图片描述

2.2 多层 for

在这里插入图片描述

正三角递增

read -p "输入三角形长度:" len

for ((a=1;a<=len;a++))
do

    for (( b=$len;b>a;b--)) #空格
    do
        echo  -n " "
    done

    for c in `seq 1 $a` #left
    do
        echo -n "$a"
    done

    for d in `seq 2 $a`   #righr
    do
        echo -n "$a"
    done

    echo "" 
done

三、while 循环

重复测试某个条件,只要条件成立则反复执行

在这里插入图片描述
操作:
◆通过变量RANDOM获得1-999随机数
◆提示用户猜测并记录次数,猜中后退出循环

#!/bin/bash

num=$[$RANDOM%1000]
sum=0
a=1
while [ $a -lt 2  ]
do
        read -p "请输入一个数:" in
        if [ $in -lt $num ];then
                echo "小了"
                let sum++
        elif [ $in -gt $num ];then
                echo "大了"
                let sum++
        else
                echo "666,对了"
                let sum++
                #let a=3
                break;
        fi
done

echo "猜了$sum次"

四、 untli 循环

重复测试某个条件,只要条件不成立则反复执行,直到条件为止。

和 while 是完全相反的:

  • while是表达式正确才执行循环体,错误结束循环;
  • until 是表达式错误才会执行循环体,正确结束循环。
#!/bin/bash

a=1

until [ $a -gt 5 ]   #当a大于5时,结束循环
do
        echo $a
        let a++   
done

在这里插入图片描述

break

break 退出单个循环,break 2 退出2层循环

#!/bin/bash

for ((i=1;i<=3;i++))
do
 echo "i---- $i"
 for ((j=1;j<=5;j++))
 do
  echo "j--------------$j"
  if [ $j -eq 2 ];then
        break;   #退出整个循环
        #break2;   #退出两层循环
  fi
 done
done

在这里插入图片描述

continue

终止当前循环的命令,去执行下一次循环,不会中止整个命令

for ((i=1;i<=3;i++))
do
 echo "i---- $i"
 for ((j=1;j<=3;j++))
 do
  if [ $j -eq 2 ];then
        continue;
  fi
  echo "j--------------$j"
 done
done

在这里插入图片描述

exit

exit 退出整个shell 脚本,后面的语句都不执行
exit 、 exit 0 正常退出,$? 获取为0

exit 1、2 … 异常退出, $? 获取为非0,1 、2 …

for ((i=1;i<=3;i++))
do
 echo "i---- $i"
 exit
done

echo "qeqeq"

在这里插入图片描述

五、 seq 用法

在这里插入图片描述
类似功能:
在这里插入图片描述

六、RANDOW 随机数

shell带有内置函数RANDOM可以随机生成随机数其范围为:0~32767

在这里插入图片描述

比如想获取 1-999 之间的随机数,则%1000即可。
在这里插入图片描述

七、set 本地变量

[root@linux ~]# aaa=bbb #设置本地变量

[root@linux ~]# echo $aaa #显示变量的值
bbb

[root@linux ~]# set|grep aaa #查看本地变量
aaa=bbb

在这里插入图片描述
以 IFS 为例
默认的是 支持 空格 退格 换行。
在这里插入图片描述
实验:修改 IFS,让其只支持 换行识别

没加 IFS=$'\\n' 之前
在这里插入图片描述
在这里插入图片描述

加了之后

#!/bin/bash
s=0
IFS_OLD=$IFS
IFS=$'\\n'
for i in `cat /root/myShell/userss.txt`
do
        echo $i
        let s++
done
echo $s
#IFS=$IFS_OLD

在这里插入图片描述

八、read line

使用 read line 可以按行读取文件

例:从文件中按行读取文件/root/myShell/userss.txt中的内容输出到屏幕中 :

方法一:

while read line
do
        echo $line
done < /root/myShell/userss.txt

在这里插入图片描述

方法二:

#!/bin/bash

cat /root/myShell/userss.txt | while read line
do
        echo $line
done


以上是关于shell循环语句的主要内容,如果未能解决你的问题,请参考以下文章

shell之循环语句

Shell脚本之forwhile循环语句和case分支语句

Shell脚本-循环语句

浅谈Shell脚本中for循环while循环及case分支语句

shell 循环语句

Linux Shell:Shell循环语句