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

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

「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

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

答え2

このコマンドを使用する場合

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

bash は "$()" で "sub-shells" コマンドを実行し、以下を返します。出力文字列

はい

次のコマンドを入力してください。./name_value.sh $(echo "no_spaces"; echo "スペースを含む")

処理されたコマンド:./name_value.sh スペースがある no_spaces

次のステップは、3つのパラメータを使用してbashスクリプトを実行することです。

最初の引数:スペースなし

2番目の引数:そして

3番目の主張:スペース


これは、コマンドを使用してスクリプトを手動で呼び出すのと同じです。

./name_value.sh no_spaces with spaces

問題を解決するには、サブシェル呼び出し "$()" の周囲に引用符を挿入する必要があります。

あなたにこれが必要です。

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

処理中のコマンドは次のとおりです。

./name_value.sh no_spaces "with spaces"

最後に、出力は次のようになります。

Name=no_spaces
Value=with spaces

関連情報