Shell学习(2/6) 传递参数-数组

三、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 不支持多维数组。