1. 程式人生 > >Linux Bash Shell學習 十八 String I/O——echo和printf

Linux Bash Shell學習 十八 String I/O——echo和printf

               

  本文也即《Learning the bash Shell》3rd Edition的第七章Input/Output and Command-Line Processing之讀書筆記之二。

echo

  echo是非常常用的shell命令。引數如下:

-e:開啟反斜槓字元backslash-escaped的解析,即對/n,/t等字元進行解析,而不視之為兩個字元 -E:關閉反斜槓字元的解析,/n作為兩個字元,這是系統預設模式 -n:刪除最後的換行

  backslash-escaped有下面引數,注意需要加上選擇-e方可生效。

/a: 發出警告鈴音(ALERT or CTRL-G (bell)) /b: 退格(BACKSPACE or CTRL-H ) /c
: 刪除最後的字元及最後的換行(Omit final NEWLINE ) /e: 刪除後面的一個字元(Escape character (same as /E) ) /E: 同上(Escape character) /f: 換頁符,在某些現實中會清屏,有些會換行(FORMFEED or CTRL-L ) /n: 換行(NEWLINE (not at end of command) or CTRL-J ) /r: 從行頭開始,和換行不一樣,仍在本行(RETURN (ENTER) or CTRL-M ) /t: tab鍵(TAB or CTRL-I ) /v: 豎直tab,和/f一樣,顯示不同機器有所不一樣,通常會引起換行VERTICAL TAB or CTRL-K /n
: 在cygwin中使用/65,無法正確顯示'A’但是下面兩種方法否可以顯示。ASCII character with octal (base-8) value n, where n is 1 to 3 digits /0nnn: 用8進位制的值表示一個字元,例如/0101,即65,表示字元’A’(The eight-bit character whose value is the octal (base-8) value nnn where nnn is 1 to 3 digits ) /xHH: 用16進位制的值表示一個字元,例如/x41,即65,表示字元’A’The eight-bit character whose value is the hexadecimal (base-16) value HH (one or two digits) //
: 表示‘/’Single backslash

  倒數第2-4,用數值來表示字元和裝置相關,通常用於複雜的IO操作,例如游標控制和特殊的圖形符號。

printf

  Linux提供一個功能更強大,更靈活的列印命令printf。printf和C語言的使用方式類似。和echo不一樣,它不會在最後自動加上換行,需要寫入命令中。例如printf "Hello, world/n"。printf的命令格式如下:    

printf format-string [arguments]    

  例子為:printf "%s, %s/n" hello world。如果格式需要的引數比後面給出的多,超出的部分為0或者null。格式如下。

%c:ASCII字元,如果引數給出字串,則列印第一個字元         %d:10進位制整數         %i:同%d         %e:浮點格式([-]d.精度[+-]dd)         %E:浮點格式([-]d.精度E[+-]dd)         %f:浮點格式([-]ddd.precision)         %g:%e或者%f的轉換,如果後尾為0,則刪除它們         %G:%E或者%f的轉換,如果後尾為0,則刪除它們         %o:8進位制         %s:字串         %u:非零正整數         %x:十六進位制         %X:非零正數,16進位制,使用A-F表示10-15         %%:表示字元"%"

  如果需要限定輸出的寬度,格式為%flags width.precision format-specifier,width是整數,右邊對齊,如果需要左邊對齊,在前面加“-”,例如"%-20s"表示從左邊開始對齊,寬度為20,如果字串長度少於20,通過空格補齊。precision在浮點值中提供四捨五入。例如%5.6G,長度為5,精度為6。精度是可選的。長度和精度的值可以引數中指定,例如printf "%*.*G/n" 5 6 $myvalue。長度指顯示中佔的字元長度,與字元長度的同義。如果長度比實際的少,例如實際字元長度更大或者所要求的精度更大,則顯示按實際長度。

%d, %I, %o, %u, %x, %X:在裡面使用精度,表示最小顯示的數字。如果顯示的數字比需求少,則補充0。預設值為1.         %e, %E:在裡面使用精度,表示最小顯示的數字。如果顯示的數字比需求少,在小數點後面補充0。預設值為10.精度度為0經隱藏小數點。         %f:在這裡的精度,表示小數點後面的數字的數目。         %g, %G:這裡的精度,表示最大的有效數字的數目。         %s:這裡的精度,表示最大的字元數目。

  在前面,介紹了”-“作為左對齊,下面介紹這些特殊符號

-:左對齊         space:正數前面加空格,負數前面加符號,例如12.12,|% f|,顯示| 12.120000|,注意前面留了一個空格。例如-12.12,|% f|,顯示|-12.120000|         +:對於數碼給予正負號。         #:給出另一種格式:

  • %o以8進位制顯示整數,而%#o則在前面加上零,表明是八進位制,例如12,顯示014
  • %x或者%X以16進位制的方式顯示整數,而%#x或者%#X,在16進位制的整數前面加上0x或者0X來表示,例如12,顯示0XC
  • %#e,%#E, %#f,將只以十進位制顯示
  • %#g,%#G,將不刪除最後無關的補齊0,例如12.1200,將全部顯示,而不是12.12。
0:對於數目,不使用空格,而使用0來作為補齊。

  介紹兩個特別的字元顯示格式%b和%q。

%b:表示解析字串的特殊的字元,包括/n等等。例如printf "%s/n" 'hello/nworld',顯示hello/nworld,要將/n作為換行符,則需要用printf "%b/n" 'hello/nworld'

%q:printf "%q/n" "greetings to the world"顯示為greetings/ to/ the/ world,可以作為shell的輸入。