$' \ r' - 在bash中找不到命令

时间:2014-09-26 21:47:37

标签: bash shell

我有以下脚本:

#!/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/

1 个答案:

答案 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在扩展后实际调用时运行的命令。

相关问题