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脚本------循环语句(for,while,until循环语句)