Windows 斷行符號

  1. 切換工作目錄到 zzz,編輯一個簡單的腳本 dos.sh複製 /etc/issue 到此目錄,使用 cat 查看檔案內容,並使用選項 -E 顯示結束符號、-v 顯示非列印符號、-T 顯示 TAB 空白。
    [dywang@dywmac ~]$ cd zzz
    [dywang@dywmac zzz]$ vim dos.sh
    [dywang@dywmac zzz]$ cat -EvT dos.sh 
    #/bin/bash$
    a=123$
    echo^I$a$
    $
    
  2. 試著執行 dos.sh,成功輸出變數 a 的內容 123。
    [dywang@dywmac zzz]$ sh dos.sh 
    123
    
  3. 如果您是使用 windows 的 notepad 編輯 dos.sh,存檔時每行行尾會有斷行符號 ^M。為測試此不同,先以指令 unix2dos 將 dos.sh 轉成 DOS 格式,再以 cat -EvT 顯示檔案內容,可查看到 windows 格式的文件結尾符號 ^M
    [dywang@dywmac zzz]$ unix2dos dos.sh 
    unix2dos: converting file dos.sh to DOS format ...
    [dywang@dywmac zzz]$ cat -EvT dos.sh 
    #/bin/bash^M$
    a=123^M$
    echo^I$a^M$
    ^M$
    
  4. grep 要找 windows 的斷行符號,必須使用 c-style escape $'...' 解釋 ...,例如 \n 是換行,而 windows 的斷行符號是 \r。 因此可以找到有斷行符號的總行數 4 行,也就是 issue 有 4 行,空白行 1 行。
    [dywang@dywmac zzz]$ grep  $'\r' dos.sh | wc -l
    4
    [dywang@dywmac zzz]$ grep  $'^\r' dos.sh | wc -l
    1
    
  5. 執行 dos.sh 時,空白行不應該執行,但因有斷行符號,所以出現錯誤訊息。
    [dywang@dywmac zzz]$ sh dos.sh 
    123
    : command not found
    
  6. 再將 dos.sh 轉成 unix 格式並成功執行。
    [dywang@dywmac zzz]$ dos2unix dos.sh
    dos2unix: converting file dos.sh to UNIX format ...
    [dywang@dywmac zzz]$ sh dos.sh 
    123