意外標記“fi”附近出現語法錯誤

意外標記“fi”附近出現語法錯誤

我不一定想要答案,但如果有人能給我指出一些文獻或例子。我想弄清楚。

當我運行腳本時,我收到一個錯誤:

意外標記附近出現語法錯誤fi

if透過對我的if語句進行註釋並添加echo "$NAME"顯示/etc/.

當我進行更改時,刪除#fromiffi新增#to wc -c "$NAME",我收到上面列出的語法錯誤。我在那;之間添加了]。我也已移至then下一行,但沒有解決方案。

#!/bin/bash
for NAME in /etc/*
do

     if [ -r "$NAME" -af "$NAME" ] then
          wc -c "$NAME"
     fi
done

答案1

if諸如、thenelsefifor等關鍵字case需要位於 shell 需要指令名稱的位置。否則它們將被視為普通單字。例如,

echo if

只是列印if,它不會啟動條件指令。

因此,在該行中

if [ -r "$NAME" -af "$NAME" ] then

這個詞then是命令的一個參數[(如果它運行的話它會抱怨)。 shell 不斷尋找then, 並找到fiin 指令位置。由於有一個ifthat 仍在尋找它的then,所以 thefi是意外的,存在語法錯誤。

您需要在前面放置一個命令終止符then,以便將其識別為關鍵字。最常見的命令終止符是換行符,但在 之前then,通常使用分號(其含義與換行符完全相同)。

if [ -r "$NAME" -af "$NAME" ]; then

或者

if [ -r "$NAME" -af "$NAME" ]
then

一旦你解決了這個問題,你就會從命令中得到另一個錯誤,[因為它不理解-af。你大概的意思是

if [ -r "$NAME" -a -f "$NAME" ]; then

儘管測試命令看起來像選項,但您不能像這樣捆綁它們。它們是[命令的運算符,並且每個都需要是一個單獨的單字(如 do[])。

順便說一下,雖然[ -r "$NAME" -a -f "$NAME" ]可行,但我建議寫

[ -r "$NAME" ] && [ -f "$NAME" ]

或者

[[ -r $NAME && -f $NAME ]]

最好保持[ … ]條件簡單,因為該[指令無法輕鬆區分運算子和操作數。如果$NAME看起來像一個運算子並且出現在該運算子有效的位置,那麼它可以被解析為一個運算子。在這個答案中看到的簡單情況下不會發生這種情況,但更複雜的情況可能會有風險。透過單獨呼叫[並使用 shell 的邏輯運算子來編寫此程式碼可以避免此問題。

第二種語法使用[[ … ]]bash(以及 ksh 和 zsh,但不是普通 sh)中存在的條件構造。此構造是特殊語法,而[像任何其他命令一樣進行解析,因此您可以使用&&inside 之類的內容,並且不需要引用變量,除了某些字符串運算符 ( =, ==, !=, =~) 的參數之外(請參閱什麼時候需要雙引號?了解詳情)。

答案2

看看有什麼變化如下

如果 [ -r "$NAME"-a -f“$NAME”];然後
#^^^^^^
     wc -c "$NAME"

如果你想刪除 if 區塊中的所有指令,你至少需要在其中加上一個冒號,例如

if [ -r "$NAME" -a -f "$NAME" ]; then
    :
fi

或單行版本

if [ -r "$NAME" -a -f "$NAME" ]; then :; fi

答案3

其他人已經指出了,但如果您正在尋找官方參考,那麼RTM

如果列出;然後列出; [ elif 列表;然後列出; ] ... [其他列表;] fi

if 清單被執行。如果其退出狀態為零,則執行 then 清單。否則,依序執行每個 elif 列表,如果其退出狀態為零,則執行相應的 thenlist 並完成命令。否則,將執行 else 清單(如果存在)。退出狀態是最後執行的指令的退出狀態,如果沒有條件測試為真,則退出狀態為零。

你錯過了;

語法為list描述於man test

相關內容