我有一个简单的脚本:
#!/bin/sh
cd /tmp/pics
for pic in *.jpg;
do
php -f /tmp/pics/covert.php $pic;
done
当我的图片名称中有空格时,该脚本将不起作用。我怎么能解决这个问题?
如何修复我的脚本以正确处理空白,并处理其他 JPEG 扩展,例如“JPG”、“JPEG”、“jpeg”?
我有一个简单的脚本:
#!/bin/sh
cd /tmp/pics
for pic in *.jpg;
do
php -f /tmp/pics/covert.php $pic;
done
当我的图片名称中有空格时,该脚本将不起作用。我怎么能解决这个问题?
如何修复我的脚本以正确处理空白,并处理其他 JPEG 扩展,例如“JPG”、“JPEG”、“jpeg”?
和其他 shell 中的引用规则bash
与 Ruby 和 Python 和 Perl 等“普通”脚本语言中的引用规则不同,所以一开始这可能会让人感到困惑,但是如果你在 . 周围加上双引号$pic
,bash 将正确处理变量的内容,即使它包含空格。
一个修复将使您的脚本看起来像这样
#!/bin/sh
cd /tmp/pics
for pic in *.jpg;
do
php -f /tmp/pics/covert.php "$pic";
done
我还将删除每行末尾的分号。仅当您将多条线路挤在一条线上时才需要这些。它们在 bash 中不需要它们在 PHP 或(在较小程度上)JavaScript 中的方式。
正如所写,这是使用 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 选项的方法来忽略大小写(和不匹配的模式),然后使用更简单的 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
希望这可以帮助!
对于像这样的短脚本,我会使用
#!/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
:-)
使用 bash,进行不区分大小写的文件匹配:
shopt -s nocaseglob nullglob
for pic in *{jpg,jpeg}
do
php5 -f ./convert.php "$pic"
done