我有以下脚本:
#!/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
一起运行时,它会为空行提供命令未找到错误,甚至非空行也无法正常工作:
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/
答案 0 :(得分:4)
$'\r
是编写CR字符的shell方式 - 回车符。 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,glob-expanded等分割。
最后 - 当做出如此大胆的声明,因为变量没有被替换时,请尝试在脚本中使用set -x
来证明它(或者使用#!/bin/sh -x
启动它,或者手动运行它sh -x yourscript
)记录shell在扩展后实际调用时运行的命令。