我在尝试执行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
答案 0 :(得分:20)
您的问题是该文件具有Windows行结尾。这可能是因为在Windows中编辑文件并尝试在非Windows系统上运行它。
您可以使用dos2unix
修改此问题以转换行结尾:
dos2unix ConstruedTermsXMLGenerator.sh
要在另一个方向转换的相应实用程序是unix2dos
。
有些系统有fromdos
和todos
。
答案 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 '传输类型:
答案 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
),所以第一种方法应该有效。