UNIXシェルの配列?


回答:


91

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

#!/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を使用できます

read -p "Enter your choice: " choice

スペースで区切られた宣言は/bin/sh、エラーをスローしても機能しませんline 1: syntax error: unexpected "("。あなたは代替案を知っていますか?
mhyousefi

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

1
Bashは配列をサポートしています。元のBourneシェルについてはよく
わかり

2
@zplesivcak -... GNU / Linuxでは、GNUのものなので。たとえば、FreeBSDには同梱されていませんbash(ただし、ポートからインストールできます)。仮定すると書かれたスクリプトbash機能は移植性がありません、そして、彼ら使用率は高い遅く(のようなほとんどのBourneシェルの実装よりも遅くしているdashあるGNU / Linuxディストリビューションに共通)。bash優れたインタラクティブシェルですが、スクリプト作成には時間がかかります。
beatgammit 2013年

1
$*有害と見なされます。通常$@は、同じことを行いますが、スペースを保持するため、推奨されます。$@は "$ 1" "$ 2" "$ 3" ... "$ n"$*として展開され、 "$ 1x $ 2x $ 3x ... $ n"として展開されます。ここで、x$IFS区切り文字(おそらくスペース)です。
zserge 2014

1
引用なし、$@$*;と同じです。違いは引用された場合にのみ表示されます:"$*"は1つの単語です が"$@"、元の単語の区切りは保持されます。
マークリード

質問にはタグが付けられているbashため、bash固有の応答が適切ですが、それ/bin/shがbashであると想定すべきではないことは確かです。
マークリード

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」を読むことができます


3
学習リソースとしてABSを提案することを再検討してください。これは、W3SchoolsがHTMLとJavascriptにどのように影響するかをさまざまな方法で打ち負かし、Googleのジュースをたくさん持っていますが、その例の多くで悪い習慣を示しており、更新がめったに不十分です。bash-hackersのwikiははるかに優れたリソースです。BashGuideもそうです。
チャールズダフィー

スペースで区切られた宣言は/bin/sh、エラーをスローしても機能しませんline 1: syntax error: unexpected "("。あなたは代替案を知っていますか?
mhyousefi

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"

cshには配列があります。
キーストンプソン

@KeithThompson:それはに文書化されていません manページにが、機能は少なくとも一部のバージョンに存在するようです。
デニスウィリアムソン

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"

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 

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のwhilereadループを使用してそれを処理します。
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次元配列をサポートします。配列要素の最大数は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

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「連想配列はdeclare-Anameを使用して作成されます。」


4

シェルで配列を作成する方法は複数あります。

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

${ARR[*]} 配列内のすべての要素を出力します。

2番目の方法は次のとおりです。

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

${#ARR[@]} 配列の長さをカウントするために使用されます。


いい答えです、初心者にとって素晴らしいスタートです。そして、
賛成

3

キーボードから値を読み取り、要素を配列に挿入するには

# 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)}"です。これにより、配列変数名を2回書き込む必要がなくなります。
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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.