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

