Blog.038 Shell 编程 循环语句 与 函数
本章目录
1. echo 的用法
  1.1 echo -n:不换行输出
  1.2 echo -e:输出转义字符
  1.3 其他用法
2. 循环语句
  2.1 for 循环语句
  2.2 while 循环语句
  2.3 until 循环语句
3. Shell 函数
  3.1 应用示例
  3.2 函数的作用范围
  3.3 函数的参数
  3.4 递归函数
4. Shell 数组
  4.1 数组定义方法
  4.2 操作示例
  4.3 数组增加元素
5. Shell 脚本正确性测试




- \b 相当于退格键
转义后相当于退格键(backspace),但是前提是 “\b” 存在字符。“\b” 表示删除前一个字符,“\b\b” 表示删除前面两个字符

- \c 不换行输出
不换行输出,在 “\c” 后面不存在字符的情况下,作用相当于 echo -n,但是当 “\b” 后面仍然存在字符时,“\c” 后面的字符将不会被输出

- \n 换行输出
换行输出,被输出的字符从 "\n" 出开始另起一行

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

- \t 制表符显示
转义后表示插入横向制表符,即 tab

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

- \\ 表示符号本身
在转义符前面加入转义符,代表将后面的转义符转义为符号本身,也就是 \

- 删除字符串内容

- 截取字符串内容

- 增加字符串内容

    在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。
    循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。
循环语句是由循环体及循环的终止条件两部分组成的。
- 读取不同的变量值,用来逐个执行同一组命令。
- 结构:


| 取值列表 | 释义 | 
|---|---|
| for i in "值1" “值2” | 变量i 依次取值 "值1",“值2” | 
| for i in /root/* | 变量i 依次取值 /root/ 下的文件/目录名 | 
| for i in /etc/*.conf | 变量i 依次取值 /etc/ 下,以 .conf 结尾的文件/目录 | 
| for i in $(seq 10 -1 1) | 变量i 依次取值,从10 到1 ,步长是 -1 | 
| for i in {1.10} | 变量i 依次取值,从1 到10 | 
| for i in $(ls /root/) | 变量i 依次取值,为 ls /root/ 命令的执行结果 | 
| for i in $(< /etc/passwd ) | 变量i 依次取值, /etc/passwd 的文件每一行内容 | 
| for i in $1 $2 $@ | 变量i 依次取值,参数1,参数2 ,及所有参数个数 | 
例:
- 批量添加用户;
- 用户名存在user.txt中,每行一个;
- 初始密码均设为123456;
- 验证脚本。

- 重复测试某个条件,只要条件成立则反复执行。
- 结构:


例:
- 批量添加用户;
- 用户名称以 stu 开头,按数字顺序进行编号;
- 一个添加 5 个账户,即 stu1、stu2、…stu5;
- 初始密码均设为 123456。


- 重复测试某个条件,只要条件不成立则反复执行。
- 格式:


例:
- 计算 1~50 的和值;
- 通过循环累加的方式计算 1~50 的和值。


- 将命令序列按格式写在一起。
- 可方便重复使用命令序列;
- Shell函数定义:
    【 function 】 函数名() {
    命令序列
    【 return x 】
    }
- 调用函数的方法:
函数名 【函数1】【函数2】
例:
- 两个数字求和;
- 通过sum() {}定义函数;
- 使用read命令交互输入两个数并求和。


- 函数在 Shell 脚本中仅在当前Shell环境中有效;
- Shell 脚本中变量默认全局有效;
- 将变量限定在函数内部使用 local 命令。
- 参数的用法:
函数名称 参数1 参数2 参数3 …
- 参数的表示方法:
$1 $2 … ${10} ${11}
- 调用自己本身的函数。
例:
- 递归遍历记录;
- 通过定义递归函数 list_files 来实现。


- 数组的定义:用括号 "()" 括起来,其中的内容用空格相间。括号中的值叫做元素,每个元素都有对应的下标(或索引)。
- 数组包括的数据类型:
    数值类型;
    字符类型;
    使用 " " 或 ' ' 定义。



- ①:
数组名=(vlaue0 vlaue1 vlaue2 …)

- ②:
数组名=([0]=vlaue [1]=vlaue [2]=vlaue …)


- ③:
    列表名=“value0 value1 value2 …”
    数组名=($列表名)

- ④:
    数组名[0]=“value”
    数组名[1]=“value”
    数组名[2]=“value”
    …

例:
- 获取数组长度

- 读取某下标赋值

- 数组遍历


- 数组切片

- 数组替换

- 数组删除

- ①:
array_name[index]=value
- ②:
array_name[${#array_name[*]}]=value
- ③:
array_name("${array_name[@]}" value1...valueN)
- 双引号不能省略,否则当数组array_name中存在包含空格的元素时会按空格将元素拆分成多个。
- 不能将 "@" 替换为 "*",如果替换为 "*" ,不加双引号时与 "@" 的表现一致,加双引号时,会将数组 array_name 中的所有元素作为一个元素添加到数组中。
for i in "${array_name[@]}"; do echo $i; done
- ④:
array_name+=(value1...valueN)
- 待添加元素必须用 "( )" 包围起来,并且多个元素用空格分隔
- -n:不会执行该脚本,仅查询本语法是否有问题,如果没有语法问题就不显示任何内容,如果有问题会提示报错。
- -v:在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也会给出错误提示。
- -x:将执行的脚本内容输出到屏幕上,这个是对调试很有用的参数。
-
 

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号