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光标移至行首linux重启命令,但不换行,相当于使用“系统运维工程师面试问题及答案\r”以后的数字覆盖之前相等长度的字符
'\' 表示插入“\”本身

echo命令截取前后字符

  • 例:i=巴沙鱼为什么不能吃$(echo "11,22,33,4系统运维工资一般多少4")
    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} ---&g系统运维工资一般多少t; 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 取值列表
d取值范围是什么意思o
命令序列
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=)

示例1linux系统:批量添巴沙鱼加用户;系统运维工程师 用户名称以stu开头,按数字顺序进行编号;
一共添加2赋值表达式0个用户,系统运维工程师面试问题及答案即stu1、stu2、......、stu20
初始密码均设为123456
#!/bin/bash
#
i=1
while [ $i -le 20 ]
do
useradd stu$i
echo "123456" | passwd --stdin $i &取值amp;>/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
ec巴氏刷牙法ho "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
e系统运维工资一般多少cho "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