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

时间:2013-12-14 18:33:51

标签: 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

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

当我在线上之后如果它说“语法错误接近意外令牌'然后'”

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:56)

除了在新行上使用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

答案 1 :(得分:16)

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

答案 2 :(得分:5)

“然后”是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

答案 3 :(得分:5)

您的脚本的第一个问题是您必须在[之后添加一个空格 输入type [以查看实际发生的情况。它应该告诉你[test命令的别名,因此bash中的[ ]不是条件的一些特殊语法,它本身就是一个命令。 bash中你更喜欢的是[[ ]]。这个常见的陷阱得到了很好的解释herehere

另一个问题是您没有引用"$f",这可能会在以后成为问题。这解释为here

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

此外,每个\n都不需要使用echo,因为默认情况下echo会设置换行符。如果您希望显示两个换行符,请使用echo -e 'start\n'echo $'start\n'here

解释了此$''语法

为了使其完全完美,您应该将--置于任意文件名之前,否则rm可能会将其视为参数,如果文件名以破折号开头。这解释为here

所以这是你的剧本:

#!/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