在Linux Shell脚本中使用数组 - 第8部分

我们不能想象一个没有数组概念的编程语言。 它们在各种语言之间如何实现并不重要。 相反,数组帮助我们在一个符号名称下合并相似或不同的数据。

在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系统中开发许多后台脚本铺平了道路。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏