サブシェルを使用してスペースを含むパラメータを渡す

サブシェルを使用してスペースを含むパラメータを渡す

「name_value.sh」というシェルがあり、サブシェルで生成された引数を渡したいと思います。サブシェルから引数を受け取るコマンドが空白を保持していることをどのように確認できますか?

注:これは私がやっていることの非常に簡単な例です。答える前に全内容をお読みください。

単純化された例は次のとおりです。

./name_value.sh $(echo "no_spaces"; echo "with spaces")

name_value.sh は次のようになります。

#!/bin/bash
echo "Name=$1"
echo "Value=$2"

希望の出力は次のとおりです。

Name=no_spaces
Value=with spaces

これは非常に単純化された例です。私の実際のサブシェルは複雑で、同時に生成され、name_value.shに渡される必要がある何十もの名前と値のペアを繰り返し出力します。私も私が呼び出すシェルファイルを制御することはできません。

私は引用符でエコーし、printfと「%q」を使ってみました。また、サブシェルの結果を最初に配列に入れることを検討しましたが、そのうちの1つも機能しませんでした。サブシェルの代わりにテキストを入力するのと同じように、サブシェルを解釈するには親シェルが必要です。

ベストアンサー1

はい。変数(通常はスペース、タブ、改行文字を含む)をIFS改行文字に設定します。これにより、単語分割にスペースやタブが使用されなくなります。これにより、希望の出力が提供されます。

IFS=$'\n'
set -o noglob # disable the second effect of leaving that
              # $(...) unquoted.
./name_value.sh $(echo "no_spaces"; echo "with spaces")

しかし、私が望むのは、標準入力からスクリプトを読むことです。

# name_value.sh
IFS= read -r name
IFS= read -r value
echo "Name=$name"
echo "Value=$value"

それから

( echo no_spaces; echo with spaces ) | ./name_value.sh

私はこのアプローチがより強力だと思います。

おすすめ記事