<オール>
Linux
変数置換は必ず二重引用符で囲みます。それ以外の場合は、スペースや *
などの文字を使用します 値に現れるものは、シェルによって解釈されます。つまり、 "$c"
と書きます 、 $c
ではありません .
構文 mysql <"$c"
mysql
になります 名前が $c
の値であるファイルからコマンドを実行します .あなたが探しているのは
printf '%s\n' "$c" | mysql
制限 ($c
を覚えている限り) -
で始めてはいけません 、および \
が含まれている場合 これは bash では問題ありませんが、他の sh の変種では問題ありません)
echo "$c" | mysql
コマンドが複数行の場合、より快適な別の方法があります。これを「ヒアドキュメント」と呼びます。文字列 EOF
特別なものではありませんが (伝統的ですが)、文字と数字の任意のシーケンスで十分です。終了 EOF
できない 空白が先行します。 \
を入れる必要があります $
ごとに 、 \
と `
シェルに解釈させたい場合を除きます。
mysql <<EOF
GRANT ALL ON *.* TO '$1'@'localhost';
EOF
シェルへの引数に一重引用符が含まれている場合は、注入ベクトルがあることに注意してください。次のスニペットは \
を追加します \
ごとに と '
.
set -- "${1//\\/\\\\}"
set -- "${1//\'/\'}"
これはかなり醜いので、複雑なことをする場合は、シェルの使用を忘れて、ライブラリがすべての引用とプロシージャの構築を処理する実際の SQL バインディング (perl、python など) を備えた言語を使用してください。 .
文字列には一重引用符を使用してください:
c='GRANT ALL ON *.* TO';
c="${c} '$1'@'localhost';";
おそらくそれを行うより良い方法がありますが、文字列に $1 を含めると奇妙になります
これは bash で動作し、エスケープは必要ありません
#!/bin/bash
mysql -u root -e "GRANT ALL ON *.* TO '$1'@'localhost'"
exit 0;