2011-09-16 112 views
0
#!/bin/bash 

    VAR019='priusr' 
    VAR901='pripasswd' 

    echo "CREATE DATABASE ftp; 
    GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO '${VAR019}'@'localhost' IDENTIFIED BY '${VAR901}'; 

这将输出Bash写变量? :找不到命令

: command not found 
    : command not found 
    : command not found 
    : command not found 

我该如何解决这个问题?我究竟做错了什么?

+0

'var019'还存在小写/大写问题 – sehe

回答

2

我建议使用here document来降低报价的复杂度。

#!/bin/bash 

VAR019='priusr' 
VAR901='pripasswd' 

cat <<HERE 
CREATE DATABASE ftp; 
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO '${VAR019}'@'localhost' IDENTIFIED BY '${VAR901}'; 
HERE 

要持怀疑态度的,这里是输出:

CREATE DATABASE ftp; 
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'priusr'@'localhost' IDENTIFIED BY 'pripasswd'; 
+1

变量替换不会使用引号完成,请使用双引号替代 –

+0

或者使用反斜杠在下一行继续当前语句。 –

+2

@ Arnaud/@ Blagovest:您的评论与我的回答没有任何关系。请移动他们到这个问题? – sehe

1

确保您的文件使用权EOL(换行分隔)。

我前段时间的问题完全一样,是由新行代码\r\n(Windows风格)而不是\n(Linux风格)引起的。

在这种情况下,Linux假定\r是命令的名称并尝试调用它。但\r是“隐形”字符,这就是为什么看起来奇怪的错误信息。关于如何将CRLF转换为LF,请参阅this link

0

我只是剪切和粘贴你的程序。我唯一的问题是缺少一个关闭双引号引号。

我得到了以下的输出:

CREATE DATABASE ftp; 
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'priusr'@'localhost' IDENTIFIED BY 'pripasswd'; 

这似乎是你想要的。

:command not found很奇怪。例如,这里就是我得到的,当我进入废话:

$ asdas 
bash: asdas: command not found. 

这看起来也许BASH不执行你的脚本,或者你认为它执行你的脚本,但它的真正执行另一个脚本。使用which命令并确保您的脚本版本正在执行。

您也可以使用bash命令本身:bash myscript.sh。通过这种方式,您正在验证您的脚本是否正在使用BASH shell执行,并且这是您的脚本正在执行,而不是您路径中的其他脚本。

另一种可能性是/bin/bash不是您的bash可执行文件实际位于的位置。你可能也想验证一下。我知道我在运行Perl脚本时看到了这种情况,顶部有#! /usr/bin/perl,Perl实际上位于/bin/perl/usr/local/bin/perl

另外请确保您的shebang格式正确。例如,#之前没有空格,并且它是行中的第一个字符。 !紧邻英镑符号。一些处理器或shell在shebang和命令解释器的名称之间只需要一个空格。