我正在尝试编写一个脚本,删除所有以奇数结尾的.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'”
当我在线上之后如果它说“语法错误接近意外令牌'然后'”
我该如何解决这个问题?
答案 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中你更喜欢的是[[ ]]
。这个常见的陷阱得到了很好的解释here和here。
另一个问题是您没有引用"$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