diff命令+ cygwin +如何读取输出

时间:2014-12-01 01:57:18

标签: bash shell

我想了解如何使用diff命令来理解这些文件之间的区别。有人可以解释一下这意味着什么吗? cases.sh是用记事本++编写的,cases2.sh是在windows7上用cygwin编写的。但我看不出差异,因为我认为它不可见?让case.sh工作的建议是什么,但我想了解它有什么问题。

$ diff cases.sh cases2.sh
1,13c1,13
< #!/bin/sh
< # Prompt user to enter a character
< echo "Please enter a letter:"
< read charac
< case $charac in
<       "a"|"A") echo "You have typed a vowel!" ;;
<       "e"|"E") echo "You have typed a vowel!" ;;
<       "i"|"I") echo "You have typed a vowel!" ;;
<       "o"|"O") echo "You have typed a vowel!" ;;
<       "u"|"U") echo "You have typed a vowel!" ;;
<       *)         echo "You have typed a consonant!" ;;
< esac
< exit 0
\ No newline at end of file
---
> #!/bin/sh
> # Prompt user to enter a character
> echo "Please enter a letter:"
> read charac
> case $charac in
>       "a"|"A") echo "You have typed a vowel!" ;;
>       "e"|"E") echo "You have typed a vowel!" ;;
>       "i"|"I") echo "You have typed a vowel!" ;;
>       "o"|"O") echo "You have typed a vowel!" ;;
>       "u"|"U") echo "You have typed a vowel!" ;;
>       *)         echo "You have typed a consonant!" ;;
> esac
> exit 0

cases.sh不起作用,我在记事本++中写了这个,我得到下面的错误

$ ./cases.sh
Please enter a letter:
t
': not a valid identifier `charac
./cases.sh: line 5: syntax error near unexpected token `$'in\r''
'/cases.sh: line 5: `case $charac in

cases2.sh确实有效,但是我在windows7上的cygwin中用nano写了这个。

$ ./cases2.sh
Please enter a letter:
t
You have typed a consonant!

2 个答案:

答案 0 :(得分:1)

尝试打开&#34;显示所有字符&#34;在notepad ++中...听起来你在那里为你的默认编辑器设置设置了windows风格的换行符。将文件转换为unix样式的换行符并尝试运行它。

答案 1 :(得分:0)

您遇到了经典的换行问题。

Linux和Unices(包括像Cygwin这样的兼容性层)使用单个\n(换行符)来终止每一行,而Windows系列则为每一行使用\r\n(回车符,换行符)。

因此,许多(尽管不是全部)Unix实用程序会阻塞在Windows上编写的脚本,因为它们包含额外的,不可见的回车。在您的情况下,diff 知道<{em>} cases1.sh与这些行上的cases2.sh不同,但不会显示实际的\r个字符造成差异。同样,bash会被回车。

最简单的解决方案是在您选择的编辑器中启用Unix行结尾,并在您已编写的脚本上运行dos2unix之类的工具。它应该在Cygwin的存储库中提供。