空白を介したbash引数の伝播

空白を介したbash引数の伝播

my-scriptでは、「$ 1」はスペースで区切られたトークン文字列です。

たとえば、この単一のパラメータを複数のパラメータに「拡張」して別のプログラムに渡すにはどうすればよいですか?

./my-script2 ...$1  # spread the string into multiple arguments, delineating by whitepace

質問を理解し、答えを見つけるのに苦労していることを願っています。

私はこれを試しました:

./my-script2 <<< "$1"

これ:

./my-script2 "" <<< $1

そして他の組み合わせもありますが、これはうまくいかないようです。 Bash v3以降をサポートする必要があります。

答え1

./my-script2 $1

引用なしパラメータ受け取る噴射いつ拡大する:

シェルは、単語分割のために二重引用符内に表示されない引数拡張、コマンド置換、および算術拡張の結果をスキャンします。

これは指定されたPOSIX動作、一部のシェル(特にzsh)では、デフォルトでこれを無効にします。デフォルトを変更する場合、IFSこれはあなたの責任です。

答え2

要約:「ファイル名拡張子」セキュリティソリューション(my-script2用):

IFS=' ' read -a arr <<<"$1"
printf '<%s>--' "${arr[@]}" ; echo

引用符なしの変数を使用してIFS値に基づいて単語に分割する簡単なソリューションも*、?そして[(少なくとも)。

この特定の文字列はうまく機能します。

$ set "a string with spaces"
$ printf '<%s>--' $1; echo
<a>--<string>--<with>--<spaces>--

しかし、この文字列は明らかに失敗します。

$ set "a bad * string with spaces"
$ printf '<%s>--' $1; echo
<a>--<bad>--<file1>--<file2>--<string>--<with>--<spaces>--

アスタリスクはPWDのファイルに拡張されました。

ここのドキュメント

「パス名拡張」(しばしば見落とされますが非常に便利です)なしで変数拡張を取得する1つの方法は、ここでドキュメントを使用することです。

IFS=' ' read -ra arr <<-_EOF_
 $1
 _EOF_
 printf '<%s>--' "${arr[@]}" ; echo;

マニュアルに記載されているように:

単語を引用しない場合、文書のすべての行にパラメータ拡張、コマンド置換、および算術拡張が適用されます。

「パス名拡張子」は次のとおりです。いいえアプリケーション。

heredocの近親者はherestringなので、コードが短くなります。

IFS=' ' read -ra arr <<<"$1"
printf '<%s>--' "${arr[@]}" ; echo;

(二重引用符内の)文字\、$、および`は特殊文字であることを忘れないでください。
マニュアルから:

文字シーケンス\は無視され、\は\、$、および文字を引用するために使用されるべきです。

関連情報