❶ linux Shell 腳本編程最佳實踐
IT路邊社
前言
與其它的編碼規范一樣,這里所討論的不僅僅是編碼格式美不美觀的問題, 同時也討論一些約定及編碼標准。這份文檔主要側重於我們所普遍遵循的規則,對於那些不是明確強制要求的,我們盡量避免提供意見。
編碼規范對於程序員而言尤為重要,有以下幾個原因:
本文檔中的准則致力於最大限度達到以下原則:
盡管本文檔涵蓋了許多基礎知識,但應注意的是,沒有編碼規范可以為我們回答所有問題,開發人員始終需要再編寫完代碼後,對上述原則做出正確的判斷。
注 :未明確指明的則默認為必須(Mandatory)
主要參考如下文檔:
僅建議Shell用作相對簡單的實用工具或者包裝腳本。因此單個shell腳本內容不宜太過復雜。
在選擇何時使用shell腳本時時應遵循以下原則:
可執行文件不建議有擴展名,庫文件必須使用 .sh 作為擴展名,且應是不可執行的。
執行一個程序時,無需知道其編寫語言,且shell腳本並不要求具有擴展名,所以更傾向可執行文件沒有擴展名。
而庫文件知道其編寫語言十分重要,使用 .sh 作為特定語言後綴的擴展名,可以和其他語言編寫的庫文件加以區分。
文件名要求全部小寫, 可以包含下劃線 _ 或連字元 - , 建議可執行文件使用連字元,庫文件使用下劃線。
正例:
反例:
源文件編碼格式為UTF-8。避免不同操作系統對文件換行處理的方式不同,一律使用 LF 。
每行最多不超過120個字元。每行代碼最大長度限制的根本原因是過長的行會導致閱讀障礙,使得縮進失效。
除了以下兩種情況例外:
如出現長度必須超過120個字元的字元串,應盡量使用here document或者嵌入的換行符等合適的方法使其變短。
示例:
除了在行結束使用換行符,空格是源文件中唯一允許出現的空白字元。
對從來沒有用到的或者被注釋的方法、變數等要堅決從代碼中清理出去,避免過多垃圾造成干擾。
Bash 是唯一被允許使用的可執行腳本shell。
可執行文件必須以 #!/bin/bash 開始。請使用 set 來設置shell的選項,使得用 bash echo "Process $: Done making $$$."
# 示例7:命令參數及路徑不需要引號 grep -li Hugo /dev/ "$1"
# 示例8:常規變數用雙引號,ccs可能為空的特殊情況可不用引號 git send-email --to "${reviewers}" ${ccs:+"--cc" "${ccs}"}
# 示例9:正則用單引號,$1可能為空的特殊情況可不用引號 grep -cP '([Ss]pecial||?characters*) ${1:+"$1"}
# 示例10:位置參數傳遞推薦帶引號的"$@",所有參數作為單字元串傳遞用帶引號的"$*" # content of t.sh func_t { echo num: $# echo args: 1:$1 2:$2 3:$3 }
func_t "$@" func_t "$*" # 當執行 ./t.sh a b c 時輸出如下: num: 3 args: 1:a 2:b 3:c num: 1 args: 1:a b c 2: 3:
使用 $(command) 而不是反引號。
因反引號如果要嵌套則要求用反斜杠轉義內部的反引號。而 $(command) 形式的嵌套無需轉義,且可讀性更高。
正例:
反例:
條件測試
使用 [[ ... ]] ,而不是 [ , test , 和 /usr/bin/[ 。
因為在 [[ 和 ]] 之間不會出現路徑擴展或單詞切分,所以使用 [[ ... ]] 能夠減少犯錯。且 [[ ... ]] 支持正則表達式匹配,而 [ ... ] 不支持。參考以下示例:
盡可能使用變數引用,而非字元串過濾。
Bash可以很好的處理空字元串測試,請使用空/非空字元串測試方法,而不是過濾字元,讓代碼具有更高的可讀性。正例:
反例:
正例:
反例:
正例:
反例:
文件名擴展
當進行文件名的通配符擴展時,請指定明確的路徑。
當目錄中有特殊文件名如以 - 開頭的文件時,使用帶路徑的擴展通配符 ./* 比不帶路徑的 * 要安全很多。
應該避免使用eval。
Eval在用於分配變數時會修改輸入內容,但設置變數的同時並不能檢查這些變數是什麼。反例:
請使用進程替換或者for循環,而不是通過管道連接while循環。
這是因為在管道之後的while循環中,命令是在一個子shell中運行的,因此對變數的修改是不能傳遞給父shell的。
這種管道連接while循環中的隱式子shell使得bug定位非常困難。反例:
如果你確定輸入中不包含空格或者其他特殊符號(通常不是來自用戶輸入),則可以用for循環代替。例如:
使用進程替換可實現重定向輸出,但是請將命令放入顯式子 shell,而非 while 循環創建的隱式子 shell。例如:
總是檢查返回值,且提供有用的返回值。
對於非管道命令,使用 $? 或直接通過 if 語句來檢查以保持其簡潔。
例如:
當內建命令可以完成相同的任務時,在shell內建命令和調用外部命令之間,應盡量選擇內建命令。
因內建命令相比外部命令而言會產生更少的依賴,且多數情況調用內建命令比調用外部命令可以獲得更好的性能(通常外部命令會產生額外的進程開銷)。
正例:
反例:
載入外部庫文件不建議用使用.,建議使用source,已提升可閱讀性。正例:
反例:
除非必要情況,盡量使用單個命令及其參數組合來完成一項任務,而非多個命令加上管道的不必要組合。常見的不建議的用法例如:cat和grep連用過濾字元串; cat和wc連用統計行數; grep和wc連用統計行數等。
正例:
除特殊情況外,幾乎所有函數都不應該使用exit直接退出腳本,而應該使用return進行返回,以便後續邏輯中可以對錯誤進行處理。正例:
反例:
推薦以下工具幫助我們進行代碼的規范:
原文鏈接:http://itxx00.github.io/blog/2020/01/03/shell-standards/
獲取更多的面試題、腳本等運維資料點擊: 運維知識社區 獲取
腳本之---簡訊轟炸機
腳本之---QQ微信轟炸機
ansible---一鍵搭建redis5.0.5集群
elk7.9真集群docker部署文檔
全球最全loki部署及配置文檔
最強安全加固腳本2.0
一鍵設置iptbales腳本
❷ linux下文件編碼格式轉換方法(gb18030/utf-8)
linux下文件編碼格式轉換方法(gb18030/utf-8)
在 Linux 做開發或者系統管理遇到亂碼是經常的事情,主要windows下中文的默認編碼是bg2312,而 linux下是utf-8。很多時候 涉及到和windows平台系統的通信免不了編碼的轉化,可能大部分人都用iconv庫函數(包含在glib中)和iconv命令來執行編碼轉換,即:
iconv -f gb18030 -t utf-8 file1.txt -o file2.txt
說實話這個命令不好使,一方面容易重復轉換,另一方面不支持通配符,無法成批轉 換,文件少了還好說,要是一大堆文件豈不是要累死?
今天我要推薦的是另一個 Shell 下編碼轉換工具enca。用它不僅可以轉換編碼,還可以查看文件的原始編碼,而且還支持成批轉換。使用上也比iconv方便一些。安裝enca很簡單,一般用源安裝就行了,enca用法如下:
enca -L 當前語言 文件名
enca -L zh_CN file //檢查文件的編碼
enca -L 當前語言 -x 目標編碼 文件名
enca -L zh_CN -x UTF-8 file //將文件編碼轉換為」UTF-8″編碼
enca -L zh_CN -x UTF-8 < file1 > file2 //如果不想覆蓋原文件可以這樣
除了有檢查文件編碼的功能以外,」enca」還有一個好處就是如果文件本來就是你要轉換的那種編碼,它不會報錯,還是會print出結果來, 而」iconv」則會報錯。這對於腳本編寫是比較方便的事情。
❸ 怎樣在Shell中把utf8編碼轉成中文顯示
String str = new String("暗示大家".getBytes(),"UTF-8");重新用utf-8編碼
或者用URLDecoder.decode("xxxxxx", "UTF-8");重新用utf-8解碼
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字元編碼,又稱萬國碼。由Ken Thompson於1992年創建。現在已經標准化為RFC 3629。UTF-8用1到6個位元組編碼UNICODE字元。用在網頁上可以同一頁面顯示中文簡體繁體及其它語言。
【編碼方式講解】
(1)ANSI編碼
不同的國家和地區制定了不同的標准,由此產生了 GB2312, BIG5, JIS 等各自的編碼標准。這些使用 2 個位元組來代表一個字元的各種漢字延伸編碼方式,稱為 ANSI 編碼。在簡體中文系統下,ANSI 編碼代表 GB2312 編碼,在日文操作系統下,ANSI 編碼代表 JIS 編碼。 不同 ANSI 編碼之間互不兼容,當信息在國際間交流時,無法將屬於兩種語言的文字,存儲在同一段 ANSI 編碼的文本中。 當然對於ANSI編碼而言,0x00~0x7F之間的字元,依舊是1個位元組代表1個字元。這一點是ASNI編碼與Unicode編碼之間最大也最明顯的區別。例如上面演示的文件中英文字母和數字並沒有出現亂碼的情況。
(2)Unicode編碼
Unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字元編碼。它為每種語言中的每個字元設定了統一並且唯一的二進制編碼,以滿足跨語言、跨平台進行文本轉換、處理的要求。1990年開始研發,1994年正式公布。隨著計算機工作能力的增強,Unicode也在面世以來的十多年裡得到普及。
Unicode是國際組織制定的可以容納世界上所有文字和符號的字元編碼方案。Unicode用數字0-0x10FFFF來映射這些字元,最多可以容納1114112個字元,或者說有1114112個碼位。碼位就是可以分配給字元的數字。UTF-8、UTF-16、UTF-32都是將數字轉換到程序數據的編碼方案。
(3)UTF-8編碼
UTF-8是UNICODE的一種變長字元編碼又稱萬國碼,由Ken Thompson於1992年創建。現在已經標准化為RFC 3629。UTF-8用1到6個位元組編碼UNICODE字元。用在網頁上可以同一頁面顯示中文簡體繁體及其它語言(如日文,韓文)。
❹ 如何更改xshell編碼
基本上Xshell使用Windows系統的用戶默認語言。也可按照遠程主機的編碼選擇使用與Windows系統不同的各種編碼。
如何更改會話編碼:
1、從以下方法中選擇其一:
點擊標准按鈕的[編碼]後選擇擬要使用的編碼。
打開會話屬性對話框選擇[類別]的[終端]後在[編碼]目錄中選擇適用的編碼。
2、輸出UTF-8 編碼:
遠程計算機支持Unicode(UTF-8)且設為使用UTF-8時編碼應使用『Unicode(UTF-8)』。UTF-8 編碼可同時輸出多個語言的字元集。如出現亂碼可以參考:Xftp中UTF文件名出現亂碼怎麼辦
* 注釋
為准確顯示選定的編碼,應安裝該Windows系統選定編碼的語言包。
編碼選項不會改變鍵盤輸入值,必要時應安裝Windows提供的IME (Input Method Editor)。
❺ shell腳本怎麼修改編碼
首先,我得知道這個文件具體採用的是什麼樣的編碼,如果是ISO-8859我將會把它轉成UTF-8,其他的ASCII這些都先不做處理,這里可以使用file filename或者是enca iconv
enca需要獲取下:sudo apt-get install enca
iconv的一般用法是:(可以man iconv)
-f from code 源文件編碼
-t to code 目標文件編碼
-o output file 保存為文件
例子:
iconv -f GB2312 -t UTF-8 -o google.txt google.txt
將google.txt的編碼由GB2312更新為UTF-8
enca也同上用法,一般在腳本中對於未曾提供的語言,enca不會報錯,這樣可以保證腳本順利執行
enca -L zh_CN file 檢查文件編碼
enca -L zh_CN -x UTF-8 file 將文件編碼修改為UTF-8並覆蓋文件
具體的用法都可以去查看man手冊或者google之
好了,不多說,查看腳本吧!
#!/bin/bash -x
#由於之前使用windows系統來存放過一些文本文件,利用dropbox同步過來的時候,文件發生亂碼,故寫腳本來批量處理
#這里是對所有的需求文件進行處理,後續可根據修改目錄進行處理
SUBFIX="txt html htm conf"
#cd /home/gavin/tmp
if [ -z $1 ];then
cd $PWD
else
if [ -d $1 ];then
cd $1
else
echo " $1 is not exist;"
exit 1
fi
fi
for i in $SUBFIX;
do
files=`find . -name "*.$i"`
for f in $files;
do
type=`file $f|awk -F':' '{print $2}' |awk '{print $1}'` #獲取文件類型
if [ $type = "ISO-8859" ];then
#iconv -f GB2312 -t UTF-8 -o $f $f
enca -L zh_cn -x UTF-8 $f
else
echo "$f encoding is :$type"
fi
done
done