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