2013-07-02 38 views
2

我想給一個變量號「元組」作爲參數傳遞到一個bash腳本,並使用模式匹配通過他們在一個循環中,像這樣的匹配:模式在bash與元組類似的論點

for *,* in "[email protected]"; do 
    #do something with first part of tuple 
    #do something with second part of tuple 
done 

這可能嗎?如果是這樣,我如何訪問元組的每個部分?

比如我想打電話給我的劇本一樣:

bash bashscript.sh first_file.xls,1 second_file,2 third_file,2 ... nth_file,1

+0

能告訴你一個例子嗎? – unxnut

回答

1

是的,這是可能的,而且不止一種方法去做一件事。您可以在變量上使用前綴/後綴擴展語法(例如,${var#prefix},${var##prefix},${var%suffix},${var%%suffix}-這些刪除與指定模式匹配的最短或最長前綴/後綴)。或者你可以用例如IFS=, set -- ${var}(儘管您必須先確保以某種方式保存原始參數的其餘部分,以便繼續循環)。如果您的bash版本足夠新(如果它不是很古老......),則可以使用數組。這些可能是三個更好的方法,但也有其他...

編輯:使用後綴/前綴擴展一些例子:

for tuple in first_file.xls,1 
do 
    echo ${tuple%,*}  # "first_file.xls" 
    echo ${tuple#*,}  # "1" 
done 

如果你的元組是超過2元,該方法的更復雜一點;例如:

for tuple in x,y,z 
do 
    first=${tuple%%,*} 
    rest=${tuple#${first}} 
    second=${rest%%,*} 
    last=${rest#*,} 
done 

在你可能更喜歡@的IFS=, read first second third <<< "${tuple}" chepner的回答的話......否則,簿記可能會很麻煩的大元組。從元組中設置一個數組也是一個可以接受的選擇。

對於簡單的對,不過,我傾向於選擇剛剛剝離適當的前綴/後綴...

+0

你能給我一個更具體的例子,說明如何使用前綴和後綴給出我在我的例子中給出的參數? – azrosen92

5

由於bash沒有一個元組的數據類型(它只是字符串),你需要將需要進行編碼和解碼自己他們。例如:

$ bash bashscript.sh first_file.xls,1 second_file,2 third_file,2 ... nth_file,1 

bashscript.sh

for tuple in "[email protected]"; do 
    IFS=, read first second <<< "$tuple" 
    ... 
done