簡體   English   中英

帶有嵌入式引號的bash中的字符串擴展

[英]String expansion in bash with embedded quotes

問題:

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

# 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插入或擴展$TARG_DB ,從而產生預期結果?

因為$TARG_DB在子shell中的單引號內,所以它是字面上的。 在那里使用雙引號,它們不會弄亂子shell。 例如

$ 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

不要用單引號括起來。

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM