意外标记'fi'附近的语法错误

Cal*_*der 50 bash

我正在尝试编写一个脚本,删除所有以奇数结尾的.jpg.这是我的代码:

#!/bin/bash
echo "start\n"
for f in *.jpg
do
  fname=$(basename "$f")
  echo "fname is $fname\n"
  fname="${filename%.*}"
  echo "fname is $fname\n"
  if[$((fname %  2)) -eq 1 ] then
    echo "removing $fname\n"
    rm $f
  fi
done
Run Code Online (Sandbox Code Playgroud)

当我运行它时输出start然后说"语法错误附近意外令牌'fi'"

当我在线上之后如果它说"语法错误接近意外令牌'那么'"

我该如何解决?

jpr*_*ice 61

除了拥有then一条新生产线之外,您还需要一个前后空间[,这是BASH中的一个特殊符号.

#!/bin/bash
echo "start\n"
for f in *.jpg
do
  fname=$(basename "$f")
  echo "fname is $fname\n"
  fname="${filename%.*}"
  echo "fname is $fname\n"
  if [ $((fname %  2)) -eq 1 ]
  then
    echo "removing $fname\n"
    rm "$f"
  fi
done
Run Code Online (Sandbox Code Playgroud)

  • 它仍然给我“意外标记'then'附近的语法错误” (3认同)
  • 您忘记引用``“$f”`` (2认同)
  • 这个特定错误是由于'then'不在新行上.还值得注意的是放一个半音((之后) (2认同)
  • 所以六年多后我再次回到这个问题,我仍然看到这个答案中糟糕的代码风格。有时 Stackoverflow 是相当令人沮丧的。 (2认同)

小智 20

使用Notepad ++并使用选项将文件转换为UNIX格式.那应该可以解决这个问题.

  • 这解决了我的问题。正在将脚本从Windows计算机迁移到Linux。 (3认同)

pet*_*ica 6

"然后"是bash中的一个命令,因此它需要一个";" 或之前的新行.

#!/bin/bash
echo "start\n"
for f in *.jpg
do
  fname=$(basename "$f")
  echo "fname is $fname\n"
  fname="${filename%.*}"
  echo "fname is $fname\n"
  if [$[fname%2] -eq 1 ]
  then
    echo "removing $fname\n"
    rm $f
  fi
done
Run Code Online (Sandbox Code Playgroud)


Ale*_*-A. 6

你的脚本的第一个问题是你必须在后面放一个空格[.
输入type [以查看实际发生的情况.它应该告诉你这[test命令的别名,所以[ ]在bash中不是条件的一些特殊语法,它只是一个命令本身.在bash中你应该更喜欢的是[[ ]].这里这里有很大的解释.

另一个问题是你没有引用"$f"哪些可能会成为一个问题.这在这里解释

您可以使用算术表达式if,因此在某些情况下您不必使用[ ]或根本不使用[[ ]].更多信息在这里

此外,不需要\n在每个中使用echo,因为echo默认情况下放置换行符.如果要显示两个换行符,请使用echo -e 'start\n'echo $'start\n'.这里$''解释这种语法

为了使它完全完美,你应该放在--任意文件名之前,否则rm如果文件名以破折号开头,则可以将其视为参数.这在这里解释.

所以这是你的脚本:

#!/bin/bash
echo "start"
for f in *.jpg
do
    fname="${f##*/}"
    echo "fname is $fname"
    if (( fname % 2 == 1 )); then
        echo "removing $fname"
        rm -- "$f"
    fi
done
Run Code Online (Sandbox Code Playgroud)


Jos*_*per 5

The original question has long since been answered, but since this was the first Google result for "unexpected token fi", I'm posting the mistake I made that I have not seen mentioned yet.

I copy-pasted some code from a different question which looked something like:

REPLY="Hello"
if [[ $REPLY =~ "Server is up" ]]; then
    # echo "Something"
fi
Run Code Online (Sandbox Code Playgroud)

The problem with the above is that the only line of code in the conditional block is commented out, and an empty conditional block is invalid syntax in bash.

Uncommenting the echo statement resolves the syntax error. Alternatively, if I intended a no-op block, I could have written : as my only line of code in the block:

REPLY="Hello"
if [[ $REPLY =~ "Server is up" ]]; then
    :
fi
Run Code Online (Sandbox Code Playgroud)