我只是不能做到这一点。 如果*在一个variables中,则它展开为当前文件夹中的文件列表。 回声“*”工作正常。
#!/bin/bash c="GRANT ALL ON \*.* TO '$1'@'localhost';" mysql < $c exit 0;
为您的string使用单引号:
c='GRANT ALL ON *.* TO'; c="${c} '$1'@'localhost';";
有可能有更好的方法来做到这一点,但包括1美元的string变得很奇怪
始终在variablesreplace周围放置双引号,否则shell中会显示空格和*类的字符。 即,写"$c" ,而不是$c 。
语法mysql <"$c"使得mysql从一个名字为$c的文件执行命令。 你在找什么
printf '%s\n' "$c" | mysql
或者更简单一些,只要你记得限制( $c不能以-开始,如果它包含\ ,那么在bash中是可以的,但是在sh的其他变体中不能)
echo "$c" | mysql
如果命令是多行的,还有另一种方法更舒服。 这就是所谓的“这里 – 文件”。 stringEOF不是特殊的(虽然是传统的),任何字母和数字的顺序都可以。 终止EOF可能不会有空格。 你需要在每个$ , \和`之前放一个\ ,除非你想让它们被shell解释。
mysql <<EOF GRANT ALL ON *.* TO '$1'@'localhost'; EOF
注意,如果shell的参数包含一个单引号,那么就有一个注入向量。 以下片段在每个\和'之前添加一个\ 。
set -- "${1//\\/\\\\}" set -- "${1//\'/\'}"
这是相当丑陋的,这就是为什么如果你要做任何复杂的事情,忘记使用shell,并使用实际的SQL绑定(perl,python,无论)在哪里库处理所有的报价和程序build设。
这将在bash中工作,不必逃脱
#!/bin/bash mysql -u root -e "GRANT ALL ON *.* TO '$1'@'localhost'" exit 0;
首先,您需要使用echo 打印 SQL命令。
那么你需要像下面这样在$c周围$c 引号 :
mysql <( echo "$c" )
否则, $c的值将被视为bash命令,因此, *将被扩展。
或者更简单的版本可能是:
mysql -e "$c"
这不是比这更复杂:
#!/bin/bash c="GRANT ALL ON *.* TO $1@localhost;" mysql -e "$c"
或者,如果你需要单引号:
#!/bin/bash c="GRANT ALL ON *.* TO '$1'@'localhost';" mysql -e "$c"
简单是完美的! (引用第一部分的单引号)
#!/bin/bash c='GRANT ALL ON *.*' "TO '$1'@'localhost';" mysql < $c exit 0;
它应该是完美的! ($ c引用)
#!/bin/bash c="GRANT ALL ON *.* TO '$1'@'localhost';" mysql < "$c" exit 0;
与你相抗衡的function是作为path名扩展的一部分。 禁用此function可以解决您报告的主要问题。 然后使用Weboide的-ebuild议通过Mysql执行包含在$ cvariables中的单个命令。 干杯,
[maxwell@elite ~]$ cat me.sh #!/bin/bash # disable shell globbing so c variable can be literal set -f c="GRANT ALL ON *.* TO '$1'@'localhost';" echo $c # enable shell globbing for normal operation set +f echo $c [maxwell@elite ~]$ ./me.sh maxwell GRANT ALL ON *.* TO 'maxwell'@'localhost'; GRANT ALL ON labserver.etc.0710.tar me.sh Validation.txt TO 'maxwell'@'localhost'; [maxwell@elite ~]$