2012-02-01 43 views
2

問題:字符串擴張與嵌入式引號

下面的腳本代碼不會產生預期的結果:

# MYSQL, MyUSER MyHost etc ... all defined above as normal 

TARG_DB="zztest"; 
DB_CREATE="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'create database $TARG_DB')"; 

預期成果:

創建一個新的數據庫與名字zztest

實際結果:

的名稱創建一個新的數據庫$TARG_DB

問:

怎麼能這個例子的代碼被改變,使得$TARG_DB插值或擴展,給出預期的結果?

回答

6

由於$TARG_DB位於子shell中的單引號內,因此從字面上理解。在那裏使用雙引號,他們不會搞亂subshel​​l。例如

$ tmp="a b c" 
$ echo $tmp 
a b c 
$ echo $(echo $tmp) 
a b c 
$ echo $(echo "$tmp") 
a b c 
$ echo $(echo '$tmp') 
$tmp 
$ echo "$(echo '$tmp')" 
$tmp 
$ echo "$(echo "$tmp")" 
a b c 
+0

偉大的答案,直接:用例子。謝謝。 – dreftymac 2012-02-02 16:18:33

+0

順便說一句,堆棧溢出誤解了引號(使答案具有誤導性),而一個體面的編輯器知道命令替換並正確突出顯示它。 – Cuadue 2015-02-03 17:46:46

0
TARG_DB="zztest"; 
DB_CREATE="$(${MYSQL} -u ${MyUSER} -h ${MyHOST} -p${MyPASS} -Bse \"create database ${TARG_DB}\")"; 
+1

因爲它位於子外殼內,所以甚至不需要轉義引號。 – Kevin 2012-02-01 15:53:08

+0

@凱文謝謝你是對的。 – sgibb 2012-02-01 15:55:38

2

不要用單引號括起來。

沒有必要引用命令替換$(),因此您可以刪除它們並在其中使用雙引號。

DB_CREATE=$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse "create database $TARG_DB"); 
0

'create database $TARG_DB'部分是錯誤的!單引號在bash中壓縮變量替換。 MySQL「看到」文本「$ TARG_DB」並創建一個具有該名稱的數據庫。把你的sql語句放在雙引號中。

相關問題