重击数组

这是linuxjournal.com上Mitch Frazier的“ Bash Arrays ”的翻译。



如果您使用的是“标准” * NIX Shell,则可能不熟悉数组的有用bash功能。虽然bash中的数组不如P语言(Perl,Python和PHP)和其他编程语言中的数组好,但它们通常很有用。

Bash数组只有数字索引,但是它们是可选的,也就是说,您不必显式定义所有索引的值。可以通过将条目括在括号中来定义整个数组:



  arr=(Hello World)


可以使用熟悉的语法(从BASIC(请原谅Dijkstra-翻译者的注意事项)到Fortran)来定义单个记录:



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




但是,相反的情况看起来比较丑陋。如果需要引用特定条目,则:



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


在手册页中:



扩展到文件的完整路径时,需要花括号以防止冲突。



此外,还提供了以下怪异的构造:



  ${arr[*]} #    
  ${!arr[*]}#    
  ${#arr[*]}#    
  ${#arr[0]}#    (  )


$ {!arr [*]}是bash的一个相对较新的添加,不是原始实现的一部分。以下构造显示了简单使用数组的示例。注意“ [索引] =值”,这使您可以将特定的值分配给特定的记录号。



#!/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


运行该脚本将产生以下输出:



数组大小:5



数组项:



一个

2

3

4

5



数组索引:



0

1

2

3

5



数组项和索引:



0:一个

1:2

2:3

3:4

5:5



。注意在{arr [*]}之类的结构中,可以使用“ @”字符代替“ *”,除了引号的扩展外,结果将相同。 “ $ *”和“ $ @”将输出带引号的条目,“ $ {arr [*]}”将每个条目作为一个单词返回,“ $ {arr [@]}”将每个条目作为单独的单词返回。



以下示例将显示引号和未引号的构造如何返回字符串(这些字符串包含空格时尤其重要):



#!/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


启动时输出:



原始数组中的项数:4



第一项

第二项

第三





未加引号的扩展后:6



第一



第二



第三





在带引号的扩展后:1



第一项第二项第三项



在@引用扩展后:4



第一项

第二项目

第三




All Articles