![](/img/trans.png)
[英]Bash parameter expansion ${parameter/pattern/string} with quotes
[英]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.