Linux
在 Bash 腳本中,不能同時使用 while 和 for 循環。出現意外的文件結束錯誤
#!/bin/bash while read -r col1 col2 col3 col4 col5 col6 col7 col8 col9 for i in 8.00 7.50 7.00 6.50 6.00 5.50 5.00 ; do echo '6.0' $i $col6 >> 1.dat done < "sih1.66"
出現錯誤 - 語法錯誤:文件意外結束
兩者都
while
需要for
它們自己的一組do
和done
來包圍循環體。所以你可能想要這個:while read -r col1 col2 col3 col4 col5 col6 col7 col8 col9; do for i in 8.00 7.50 7.00 6.50 6.00 5.50 5.00; do echo '6.0' "$i" "$col6" done done < "sih1.66" >> 1.dat
如果循環內的所有內容都被重定向到同一個地方,您也可以將輸出重定向放在循環外。它可能會使重定向更加明顯,並且可能會稍微快一些,但是任何一個都可以。
for
但是,當您使用而不是簡單的“語法錯誤”來代替預期時,為什麼它會說“文件意外結束”do
?那是因為
while
循環條件部分也可以接受多個命令,for
循環可以是其中之一。雖然聽起來有點奇怪,但並非幾乎所有的程式語言都允許這樣的事情。但是外殼可以。所以,下面的版本也是有效的,它的工作方式有點像上面……只是它會使用*-loop的返回值作為循環
for
*while
條件。這可能不是您想要的,因為read
失敗不會使循環停止。while read -r col1 col2 col3 col4 col5 col6 col7 col8 col9; for i in 8.00 7.50 7.00 6.50 6.00 5.50 5.00; do echo '6.0' "$i" "$col6" done; do true # need to have some command here done
順便說一句,由於您使用的是 Bash,因此您可以使用數組而不是單獨的編號變數:
while read -r -a cols; do for i in 8.00 7.50 7.00 6.50 6.00 5.50 5.00; do echo '6.0' "$i" "${cols[5]}" done done < "sih1.66" >> 1.dat
請注意,數組索引在 Bash 中從零開始。