【问题标题】:print 001, 002, ..., 099, 100 instead of 1, 2, 3, ..., 99, 100打印 001, 002, ..., 099, 100 而不是 1, 2, 3, ..., 99, 100
【发布时间】:2018-08-17 12:20:23
【问题描述】:

我想打印以下格式的 2 个数字: 001,002,003,...,015,016,017,...,098,099,100

for i in touch {001..100}; do
        for j in touch {001..100}; do
                if (( $j > $i )); then
                        echo $i $j
                fi
        done
done

循环做我想做的事。

但问题是它打印的时候没有 0。例如,它打印 1 2、1 3、1,4、...、99 100。 我希望它打印 001 002、001 003、001 004、...、099 100。 有谁知道我该如何解决这个问题?

【问题讨论】:

    标签: bash command-line


    【解决方案1】:

    bash4 中增加了前导零的保留;您似乎使用的是旧版本的 bash。但是,如果保留 0,则必须调整比较以避免将值视为八进制数。 (例如,090 是一个无效的八进制数。)

    for i in {001..100}; do
      for j in {001..100}; do
        if (( 10#$j > 10#$i )); then
          echo $i $j
        fi
      done
    done
    

    不过,最好将 printf 与 C 风格的 for 循环一起使用。

    for ((i=1; i < 101; i++)); do
      for ((j=i+1; j < 101; j++)); do
        printf '%03d %03d\n' "$i" "$j"
      done
    done
    

    注意没有比较;内部循环以大于 i 的值开始 j

    【讨论】:

    • 第一部分仍然打印不带 0 的数字,但 printf 有效。你知道第一个缺少什么吗?
    • 正如我在第一句话中所说,您使用的bash的版本似乎太旧了;使用更新版本的bash
    【解决方案2】:

    一种可能性是使用 printf:

    for i in {1..100}; do
            for j in {1..100}; do
                    if (( $j > $i )); then
                            printf "%03d %03d\r\n" $i $j
                    fi
            done
    done
    

    【讨论】:

    • 为什么输出中有回车符?
    【解决方案3】:

    使用seq:

    for i in touch $(seq -w 1 100); do
            for j in touch $(seq -w 1 100); do
                    if (( $j > $i )); then
                            echo $i $j
                    fi
            done
    done
    

    printf 也可以。

    【讨论】:

    • 我在第 10 行得到这个错误:((: 09: value too great for base (error token is "09")
    • 对。我只解决了你要求的问题。比较正确基数中的数字的问题是另一段历史。
    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 2014-05-09
    • 2016-06-07
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多