我们不能想象一个没有数组概念的编程语言。 它们在各种语言之间如何实现并不重要。 相反,数组帮助我们在一个符号名称下合并相似或不同的数据。
在Shell脚本中使用数组
在这里,我们关心shell脚本,这篇文章将帮助你使用一些shell脚本,利用这个数组的概念。
阵列初始化和使用
对于较新版本的bash,它支持一维数组。 数组可以通过申报壳内置的明确声明。
declare -a var
但是没有必要像上面那样声明数组变量。 我们可以直接将各个元素插入数组,如下所示。
var[XX]=<value>
其中“XX”表示数组索引。 要取消引用数组元素,请使用大括号语法,即
${var[XX]}
注 :数组索引总是以0开始。
初始化整个数组的另一种方便的方法是使用一对圆括号,如下所示。
var=( element1 element2 element3 . . . elementN )
还有另一种将值分配给数组的方法。 这种初始化方式是先前解释的方法的子类别。
array=( [XX]=<value> [XX]=<value> . . . )
我们也可以读/期间使用的读壳内置的执行时间将值分配给数组。
read -a array
现在在脚本中执行上面的语句,它等待一些输入。 我们需要提供以空格分隔的数组元素(而不是回车符)。 输入值后按Enter键终止。
要遍历数组元素,我们也可以使用for循环。
for i in “${array[@]}” do #access each element as $i. . . done
以下脚本总结了此特定部分的内容。
#!/bin/bash array1[0]=one array1[1]=1 echo ${array1[0]} echo ${array1[1]} array2=( one two three ) echo ${array2[0]} echo ${array2[2]} array3=( [9]=nine [11]=11 ) echo ${array3[9]} echo ${array3[11]} read -a array4 for i in "${array4[@]}" do echo $i done exit 0
数组上的各种操作
许多标准字符串操作在数组上工作。 看看下面的示例脚本,它实现了对数组的一些操作(包括字符串操作)。
#!/bin/bash array=( apple bat cat dog elephant frog ) #print first element echo ${array[0]} echo ${array:0} #display all elements echo ${array[@]} echo ${array[@]:0} #display all elements except first one echo ${array[@]:1} #display elements in a range echo ${array[@]:1:4} #length of first element echo ${#array[0]} echo ${#array} #number of elements echo ${#array[*]} echo ${#array[@]} #replacing substring echo ${array[@]//a/A} exit 0
以下是在执行上述脚本时产生的输出。
apple apple apple bat cat dog elephant frog apple bat cat dog elephant frog bat cat dog elephant frog bat cat dog elephant 5 5 6 6 Apple bAt cAt dog elephAnt frog
我认为没有意义详细解释上述脚本,因为它是不言自明的。 如果有必要,我将专门在这个系列的一部分专门对字符串操作。
使用数组的命令替换
命令替换将一个或多个命令的输出分配给另一个上下文。 这里在数组的上下文中,我们可以将命令的输出作为数组的单独元素。 语法如下。
array=( $(command) )
默认情况下,命令的输出中的内容由空格分隔,作为单个元素插入数组。 以下脚本列出目录的内容,它们是具有755权限的文件。
#!/bin/bash ERR=27 EXT=0 if [ $# -ne 1 ]; then echo "Usage: $0 <path>" exit $ERR fi if [ ! -d $1 ]; then echo "Directory $1 doesn't exists" exit $ERR fi temp=( $(find $1 -maxdepth 1 -type f) ) for i in "${temp[@]}" do perm=$(ls -l $i) if [ `expr ${perm:0:10} : "-rwxr-xr-x"` -eq 10 ]; then echo ${i##*/} fi done exit $EXT
模拟二维数组
我们可以使用1维数组来容易地表示2维矩阵。 行的矩阵的各行中主要为了表示元素被逐渐存储在数组索引以顺序的方式。 对于mXn矩阵,其公式可以写为。
matrix[i][j]=array[n*i+j]
看另一个示例脚本添加2个矩阵并打印结果矩阵。
#!/bin/bash read -p "Enter the matrix order [mxn] : " t m=${t:0:1} n=${t:2:1} echo "Enter the elements for first matrix" for i in `seq 0 $(($m-1))` do for j in `seq 0 $(($n-1))` do read x[$(($n*$i+$j))] done done echo "Enter the elements for second matrix" for i in `seq 0 $(($m-1))` do for j in `seq 0 $(($n-1))` do read y[$(($n*$i+$j))] z[$(($n*$i+$j))]=$((${x[$(($n*$i+$j))]}+${y[$(($n*$i+$j))]})) done done echo "Matrix after addition is" for i in `seq 0 $(($m-1))` do for j in `seq 0 $(($n-1))` do echo -ne "${z[$(($n*$i+$j))]}\t" done echo -e "\n" done exit 0
即使在shell脚本中实现数组有局限性,但在少数情况下仍然有用,特别是在使用命令替换处理时。 从管理的角度来看,数组的概念为在GNU / Linux系统中开发许多后台脚本铺平了道路。