2011-09-23 34 views
16

我有一個bash腳本,它接收用戶的一組文件。這些文件有時位於名稱中帶有空格的目錄下。不幸的是,與this question不同,所有文件名都通過命令行界面傳遞。讓我們假設路徑在用戶傳入時被正確引用,所以空格(除引用空格外)是路徑之間的分隔符。如何將這些參數轉發到我的bash腳本中的子例程中,以保留引用空格的方式?bash:以空格爲參數傳遞路徑?

回答

19
#! /bin/bash 

for fname in "[email protected]"; do 
    process-one-file-at-a-time "$fname" 
done 

請注意過多使用引號。這是所有必要的。

傳遞所有的參數到另一個程序更簡單:

process-all-together "[email protected]" 

棘手的情況是,當你想在半分割的參數。這要求在一個簡單的POSIX shell中有更多的代碼。但也許Bash有一些特殊功能。

+0

謝謝;如果我需要批量處理它們怎麼辦? – fbrereto

+0

我更新了我的答案。 –

+1

此外,請確保子例程正確地對所有內容進行雙引號,例如'一次處理一個文件(){cp「$ 1」「backupdir/$(basename」$ 1「)」; }' –

0
"$var" 

例如,

$ var='foo bar' 

$ perl -E'say "<<$_>>" for @ARGV' $var 
<<foo>> 
<<bar>> 

$ perl -E'say "<<$_>>" for @ARGV' "$var" 
<<foo bar>> 
3

你想"[email protected]",其中有擴大[email protected]但保留空白引用調用者的特殊語法(它不會創建一個巨大的字符串與所有在它的論據)。因此,有人可以調用腳本,如:

bash-script.sh AFile "Another File With Spaces" 

然後在你的腳本,你可以做這樣的事情:

for f in "[email protected]"; do 
    echo "$f"; 
done 

,並得到兩行輸出(而不是5)。

閱讀有關特殊參數段落 「@」 在這裏:http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters

0

布拉沃@Roland。 Thans爲您的解決方案提供了很多幫助

它確實有效!

我寫了一個簡單的腳本函數,用鸚鵡螺打開給定的路徑。

而且我剛剛嵌套函數這個「幫手」 - 用於循環進入主功能:

fmp() { 

    fmp2() { 
     nautilus "[email protected]"; 
    }; 

    for fname in "[email protected]"; 
    do   
     fmp2 "$fname";   
    done; 
} 

現在,我能夠讓我所有的腳本做工與路徑處理只需轉動將它們嵌入由函數包裝的嵌套函數中,並使用此輔助程序for循環。