2012-09-18 41 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