在Bash(沒有調用第二個腳本)中是否有方法來解析變量,就好像它們是命令行參數一樣?我希望能夠通過引號等方式對它們進行分組。解析變量就好像它是參數?
例子:
this="'hi there' name here"
for argument in $this; do
echo "$argument"
done
應打印(但顯然沒有)
hi there
name
here
在Bash(沒有調用第二個腳本)中是否有方法來解析變量,就好像它們是命令行參數一樣?我希望能夠通過引號等方式對它們進行分組。解析變量就好像它是參數?
例子:
this="'hi there' name here"
for argument in $this; do
echo "$argument"
done
應打印(但顯然沒有)
hi there
name
here
參數不存儲在一個字符串。陣列被髮明用於這一目的:
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
將把*
擴展爲一個模式,匹配當前目錄中的每個文件。
我從'read'提示或Zenity對話框中獲取輸入。有沒有什麼辦法從它那裏得到它的數組? – minerz029
我摸索出了半回答自己。考慮下面的代碼:
this="'hi there' name here"
eval args=($this)
for arg in "${args[@]}"; do
echo "$arg"
done
它打印的
hi there
name
here
所需的輸出使用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
這個問題有一些建議 - http://stackoverflow.com/questions/17338863/split-a-string-stored-in-a-variable-into-multiple-words-using-spaces-but-not -t – chooban