2013-10-26 59 views
2

在Bash(沒有調用第二個腳本)中是否有方法來解析變量,就好像它們是命令行參數一樣?我希望能夠通過引號等方式對它們進行分組。解析變量就好像它是參數?

例子:

this="'hi there' name here" 

for argument in $this; do 
    echo "$argument" 
done 

應打印(但顯然沒有)

hi there 
name 
here 
+0

這個問題有一些建議 - http://stackoverflow.com/questions/17338863/split-a-string-stored-in-a-variable-into-multiple-words-using-spaces-but-not -t – chooban

回答

1

參數不存儲在一個字符串。陣列被髮明用於這一目的:

this=('hi there' name here) 

for argument in "${this[@]}"; do 
    echo "$argument" 
done 

強烈建議,如果你有控制this您使用這種方法。如果不這樣做,那麼更不要使用eval的原因,因爲意外的命令可以嵌入this的值中。例如:

$ this="'hi there'); echo gotcha; foo=(" 
$ eval args=($this) 
gotcha 

不太邪惡就像this="'hi there' *"一樣簡單。 eval將把*擴展爲一個模式,匹配當前目錄中的每個文件。

+0

我從'read'提示或Zenity對話框中獲取輸入。有沒有什麼辦法從它那裏得到它的數組? – minerz029

2

我摸索出了半回答自己。考慮下面的代碼:

this="'hi there' name here" 

eval args=($this) 

for arg in "${args[@]}"; do 
    echo "$arg" 
done 

它打印的

hi there 
name 
here 
1

所需的輸出使用gsed -r

echo "$this" | gsed -r 's/("[^"]*"|[^" ]*) */\1\n/g' 
"hi there" 
name 
here 

使用egrep -o

echo "$this" | egrep -o '"[^"]*"|[^" ]+' 
"hi there" 
name 
here 

純BASH方式:

this="'hi there' name here" 
s="$this" 
while [[ "$s" =~ \"[^\"]*\"|[^\"\ ]+ ]]; do 
    echo ${BASH_REMATCH[0]} 
    l=$((${#BASH_REMATCH[0]}+1)) 
    s="${s:$l}" 
done 

"hi there" 
name 
here 
相關問題