Shell腳本命令行批處理bash?sh?cmd?bat函數(shù)極簡學法
正文
有時候為了方便別人使用,我們會選擇去編寫各種各樣的命令行腳本:給Windows用戶編寫.bat
cmd批處理腳本,給macOS、Linux用戶編寫.sh
bash shell腳本。
面向國內(nèi)用戶當然應當首選中文作為腳本的顯示語言,如果還要支持海外用戶使用,那么能提供國際化多語言(i18n
)支持那是最好了,省事的也許只提供英文版本;
i18n這個概念太大了,本篇文章記錄的是如何簡單的實現(xiàn):根據(jù)用戶語言環(huán)境,讓腳本自動顯示成中文或英文,當然如果你愿意,同時支持更多語言也是可以的。
命令行腳本參考 - bat
@echo off ::請保存成gbk編碼.bat文件,為了防止亂碼吞掉關(guān)鍵字符,所有多字節(jié)字符文本后面均多放了幾個空格 ::取消下面這行注釋可以切換成英文代碼頁cmd窗口 ::chcp 437 ::識別當前語言,0英文,1中文,2...更多支持的語言,中文識別簡單粗暴 set CurrentLang=0 ver | find "版本%qjkTTT%" > nul && set CurrentLang=1 ::封裝echo輸出函數(shù),通過2個或更多參數(shù)提供不同語言的文字,只顯示當前語言文字 goto func__echo2 :echo2 if "%CurrentLang%"=="1" echo %~1 if "%CurrentLang%"=="0" echo %~2 goto:eof :func__echo2 ::測試 call:echo2 "顯示語言:簡體中文 " "Language: English" call:echo2 "腳本運行啦 " "The script is running" pause
命令行腳本參考 - bash
#!/usr/bin/env bash # 請保存成utf-8編碼.sh文件,將文件設為允許執(zhí)行,然后到終端中執(zhí)行即可測試 # 識別當前語言,0英文,1中文,2...更多支持的語言 CurrentLang=0 if [ $(echo ${LANG/_/-} | grep -Ei "\\b(zh|cn)\\b") ]; then CurrentLang=1; fi # 封裝echo輸出函數(shù),通過2個或更多參數(shù)提供不同語言的文字,只顯示當前語言文字 function echo2(){ if [ $CurrentLang == 1 ]; then echo $1; #顯示中文 else echo $2; #顯示英文 fi } #測試 echo2 "顯示語言:簡體中文" "Language: English" echo2 "腳本運行啦" "The script is running" read -n1 #按任意鍵退出
以上bat、bash腳本代碼參考自GitHub開源庫: https://github.com/xiangyuecn/RSA-csharp ,Test-Build-Run.bat
和 Test-Build-Run.sh
腳本,無需IDE直接調(diào)用.NET編譯運行c#
代碼,支持.NET Core、.NET Framework環(huán)境下PEM(PKCS#1、PKCS#8)格式RSA密鑰生成、導入、導出,多種常見RSA加密、簽名填充算法支持。
和 https://github.com/xiangyuecn/RSA-java ,同樣sh、bat兩個腳本,無需IDE直接調(diào)用JDK編譯運行java
代碼,使用bash、bat腳本代碼方便好使,也方便參考。
值得學習的知識點
1. 識別終端使用的語言
騷一點的辦法可以直接通過查詢終端的版本號中顯示文本是否包含“版本”這兩個字來判斷是中文環(huán)境還是英文環(huán)境,bash、bat cmd中均支持,主要是非常簡單(不排除部分情況下使用這種方式判斷出來的結(jié)果和實際可能不符)。另外bash里面可以用$LANG
環(huán)境變量來判斷,也很好使。
// bat中 > ver //輸出:Microsoft Windows [版本 10.0.****.***] //bash中 > bash -version //輸出:GNU bash,版本 5.1.16 ......
2. 函數(shù)的編寫
bash本身就支持函數(shù)的編寫,所有比較簡單,通過function echo2(){ ... }
來定義函數(shù)echo2
,函數(shù)內(nèi)通過$1 $2 $3 ...
來獲取參數(shù)。調(diào)用時直接寫函數(shù)名字加參數(shù)即可完成函數(shù)調(diào)用:echo2 "args1" args2 args3
,參數(shù)可以用引號包裹起來(參數(shù)內(nèi)有空格是必須包裹的),沒有參數(shù)就直接寫一個函數(shù)名字就完成了調(diào)用:echo2
。
cmd的bat腳本里面沒有專門定義函數(shù)的語法,但它支持標簽和goto跳轉(zhuǎn),想到哪執(zhí)行就到哪執(zhí)行,巨靈活,且標簽支持call:lable
調(diào)用,搭配特殊的標簽eof
可以返回到call
調(diào)用點。
因此我們在bat腳本里面可以通過:echo2
來定義函數(shù)入口位置,通過goto:eof
來定義函數(shù)結(jié)束位置,函數(shù)內(nèi)通過%1 %2 %3 ...
來獲取參數(shù),%1
這種不會去掉參數(shù)首尾的引號,使用%~1
會去掉首尾的引號。
雖然通過標簽:echo2
定義了函數(shù)echo2
,但bat腳本執(zhí)行時會一行一行的執(zhí)行標簽后面的函數(shù)內(nèi)容,因此我們在:echo2
之前要通過goto
來跳過函數(shù)體,因此我們在函數(shù)結(jié)尾放一個:func__echo2
標簽(標簽名字隨意),函數(shù)開頭放一個goto func__echo2
,這樣執(zhí)行的時候就會跳過這個函數(shù)體。
最后函數(shù)的調(diào)用,使用call:echo2 "args1" args2 args3
來調(diào)用函數(shù),參數(shù)可以用引號包裹起來(參數(shù)內(nèi)有空格是必須包裹的),沒有參數(shù)就直接寫一個call:echo2
就完成了調(diào)用。
3. 獲取用戶的輸入
bash中通過read
命令來獲取輸入,bat中通過set /p
來獲取輸入。
//bat中 set text=&set /p text=^> //bash中 read -rp "> " text
上面這個代碼在不同環(huán)境中均會顯示出"> "
,然后等待用戶輸入,回車后就會將文本內(nèi)容存入text
變量中;值得要注意的是,bat中如果沒有輸入內(nèi)容直接回車,變量將不會賦值為空,這個設定比較奇葩,因此需要在輸入前提前把變量設為空,或者輸入之后使用 || set text=
來設為空也可以。
4. bat文件老是亂碼怎么辦
嘿,bat腳本這玩意跟隨系統(tǒng)默認編碼,要是utf-8保存的文件,中文準要亂碼,得在文件開頭使用chcp 65001
強制切換成utf-8代碼頁,但下腳本是不亂碼了,但調(diào)用很多程序命令輸出的內(nèi)容反而變成了亂碼,還是老實用gbk編碼。
注意到bat文件內(nèi)所有多字節(jié)字符文本(中文)后面均特意多寫了幾個空格,這是為了防止在亂碼時換行符、引號等符號被亂碼吞掉(有無作用有待考證),就算bat文件亂碼了,也能正確執(zhí)行,并且輸出里面的英文內(nèi)容。上面代碼里面有個 "版本%qjkTTT%"
,這個也是一個特殊處理,防止亂碼時結(jié)尾的引號被吞掉,錕斤拷 · 燙燙燙 最終抗下了所有。
以上就是Shell腳本命令行批處理bash sh cmd bat函數(shù)極簡學法的詳細內(nèi)容,更多關(guān)于Shell命令行bash sh cmd bat的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Linux里awk中split函數(shù)的用法小結(jié)
The awk function split(s,a,sep) splits a string s into an awk array a using the delimiter sep2013-03-03Linux tar 命令出現(xiàn) Cowardly refusing to create an empty archive
這篇文章主要介紹了Linux tar 命令出現(xiàn) Cowardly refusing to create an empty archive 錯誤解決辦法的相關(guān)資料,需要的朋友可以參考下2017-04-04