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

4 回答 4

1

提示:

  • 不要解析 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

请注意,您需要在填充参数周围加上引号,否则外壳程序将解释括号而不是将它们作为选项传递。您也可以通过使用反斜杠(即gray\(50%\))转义括号来实现此目的。但是引号更安全一些,因为它们还可以将您从其他您可能不知道要逃避的字符中拯救出来。

于 2012-11-12T17:15:42.143 回答
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
于 2012-11-12T16:03:43.980 回答
0

尝试

for f in `ls *.PNG`; do

或(更好)

for f in *.PNG; do

避免过度ls调用(除非您以后想使用ls诸如排序之类的工具-我怀疑不是)

于 2012-11-12T16:04:26.373 回答
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

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

  • 缺乏对此类条件的编码可能导致不良结果的实例数量,以及
  • 合并必要的特殊编码以正确处理此类实例所需的多个实例。
于 2021-04-16T23:00:30.117 回答