【问题标题】:\r character in shell script\r 脚本中的字符
【发布时间】:2021-05-11 04:07:17
【问题描述】:

我在尝试执行 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

【问题讨论】:

  • 你的 shell 脚本的前两三行是什么? :)
  • 请发布整个脚本或足够的脚本,以便人们重现问题
  • \r\n 是 Windows 行尾。你是在 Windows 中写的吗?如果是这样,只需重新输入:P
  • 哇,别再打字了:dos2unixit

标签: shell


【解决方案1】:

您的问题是文件有 Windows 行结尾。这可能是由于在 Windows 中编辑文件并尝试在非 Windows 系统上运行造成的。

您可以使用dos2unix 转换行尾来解决此问题:

dos2unix ConstruedTermsXMLGenerator.sh

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

有些系统有fromdostodos

【讨论】:

  • @Mohan,如果您将脚本从 windows ftp 到 *nix,请确保将其传输为 ascii。如果你 scp 它,你必须在远程端使用dos2unix。或者使用可以保存为“unix”格式的文本编辑器。
  • Notepad++ 在 Windows 上使用 Ansi 编码对 sh 文件执行此操作。使用“另存为 unix bash 文件”而不是“保存”。
【解决方案2】:

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

将脚本名替换为实际脚本名。

【讨论】:

    【解决方案3】:

    我使用notepad++转换行尾。

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

    【讨论】:

      【解决方案4】:

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

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

      我认为您也可以使用以下方法删除“\r”字符:

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

      tr是命令转换,-d是删除后面的字符。

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          /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,看看是否有帮助。

          【讨论】:

          • 感谢 sarnold 的回复。在更改为 bash 并打开调试后,我尝试了相同的脚本。我仍然得到错误,下面是输出, $ bash -xv foo.sh #!/bin/bash + $'\r' : command not foundnerator.sh: line 2: if [[ $# -lt 1 ]] ;然后 echo "ERROR Environment argument missing " export RC=50 exit $RC fi ConstruedTermsXMLGenerator.sh: line 7: syntax error near unexpected token fi' ConstruedTermsXMLGenerator.sh: line 7: fi'
          • @Mohan,那么@Sigtran 可能是正确的;此文件是否源自 Windows?如果是这样,请运行 dos2unixdtox 或其中一种类似的工具,以从文件中删除所有额外的 \r 字符。
          • 但是,相同的脚本放在 /tmp 目录并执行时可以正常工作。这怎么可能?
          • 如果shebang 显示#!/bin/sh,则使用bash -vx 运行它是错误的,反之亦然。另见stackoverflow.com/questions/5725296/…
          【解决方案7】:

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-03-04
            • 2019-12-17
            • 1970-01-01
            • 2013-05-04
            • 1970-01-01
            • 1970-01-01
            • 2011-11-04
            相关资源
            最近更新 更多