bash array[@] 语法详解

最近我写的 bash 脚本中需要遍历数组,用到了 bash 中的 array[@] 这种语法。

在 Bash shell 脚本中,array[@] 是一种特殊的数组引用语法,它有以下几个重要特点:

基本含义

  • array[@] 表示引用数组 array 的所有元素
  • @ 是一个特殊的下标,表示"数组中的所有元素"

array[*] 的区别

  • array[@]array[*] 都表示数组的所有元素
  • 关键区别在于它们在引号中的展开方式:
    • "${array[@]}":每个元素保持独立,即使包含空格也会被正确处理
    • "${array[*]}":所有元素合并为一个字符串,用第一个字符的 IFS(内部字段分隔符)连接

使用示例

fruits=("apple" "banana" "cherry")

# 打印所有元素
echo "${fruits[@]}"  # 输出:apple banana cherry

# 在引号中使用
for fruit in "${fruits[@]}"; do
    echo "$fruit"
done
# 输出:
# apple
# banana
# cherry

带空格的元素处理

当数组元素包含空格时,"${array[@]}" 能正确处理:

files=("file 1.txt" "file 2.txt")

# 正确方式 - 每个元素保持独立
for file in "${files[@]}"; do
    echo "$file"
done
# 输出:
# file 1.txt
# file 2.txt

# 错误方式 - 空格会导致元素被拆分
for file in ${files[@]}; do
    echo "$file"
done
# 输出:
# file
# 1.txt
# file
# 2.txt

for ... in 介绍

你可能注意到了,这里面用到了 for ... in 这种循环结构。

介绍数组遍历怎么少的了 for ... in 呢

Bash 中的 for...in 循环是一种常用的循环结构,用于遍历一组值或列表中的元素。

for ... in 基本语法

for variable in list
do
    commands
done

或者写在一行:

for variable in list; do commands; done

for ... in 使用示例

  1. 遍历固定列表

    for i in 1 2 3 4 5
    do
       echo "Number: $i"
    done
  2. 遍历字符串列表

    for color in red green blue
    do
       echo "Color: $color"
    done
  3. 使用通配符遍历文件

    for file in *.txt
    do
       echo "Text file: $file"
    done
  4. 使用命令输出作为列表

    for user in $(cat /etc/passwd | cut -d: -f1)
    do
       echo "User: $user"
    done
  5. 使用范围表达式

    for i in {1..5}
    do
       echo "Number: $i"
    done
  6. 带步长的范围表达式

    for i in {1..10..2}
    do
       echo "Odd number: $i"
    done

for ... in 特殊用法

  • 遍历位置参数

    for arg in "$@"
    do
      echo "Argument: $arg"
    done
  • 遍历数组

    arr=("apple" "banana" "cherry")
    for fruit in "${arr[@]}"
    do
      echo "Fruit: $fruit"
    done

注意事项

  1. list 中的元素默认以空格分隔
  2. 如果元素包含空格,应该用引号括起来
  3. dodone 是必须的关键字
  4. 循环变量不需要提前声明
赞赏

微信赞赏支付宝赞赏

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注