shell脚本中的\ r字符

时间:2011-03-08 09:50:11

标签: shell

我在尝试执行shell脚本时遇到以下错误,

$'\r': command not found: line 2:

请为此建议解决方案。

以下是脚本中使用的初始行

#!/bin/sh

if [[ $# -lt 1 ]]; then
   echo "ERROR Environment argument missing <dev,test,qa,prod>"
   export RC=50
   exit $RC
fi

7 个答案:

答案 0 :(得分:20)

您的问题是该文件具有Windows行结尾。这可能是因为在Windows中编辑文件并尝试在非Windows系统上运行它。

您可以使用dos2unix修改此问题以转换行结尾:

dos2unix ConstruedTermsXMLGenerator.sh

要在另一个方向转换的相应实用程序是unix2dos

有些系统有fromdostodos

答案 1 :(得分:7)

您可以使用 sed -i 's/\r$//' scriptname.sh

将scriptname替换为实际的脚本名称。

答案 2 :(得分:1)

/bin/sh下运行脚本时收到了不同的错误消息,但是当我切换到/bin/bash时,它运行正常:

$ cat foo.sh
#!/bin/sh
if [[ $# -lt 1 ]];
    then echo "ERROR Environment argument missing"
    RC=50
    exit $RC
fi
$ sh foo.sh
foo.sh: 6: [[: not found
$ bash foo.sh
ERROR Environment argument missing

你内置了bashism。这对您的组织来说可能是也可能不是一件大事。如果您想继续使用bash特定功能,请将shebang行更改为#!/bin/bash,看看是否有帮助。

答案 3 :(得分:0)

在Mac(unix)上创建.sh文件并在Linux中执行时,我遇到了这个问题。 事实证明我必须将FileZilla FTP设置设置为' Binary '传输类型:

  • 设置&gt;传输&gt;文件类型&gt;默认传输类型”到“二进制”(而不是“自动”)

答案 4 :(得分:0)

我遇到了同样的错误,我所做的就是将字符'\r'转换为'\n'。使用这一行:

tr '\r' '\n' < oldfile.sh > newfile.sh
mv newfile.sh oldfile.sh
chmod +x oldfile.sh
./oldfile.sh

我想你也可以删除&#39; \ r&#39;字符使用:

tr -d '\r' < oldfile.sh > newfile.sh

tr是命令trasnform,-d删除以下字符。

我认为shell实际上并不喜欢'\r'字符。

答案 5 :(得分:0)

我用notepad ++转换了行尾。

编辑> EOL转换> UNIX / OSX格式

答案 6 :(得分:0)

您可以将 '\r' 替换为 ''(无),这样就可以了。 如果你有任何 GUI 编辑器(Notepad++)推荐直接查找/替换。

如果您仅在 Linux 服务器上执行此操作,请使用以下内容:

sed -i 's/old-text/new-text/g' input.txt

但是由于 '\r' 只有在您在 Windows 中编辑它时才会出现,因为它是一个换行符 (\r\n),所以第一种方法应该有效。