<オール>
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;