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