2014-09-26 113 views
0

没有发现我有以下脚本:

#!/bin/sh 

#parameters definition 
ROOT_PATH=/var/www/ 
msql_psw="cc" 
mysql_login="bb" 
mysql_db_name="aa" 

echo START MYSQL DUMP 

NOW=$(date +"%Y-%m-%d") 
SQLFILE="log-$NOW.sql" 
mysqldump --add-drop-table -u "$mysql_login" --password="$mysql_psw" "$mysql_db_name" > "$ROOT_PATH/$SQLFILE" 

当它与sh -x运行,它给出了空行的命令没有发现错误,甚至非空行唐“T正常工作:

sh -x export_db.sh 
+ $'\r' 
: command not found2: 
+ ROOT_PATH=$'/var/www/\r' 
+ msql_psw=$'cc\r' 
+ mysql_login=$'bb\r' 
+ mysql_db_name=$'aa\r' 
+ $'\r' 
: command not found8: 
+ echo START MYSQL $'DUMP\r' 
START MYSQL DUMP 
+ $'\r' 
: command not found10: 
++ date +%Y-%m-%d 
+ NOW=$'2014-10-02\r' 
+ SQLFILE=$'log-2014-10-02\r.sql\r' 
+ mysqldump --add-drop-table -u $'bb\r' --password= $'aa\r' 
: No such file or directory/www/ 
+1

这里唯一特别错的是缺少引号 - 应该是'-u“$ mysql_login”--password =“$ mysql_psw”'等等,用'sh -x your.script'运行你的脚本看看它说的是实际运行 - 这会显示它是否真的不会替换命令中的变量。 – 2014-09-26 21:55:34

+2

噢 - 实际上,'$ ROOT_PATH = foo'是非常错误的;需要'ROOT_PATH = foo',而不需要前导'$'。 – 2014-09-26 21:57:46

+0

$ root_path是一个错字,我没有在脚本中使用$。我会尝试并让你知道。谢谢 – LEM01 2014-09-27 21:49:05

回答

4

$'\r是写CR字符的壳方式 - 回车。 DOS格式的文本文件以CRLF结尾 - 以shell命名,$'\r\n',而UNIX文本文件仅以$ \n结尾。因此,当UNIX读取DOS格式的文本文件时,每行看起来最后都有一个额外的$ \r


除此之外,一些笔记(的地方,只有相关的问题的早期版本):

扩展运营商都没有分配使用,所以

$ROOT_PATH=/var/www/ 

需求是

ROOT_PATH=/var/www 

除此之外 - 在所有扩展中使用引号。那就是:

mysqldump \ 
    --add-drop-table \ 
    -u "$mysql_login" \ 
    --password="$mysql_psw" \ 
    "$mysql_db_name" \ 
    >"$ROOT_PATH/$SQLFILE" 

否则,变量将通过IFS,水珠展开拆分等

最后 - 做这样一个大胆的要求时,作为变量没有被取代,试图证明它通过在脚本中使用set -x(或以#!/bin/sh -x开头,或使用sh -x yourscript手动运行它)来记录shell在扩展后实际调用时运行的命令。

+0

感谢您的回答,不幸的是我仍然无法得到它的工作。我用我得到的输出编辑了我的帖子。 – LEM01 2014-10-02 19:03:18

+0

我会验证这个答案,但我在初始文章中添加了一些评论。谢谢! – LEM01 2014-10-03 10:33:25

+0

添加自己的答案_作为答案,而不是编辑问题。 – 2014-10-03 14:39:30