在unix shell中的数组?

如何在unix shell脚本中创build一个数组?

以下代码在shell中创build并打印一个string数组:

#!/bin/bash array=( "A" "B" "ElementC" "ElementE" ) for element in ${array[@]} do echo $element done echo "" echo "Nbr of elements:" ${#array[@]} echo "" echo ${array[@]} 

结果:

 A B ElementC ElementE Nbr of elements: 4 AB ElementC ElementE 

在bash中,你可以像这样创build数组

 arr=(one two three) 

调用元素

 $ echo ${arr[0]} one $ echo ${arr[2]} three 

要求用户input,可以使用read

 read -p "Enter your choice: " choice 

那是你要求的吗?

Bourne shell不支持数组。 但是,有两种方法来处理这个问题。

使用位置shell参数$ 1,$ 2等:

 $ set one two three $ echo $* one two three $ echo $# 3 $ echo $2 two 

使用variables评估:

 $ 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 
 #!/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脚本指南”

尝试这个 :

 echo "Find the Largest Number and Smallest Number of a given number" echo "---------------------------------------------------------------------------------" echo "Enter the number" read n while [ $n -gt 0 ] #For Seperating digits and Stored into array "x" do x[$i]=`expr $n % 10` n=`expr $n / 10` 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" 

Bourne shell和C shell没有数组IIRC。

除了别人所说的以外,在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" 

你可以尝试下面的types:

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

如果您想要一个支持空格的键值存储,请使用-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 “使用declare -A名称创build关联数组。

一个数组可以在两个加载。

 set -A TEST_ARRAY alpha beta gamma 

要么

 X=0 # Initialize counter to zero. 

– 用stringalpha,beta和gamma加载数组

 for ELEMENT in alpha gamma beta do TEST_ARRAY[$X]=$ELEMENT ((X = X + 1)) done 

另外,我认为以下信息可能有所帮助:

该shell支持一维数组。 数组元素的最大数量是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 

从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 

你的问题是关于“unix shell脚本”,但是被标记为bash 。 这是两个不同的答案。

关于shell的POSIX规范没有关于数组的任何内容,因为原始的Bourne shell不支持它们。 即使在今天,在FreeBSD,Ubuntu Linux和许多其他系统上, /bin/sh也没有arrays支持。 所以如果你想让你的脚本在不同的Bourne兼容shell中工作,你不应该使用它们。 或者,如果你假定一个特定的shell,那么一定要把它的全名放在shebang行,例如#!/usr/bin/env bash

如果你正在使用bash或者zsh或者现代版本的ksh ,你可以像这样创build一个数组:

 myArray=(first "second element" 3rd) 

并访问这样的元素

 $ echo "${myArray[1]}" second element 

您可以通过"${myArray[@]}"获取所有元素。 您可以使用切片符号$ {array [@]:start:length}来限制引用的数组部分,例如"${myArray[@]:1}"以使第一个元素不起作用。

数组的长度是${#myArray[@]} 。 您可以使用"${!myArray[@]}"获取包含现有数组中所有索引的新数组。

在ksh93之前的ksh的老版本也有数组,但不是基于括号的记法,也不支持切片。 不过你可以像这样创build一个数组:

 set -A myArray -- first "second element" 3rd 

在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 )) ]}