bashはzshと同じように{1..$VAR}を拡張します。

bashはzshと同じように{1..$VAR}を拡張します。

私のコメントに答えてくださいこの問題SFに関して、OPは主張する。

for i in {1..$NUM}

Bashで正しく拡張してください。 bash 4.0.33(Ubuntu)、3.2.25(Centos)、および3.00.16(1)(solaris 10)にアクセスできます。これらのどれも{1..$NUM}を拡張しません。

どのbashバージョンに拡張機能があるかを知っている人はいますか?強打でなければ何ですか? zshが拡張を実行していることはわかっていますが、OPスクリプトでshebangはエイリアシングの可能性を排除する必要がありますか?

答え1

サーバー障害について質問した人が間違っていると確信しています。彼らは意図的にいくつかの詳細を省略したか、システムの奇妙な構成を認識しませんでした(/bin/bashは他のものへのリンクとして機能します)。私は2週間前のbash 4.2バージョン、CentOS 5のbash 3.2、そして最近bash 2.05a(2001年から)ビルドを試しました。

最も古いソースftp.gnu.org1.14ですが、きちんと構築されていないので、試してみる価値があるかどうかわかりません。このバージョンのドキュメントには、最新のドキュメントとまったく同じコアフレーズが含まれています。

 The order of expansions is: brace  expansion,  tilde  expan-
 sion, parameter, variable, command, and arithmetic substitu-
 tion (done in a left-to-right fashion), word splitting,  and
 pathname expansion.

しかし、実際に今考えてみると、「{x..y}」構文は次のようなので意味がありません。バッシュ3.0に追加、以前の検索を無駄にします。

それでは3.0を試してみましょう...そうです。同じ行動。

まあ、うん。私はそれを非常に疑います。何か合算されませんでした。


(後に…)

ああ!サーバー障害の質問者認める申し訳ありません。私のせい。 {1..10}のiに実際の数字を入れたので、うまくいきます。「じゃあ、それだ。

正解はこれ問題は「このように動作するbashバージョンがありません」です。 :)

答え2

拡張するには、以下を使用する必要がありますeval

$ echo {1..5}
1 2 3 4 5
$ NUM=5
$ echo {1..$NUM}
{1..5}
$ eval "echo {1..$NUM}"
1 2 3 4 5

しかし、非常に注意してくださいevalユーザー入力を受け入れる場合は、その操作を実行する前に実際に数値であることを確認してください。私の同僚が言ったように:「evalそれは邪悪です!」

答え3

中括弧拡張はシェル拡張の最初のステップであり、変数は後で拡張されるため、中括弧拡張は変数を拡張しません。

Bashのマニュアルページから:

Brace 拡張は他の拡張の前に実行され、他の拡張に固有の文字は結果に保存されます。厳密にテキストです。 Bashは、拡張コンテキストまたは中括弧の間のテキストに構文解析を適用しません。

だから:

NUM=4
for i in {1..$NUM}
do
    echo $i
done

印刷

{1..4}

関連情報