语法中shell脚本中的错误

时间:2012-11-12 16:02:18

标签: shell

#!/bin/sh
 for f in `ls *.png`
  do
convert $f -fill gray(50%) -opaque black ./background_change/$f
  done
  for f in `ls *.PNG`
   do
  convert $f -fill gray(50%) -opaque black ./background_change/$f
  done

对于上面提到的shell脚本,我收到一条错误消息:

[gsamanth@cngfile Acsady]$ sh background_change.sh 
'ackground_change.sh: line 3: syntax error near unexpected token `do
'ackground_change.sh: line 3: `do
[gsamanth@cngfile Acsady]$ 

为什么会这样?

4 个答案:

答案 0 :(得分:1)

提示:

  • Don't parse LS。你会比你期望的更频繁地遇到问题。使用for循环或使用find命令处理文件。
  • 始终引用您的变量。您的脚本有:convert $f -file ...。如果文件名包含空格后跟连字符会发生什么?
 #!/bin/sh

 for f in *.png *.PNG; do
     convert "$f" -fill "gray(50%)" -opaque black background_change/"$f"
 done

请注意,您需要填充参数周围的引号,否则shell将解释括号而不是将它们作为选项传递。您也可以通过使用反斜杠转义括号(即gray\(50%\))来实现此目的。但是引用更安全一些,因为它们也会让你远离其他你可能不知道要逃脱的角色。

答案 1 :(得分:0)

do子句之前需要使用分号:

for f in `ls *.png`; do
                   ^
                   +- here

您也可以在shell脚本中使用通配符,无需调用ls。总而言之,您的脚本应该是

#!/bin/sh
for f in *.png *.PNG; do
    convert $f -fill gray(50%) -opaque black ./background_change/$f
done

答案 2 :(得分:0)

尝试

for f in `ls *.PNG`; do

或(更好)

for f in *.PNG; do

以避免过多的ls调用(除非您以后想要使用某些ls工具,例如排序 - 我怀疑不会这样做)

答案 3 :(得分:0)

ls 命令可以根据您的环境和设置提供不同的结果。我不会深入讨论这里的内容。

出于这个原因,最好将 ls 的输出作为流提供给单独的“while”(或者根据复杂性, >awk) 循环,然后

  1. 阅读每一行,
  2. 在“准备”或“调节”预处理之前评估每一行
  3. 运行所需的 命令。

由于不希望出现的情况(文件名中的空格或特殊字符)是不可避免的(除非您有一个阻止创建此类文件名的过程),因此始终将双引号括起来是一个很好的预防性措施任何涉及未知格式文件名的变量,例如

"/thisdir/anotherdir/${filename}" .

这个例子将这些原则付诸实践:

START=`pwd`
rm -f ${START}/rename.EXCEPTIONS.txt

EVALdir="${HOME}/Downloads"
cd ${EVALdir}

ls | while read line
do
     if [ -z "${line}" ] ; then break ; fi
     newname=`echo "${line}" | sed 's+\ +_+g' `
     echo "\n\t Rename '${line}' to '${newname}' ? [y|N] => \c"
     read ans ; if [ -z "${ans}" ] ; then ans="N" ; fi
     case ${ans} in
         y* | Y* )  mv -v "${line}" "${newname}" ;
         * ) echo "IGNORED|${line}|" >&2 ;;
     esac 2>${START}/rename.EXCEPTIONS.txt
done

由于将网页或文件保存到磁盘的操作是此类文件名条件的常见原因,因此定期扫描整个系统(仅在用户可以将文件保存到的那些部分)是一个好习惯) 检测违规条件或字符,并在报告中标记此类实例以采取纠正措施,以尽量减少

  • 缺乏针对此类条件的编码的实例数量 导致不良后果,以及
  • 需要多个实例 合并必要的特殊编码以正确处理此类 实例。