#!/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]$
为什么会这样?
答案 0 :(得分:1)
提示:
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) 循环,然后
由于不希望出现的情况(文件名中的空格或特殊字符)是不可避免的(除非您有一个阻止创建此类文件名的过程),因此始终将双引号括起来是一个很好的预防性措施任何涉及未知格式文件名的变量,例如
"/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
由于将网页或文件保存到磁盘的操作是此类文件名条件的常见原因,因此定期扫描整个系统(仅在用户可以将文件保存到的那些部分)是一个好习惯) 检测违规条件或字符,并在报告中标记此类实例以采取纠正措施,以尽量减少