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

Bash diff命令+;cygwin+;如何读取输出,bash,shell,Bash,Shell,我试图了解如何使用diff命令来理解这些文件之间的差异。有人能解释一下这是什么意思吗cases.sh是用记事本++编写的,cases2.sh是在windows7上的cygwin中用nano编写的。但是我看不到区别,因为我不认为它是可见的?让cases.sh工作的建议是什么,但我想了解它有什么问题 $ diff cases.sh cases2.sh 1,13c1,13 < #!/bin/sh < # Prompt user to enter a character < echo

我试图了解如何使用
diff
命令来理解这些文件之间的差异。有人能解释一下这是什么意思吗
cases.sh
是用记事本++编写的,
cases2.sh
是在windows7上的cygwin中用nano编写的。但是我看不到区别,因为我不认为它是可见的?让cases.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
cases2.sh
确实有效,但我是在windows7上的cygwin中用nano编写的

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

尝试在记事本++中打开“显示所有字符”。。。听起来您已经为默认编辑器设置了windows样式的换行符。将文件转换为unix样式的换行符,然后尝试运行它

您遇到了典型的换行问题

Linux和Unice(包括Cygwin之类的兼容层)使用单个
\n
(换行符)终止每一行,而Windows系列使用
\r\n
(回车符,换行符)终止每一行

因此,许多(尽管不是全部)Unix实用程序将被在Windows上编写的脚本阻塞,因为它们包含额外的、不可见的回车。在您的情况下,
diff
知道这些行上的
cases1.sh
cases2.sh
不同,但不显示实际导致差异的
\r
字符。类似地,
bash
也会在回车时遇到问题

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

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