在bash中退出星号(*)

我只是不能做到这一点。 如果*在一个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变得很奇怪

  1. 始终在variablesreplace周围放置双引号,否则shell中会显示空格和*类的字符。 即,写"$c" ,而不是$c

  2. 语法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 
  3. 注意,如果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 ~]$