0

我有一个简单的脚本:

#!/bin/sh
cd /tmp/pics
for pic in *.jpg;
do
  php -f /tmp/pics/covert.php $pic;
done

当我的图片名称中有空格时,该脚本将不起作用。我怎么能解决这个问题?

如何修复我的脚本以正确处理空白,并处理其他 JPEG 扩展,例如“JPG”、“JPEG”、“jpeg”?

4

3 回答 3

2

和其他 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

希望这可以帮助!

于 2012-09-18T14:04:59.097 回答
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:-)

于 2012-09-18T14:10:01.780 回答
2

使用 bash,进行不区分大小写的文件匹配:

shopt -s nocaseglob nullglob
for pic in *{jpg,jpeg}
do
    php5 -f ./convert.php "$pic"
done
于 2012-09-18T20:57:44.180 回答