この問題をさまざまな方法で解決できることを知っていますが、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つのパラメータのみを処理させるにはどうすればよいですか?
ベストアンサー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[@]}"