看板 Linux 關於我們 聯絡資訊
※ 引述《SSID2244 (ssid)》之銘言: : 大家好 最近在學習shell scripts (用在修改大量數據) : 遇上一個問題,我想寫一個for的多重迴圈 在這裡我先簡化問題為雙迴圈好了 : for ((i=1;i<=5;i=i+1));do : for ((j=1;j<=5;j=j+1));do : echo "i=${i},j=${j}" : done : done : bash這個檔案之後 : 會print出總共25個字串 5x5 : 但如果我想要自訂i的起始點,間距以及終點 : 所以我把scripts改寫成 : read -p "i_intial= " i : read -p "i_intvl= " id : read -p "i_end= " ied : read -p "j_intial= "j : read -p "j_intvl= " jd : read -p "j_end= " jed : for ((i=${i};i<=${ied};i=${i}+${id}));do : for ((j=${j};j<=${jed};j=${j}+${jd}));do : echo "i=${i},j=${j}" : done : done : 但改寫成這樣之後,他卻只會print出j的迴圈,i的迴圈卻不會work : 但檢查不出問題出在哪.. : 請大大們幫忙了 謝謝! 程式碼認真說太亂,請改一下這樣比較好閱讀: read -p "i_intial= " i read -p "i_intvl= " id read -p "i_end= " ied read -p "j_intial= " j read -p "j_intvl= " jd read -p "j_end= " jed for ((i=i;i<=ied;i=i+id));do for ((j=j;j<=jed;j=j+jd));do echo "i=${i},j=${j}" done done 你的 j=j 是有問題的,因為你每跑過外層迴圈時候 j 已經增加過了,所以 外層迴圈要跑第二次時候 j 早就已經增加到超過 jed 範圍了所以當然不會執行, 因此第二層的迴圈不能夠直接拿 j=... 這種語法來用,請另外產生新的變數紀錄, 比方變成: read -p "i_intial= " i read -p "i_intvl= " id read -p "i_end= " ied read -p "j_intial= " j read -p "j_intvl= " jd read -p "j_end= " jed for ((i=i;i<=ied;i=i+id));do for ((new_j=j;new_j<=jed;new_j=new_j+jd));do echo "i=${i},j=${new_j}" done done 另外 ((i=i;i<=ied;i=i+id));do 這個前面多此一舉可以改成: ((;i<ied;i=i+id)) 最後提供另外一個版本讓你參考 read -p "i_intial= " i read -p "i_intvl= " id read -p "i_end= " ied read -p "j_intial= " j read -p "j_intvl= " jd read -p "j_end= " jed for n1 in $(seq $i $id $ied); do for n2 in $(seq $j $jd $jed); do echo "n1 = $n1 , n2 = $n2" done done -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.117.155.17 ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1441134940.A.3A7.html
SSID2244: 了解了!!謝謝 09/02 10:28
HamalAri: read 讀變數的時候不要用 ijk ,ijk 留給迴圈用 09/02 12:21