Bashでは、「df -h」出力を行配列として読み込みます。

Bashでは、「df -h」出力を行配列として読み込みます。

シェルスクリプトから「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)でも機能します。これは、コマンドの置き換え時にグローブではなく分割のみを実行するためです。ksh93zshzshset -o noglob

または、次のこともできます(bashのみ)。

readarray -t lines < <(df -k)

出力に項目ごとに正確に1行が含まれるという保証はありませんdfテキスト処理にシェルループを使用することは通常、正しいアプローチではありません。。また、bashとkshの配列インデックスは0から始まりますが、他のすべてのシェルでは1から始まります。

おすすめ記事