Shell Scripts for迴圈的小問題 - Linux

By George
at 2015-09-02T03:15
at 2015-09-02T03:15
Table of Contents
※ 引述《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
--
: 大家好 最近在學習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
--
Tags:
Linux
All Comments

By Dorothy
at 2015-09-03T19:28
at 2015-09-03T19:28

By Yedda
at 2015-09-04T20:31
at 2015-09-04T20:31
Related Posts
USB Disk

By Freda
at 2015-09-01T22:40
at 2015-09-01T22:40
Apache2 + Gitlist 問題

By Ula
at 2015-09-01T18:27
at 2015-09-01T18:27
使用 GNU/Linux 做為筆電的 OS

By Margaret
at 2015-08-31T18:51
at 2015-08-31T18:51
VirtualBox 網路斷線

By Oliver
at 2015-08-30T23:17
at 2015-08-30T23:17
windows boot error

By Damian
at 2015-08-30T20:15
at 2015-08-30T20:15