この問題はいくつかの方法で解決できることはわかっていますが、bashビルトインのみを使用して解決する方法があるかどうか疑問に思っています。そうでない場合は、最も効率的な方法は何ですか。
のような内容のファイルがあります
AAA
B C DDD
FOO BAR
つまり、複数の行があり、各行にスペースがある場合とない場合があります。
のようなコマンドを実行したいcmd AAA "B C DDD" "FOO BAR"
cmd $(< file)
を使用する場合 取得
cmd AAA B C DDD FOO BAR
cmd "$(< file)"
を使用する場合 取得
cmd "AAA B C DDD FOO BAR"
各行を正確に1つのパラメータとして処理するにはどうすればよいですか?
承認された回答:
移植可能:
set -f # turn off globbing
IFS='
' # split at newlines only
cmd $(cat <file)
unset IFS
set +f
または、サブシェルを使用してIFS
を作成します およびオプションのローカル変更:
( set -f; IFS='
'; exec cmd $(cat <file) )
シェルは、二重引用符で囲まれていない変数またはコマンド置換の結果に対して、フィールド分割とファイル名生成を実行します。したがって、set -f
を使用してファイル名の生成をオフにする必要があります 、およびIFS
を使用してフィールド分割を構成します 改行のみを個別のフィールドにするため。
bashまたはkshコンストラクトで得られるものはあまりありません。 IFS
を作成できます 関数に対してローカルですが、set -f
ではありません 。
bashまたはksh93では、フィールドを複数のコマンドに渡す必要がある場合は、フィールドを配列に格納できます。アレイを構築するときに拡張を制御する必要があります。次に、"${a[@]}"
単語ごとに1つずつ、配列の要素に展開されます。
set -f; IFS=$'n'
a=($(cat <file))
set +f; unset IFS
cmd "${a[@]}"