如何在UNIX Shell脚本中创建数组?
Answers:
Bourne Shell不支持数组。但是,有两种方法可以解决此问题。
使用位置外壳程序参数$ 1,$ 2等:
$ set one two three
$ echo $*
one two three
$ echo $#
3
$ echo $2
two
使用变量评估:
$ n=1 ; eval a$n="one"
$ n=2 ; eval a$n="two"
$ n=3 ; eval a$n="three"
$ n=2
$ eval echo \$a$n
two
bash
(尽管可以从端口安装)。假定bash
功能无法移植的脚本,并且比大多数Bourne Shell实现(例如dash
,在GNU / Linux发行版中很常见)要慢得多。bash
是一个不错的交互式外壳,但是编写脚本的速度很慢。
$*
被认为是有害的。通常,$@
首选这样做是因为它可以做到相同,但要保留空格。$@
扩展为“ $ 1”,“ $ 2”,“ $ 3” ...“ $ n”,而$*
扩展为“ $ 1x $ 2x $ 3x ... $ n”,其中x
为$IFS
分隔符(最有可能是空格)。
$@
与$*
;相同。差异仅在被引用时显示: "$*"
是一个单词,而"$@"
保留原始的分词符。
bash
,因此bash特定的响应是适当的,但是可以肯定的是,不应该认为/bin/sh
bash是对的。
#!/bin/bash
# define a array, space to separate every item
foo=(foo1 foo2)
# access
echo "${foo[1]}"
# add or changes
foo[0]=bar
foo[2]=cat
foo[1000]=also_OK
您可以阅读ABS“高级Bash脚本指南”
/bin/sh
引发error line 1: syntax error: unexpected "("
。您知道替代品吗?
IIRC的Bourne shell和C shell没有数组。
除了别人所说的以外,在Bash中,您还可以按以下方式获得数组中元素的数量:
elements=${#arrayname[@]}
并执行切片式操作:
arrayname=(apple banana cherry)
echo ${arrayname[@]:1} # yields "banana cherry"
echo ${arrayname[@]: -1} # yields "cherry"
echo ${arrayname[${#arrayname[@]}-1]} # yields "cherry"
echo ${arrayname[@]:0:2} # yields "apple banana"
echo ${arrayname[@]:1:1} # yields "banana"
set
命令(set name=(wordlist)
)和“变量替换”部分($name[selector]
和${name[selector]}
)的文档。据我所知,csh一直支持数组。例如,请参阅$path
数组变量,该变量反映了$PATH
环境变量。
试试这个 :
echo "Find the Largest Number and Smallest Number of a given number"
echo "---------------------------------------------------------------------------------"
echo "Enter the number"
read n
i=0
while [ $n -gt 0 ] #For Seperating digits and Stored into array "x"
do
x[$i]=`expr $n % 10`
n=`expr $n / 10`
i=`expr $i + 1`
done
echo "Array values ${x[@]}" # For displaying array elements
len=${#x[*]} # it returns the array length
for (( i=0; i<len; i++ )) # For Sorting array elements using Bubble sort
do
for (( j=i+1; j<len; j++ ))
do
if [ `echo "${x[$i]} > ${x[$j]}"|bc` ]
then
t=${x[$i]}
t=${x[$i]}
x[$i]=${x[$j]}
x[$j]=$t
fi
done
done
echo "Array values ${x[*]}" # Displaying of Sorted Array
for (( i=len-1; i>=0; i-- )) # Form largest number
do
a=`echo $a \* 10 + ${x[$i]}|bc`
done
echo "Largest Number is : $a"
l=$a #Largest number
s=0
while [ $a -gt 0 ] # Reversing of number, We get Smallest number
do
r=`expr $a % 10`
s=`echo "$s * 10 + $r"|bc`
a=`expr $a / 10`
done
echo "Smallest Number is : $s" #Smallest Number
echo "Difference between Largest number and Smallest number"
echo "=========================================="
Diff=`expr $l - $s`
echo "Result is : $Diff"
echo "If you try it, We can get it"
您的问题询问“ unix shell脚本”,但已被标记 bash
。那是两个不同的答案。
Shell的POSIX规范没有任何关于数组的说明,因为原始的Bourne Shell不支持它们。即使在今天,在FreeBSD,Ubuntu Linux和许多其他系统上,/bin/sh
也没有阵列支持。因此,如果您希望脚本在与Bourne兼容的其他外壳中运行,则不应使用它们。另外,如果您假设使用特定的外壳,请确保将其全名放在shebang行中,例如#!/usr/bin/env bash
。
如果使用bash或zsh或现代版本的ksh,则可以创建如下数组:
myArray=(first "second element" 3rd)
和这样的访问元素
$ echo "${myArray[1]}"
second element
您可以通过获取所有元素"${myArray[@]}"
。您可以使用切片符号$ {array [@]:start:length}来限制引用的数组部分,例如"${myArray[@]:1}"
,省略第一个元素。
数组的长度为${#myArray[@]}
。您可以使用以下命令从现有数组中获取一个包含所有索引的新数组:"${!myArray[@]}"
。
在ksh93之前的较早版本的ksh也具有数组,但是没有基于括号的表示法,也不支持切片。您可以创建一个像这样的数组:
set -A myArray -- first "second element" 3rd
您可以尝试以下类型:
#!/bin/bash
declare -a arr
i=0
j=0
for dir in $(find /home/rmajeti/programs -type d)
do
arr[i]=$dir
i=$((i+1))
done
while [ $j -lt $i ]
do
echo ${arr[$j]}
j=$((j+1))
done
数组可以双向加载。
set -A TEST_ARRAY alpha beta gamma
要么
X=0 # Initialize counter to zero.
-使用字符串alpha,beta和gamma加载数组
for ELEMENT in alpha gamma beta
do
TEST_ARRAY[$X]=$ELEMENT
((X = X + 1))
done
另外,我认为以下信息可能会有所帮助:
外壳支持一维数组。数组元素的最大数量为1,024。定义数组后,它会自动调整为1,024个元素的尺寸。一维数组包含一系列数组元素,就像在火车轨道上连接在一起的棚车一样。
如果要访问数组:
echo ${MY_ARRAY[2] # Show the third array element
gamma
echo ${MY_ARRAY[*] # Show all array elements
- alpha beta gamma
echo ${MY_ARRAY[@] # Show all array elements
- alpha beta gamma
echo ${#MY_ARRAY[*]} # Show the total number of array elements
- 3
echo ${#MY_ARRAY[@]} # Show the total number of array elements
- 3
echo ${MY_ARRAY} # Show array element 0 (the first element)
- alpha
如果要使用支持空格的键值存储,请使用-A
参数:
declare -A programCollection
programCollection["xwininfo"]="to aquire information about the target window."
for program in ${!programCollection[@]}
do
echo "The program ${program} is used ${programCollection[${program}]}"
done
http://linux.die.net/man/1/bash “使用声明-A名称创建关联数组。”
从keybord读取值并将元素插入数组
# enter 0 when exit the insert element
echo "Enter the numbers"
read n
while [ $n -ne 0 ]
do
x[$i]=`expr $n`
read n
let i++
done
#display the all array elements
echo "Array values ${x[@]}"
echo "Array values ${x[*]}"
# To find the array length
length=${#x[*]}
echo $length
在ksh中,您可以执行以下操作:
set -A array element1 element2 elementn
# view the first element
echo ${array[0]}
# Amount elements (You have to substitute 1)
echo ${#array[*]}
# show last element
echo ${array[ $(( ${#array[*]} - 1 )) ]}
echo "${array[@]:(-1)}"
。这样就无需两次编写数组变量名。