目录
3.1 for循环语句
3.1.1for语句的结构
3.1.2 for语句应用实例
3.2 使用whlie循环语句
1.打印数字1到5
3.3 使用until循环语句
3.3.1until的实例
1.打印数字1到5(使用until的逆向逻辑)
2.等待用户输入特定内容
3.4 函数
3.4.1Shell函数的基本语法如下:
示例
注意事项
3.5定义数组
3.5.1 访问数组元素
3.5.2 数组长度
3.5.3 数组操作和方法
3.1 for循环语句
在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如,根据通讯录中的姓名列表创建系统账号,根据服务器清单检查各主机的存活状态,根据IP地址黑名单设置拒绝访问的防火墙策略等
当面对各种列表重复任务时,使用简单的if语句已经难以满足要求,而顺序编写全部代码更是显得异常烦琐、困难重重。for 循环语句,可以很好地解决类似问题
3.1.1for语句的结构
使用for 循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。在这里"取值列表”称为for语句的执行条件,其中包括多个属性相同的对象,需要预先指定(如通讯录、IP黑名单)。
for 循环语句的语法结构如下所示。
for variable in value1 value2 value3 ...
do
# 在这里执行命令,使用$variable引用当前值
echo $variable
done
上述语句结构中,for语句的操作对象为用户指定名称的变量,并通过in关键字为该变量预先设置了一个取值列表,多个取值之间以空格进行分隔。位于 do..done 之间的命令序列称为循环体,其中的执行语句需要引用变量以完成相应的任务。
for 语句的执行流程:首先将列表中的第一个取值赋给变量,并执行do...done 循环体中的命令序列:然后将列表中的第二个取值赋给变量,并执行循环体中的命令序列.….依此类推,直到列表中的所有取值用完,最后将跳至 done 语句,表示结束循环,如图所示。
3.1.2 for语句应用实例
#!/bin/bash
list=("apple" "banana" "cherry") //创建一个数组
for fruit in "${list[@]}"
do
echo "I like $fruit" //输出遍历
done
3.2 使用whlie循环语句
hile 是一个控制结构,用于重复执行一段代码,直到某个条件不再满足为止。其基本语法如下:
while [ condition ]
do
# 要重复执行的命令或代码块
done
其中,[ condition ] 是一个测试条件,如果条件为真(返回值为0),则执行 do 和 done 之间的命令或代码块。然后再次检查条件,如果条件仍然为真,则再次执行代码块,如此循环直到条件不再为真。
1.打印数字1到5
#!/bin/bash
counter=1
while [ $counter -le 5 ]
do
echo $counter
counter=$((counter+1))
done
3.3 使用until循环语句
until循环与while循环相反,它在条件不满足时执行循环体,一旦条件满足就停止循环。
until [ condition ]
do
# 循环体,条件不满足时执行的语句
...
done
- [ condition ]:这是测试条件,如果条件为假(返回非零值),则执行do和done之间的语句。如果条件为真(返回零值),则停止循环。
3.3.1until的实例
1.打印数字1到5(使用until的逆向逻辑)
虽然通常我们会使用while循环来打印数字1到5,但也可以使用until循环通过逆向逻辑来实现:
#!/bin/bash
counter=1
until [ $counter -gt 5 ]
do
echo $counter
counter=$((counter+1))
done
这里,我们设置了一个条件$counter -gt 5(即counter大于5),由于初始时counter为1,这个条件不满足,所以进入循环体。每次循环,counter增加1,直到counter大于5,条件满足,循环结束。
2.等待用户输入特定内容
假设我们想要等待用户输入"stop",一旦输入"stop",则停止循环:
#!/bin/bash
read -p "请输入内容(输入'stop'结束): " input
until [ "$input" == "stop" ]
do
echo "您输入了: $input"
read -p "请继续输入内容(输入'stop'结束): " input
done
echo "已接收到'stop'指令,退出循环。"
input变量中。然后,我们使用until循环来检查
input是否等于"stop"。如果不等于,就打印用户输入的内容,并再次提示用户输入。一旦用户入"stop",循环结束。
3.4 函数
我们通常不直接定义像其他编程语言(如C、Python或JavaScript)中的函数。但是,Shell脚本提供了一种称为“函数”或“shell函数”的机制,它允许你定义可重用的代码块。这些代码块可以在脚本的多个位置被调用。
3.4.1Shell函数的基本语法如下:
function_name() {
# 这里是函数的代码
# 可以是任意有效的shell命令
echo "Hello from $function_name"
}
示例
下面是一个简单的示例,展示了如何定义和调用一个Shell函数:
#!/bin/bash
# 定义一个名为greet的函数
greet() {
local name=$1
echo "Hello, $name!"
}
# 调用greet函数并传递一个参数
greet "World"
# 再次调用greet函数,这次传递一个不同的参数
greet "Shell Scripting"
注意事项
- 在函数内部,你可以使用$1、$2等来引用传递给函数的参数。就像在脚本的主体中引用位置参数一样。
- 你可以使用local关键字在函数内部声明局部变量。这些变量只在函数内部可见,并且在函数结束时会被销毁。这有助于防止变量名冲突和意外的副作用。
- 函数名通常以字母或下划线开头,并且不能包含空格或特殊字符(除了下划线)。函数名是大小写敏感的。
- 你可以在脚本的任何位置定义函数,但通常建议在脚本的开头或接近开头的位置定义它们,以便在需要时轻松找到和引用它们。
3.5定义数组
在Bash中,数组是通过将值分配给连续的索引来定义的。索引可以是整数或字符串(在关联数组中)。
# 定义索引数组
arr_index=(value1 value2 value3)
# 定义关联数组(Bash 4.0及以上版本)
declare -A arr_assoc
arr_assoc["key1"]="value1"
arr_assoc["key2"]="value2"
3.5.1 访问数组元素
- 索引数组:${arr_index[index]}
- 关联数组:${arr_assoc[key]}
3.5.2 数组长度
- 索引数组:${#arr_index[@]} 或 ${#arr_index[*]}
- 关联数组:${#arr_assoc[@]} 或 ${!arr_assoc[@]}(后者列出所有键)
3.5.3 数组操作和方法
方法 | 描述 | 示例 |
定义数组 | 使用圆括号和空格分隔的值来定义数组 | arr=(value1 value2 value3) |
访问元素 | 使用${array[index]}访问索引数组的元素,${array[key]}访问关联数组的元素 | echo ${arr[0]} |
获取数组长度 | 使用${#array[@]}或${#array[*]} 获取索引数组的长度${#array[@]} 获取关联数组的长度(键的数量) | echo ${#arr[@]} |
遍历数组 | 使用for循环遍历数组的所有元素 | for i in "${arr[@]}"; do echo $i; done |
关联数组键 | 使用${!array[@]}列出关联数组的所有键 | echo ${!arr_assoc[@]} |
追加元素 | 使用${array[@]}" new_element" 将新元素追加到数组末尾(注意:这实际上是创建了一个新的数组,原数组不变) | arr=("${arr[@]}" value4) |
删除元素 | 使用unset array[index]删除索引数组的元素,unset array[key] 删除关联数组的元素 | unset arr[1] |
切片数组 | Bash没有直接的切片功能,但可以通过循环和条件语句来实现 | 自定义实现 |
数组排序 | 使用sort命令或外部工具(如IFS 和循环)对数组进行排序 | `for i in "arr[@]";doecho"i"; done |
关联数组默认值 | Bash 4.3及以上版本支持关联数组的默认值,使用 ${array[key]:-default} | echo ${arr_assoc[key3]:default_value} |
数组替换 | 使用${array[@]/pattern/replacement} 替换数组中的所有元素(Bash 4.0及以上版本) | new_arr=("${arr[@]/%foo/bar}") |