web-dev-qa-db-ja.com

UNIXシェルの配列?

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

77
Arunachalam

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

#!/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
84
Vincent Agami

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

arr=(one two three)

要素を呼び出す

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

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

read -p "Enter your choice: " choice
59
ghostdog74

Bourne Shellは配列をサポートしていません。ただし、問題を処理するには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
16
Mishka
#!/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「Advanced Bash-Scripting Guide」を読むことができます

13
Lai Jiangshan

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"
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"

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

シェルのPOSIX仕様には、元のBourneシェルではサポートされていなかったため、配列に関する説明がありません。今日でも、FreeBSD、Ubuntu Linux、および他の多くのシステムでは、/bin/shはアレイをサポートしていません。したがって、スクリプトをさまざまなBourne互換シェルで動作させる場合は、使用しないでください。また、特定のシェルを想定している場合は、その完全な名前を必ずShebang行に入れてください。 #!/usr/bin/env bash

bash または zsh 、または 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 
6
Mark Reed

配列は双方向でロードできます。

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
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
5
Roopesh Majeti

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

4
richardjsimkins

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

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
3
para

簡単な方法:

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
1
rashedcs

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 )) ]}
1
user224243