'\ r':找不到命令

Man*_*tel 19 shell

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
Run Code Online (Sandbox Code Playgroud)

错误:

[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]$ 
Run Code Online (Sandbox Code Playgroud)

dst*_*zak 30

您似乎有Windows样式行结尾(\r\n) - 您需要将它们更改为unix样式(\n).如果已dos2unix安装,则可以使用它.你也可以用sed或者做awk.

  • 并且sed命令将是...`sed's /\r \n/\n/g'`,或者? (7认同)
  • 你刚刚节省了我的开发团队这么多时间.奇怪的问题,都解决了,因为团队中运行Windows的*一个人正在检查文件为"CRLF".一百万互联网指向你. (4认同)
  • sed命令将是'sed's /\r $ $'',但为什么不只是`dos2unix`? (2认同)
  • 因为并非所有发行版都默认安装了"dos2unix". (2认同)

小智 13

使用记事本,记事本++(已测试)等编辑器在Windows中编写脚本时,其行尾(EOL)转换问题.

如果你只是需要运行脚本,sed,tr可以解决问题,但是如果你正在开发shell脚本,每次首次转换使用时都会变得烦人,sed/tr命令然后运行你的脚本.

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

在这里,保存脚本文件并运行它.

这是相同的截图


ken*_*orb 11

发生错误,因为shell不理解DOS /类似Windows的行结尾,它期望LF而不是CRLF.

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

dos2unix ./NetworkUtility.sh
Run Code Online (Sandbox Code Playgroud)

在以下位置阅读更多详细信息:'\r'找不到命令.

如果您正在使用Vagrant,请检查:Vagrant中的Windows CRLF到Unix LF问题