
我不一定想要答案,但如果有人能給我指出一些文獻或例子。我想弄清楚。
當我運行腳本時,我收到一個錯誤:
意外標記附近出現語法錯誤
fi
我if
透過對我的if
語句進行註釋並添加echo "$NAME"
顯示/etc/
.
當我進行更改時,刪除#
fromif
和fi
新增#
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
諸如、then
、else
、fi
、for
等關鍵字case
需要位於 shell 需要指令名稱的位置。否則它們將被視為普通單字。例如,
echo if
只是列印if
,它不會啟動條件指令。
因此,在該行中
if [ -r "$NAME" -af "$NAME" ] then
這個詞then
是命令的一個參數[
(如果它運行的話它會抱怨)。 shell 不斷尋找then
, 並找到fi
in 指令位置。由於有一個if
that 仍在尋找它的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