2014-07-12 25 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