シェルスクリプトから「df -h」出力を行配列として読み取ろうとします。
以下のコードを試しましたが、var [0]は最初の行全体ではなく、最初の行の最初の列を提供します。私の期待は、1回の繰り返しで完全なラインを得ることです。
var=($(df -k))
echo " echo ${var[0]}
awkを使わずにこれを達成するには?
答え1
$(cmd)
(コマンドの置き換え)リストのコンテキストで引用符をオフにすると、POSIXシェルは分割+glob演算子を呼び出しますbash
。たとえば、ここではglob部分は必要ありません。分割部分は$IFS
(デフォルトでは空白、タブ、および改行)の文字に基づいて分割されます。
ここで欲しいものは次のとおりです。
IFS='
' # split on newline only. Also IFS=$'\n' in bash/ksh93/zsh/mksh
set -o noglob # disable globbing
lines=($(df -k)) # use the split+glob operator
(空白行が削除されます。)
mksh
これは、または(省略可能yash
)でも機能します。これは、コマンドの置き換え時にグローブではなく分割のみを実行するためです。ksh93
zsh
zsh
set -o noglob
または、次のこともできます(bashのみ)。
readarray -t lines < <(df -k)
出力に項目ごとに正確に1行が含まれるという保証はありませんdf
。テキスト処理にシェルループを使用することは通常、正しいアプローチではありません。。また、bashとkshの配列インデックスは0から始まりますが、他のすべてのシェルでは1から始まります。