3
$ set a b c
$ echo $1 $2 $3
a b c
$ echo ${1..3}
-bash: ${1..3}: bad substitution

ブレース展開で $1 $2 $3 をエコーし​​たい。しかし、うまくいきません。

展開の順序は、ブレース展開、チルダ展開、パラメーター、変数と算術展開、およびコマンド置換 (左から右に行われる)、単語分割、およびパス名展開です。

bash のマニュアルによると、ブレース展開はパラメーター展開の前に実行されます。

${1..3}したがって、bash は最初にブレース展開を実行し、それを に変換してからecho $1 $2 $3、パラメーター展開を実行する必要があると思います。

しかし、実際のところ、bash は不適切${1..3}な代用として不平を言っています。何故ですか?

PS: 皆さん、ありがとうございました!すべての回答は素晴らしいものです.しかし、私は思う

Ignacio Vazquez-Abrams の答えは、私が望むものに近いものです。

4

2 に答える 2

6

中かっこはドル記号の後に続くため、パラメータ置換の一部であると考えられ、「$1..3」は無効な変数名です。

代わりに「${@:1:3}」を試してください。

于 2015-09-14T05:26:03.613 に答える
3

イグナシオの答えは正しい方法ですが、ここでは、開始した方法で機能させる方法についてもう少し詳しく説明します。

${1..3}に展開したかったでしょう$1 $2 $3。連結できず、機能させることができません。そうしない${1..3}、bash はそれをパラメーター展開として解釈します (そして失敗します)。中括弧展開として解釈するには、ドル記号をエスケープして中和します。

user$ echo \${1..3}
$1 $2 $3

お気づきのとおり、ドル式を評価せずに出力します。これは、引用符の削除 ( に変換する部分\$)$がパラメーター展開の後に実行されるためです。したがって、次のように実行する必要がありますeval

user$ eval echo \${1..3}
a b c

次のように記述できる場合、必要以上に複雑になります。echo "$@"

于 2015-09-14T09:01:34.623 に答える