2013-11-21 43 views
1

我有它的工作,但不能相信,語法應該是瘋了。我想要做的就是將所有以第三個開始的參數都放入數組中。bash語法瘋狂 - 如何獲得第三個直到最後一個命令行參數到一個數組

E.g.

script.sh foo bar value1 value2 value3 

應該給我一個包含value1,value2和value3的數組。這個數組是用來提供一個新的函數的參數:

./runpy /dsnormalize.py "${values[@]}" 

這工作:

args=("[email protected]") 
length=$((${#args[@]}-2)) 
values=(${args[@]:$length:2}) 

請告訴我這是不正確的方法。我通常以包含所有值的字符串結束。

bash如何處理字符串和整數呢? 並且是$ {}和$()之間的區別?

感謝您的幫助, 卡斯滕

回答

5

正確的語法是:

args_from_third=("{@:3}") 

這是沒有必要插入長度,因爲默認是「自變量的休息」。

確實如此,bash括號很複雜。這兩個我在這裏使用:

VARIABLE=(...) 

這將創建一個名爲VARIABLE數組,其值分隔字符串...元素的空白。

"${@:start:length}" 

這擴展到起始參數startlength參數;如果省略了length,則會使用其餘所有參數。參數由空格字符分隔。由於引用了表達式,因此將每個參數(但不包括空格分隔符)視爲引用它們。

${...}涵蓋了很多可能性,包括子串,搜索和替換以及大小寫更改。詳情請看bash manual

+0

這沒有奏效。我應該補充說我使用參數來調用不同的函數。我更新了我的帖子。 – Karsten

+0

@Karsten:在這種情況下,你不需要數組。只需'./runpy /dsnormalize.py「$ {@:3}」'。如果你嘗試過,並且不符合你的期望,那麼你必須比「它沒有工作」更精確。 (順便說一下,你不是指'./dsnormalize.py') – rici

+0

嗨,「$ {@:3}」工作。謝謝!我如何將它保存在一個變量中並使用這個變量:normalize.py「$ {columns [@]}」? – Karsten

4

更簡單的方法做,這是通過使用shift取消固定參數。

first_arg=$1 
second_arg=$2 
shift 2 
the_rest=("[email protected]") 

和:

如何處理bash的字符串和整數呢?和${}$()之間的區別是什麼?

${}用於獲取變量的值。如果您只是編寫$foo,大括號是可選的,但它們對於任何更復雜的操作都是必需的,例如訪問數組的元素。

$()捕獲命令的輸出,類似於反引號。這與$(())不同,這是您正在使用的。

$(())評估算術表達式。它可以讓你做基本的整數和布爾操作。

+0

+1比使用'$ {@:3}'稍長一點,但POSIX兼容(由於數組不是POSIX,所以第二個想法是無關緊要的)。 – chepner

相關問題