三、shell 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为 $n,n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数。
3.1 传递参数的基本方法
./script.sh arg1 arg2 arg3
3.2 脚本中访问参数
3.2.1 位置参数:
$0
:表示脚本名称或命令名。$1, $2, ...
:表示第一个、第二个等位置参数。$#
:表示传递给脚本的参数个数。$\*
:将所有参数作为一个整体返回,参数之间用一个空格分隔。"$@"
:将所有参数分别返回,参数之间保留独立性。
示例脚本:
#!/bin/bash
echo "脚本名称: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "参数个数: $#"
echo "所有参数(*): $*"
echo "所有参数(@): $@"
3.2.2 参数处理的区别:
$*
和$@
的区别在于它们在被双引号包裹时的行为:$*
会将所有参数视为一个整体。$@
会将每个参数保留独立性。
./script.sh "arg 1" "arg 2"
脚本中:
$*
的结果是:arg 1 arg 2(参数合为一个字符串)。$@
的结果是:arg 1 和 arg 2(参数独立保留)。
3.3 特殊变量
$?
:表示上一个命令的退出状态(返回值)。$$
:表示当前脚本的进程 ID。$!
:表示最后一个后台运行的进程 ID。
四、Shell 数组
数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。
与大部分编程语言类似,数组元素的下标由 0 开始。
4.1 声明数组
- 显式声明:
array_name=(value1 value2 value3)
- 单独赋值:
array_name[0]=value1
array_name[1]=value2
array_name[2]=value3
示例
my_array=("Apple" "Banana" "Cherry")
my_array[3]="Date"
4.2 访问数组元素
通过数组的索引访问元素,索引从 0 开始。
访问单个元素
echo ${array_name[0]} # 输出第一个元素
访问所有元素
- 使用
\*
或@
:
echo ${array_name[*]} # 输出所有元素为一个字符串
echo ${array_name[@]} # 输出所有元素,保留独立性
获取数组长度
echo ${#array_name[@]} # 获取数组长度
4.3 修改数组元素
直接使用索引即可修改:
array_name[1]="NewValue"
4.4 删除数组元素
- 删除单个元素:
unset array_name[index]
- 删除整个数组:
unset array_name
4.5 遍历数组
通过循环可以遍历数组的元素。
示例:使用 for 遍历
my_array=("A" "B" "C" "D")
for item in "${my_array[@]}"; do
echo $item
done
使用索引遍历
for i in "${!my_array[@]}"; do
echo "Index $i: ${my_array[i]}"
done
4.6 示例脚本
#!/bin/bash
# 定义数组
fruits=("Apple" "Banana" "Cherry")
# 添加新元素
fruits[3]="Date"
# 输出数组所有元素
echo "所有水果: ${fruits[@]}"
# 输出数组长度
echo "数组长度: ${
#fruits[@]}"
# 遍历数组
for fruit in "${fruits[@]}"; do
echo "水果: $fruit"
done
# 修改数组元素
fruits[1]="Blueberry"
echo "修改后: ${fruits[@]}"
# 删除某个元素
unset fruits[2]
echo "删除后: ${fruits[@]}"
4.7 注意事项
- Shell 数组的索引是非连续的,删除某些元素后,索引不会自动重排。
- Shell 不支持多维数组。