在Unix外壳数组?


Answers:


90

以下代码在shell中创建并打印字符串数组:

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

echo
echo "Number of elements: ${#array[@]}"
echo
echo "${array[@]}"

结果:

A
B
ElementC
ElementE

Number of elements: 4

A B ElementC ElementE

61

在bash中,您可以这样创建数组

arr=(one two three)

称呼元素

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

要求用户输入,您可以使用阅读

read -p "Enter your choice: " choice

以空格分隔的声明不适用于/bin/sh引发error line 1: syntax error: unexpected "("。您知道替代品吗?
mhyousefi

20

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

1
Bash支持数组。不确定原始的Bourne外壳,但
如今

2
@zplesivcak-...在GNU / Linux上,因为它是GNU。例如,FreeBSD不附带bash(尽管可以从端口安装)。假定bash功能无法移植的脚本,并且比大多数Bourne Shell实现(例如dash,在GNU / Linux发行版中常见)要慢得多。bash是一个不错的交互式外壳,但是编写脚本的速度很慢。
Beatgammit,

1
$*被认为是有害的。通常,$@首选这样做是因为它可以做到相同,但要保留空格。$@扩展为“ $ 1”,“ $ 2”,“ $ 3” ...“ $ n”,而$*扩展为“ $ 1x $ 2x $ 3x ... $ n”,其中x$IFS分隔符(最有可能是空格)。
zserge 2014年

1
未引用,$@$*;相同。差异仅在被引用时显示: "$*"是一个单词,而"$@"保留原始的分词符。
马克·里德

这个问题被标记为bash,因此bash特定的响应是适当的,但是可以肯定的是,不应该认为/bin/shbash是对的。
马克·里德

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


3
请重新考虑建议将ABS作为学习资源-它以多种方式抨击W3Schools对HTML和Javascript的含义,拥有大量的Google果汁,但在许多示例中都展示了不良做法,并且很少且未充分更新。bash-hackers的Wiki是更好的资源。BashGuide也是如此
Charles Duffy

空格分隔的声明不适用于/bin/sh引发error line 1: syntax error: unexpected "("。您知道替代品吗?
mhyousefi

8

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"

csh确实有数组。
基思·汤普森

@KeithThompson:手册页中没有记录此功能,但至少在某些版本中确实存在该功能。
暂停,直到另行通知。

3
手册页中没有提到该名称的“数组”,但请参见set命令(set name=(wordlist))和“变量替换”部分($name[selector]${name[selector]})的文档。据我所知,csh一直支持数组。例如,请参阅$path数组变量,该变量反映了$PATH环境变量。
基思·汤普森

8

试试这个 :

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"

这仅适用于ksh和bash,对吗?
拉西

6

您的问题询问“ unix shell脚本”,但已被标记 bash。那是两个不同的答案。

Shell的POSIX规范没有任何关于数组的说明,因为原始的Bourne Shell不支持它们。即使在今天,在FreeBSD,Ubuntu Linux和许多其他系统上,/bin/sh也没有阵列支持。因此,如果您希望脚本在与Bourne兼容的其他外壳中运行,则不应使用它们。另外,如果您假设使用特定的外壳,请确保将其全名放在shebang行中,例如#!/usr/bin/env bash

如果使用bashzsh或现代版本的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 

5

您可以尝试以下类型:

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

用空格分隔目录名称。使用变更IFS的while读取循环来解决这一问题。
ghostdog74

5

数组可以双向加载。

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

4

如果要使用支持空格的键值存储,请使用-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名称创建关联数组。”


4

在shell中有多种创建数组的方法。

ARR[0]="ABC"
ARR[1]="BCD"
echo ${ARR[*]}

${ARR[*]} 打印数组中的所有元素。

第二种方法是:

ARR=("A" "B" "C" "D" 5 7 "J")
echo ${#ARR[@]}
echo ${ARR[0]}

${#ARR[@]} 用于计算数组的长度。


好的答案,对于新手来说是个好开始。欢迎升级;-)
GhostCat

3

从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

1

在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)}"。这样就无需两次编写数组变量名。
Alex Dupuy 2014年

1

一个简单的方法:

arr=("sharlock"  "bomkesh"  "feluda" )  ##declare array

len=${#arr[*]}  #determine length of array

# iterate with for loop
for (( i=0; i<len; i++ ))
do
    echo ${arr[$i]}
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.