2012-09-18 42 views
0

我有一个简单的脚本:庆典:在文件名中的空白

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

当我的照片在他们的名字空格该脚本将无法正常工作。我怎么能解决这个问题?

我该如何修复我的脚本以正确处理空白,并且还处理其他JPEG扩展名,例如“JPG”,“JPEG”,“jpeg”?在bash和另一个外壳

+1

围绕''$ pic''尝试语音标记。 – Orbling

+0

在空白区域遇到问题时添加引号 –

+0

此处不需要分号。 – Jens

回答

2

竞标规则是不像那些“正常”的脚本语言如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(在较小程度上)的方式进行打击。

正如所写,这是使用Bourne shell而不是bash。 (目前我们将忽略bash可能会在系统上用来模拟Bourne shell的事实)。如果您想使用bash,请更改顶部的“shebang”行。通常它是#!/bin/bash

要处理多个文件扩展名,你可以堆叠起来彼此相邻用空格之间,像这样的

for pic in *.jpg *.jpeg *.JPEG *.JPG 

正如延斯所指出的,你可能有奇怪的角落情况下,文件扩展名是混合的情况。您可以处理与括号字符组

for pic in *.[jJ][pP][gG] *.[jJ][pP][eE][gG] 

或者你可以使用设置你的壳选择忽略大小写(和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 

希望这有助于!

+0

双引号,顺便说一句。单引号不适用于参数替换。 – Jens

+1

它在PHP中很相似,因为它在引用时不会将它们视为文字。但是你是对的,你只是在谈论正常的脚本语言。 :) – lynxlynxlynx

+0

@Jens:是的,我应该澄清一点。在(与电脑无关的)美式英语中,“引号”表示双引号,但我认为它可能与英式英语相反,因此大部分英语世界......将修复... – iconoclast

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

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

shopt -s nocaseglob nullglob 
for pic in *{jpg,jpeg} 
do 
    php5 -f ./convert.php "$pic" 
done 
+0

谢谢,这是工作! – SubZeroFX