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;
(二重引用符内の)文字\、$、および`は特殊文字であることを忘れないでください。
マニュアルから:
文字シーケンス\は無視され、\は\、$、および文字を引用するために使用されるべきです。