一方./mysh0
:
#!/bin/bash
exec ./mysh1 $*
そして./mysh1
:
#!/bin/bash
echo $1
echo $2
echo $3
mysh0
このようなパラメータをどのように呼び出し、mysh1
「A」、「B 2」、および「C」を印刷しますか?
これを./mysh0 A "B 2" C
絶対禁物と呼んでください。
答え1
"$@"
代わりに、以下を使用する必要があります$*
。
exec ./mysh1 "$@"
これは、すべての位置パラメータを別々の単語に拡張する正しい方法です。
を使用すると、$*
すべての位置パラメータが1つの長い文字列に連結されます。最初の値はIFS
区切り文字で、デフォルトのスペースはですA B 2 C
。
$*
今二重引用符なしで使用しているので(安全上の危険を招くおそれそしてスクリプトを窒息させる)、シェルがsplit+glob
これを実行します。上記で得た長い文字列はA
、B
と 4 つの単語に分けられます。2
C
mysh1
したがって、実際には3つではなく4つのパラメータを渡します。