1

Unix プログラミングは初めてで、このコードの何が問題なのかわかりません。

#!/bin/sh
    i=1
    max=10
        for i in {1..$max}
        do
            echo $i;
        done

上記のコードを次のように試すと、動作します。

#!/bin/sh
    i=1
    max=10
        for i in {1..10}
        do
            echo $i;
        done

私はこれを試しました:

#!/bin/sh
    i=1
    max=10
        for i in {1..`echo $max`}
        do
            echo $i;
        done

#!/bin/sh
    i=1
    max=10
        for i in {1..`expr $max`}
        do
            echo $i;
        done

#!/bin/sh
    i=1
    max=10
        for i in {1..`echo $max | bc`}
        do
            echo $i;
        done

しかし、それも機能していません..どうしてうまくいくのか教えてもらえますか..?

4

4 に答える 4

2

多分あなたはこれを試すことができます

#!/bin/sh
max=10
for i in $(seq 1 $max)
do
    echo "$i"
done

あなたはこの答えを見ることができます

ブレース展開、{x..y} は他の展開の前に実行されるため、可変長シーケンスには使用できません。

アップデート:

カスタムインクリメントのシーケンスが必要な場合は、のマニュアルページにseq次のように記載されています。

seq [-w] [-f format] [-s string] [-t string] [first [incr]] last

したがってseq 1 3 $max、インクリメント 3 のシーケンスを取得するために使用できます。

一般に、

#!/bin/sh
max=10
incr=3
for i in $(seq 1 $incr $max)
do
    echo "$i"
done
于 2013-07-26T03:08:45.517 に答える
1

bash の man ページには次のように書かれています。

ブレース展開は他の展開よりも前に実行され、他の展開に特有の文字は結果に保持されます。それは厳密にテキストです。Bash は、展開のコンテキストまたは中括弧内のテキストに構文解釈を適用しません。

そのため、中かっこ内のテキストが何であれ、bash は逐語的に通過するように見えます。私はその構文に慣れていなかったので、調べる必要がありました。forループで使用することを意図していたようには思えません。

bash にはこれを行う新しい方法がありますが、従来の方法は

for i in $(seq 1 $max)
do
 # whatever...
done

十分な努力をすればほとんど何でも bash で行うことができ、私は挑戦を断ることができませんでした。

for i in $(eval echo {1..$max})
do
 echo $i
done
于 2013-07-26T03:20:33.213 に答える
1

形式のシーケンス式は、andがリテラルの数字または単一の文字の{x..y}場合にのみ発生します。変数展開の前に行われます。制限に変数を含めることができる場合は、次のコマンドを使用します。xyseq

for i in $(seq 1 $max)
于 2013-07-26T03:04:24.180 に答える