【问题标题】:Shell script not runningShell 脚本未运行
【发布时间】:2013-10-09 02:03:00
【问题描述】:

当我执行下面的脚本时,它只是坐在那里没有输出。有什么想法有什么问题吗?

#!/bin/bash
for k in `seq 0 4`
do
for c1 in `seq 1 30`
do
for c2 in `seq $c1 30`
do
for b1 in `seq 1 $c1`
do
for b2 in `seq $b1 $c2`
do
for s1 in `seq 0 (($c1 - $b1))`
do
for s2 in `seq 0 (($c2 - $b2))`
do
    echo "k: $k - c1: $c1 - c2: $c2 - b1: $b1 - b2: $b2 - s1: $s1 - s2: $s2"
done
done
done
done
done    
done
done

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    seq 语句之一正在无限期地运行。您缺少一些美元符号:

    for s1 in `seq 0 $(($c1 - $b1))`
    
    for s2 in `seq 0 $(($c2 - $b2))`
    

    【讨论】:

    • @codepk 因为没有$ 这是一个语法错误。您是否在抑制错误?
    • @codepk $((...)) 将执行算术评估并返回实际值; ((...)) 没有 $ 只会评估代码并设置错误值(阅读手册页)
    • 我是新手。我认为 $ 是为了获取变量的值。以 $ 作为结果对我来说没有意义。现在好了。
    • ((...)) 仅用作语句,不能用作另一个命令的参数。
    • (( ))内部,其实最好直接使用c1b1,不用$
    【解决方案2】:

    这里根本不要使用seq;没意义。

    for ((k=0; k<4; k++)); do
      for ((c1=1; c1<30; c1++)); do
        for ((c2=c1; c2<30; c2++)); do
          for ((b1=1; b1<c1; b1++)); do
            for ((b2=b1; b2<c2; b2++)); do
              for ((s1=0; s1<(c1-b1); s1++)); do
                for ((s2=0; s2<(c2-b2); s2++)); do
                  echo "k: $k - c1: $c1 - c2: $c2 - b1: $b1 - b2: $b2 - s1: $s1 - s2: $s2"
                done
              done
            done
          done
        done    
      done
    done
    

    seq 是一个外部命令,bash 必须派生外部进程、运行、读取输出等;它涉及更多的开销,甚至不能保证在所有操作系统上都存在(或行为相同)!

    相比之下,(( )) 创建了一个数学上下文;在这种情况下,您不需要使用$ 来扩展变量,并且可以使用传统的整数数学运算符(&lt;&gt;++-- 等)。

    【讨论】:

    • 不妨对其中一些使用 bash 序列表达式:for k in {0..4}
    • @Nirk ...对于两个值都是常量的值,是的。但问题是,这种方便的语法是否是对一致性的合理权衡。
    • 我运行的是 sh 而不是 bash。在 bash 中工作。
    猜你喜欢
    • 2015-10-15
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多