UNIXシェルの配列?

2009年12月10日に質問されました。  ·  閲覧回数 262.7k回  ·  ソース

Arunachalam picture
2009年12月10日

UNIXシェルスクリプトで配列を作成するにはどうすればよいですか?

回答

Vincent Agami picture
2013年09月19日
90

次のコードは、シェルで文字列の配列を作成して出力します。

#!/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
ghostdog74 picture
2009年12月10日
61

bashでは、次のような配列を作成します

arr=(one two three)

要素を呼び出す

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

ユーザー入力を求めるには、readを使用できます

read -p "Enter your choice: " choice
Mishka picture
2013年03月13日
20

Bourneシェルは配列をサポートしていません。 ただし、この問題を処理するには2つの方法があります。

位置シェルパラメータ$ 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
Lai Jiangshan picture
2009年12月10日
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「AdvancedBash-ScriptingGuide」を読むことができます

Paused until further notice. picture
2009年12月10日
8

BourneシェルとCシェルには配列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"
muthukrishnavinayagam picture
2012年03月14日
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"
Mark Reed picture
2015年12月10日
6

あなたの質問は「unixシェルスクリプト」について尋ねますが、 bashタグが付けられています。 これらは2つの異なる答えです。

元のBourneシェルは配列をサポートしていなかったため、シェルのPOSIX仕様には配列について何も言うことがありません。 今日でも、FreeBSD、Ubuntu Linux、および他の多くのシステムでは、 /bin/shは配列をサポートしていません。 したがって、スクリプトをさまざまなBourne互換シェルで機能させたい場合は、それらを使用しないでください。 または、特定のシェルを想定している場合は、必ずそのフルネームをシバン行に入力してください(例: #!/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 
Roopesh Majeti picture
2009年12月10日
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
Pinaki Mukherjee picture
2015年07月20日
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次元配列をサポートします。 配列要素の最大数は1,024です。 配列が定義されると、1,024要素に自動的にディメンション化されます。 1次元配列には、一連の配列要素が含まれています。これは、線路上で互いに接続されたボックスカーのようなものです。

配列にアクセスする場合:

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
richardjsimkins picture
2015年04月19日
4

スペースをサポートするKeyValueストアが必要な場合は、 -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-Anameを使用して作成されます。」