Shell脚本之循环语句和转义字符

Posted 热心群众

tags:

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

@toc

一、转义字符

==echo -n== 表示不换行输出

==echo -e== 输出转义字符,将转义后的内容输出到屏幕上
==echo -E== 禁止反斜杠转义,与-e参数功能相反

  • 在echo -e后面可以添加很多转义符
    常用的转义字符如下
转义符 说明
\\b 相当于退格键,但前提是“\\b”后存在字符"\\b"表示删除前一个字符"\\b\\b"表示删除前两个字符
\\c 不换行输出。后面无字符时相当于 echo -n"\\c"后有字符时,将不被输出
\\n 换行,但是换行后的新行从“\\n”处开始另起一行
\\f 换行,但是换行后的新行的开头位置连接着上一行的行尾
\\v 与\\f相同
\\t 转义后表示插入tab,即横向制表符\\r光标移至行首,但不换行,相当于使用“\\r”以后的数字覆盖之前相等长度的字符
\\ 表示插入“\\”本身

echo命令截取前后字符

  • 例:i=$(echo "11,22,33,44")
    1.命令:echo $i%,*
    输出结果:11,22,33
    解析:从最后倒数到最短的匹配部分(用%)后面的逗号的地方被删除
    2.命令:echo $i%%,*
    输出结果:11
    解析:从最后倒数到最长的匹配部分(用%%)后面的逗号的地方被删除
    3.命令:echo $i#*,
    输出结果:22,33,44
    解析:从开头到最短的匹配部分(用#)后面的逗号的地方被删除
    4.命令:echo $i##*,
    输出结果:44
    解析:从开头到最长的匹配部分(用##)后面的逗号的地方被删除

    echo命令取值字符

    
         i=1 2 3 4 5 6 7 8 9
    #下标分别为 0 1 2 3 4 5 6 7 8   (1对用0,2对应1...)
    echo $i  ---> 1 2 3 4 5 6 7 8 9
    echo $i:4:3  ---> 567     (下标为4,以此开头取3个)
    echo $i:6:1  ---> 7       (下标为6,以此开头取1个)

a=123
echo $a:-abc ---> 123 (:前面的a有被赋值,就输入a的变量值)
echo $b:-abc ---> abc (:前面的b没有被赋值,就会显示后面的值abc)
echo $b:=abc ---> abc (这里:=相当于赋值了,如下)
echo $b ---> abc

a=gadak1234
echo $#a ---> 9 (显示字符个数)

![image.png](https://s2.51cto.com/images/20211219/1639926631247405.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
![image.png](https://s2.51cto.com/images/20211219/1639926767435859.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

## 二、for循环语句
面对列表重复任务时,if语句难以满足需求,按着顺序编写,又非常耗时间,这时候就需要使用循环语句来解决这个问题。
- for语句需要定义一个变量和取值列表,根据不同的取值执行相同的命令,直到变量值用完。
- 取值列表里包含多个属性相同的对象,例如:IP地址,通信录等。

#for语句结构
for 变量名 in 取值列表
do
命令序列
done


![image.png](https://s2.51cto.com/images/20211219/1639927115626653.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
**for取值的一些用法:**
![image.png](https://s2.51cto.com/images/20211219/1639927657453784.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
for循环的相关例题在后面博客,这里就不在展示了
## 三、while循环语句
- 根据特定条件反复执行一个命令序列,直到不满足条件为止。
- 编写时可能会出现死循环,要避免这种情况发生
- true(真)和false(假)为特殊条件测试操作,也可以在if语句的条件测试中使用。
 **true作为条件时,表示条件永远成立**,无限执行,也就是死循环,需要强制终止
**false作为条件时,表示条件不成立**,不执行命令序列

#while语句结构
while 条件测试操作
do
命令序列
done

![image.png](https://s2.51cto.com/images/20211219/1639927887563882.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

示例1:批量添加用户; 用户名称以stu开头,按数字顺序进行编号;
一共添加20个用户,即stu1、stu2、......、stu20
初始密码均设为123456
#!/bin/bash
#
i=1
while [ $i -le 20 ]
do
useradd stu$i
echo "123456" | passwd --stdin $i &>/dev/null
let i++
done

![image.png](https://s2.51cto.com/images/20211219/1639928275240477.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
![image.png](https://s2.51cto.com/images/20211219/1639928297901080.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
![image.png](https://s2.51cto.com/images/20211219/1639928313676154.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

- while语句求1到100整数相加之和

#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
sum=$[ $sum + $i ]
let i++
done
echo "while循环语句:1~100整数的和为$sum"


![image.png](https://s2.51cto.com/images/20211219/1639928821167805.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

- 输入一个小于100的整数,并计算从1到该数之间所有整数的和

#!/bin/bash
i=1
sum=0
read -p "输入小于100的正整数:" a
while [ $i -le $a ]
do
sum=$[ $sum + $i ]
let i++
done
echo "1到$a间整数和为$sum"

![image.png](https://s2.51cto.com/images/20211219/1639929073416801.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

## 四、until循环语句
- 与while相反,重复测试某个条件,只要条件不成立则反复执行。
- 一般熟练运用while即可,这个很少用
![image.png](https://s2.51cto.com/images/20211219/1639929182303760.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

#until语句结构
until 条件测试操作
do
命令序列
done

![image.png](https://s2.51cto.com/images/20211219/1639929298615106.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

示例:计算1~100整数相加和
#!/bin/bash
a=1
sum=0
until [ $a -gt 100 ]
do
sum=$[ $sum + $a ]
let a++
done
echo "1~100整数相加和为$sum"


![image.png](https://s2.51cto.com/images/20211220/1639929760525381.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
## 五、结束循环----break和continue

以上是关于Shell脚本之循环语句和转义字符的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本——编程之循环语句(forwhileuntil)

自动化运维必须要学的Shell脚本之——循环语句(forwhile和until循环)

Shell编程之循环语句和函数

Shell脚本------循环语句(for,while,until循环语句)

for / while / until 基础循环语句案例图解 shell编程之循环语句

shell双循环-脚本转义字符以及脚本案列