Linuxシェルスクリプトでの配列の操作–パート8
配列の概念がなければプログラミング言語を想像することはできません。さまざまな言語間でどのように実装されているかは関係ありません。代わりに、配列は、類似または異なるデータを1つの記号名で統合するのに役立ちます。
ここではシェルスクリプトについて懸念しているので、この記事は、この配列の概念を利用するいくつかのシェルスクリプトを試すのに役立ちます。
アレイの初期化と使用法
新しいバージョンのbashでは、1次元配列をサポートしています。配列はdeclareで明示的に宣言できます シェルビルトイン。
declare -a var
ただし、上記のように配列変数を宣言する必要はありません。次のように、個々の要素を配列に直接挿入できます。
var[XX]=<value>
ここで、「XX」はアレイインデックスを示します。配列要素を逆参照するには、中括弧構文を使用します。つまり、
${var[XX]}
配列全体を初期化するもう1つの便利な方法は、以下に示すように括弧のペアを使用することです。
var=( element1 element2 element3 . . . elementN )
配列に値を割り当てるさらに別の方法があります。この初期化の方法は、前に説明した方法のサブカテゴリです。
array=( [XX]=<value> [XX]=<value> . . . )
read を使用して、実行時に配列に値を読み取ったり割り当てたりすることもできます。 シェルビルトイン。
read -a array
スクリプト内で上記のステートメントを実行すると、入力を待ちます。スペースで区切られた配列要素を提供する必要があります(キャリッジリターンではありません)。値を入力したら、Enterキーを押して終了します。
配列要素をトラバースするために、forループを使用することもできます。
for i in “${array[@]}”
do
#access each element as $i. . .
done
次のスクリプトは、この特定のセクションの内容を要約したものです。
#!/bin/bash
array1[0]=one
array1[1]=1
echo ${array1[0]}
echo ${array1[1]}
array2=( one two three )
echo ${array2[0]}
echo ${array2[2]}
array3=( [9]=nine [11]=11 )
echo ${array3[9]}
echo ${array3[11]}
read -a array4
for i in "${array4[@]}"
do
echo $i
done
exit 0
配列のさまざまな操作
標準の文字列操作の多くは配列で機能します。配列に対するいくつかの操作(文字列操作を含む)を実装する次のサンプルスクリプトを見てください。
#!/bin/bash
array=( apple bat cat dog elephant frog )
#print first element
echo ${array[0]}
echo ${array:0}
#display all elements
echo ${array[@]}
echo ${array[@]:0}
#display all elements except first one
echo ${array[@]:1}
#display elements in a range
echo ${array[@]:1:4}
#length of first element
echo ${#array[0]}
echo ${#array}
#number of elements
echo ${#array[*]}
echo ${#array[@]}
#replacing substring
echo ${array[@]//a/A}
exit 0
上記のスクリプトを実行したときに生成される出力は次のとおりです。
apple apple apple bat cat dog elephant frog apple bat cat dog elephant frog bat cat dog elephant frog bat cat dog elephant 5 5 6 6 Apple bAt cAt dog elephAnt frog
上記のスクリプトは一目瞭然なので、詳しく説明しても意味がないと思います。必要に応じて、このシリーズの一部を文字列操作のみに当てます。
配列によるコマンド置換
コマンド置換は、1つまたは複数のコマンドの出力を別のコンテキストに割り当てます。この配列のコンテキストでは、コマンドの出力を配列の個々の要素として挿入できます。構文は次のとおりです。
array=( $(command) )
デフォルトでは、空白で区切られたコマンドの出力の内容は、個々の要素として配列にプラグインされます。次のスクリプトは、755のアクセス許可を持つファイルであるディレクトリの内容を一覧表示します。
#!/bin/bash
ERR=27
EXT=0
if [ $# -ne 1 ]; then
echo "Usage: $0 <path>"
exit $ERR
fi
if [ ! -d $1 ]; then
echo "Directory $1 doesn't exists"
exit $ERR
fi
temp=( $(find $1 -maxdepth 1 -type f) )
for i in "${temp[@]}"
do
perm=$(ls -l $i)
if [ `expr ${perm:0:10} : "-rwxr-xr-x"` -eq 10 ]; then
echo ${i##*/}
fi
done
exit $EXT
2次元配列のシミュレーション
1次元配列を使用して2次元行列を簡単に表すことができます。 行の主要な順序 行列の各行の表現要素は、配列インデックスに順番に格納されます。 mXn行列の場合、同じ式は次のように記述できます。
matrix[i][j]=array[n*i+j]
2つの行列を追加し、結果の行列を印刷するための別のサンプルスクリプトを見てください。
#!/bin/bash
read -p "Enter the matrix order [mxn] : " t
m=${t:0:1}
n=${t:2:1}
echo "Enter the elements for first matrix"
for i in `seq 0 $(($m-1))`
do
for j in `seq 0 $(($n-1))`
do
read x[$(($n*$i+$j))]
done
done
echo "Enter the elements for second matrix"
for i in `seq 0 $(($m-1))`
do
for j in `seq 0 $(($n-1))`
do
read y[$(($n*$i+$j))]
z[$(($n*$i+$j))]=$((${x[$(($n*$i+$j))]}+${y[$(($n*$i+$j))]}))
done
done
echo "Matrix after addition is"
for i in `seq 0 $(($m-1))`
do
for j in `seq 0 $(($n-1))`
do
echo -ne "${z[$(($n*$i+$j))]}\t"
done
echo -e "\n"
done
exit 0
シェルスクリプト内に配列を実装することには制限がありますが、特にコマンド置換を使用して処理する場合は、いくつかの状況で役立ちます。管理の観点から見ると、配列の概念は、GNU/Linuxシステムでの多くのバックグラウンドスクリプトの開発への道を開きました。
-
シェルスクリプト言語でのLinux「変数」の洞察–パート9
Linuxシェルスクリプトに関する一連の記事はすでに書いています。 その時は暖かく迎えられ、今でも非常に重要でした。シェルスクリプトに関する記事のコレクションへのリンクは次のとおりです。 Linuxシェルスクリプトを学ぶ この記事では、変数を確認します。 、その実行とシェルスクリプトでの実装。 出力の保存 コマンドの出力は、標準出力またはファイルにリダイレクトでき、変数に保存することもできます。コマンドの出力が画面に収まらないほど大きい場合は、ファイルへの出力を変数に保存するオプションのみが残ります。出力を変数に保存することの利点の1つは、検査速度が速いことです。変数はメモリに保存さ
-
5 つの実用的な例を含む Bash スクリプト入門チュートリアル
進行中の Unix Sed および Unix Awk シリーズと同様に、Bash スクリプトに関するいくつかの記事を投稿します。実用的な例ですべての bash スクリプト テクニックをカバーします。 シェルは、ユーザー コマンドを解釈するプログラムです。コマンドは、ユーザーが直接入力するか、シェル スクリプトと呼ばれるファイルから読み取るかのいずれかです。ユーザーからの入力を直接読み取る場合、シェルは対話型シェルとして呼び出されます。 シェルは、ファイルからコマンドを読み取って実行するときに、非対話型シェルとして呼び出されます。この場合、シェルはスクリプト ファイルの各行を上から下に読み取