【问题标题】:'\r': command not found [duplicate]'\r':找不到命令[重复]
【发布时间】:2013-09-07 15:19:06
【问题描述】:
echo "Select your option:"
echo "1. Change ip address"
echo "2. Add route"
echo "3. Reboot"
echo "4. Exit"
read A
case $A in
    1)
            echo "Add Ip address"
            read IP
            echo "Add Netmask"
            read Netid
            echo "Add name of interface"
            read Interface
            ifconfig ${Interface} ${IP}/${Netid}
            if [ $? -ne 0 ];then
                    echo "Ip address not configured"
            fi
            ;;
    2)
            echo "Add Destination"
            read dst
            echo "Add Netmask"
            read Netid
            echo "Add Gateway"
            read gw
            route add $dst mask $Netid gw $gw
            if [ $? -ne 0 ];then
                    echo "Route not added"
            fi
            ;;
    3)
            reboot
            ;;
    4)
            echo "Bye"
            exit 0
            ;;
    default)
            echo "Wrong selection"
            exit 1
esac

错误:

[b104@b104 Downloads]$ ./NetworkUtility.sh 
./NetworkUtility.sh: line 1: $'\r': command not found
Select your option:
1. Change ip address
2. Add route
3. Reboot
4. Exit
1
': not a valid identifier 7: read: `A
./NetworkUtility.sh: line 8: $'\r': command not found
./NetworkUtility.sh: line 9: syntax error near unexpected token `newline'
'/NetworkUtility.sh: line 9: `case $A in 
[b104@b104 Downloads]$ 

【问题讨论】:

  • 您的脚本文件包含 DOS/Windows 样式的行尾 (\r\n),这让您的 shell 感到困惑。尝试使用 unix 行尾 (\n) 保存它。
  • 您可以执行tr -d "\r" < NetworkUtility.sh > cleaned.sh,然后检查./cleaned.sh是否效果更好。
  • 关于这个问题最不幸的是它有多长——当一个两行的脚本(有一个shebang和一个单行)时,绝对没有理由拥有超过20行的脚本空行)会产生完全相同的问题。
  • 如果您在 Windows 上使用 IntelliJ 进行开发,但在 Linux 上执行脚本,由于默认的 IntelliJ 行尾配置,您可能会遇到此类问题。您可以通过配置 Unix 结尾来解决它,如下所述:jetbrains.com/help/idea/…

标签: shell


【解决方案1】:

您似乎有 Windows 样式的行尾 (\r\n) - 您需要将它们更改为 unix 样式 (\n)。如果您安装了dos2unix,您可以使用它。您也可以使用sedawk 来实现。

【讨论】:

  • 而 sed 命令将是...sed 's/\r\n/\n/g',或者?
  • sed 命令是sed 's/\r$//',但为什么不只是dos2unix
  • 因为并非所有发行版都默认安装了dos2unix
  • 你刚刚为我的开发团队节省了很多时间。奇怪的问题都解决了,因为团队中运行 Windows 的 one 人正在以CRLF 签出文件。一百万个互联网点指向您。
【解决方案2】:

使用 notepadnotepad++(已测试)等编辑器在 windows 中编写脚本时出现行尾 (EOL) 转换问题。

如果您只需要运行脚本,Sed 和 tr 可能会解决问题,但是如果您正在开发 shell 脚本,每次第一次转换使用 sed/tr 命令然后运行您的脚本时都会变得烦人。

Notepad++ 有一个转换 END OF LINE CONVERSION(EOL) 的选项。 怎么做: 转到 Edit > EOL Conversion > 选择 Unix/OSX

给你,保存脚本文件并运行它。

Here is screenshot of the same

【讨论】:

  • 您使用 notepad++ 的建议对我有用,
【解决方案3】:

发生错误,因为 shell 不理解 DOS/Windows 式的行尾,它需要 LF 而不是 CRLF。

您需要先将编辑器配置为使用类 Unix 的行尾或使用dos2unix 命令自动更改它,例如

dos2unix ./NetworkUtility.sh

阅读更多详情:'\r': command not found

如果您使用 Vagrant,请查看:Windows CRLF to Unix LF Issues in Vagrant

【讨论】:

  • 感谢为我工作
猜你喜欢
  • 2022-01-10
  • 2021-07-23
  • 2016-06-06
  • 2013-05-17
  • 2019-01-28
相关资源
最近更新 更多