2014-07-12 24 views
0

这是我的bash脚本代码,所以我想知道如何使用“for”循环而不是“while”循环来重写下面的Bash脚本。如何将'bash'while循环重写为'for'循环?

#!/bin/bash 
    if [ $# -gt 0 ]; then     
      a=0;     
      if [ -f RandNos ]; then 
       rm RandNos; 
      fi 

      while [ $a -lt $1 ] 
      do 
       a='expr $a + 1'; 
       myrand=$RANDOM; 

       if [ "$2" "1"]; then 
        echo "No. $a ==> $myrand"; 
       fi 

       echo $myrand>>RandNos 
      done     
    else 
     echo "please use with an argument..." 
    fi 

谢谢。

+0

为什么?在语法重写中没有意义... –

+0

可能的重复[如何在bash中编写for循环](http://stackoverflow.com/questions/49110/how-do-i-write-a-for- loop-in-bash) – BroSlow

+0

要做的第一件事就是让它使用一致的缩进。 –

回答

1

只需用for循环的结果改写它:

#!/bin/bash 
if [ $# -gt 0 ]; then 
    if [ -f RandNos ]; then 
     rm RandNos; 
    fi 
    lim=$(expr $1 - 1) 
    as=$(seq 0 $lim) 
    for a in $as 
    do 
     a='expr $a + 1'; 
     myrand=$RANDOM; 
     if [ "$2" "1"]; then # <- Caveat: conditional is BROKEN 
     echo "No. $a ==> $myrand"; 
     fi 
     echo $myrand>>RandNos 
    done 
else 
    echo "please use with an argument..." 
fi 

但有几件事情错了,无论如何脚本。像最后的if声明一样。

+0

固定它,谢谢 –

4

短的它:为基于计数器的环路,使用for环的类C 形式:(该取代while [ $a -lt $1 ]; do a='expr $a + 1' ...; done

for ((a = 0; a < $1; a++)); do 
     # ... use $a 
    done 

查看下列更多关于在((...))内适用的规则。


对于其余代码的:

  • 条件[ "$2" "1"]被打破:它缺少强制空间之前]
    • 随着那固定的,它只会工作如果$2扩展为一个一元测试运算符,如-n
    • 也许你的意思是if [[ -z $myrand ]]; then,检查$RANDOM是否导致非空字符串?
  • a='expr $a + 1' - 你不与for循环不再需要 - 并没有实际调用expr,因为您使用单引号 - 你需要反引号(`),或者,最好是现代等价物:$(expr $a + 1)。但是,通过算术评估,这可以简化为((++a))

  • [ ... ]条件语句在bash工作,但他们提供POSIX兼容 - 使用[[ ... ]]为特定的bash的替代,这是更强大的,具有更多的功能,而且速度更快

  • 庆典报表只需要;终止,如果你把多个一行

    • 注意的bash认为do ...then ...单独的语句,因此你经常看到if ...; thenfor ...; do。在http://shellcheck.net
  • 一般情况下,我鼓励你语法检查你的shell代码 - 这是用于检测语法问题一个很好的工具。

不同的规则如何应用内((...))相比其他地方bash:在=周围

  • 空间的变量赋值是允许
  • 引用一个变量而不用$前缀(a++)为允许
  • <执行数值比较(而内[[ ... ]]词法)-i.e.,它的更自然相当于-lt内部[ ... ][[ ... ]]
  • 其他几个数学乃至位运算符支持
  • ...

当bash在算术方面,它适用于((...))$((...))运行所有这些不同的规则,数组下标和其他情况。
对于所有规则,运行man bash并阅读ARITHMETIC EVALUATION部分。

1

有几种情况可以得到改善:

#!/bin/bash 
if (($#)); then        # anything but 0 is true 
    rm -f RandNos       # remove if existing, otherwise fail silently 
    for ((a=0; a<$1; a++)); do 
     myrand=$RANDOM 

# what is the intention here? 
     (($2 > 1)) && echo "No. $a ==> $myrand" 
     echo "$myrand" >> RandNos 
    done 
else 
    echo "please use with an argument..." 
fi 

不知道你的意图是用[ “$ 2”, “1”]的表达。这可能不是我所做的。

for ((a=1; a<=$1; a++)); do 

可能会更好地反映您的预期逻辑,因为您只需在增加后使用$ a作为输出。正如@mklement0所指出和纠正的那样

+0

'((A = 0;一<$ 1;一++))'和'((A = 0;一<$ 1; ++ A))'是_The same_:内部的循环中,'$ a'以任何方式以'0'开头,'$ a'只在每次迭代后增加 - 换句话说:无论您使用前或后增量都无关紧要。如果你真的想从'1'开始,使用'((a = 1; a <= $ 1; a ++))'。 – mklement0

1
if [ $# -lt 1 ];then 
    echo "First argument must be number". 
    exit 1; 
fi 

for a in `seq $1` 
do 
    ... 
done 
0

!/斌/庆典

if [ $# -gt 0 ]; then 

a=0; 
    if [ -f RandNos ]; then 
     rm RandNos; 
    fi 
    for ((i=$a; i<$1; i++)) 

    do 

    myrand=$RANDOM; 
    if [ "$2" = "1" ]; then 
     echo "No. $a ==> $myrand"; 
    fi 
    echo $myrand >> RandNos 
    done 
else 
    echo "please use with an argument..." 
fi 
+0

感谢您的帮助 – user3624843