我不一定想要答案,但如果有人能给我指出一些文献或例子。我想弄清楚。
当我运行脚本时,我收到一个错误:
意外标记附近出现语法错误
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