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、補間または拡張し、期待される結果を得ることができますか?

4

4 に答える 4

7

$TARG_DBはサブシェル内で一重引用符で囲まれているため、文字通りに解釈されます。そこで二重引用符を使用してください。サブシェルを台無しにすることはありません。例えば

$ 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
于 2012-02-01T15:52:28.547 に答える
2

一重引用符で囲まないでください。

コマンド置換を引用符で囲む必要はないので、$()それらを削除して、その中で二重引用符を使用できます。

DB_CREATE=$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse "create database $TARG_DB");
于 2012-02-01T15:52:29.167 に答える
0

'create database $TARG_DB'パーツが間違っています!一重引用符は、bashの変数置換を抑制します。MySQLは、リテラルテキスト「$ TARG_DB」を「認識」し、その名前でデータベースを作成します。SQLステートメントを二重引用符で囲みます。

于 2012-02-01T15:55:13.567 に答える
0
TARG_DB="zztest";
DB_CREATE="$(${MYSQL} -u ${MyUSER} -h ${MyHOST} -p${MyPASS} -Bse \"create database ${TARG_DB}\")";
于 2012-02-01T15:51:49.040 に答える