GNU/Linux >> Linux の 問題 >  >> Linux

コマンド置換:改行で分割するがスペースでは分割しない?

この問題はいくつかの方法で解決できることはわかっていますが、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[@]}"

Linux
  1. シェルコマンド置換が末尾の改行文字を飲み込むのはなぜですか?

  2. 「-oErrtrace」(つまり、Set -e)を使用したコマンド置換でのエラーのトラップ?

  3. 「?」を使用したコマンド置換

  1. ifrename:コマンドが見つかりません

  2. ln:コマンドが見つかりません

  3. Conda コマンドはコマンド プロンプトでは機能するが、bash スクリプトでは機能しない

  1. コマンドはZshで見つかりませんが、Bashで見つかりましたか?

  2. Gnu Awk Errnoがコマンドの失敗に設定されていませんか?

  3. id:コマンドが見つかりません