1. 程式人生 > >[shell]while read line 與 for迴圈的區別

[shell]while read line 與 for迴圈的區別

while read line 是一次性將檔案資訊讀入並賦值給變數line ,while中使用重定向機制,檔案中的所有資訊都被讀入並重定向給了整個while 語句中的line 變數。

for是每次讀取檔案中一個以空格為分割符的字串。

如下示例指令碼:

  1. #/bin/bash
  2. IPS="10.1.1.10 3001
  3. 10.1.1.10 3003
  4. 10.1.1.11 3001
  5. 10.1.1.11 3002
  6. 10.1.1.11 3004
  7. 10.1.1.11 3005
  8. 10.1.1.13 3002
  9. 10.1.1.13 3003
  10. 10.1.1.13 3004
  11. 10.1.1.14 3002"
  12. echo "====while test ===="
  13. i=0
  14. echo
     $IPS | while read line
  15. do
  16.     echo $(($i+1))
  17.     echo $line
  18. done
  19. echo "====for test ===="
  20. n=0
  21. for ip in $IPS ;
  22. do
  23.    n=$(($n+1))
  24.    echo $ip
  25.    echo $n
  26. done
輸出結果如下:

點選(此處)摺疊或開啟

  1. ====while test ====
  2. 1
  3. 10.1.1.10 3001 10.1.1.10 3003 10.1.1.11 3001 10.1.1.11 3002 10.1.1.11 3004 10.1.1.11 3005 10.1.1.13 3002 10.1.1.
    13 3003 10.1.1.13 3004 10.1.1.14 3002
  4. ====for test ====
  5. 10.1.1.10
  6. 1
  7. 3001
  8. 2
  9. 10.1.1.10
  10. 3
  11. 3003
  12. 4
  13. 10.1.1.11
  14. 5
  15. 3001
  16. 6
  17. 10.1.1.11
  18. ....

當檔案中有多行文字,在while迴圈中再一次呼叫read語句,就會讀取到下一條記錄。而$line中的最後一行已經讀完,無法獲取下一行記錄,從而退出 while迴圈。

若使用while迴圈,想每次讀取其中1行內容到變數$line,則可以使用以下方法:

#!/system/bin/sh
busybox cat /data/data/1.txt | while read LINE
do
adb shell gsr -m -p /data/data/$LINE 10000
done

--------------------------------------------------------------------------------------------------------------------

原作者的【解決方法】---存疑,不太理解,後續學習
1 使用ssh -n "command" 
2 ssh "cmd" < /dev/null 將ssh 的輸入重定向輸入。