我有一个简单的脚本:
#!/bin/sh
cd /tmp/pics
for pic in *.jpg;
do
php -f /tmp/pics/covert.php $pic;
done
当我的图片名称中有空格时,脚本将无效。我怎么能解决这个问题?
如何修复我的脚本以正确处理空白,还可以处理其他JPEG扩展,例如“JPG”,“JPEG”,“jpeg”?
答案 0 :(得分:2)
bash
和其他shell中的引用规则与Ruby,Python和Perl等“普通”脚本语言中的引用规则不同,所以这可能会让人感到困惑,但如果你在$pic
周围加上双引号,bash会正确处理变量的内容,即使它包含空格。
这一个修复程序会使您的脚本看起来像这样
#!/bin/sh
cd /tmp/pics
for pic in *.jpg;
do
php -f /tmp/pics/covert.php "$pic";
done
我还会删除每行末尾的分号。只有当你在一条线上塞满多条线时才需要这些。他们不像在PHP或(在较小程度上)JavaScript那样以bash的方式使用它们。
如上所述,这是使用Bourne shell而不是bash。 (目前我们将忽略可能在您的系统上使用bash来模拟Bourne shell的事实。)如果您想使用bash,请更改顶部的“shebang”行。通常是#!/bin/bash
。
要处理多个文件扩展名,您可以将它们彼此相邻堆叠,中间有空格,例如
for pic in *.jpg *.jpeg *.JPEG *.JPG
正如Jens指出的那样,你可能会遇到奇怪的角落案例,其中文件扩展名是混合大小写的。您可以使用括号来处理该字符组
for pic in *.[jJ][pP][gG] *.[jJ][pP][eE][gG]
或者您可以使用glenn设置shell选项的方法来忽略大小写(和non-matching patterns),然后使用更简单的glob模式
shopt -s nocaseglob nullglob
for pic in *.jpg *.jpeg
如果采用后一种方法,最终的脚本将如下所示:
#!/bin/bash
cd /tmp/pics
shopt -s nocaseglob nullglob
for pic in *.jpg *.jpeg
do
php -f /tmp/pics/covert.php "$pic"
done
希望这有帮助!
答案 1 :(得分:2)
对于像这样的简短脚本,我会使用
#!/bin/sh
cd /tmp/pics
for pic in *.[jJ][pP][gG] *.[jJ][pP][eE][gG]; do
php -f /tmp/pics/covert.php "$pic"
done
这甚至可以处理奇怪的类似扩展,例如prettygirl.JpeG
: - )
答案 2 :(得分:2)
使用bash,进行不区分大小写的文件匹配:
shopt -s nocaseglob nullglob
for pic in *{jpg,jpeg}
do
php5 -f ./convert.php "$pic"
done