2013-09-04 51 views
16
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 

Lỗi:' r': command not found

[[email protected] 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 
[[email protected] Downloads]$ 
+4

Tệp tập lệnh của bạn có chứa kết thúc dòng DOS/Windows ('\ r \ n'), đây là điều làm bạn bối rối. Hãy thử lưu nó với kết thúc dòng unix ('\ n'). –

+3

Bạn có thể thực hiện 'tr -d" \ r " cleaned.sh', sau đó kiểm tra xem'./Cleaned.sh' có hoạt động tốt hơn không. –

+0

Điều đáng tiếc nhất về câu hỏi này là bao lâu - hoàn toàn không có lý do gì để có một kịch bản nhiều hơn 20 dòng khi một dòng hai (với một shebang và một dòng trống) sẽ tạo ra chính xác cùng một vấn đề. –

Trả lời

26

Dường như bạn có Windows kết thúc dòng phong cách (\r\n) - bạn cần phải thay đổi chúng để unix phong cách (\n). Nếu bạn đã cài đặt dos2unix, bạn có thể sử dụng nó. Bạn cũng có thể làm điều đó bằng cách sử dụng sed hoặc awk.

+7

và lệnh sed sẽ là ... 'sed 's/\ r \ n/\ n/g'', hoặc? – vikingsteve

+1

lệnh sed sẽ là 'sed' s/\ r $ // '', nhưng tại sao không chỉ' dos2unix'? – aragaer

+1

Bởi vì không phải tất cả các bản phân phối đều có 'dos2unix' được cài đặt theo mặc định. – dstronczak

8

Lỗi xảy ra, vì trình vỏ không hiểu dòng kết thúc dòng DOS/Windows và nó dự kiến ​​LF thay vì CRLF.

Trước tiên, bạn cần phải định cấu hình trình chỉnh sửa của mình để sử dụng kết thúc dòng giống Unix hoặc sử dụng lệnh dos2unix để tự động thay đổi, ví dụ:

dos2unix ./NetworkUtility.sh 

Đọc thêm chi tiết tại: '\r': command not found.

Nếu bạn đang sử dụng Vagrant, kiểm tra: Windows CRLF to Unix LF Issues in Vagrant

11

End of Line (EOL) vấn đề chuyển đổi khi kịch bản được viết bằng cửa sổ sử dụng một số biên tập viên như notepad, notepad ++ (thử nghiệm). Nếu bạn đang phát triển kịch bản lệnh, nó sẽ trở nên khó chịu mỗi lần chuyển đổi đầu tiên bằng lệnh sed/tr, sau đó chạy kịch bản lệnh của bạn.

Notepad ++ có tùy chọn chuyển đổi END OF LINE CONVERSION (EOL). Làm thế nào để làm điều đó: đi Edit> EOL Chuyển Đổi> chọn Unix/OSX

Ở đây bạn đi, lưu tập tin kịch bản và chạy nó.

Here is screenshot of the same

Các vấn đề liên quan