2014-10-06 103 views
3

考慮這個簡單的shell腳本:當我把它粘貼到它工作正常一個cygwin窗口shell腳本作品

#!/bin/sh 
fruitlist="Apple Pear Tomato Peach Grape" 
for fruit in $fruitlist 
do 
    if [ "$fruit" = "Tomato" ] || [ "$fruit" = "Peach" ] 
    then 
     echo "I like ${fruit}es" 
    else 
     echo "I like ${fruit}s" 
    fi 
done 

但是當我將它保存爲文本文件然而

$ ./test.sh 
./test.sh: line 4: syntax error near unexpected token `$'do\r'' 
'/test.sh: line 4: `do 

,如果刪除換行符它的工作原理:test.sh從cygwin的終端運行它,我得到這個

#!/bin/sh 
fruitlist="Apple Pear Tomato Peach Grape" 
for fruit in $fruitlist 
do if [ "$fruit" = "Tomato" ] || [ "$fruit" = "Peach" ] 
    then echo "I like ${fruit}es" 
    else echo "I like ${fruit}s" 
fi done 

如何通過在文件中保留新行來使腳本更具可讀性,\n似乎不起作用。

+4

您在DOS - > UNIX轉換中添加了一些奇怪的字符。嘗試使用'dos2unix'來清理文件。 – fedorqui 2014-10-06 12:32:36

+0

可能確實,我已經用更有用的信息來彌補這個問題,看看你現在是否能夠提供幫助? – Joly 2014-10-06 12:35:20

+0

你使用的是什麼shell(+版本)? – 2014-10-06 12:38:09

回答

5

您的\r字符來自Windows文件,其中新行用\r\n定義。在UNIX中,新行僅用\n定義,因此\r保持「孤立」並導致這些問題。

您可以做的是使用命令dos2unix將文件轉換爲UNIX模式。 Does Windows carriage return \r\n consist of two characters or one character?

的更多信息

兩個字符組合表示在Windows上新的生產線。而在 Linux上,\n代表新行。它將光標移動到Linux上新的 行的開頭。在Windows上,光標將停留在控制檯上的 的同一列中,但位於下一行。

  • \r is carriage return;
  • \n是換行符。
1

不回答這個問題。

A case聲明很適合在這裏。以及一個實際的數組。

fruitlist=(Apple Pear Tomato Peach Grape) 
for fruit in "${fruitlist[@]}"; do 
    case $fruit in 
     Tomato|Peach) echo "I like ${fruit}es" ;; 
     *) echo "I like ${fruit}s" ;; 
    esac 
done 
0

我總是下面的頭添加到我的shell腳本,讓cygwin的忽略CR:

#!/bin/sh 
if [ "$OSTYPE" = "cygwin" ]; then shopt -s igncr 2>/dev/null; fi # New version of Cygwin complains itself of CR 

需要注意的是,在第二行的末尾處的註釋是強制性的。