意外标记“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

相关内容