Fork me on GitHub
Suzf  Blog

Bash Arrays

如果你使用的是类UNIX的shell 你可能对bash 的 数组不是很熟悉。虽然没有向P语言(Perl, Python, PHP)那样强大,但是它们往往是很有用处的。 Bash 数组只有索引编号,但是它们是单独的。也就是说你不必定义所有索引。整个数组可以通过封闭括号中的数组项分配:

arr=(Hello World)

单个项目可以用熟悉的数组语法被分配(除非你已经习惯了Basic或Fortran):

  arr[0]=Hello
  arr[1]=World

但是,当你要引用数组项它变得有点难看:

  echo ${arr[0]} ${arr[1]}

man 手册中的部分内容: 大括号是必需的,以避免与路径扩展冲突。

常用的用法 
   ${arr[*]}         # 所有数组元素
   ${!arr[*]}        # 所有数组索引
   ${#arr[*]}        # 数组元素个数
   ${#arr[0]}        # 数组第0个元素长度

${!arr[*]}  是一个相对较新的在bash中,它不是原始数组实现的一部分。 下面的例子显示了一些简单的数组使用(注意  "[index]=value" 的分配分配特定的索引):

#!/bin/bash

array=(one two three four [5]=five)

echo "Array size: ${#array[*]}"

echo "Array items:"
for item in ${array[*]}
do
    printf "   %s\n" $item
done

echo "Array indexes:"
for index in ${!array[*]}
do
    printf "   %d\n" $index
done

echo "Array items and indexes:"
for index in ${!array[*]}
do
    printf "%4d: %s\n" $index ${array[$index]}
done

执行结果如下:

Array size: 5
Array items:
   one
   two
   three
   four
   five
Array indexes:
   0
   1
   2
   3
   5
Array items and indexes:
   0: one
   1: two
   2: three
   3: four
   5: five

注意: "@" 可以替代 "*" 在这样的结构中 比如 ${arr[*]}, 得到的结果是一致的除了当使用引用字符串扩展数组元素的时候。 在这种情况下也是相同的,使用 引用字符串扩展 "$*" and "[email protected]": "${arr[*]}" 将所有元素作为一个单独的元素返回 "${arr[@]}" 将每个元素作为一个独立的元素返回 下面的例子说明了如何 不引用, 引用 "*", 和 quoted "@" 扩大影响 (当数组元素包含空格的时候特别重要)

#!/bin/bash

array=("first item" "second item" "third" "item")

echo "Number of items in original array: ${#array[*]}"
for ix in ${!array[*]}
do
    printf "   %s\n" "${array[$ix]}"
done
echo

arr=(${array[*]})
echo "After unquoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done
echo

arr=("${array[*]}")
echo "After * quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done
echo

arr=("${array[@]}")
echo "After @ quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done

执行结果如下:

Number of items in original array: 4
   first item
   second item
   third
   item

After unquoted expansion: 6
   first
   item
   second
   item
   third
   item

After * quoted expansion: 1
   first item second item third item

After @ quoted expansion: 4
   first item
   second item
   third
   item

Reference:

bash-arrays

bash-for-loop-array

License: Attribution-NonCommercial-ShareAlike 4.0 International

本文出自 Suzf Blog。 如未注明,均为 SUZF.NET 原创。

转载请注明:https://suzf.net/post/848

「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」

Suzf Blog

(๑>ڡ<)☆ 谢谢 ~

使用微信扫描二维码完成支付