UNIXシェルスクリプトで配列を作成するにはどうすればよいですか?
回答:
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 "("
。あなたは代替案を知っていますか?
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
bash
(ただし、ポートからインストールできます)。仮定すると書かれたスクリプトbash
機能は移植性がありません、そして、彼ら使用率は高い遅く(のようなほとんどのBourneシェルの実装よりも遅くしているdash
、あるGNU / Linuxディストリビューションに共通)。bash
優れたインタラクティブシェルですが、スクリプト作成には時間がかかります。
$*
有害と見なされます。通常$@
は、同じことを行いますが、スペースを保持するため、推奨されます。$@
は "$ 1" "$ 2" "$ 3" ... "$ n"$*
として展開され、 "$ 1x $ 2x $ 3x ... $ n"として展開されます。ここで、x
は$IFS
区切り文字(おそらくスペース)です。
$@
は$*
;と同じです。違いは引用された場合にのみ表示されます:"$*"
は1つの単語です が"$@"
、元の単語の区切りは保持されます。
bash
ため、bash固有の応答が適切ですが、それ/bin/sh
がbashであると想定すべきではないことは確かです。
#!/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」を読むことができます
/bin/sh
、エラーをスローしても機能しませんline 1: syntax error: unexpected "("
。あなたは代替案を知っていますか?
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"
set
コマンドのドキュメント(set name=(wordlist)
)および「変数の置換」セクション($name[selector]
および${name[selector]}
)を参照してください。私の知る限り、cshは常に配列をサポートしてきました。たとえば、$path
$PATH
環境変数を反映する配列変数を。
これを試して :
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シェルスクリプト」について尋ねますが、タグが付けられています bash
ます。これらは2つの異なる答えです。
元のBourneシェルは配列をサポートしていなかったため、シェルのPOSIX仕様には配列について何も言うことがありません。今日でも、FreeBSD、Ubuntu Linux、および他の多くのシステムで/bin/sh
は、アレイはサポートされていません。したがって、スクリプトをさまざまなBourne互換シェルで機能させたい場合は、それらを使用しないでください。または、特定のシェルを想定している場合は、必ずそのフルネームをシバン行に入力してください#!/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
次のタイプを試すことができます:
#!/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
配列は双方向でロードできます。
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
スペースをサポートするキー値ストアが必要な場合は、次の-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を使用して作成されます。」
シェルで配列を作成する方法は複数あります。
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
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回書き込む必要がなくなります。