bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.htmlhtml
注:本文關於引號等特殊符號的處理僅僅只是幾個例子,想要完全搞明白shell對特殊符號的解析,見另外一篇文章shell解析命令行的過程。shell
關於echo的用法,注意點就是單引號和雙引號的特殊狀況。vim
另外,在bash環境下,感嘆號只能經過單引號包圍來輸出,由於此時感嘆號表示引用歷史命令,除非設置"set +H"關閉歷史命令的引用。而在shell腳本中不會出現這類問題。bash
以打印「Hello World!」爲例。字體
[root@xuexi tmp]# echo Hello World!
Hello World!spa
[root@xuexi tmp]# echo 'Hello World!'
Hello World!命令行
[root@xuexi tmp]# echo "Hello World!" #雙引號不能打印感嘆號
-bash: !": event not foundcode
[root@xuexi tmp]# echo Hello World!;echo 'Hello World!'
-bash: !: event not foundhtm
[root@xuexi tmp]# echo 'Hello World!';echo Hello World! #感嘆號能夠在最結尾
Hello World!blog
Hello World!
從上面幾個實驗發現,在bash環境下,要輸出感嘆號必須使用單引號。這是由於默認狀況下開啓了使用感嘆號引用內存中的歷史命令的設置,可使用set +H關閉該設置,這時可使用感嘆號輸出。
[root@xuexi tmp]# set +H [root@xuexi tmp]# echo "Hello World!"
Hello World!
或者使用多對引號分別包圍echo的參數,其中感嘆號使用單引號包圍,以下。
[root@xuexi ~]# echo "Don't use rm -rf command"'!' Don't use rm -rf command!
若是echo不加任何引號,很顯然不能輸出分號「;」,由於分號會被shell解析爲命令鏈接符號。
[root@xuexi tmp]# echo Hello World; Hello World # 分號做爲斷行符號被忽略了
但只加單引號又不能擴展變量,使用雙引號又很差輸出感嘆號,因此echo命令克服各類疑難雜症的方法是對特殊符號分開引用。
[root@xuexi ~]# str=hello [root@xuexi ~]# echo "$str"'!' "world" hello! world
echo -e識別轉義和特殊意義的符號,如換行符、n、製表符\t、轉義符\等。
[root@xuexi tmp]# echo 'Hello World!\n';echo "Hello World"!
Hello World!\n
Hello World!
[root@xuexi tmp]# echo -e 'Hello World!\n';echo "Hello World"!
Hello World!
#換行
Hello World!
不加-n的默認狀況下echo會在每行行尾加上換行符號,使用echo -n取消分行輸出。
[root@xuexi tmp]# echo 'Hello World!'>abc.sh #輸入完就加了分行符號 [root@xuexi tmp]# echo 'Hello World!'>>abc.sh [root@xuexi tmp]# cat abc.sh
Hello World!
Hello World!
[root@xuexi tmp]# echo -n 'Hello World!'>abc.sh #取消了分行符號 [root@xuexi tmp]# echo 'Hello World!'>>abc.sh [root@xuexi tmp]# cat abc.sh
Hello World!Hello World!
echo能夠控制字體顏色和背景顏色輸出。
常見的字體顏色:重置=0,黑色=30,紅色=31,綠色=32,黃色=33,藍色=34,紫色=35,天藍色=36,白色=37。
常見的背景顏色:重置=0,黑色=40,紅色=41,綠色=42,黃色=43,藍色=44,紫色=45,天藍色=46,白色=47。
字體控制選項:1表示高亮,4表示下劃線,5表示閃爍等。
由於須要使用特殊符號,因此須要配合-e選項來識別特殊符號。
[root@xuexi tmp]# echo -e "\e[1;41m Red Bcakground \e[0m" [root@xuexi tmp]# echo -e "\e[1;31m Red Bcakground \e[0m"
顏色控制和字體控制選項的定義順序無所謂,只要被定義出來,shell都能識別。建議定義了顏色後同時定義關閉顏色,不然顏色會繼續影響bash環境的顏色。
另外,任意一個\e可使用\033替換。如:
[root@xuexi tmp]# echo -e "\033[1;41m Red Bcakground \033[0m"
[root@xuexi tmp]# echo -e "\e[1;31m Red Bcakground \033[0m"
使用printf能夠輸出更規則更格式化的結果。它引用於C語言的printf命令,可是有些許區別。
使用printf能夠指定字符串的寬度、實現左對齊(使用減符號-)、右對齊(默認的)、格式化小數輸出等。
使用printf最須要注意的兩點是:
(1)printf默認不在結尾加換行符,它不像echo同樣,因此要手動加「\n」換號;
(2)printf只是格式化輸出,不會改變任何結果,因此在格式化浮點數的輸出時,浮點數結果是不變的,僅僅只是改變了顯示的結果。
[root@xuexi tmp]# cat >abc.sh<<eof # 將下面的內容覆蓋到abc.sh腳本中 > #!/bin/bash > #文件名:abc.sh > printf "%-5s %-10s %-4s\n" No Name Mark # 三個%分別對應後面的三個參數 > printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.34 # 減號「-」表示左對齊 > printf "%-5s %-10s %-4.2f\n" 2 James 90.998 # 5s表示第一個參數佔用5個字符 > printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564 > eof
[root@xuexi tmp]# sh abc.sh # 執行結果:左對齊,取小數點後兩位 No Name Mark 1 Sarath 80.34 2 James 91.00 3 Jeff 77.56
[root@xuexi tmp]# sed -i s#'-'##g abc.sh # 將減號「-」去掉,將右對齊 [root@xuexi tmp]# sh abc.sh No Name Mark 1 Sarath 80.34 2 James 91.00 3 Jeff 77.56
printf中還能夠加入分行符、製表符等符號。
[root@xuexi tmp]# vim abc.sh #修改abc.sh將其改成以下格式 #!/bin/bash #文件名:abc.sh
printf "%-s\t %-s\t %s\n" No Name Mark printf "%-s\t %-s\t %4.2f\n" 1 Sarath 80.34 printf "%-s\t %-s\t %4.2f\n" 2 James 90.998 printf "%-s\t %-s\t %4.2f\n" 3 Jeff 77.564
[root@xuexi tmp]# sh abc.sh # 出現製表符 No Name Mark 1 Sarath 80.34 2 James 91.00 3 Jeff 77.56
printf還有一個常見的i格式,表示對整型格式化佔用幾個整數,前面示例中的s表示對字符格式化。