2017-06-19 83 views
0

我需要在bash shell腳本中聲明變量,其中名稱和值都是從另一個命令的輸出中獲取的。如何使用bash中的`declare`在命令的輸出中設置其名稱和值取自哪個變量?

對於這個問題的緣故,我將使用一個臨時文件tmp

$ cat tmp 
var1="hello world" 
var2="1" 

...,並使用它下面我模擬命令。

最後,我需要有變量$var1$var2組分別與hello world1,與直接從輸入採取的變量名和var1var2

這是我走到這一步:

$ cat tmp|while read line; do declare $line; done 

我知道我並不需要使用cat但這是模擬的輸入是從其他命令的輸出取,而不是事實在一個文件中。

這不起作用。我得到:

bash: declare: `world"': not a valid identifier 

$ echo $var1; echo $var2 


$ 

我不明白爲什麼這不工作,因爲我可以這樣做:

declare var1="hello world" 

...與預期的結果。我認爲這將是相當的,但我顯然是錯的。

我發現this answer與我的問題最接近,但並不完全,因爲它依賴於文件來源。我想避免這種情況。我發現其他答案使用eval,但我更願意避免這種情況。

也許在我不明白的引號的使用中有微妙之處。

如果唯一的方法是使用一個臨時文件和源代碼,那就是我要做的,但我認爲必須有另一種方式。

回答

0

編寫shell腳本時一個很好的建議是總是雙引號變量。否則,它將受到shell分詞的影響。

while read line; do 
    declare "$line" 
done < <(echo "var1=hello world") 

而爲什麼echo "var1=hello world" | while read line; do export "$line"; done不起作用?因爲pipesub-shell,它會在子shell中創建var1,它不會影響當前shell。所以在當前shell中不能設置爲

作爲替代方案,使用process substitution,您可以獲取輸出爲臨時文件。所以它會在當前shell中創建變量。

+0

如果OP執行腳本(在子shell上運行) – Inian

+0

這仍然不能解決問題好吧,它不適用於子shell。 @Inian。 – zhenguoli

+0

@zhenguoli恐怕這並不能回答這個問題,因爲1)它仍然依賴於一個外部文件,2)如果變量的值有一個「=」符號,它就不起作用。 – Jordan

相關問題