Linux

在 Bash 腳本中,不能同時使用 while 和 for 循環。出現意外的文件結束錯誤

  • April 16, 2022
#!/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它們自己的一組dodone來包圍循環體。所以你可能想要這個:

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 中從零開始。

引用自:https://unix.stackexchange.com/questions/699248