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

