UNIXシェルスクリプトで配列を作成するにはどうすればよいですか?
次のコードは、シェルで文字列の配列を作成して出力します。
#!/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
bashでは、このような配列を作成します
arr=(one two three)
要素を呼び出す
$ echo "${arr[0]}"
one
$ echo "${arr[2]}"
three
ユーザー入力を求めるには、readを使用できます
read -p "Enter your choice: " choice
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
#!/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」を読むことができます
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"
これを試して :
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
配列は双方向でロードできます。
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
次のタイプを試すことができます:
#!/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 nameを使用して作成されます。」
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[@]}
は、配列の長さをカウントするために使用されます。
キーボードから値を読み取り、要素を配列に挿入するには
# 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
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
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 )) ]}