Shell脚本命令行批处理bash sh cmd bat函数极简学法
作者:高坚果
正文
有时候为了方便别人使用,我们会选择去编写各种各样的命令行脚本:给Windows用户编写.bat
cmd批处理脚本,给macOS、Linux用户编写.sh
bash shell脚本。
面向国内用户当然应当首选中文作为脚本的显示语言,如果还要支持海外用户使用,那么能提供国际化多语言(i18n
)支持那是最好了,省事的也许只提供英文版本;
i18n这个概念太大了,本篇文章记录的是如何简单的实现:根据用户语言环境,让脚本自动显示成中文或英文,当然如果你愿意,同时支持更多语言也是可以的。
命令行脚本参考 - bat
@echo off ::请保存成gbk编码.bat文件,为了防止乱码吞掉关键字符,所有多字节字符文本后面均多放了几个空格 ::取消下面这行注释可以切换成英文代码页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文件,将文件设为允许执行,然后到终端中执行即可测试 # 识别当前语言,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环境下PEM(PKCS#1、PKCS#8)格式RSA密钥生成、导入、导出,多种常见RSA加密、签名填充算法支持。
和 https://github.com/xiangyuecn/RSA-java ,同样sh、bat两个脚本,无需IDE直接调用JDK编译运行java
代码,使用bash、bat脚本代码方便好使,也方便参考。
值得学习的知识点
1. 识别终端使用的语言
骚一点的办法可以直接通过查询终端的版本号中显示文本是否包含“版本”这两个字来判断是中文环境还是英文环境,bash、bat cmd中均支持,主要是非常简单(不排除部分情况下使用这种方式判断出来的结果和实际可能不符)。另外bash里面可以用$LANG
环境变量来判断,也很好使。
// 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跳转,想到哪执行就到哪执行,巨灵活,且标签支持call:lable
调用,搭配特殊的标签eof
可以返回到call
调用点。
因此我们在bat脚本里面可以通过:echo2
来定义函数入口位置,通过goto:eof
来定义函数结束位置,函数内通过%1 %2 %3 ...
来获取参数,%1
这种不会去掉参数首尾的引号,使用%~1
会去掉首尾的引号。
虽然通过标签:echo2
定义了函数echo2
,但bat脚本执行时会一行一行的执行标签后面的函数内容,因此我们在:echo2
之前要通过goto
来跳过函数体,因此我们在函数结尾放一个:func__echo2
标签(标签名字随意),函数开头放一个goto func__echo2
,这样执行的时候就会跳过这个函数体。
最后函数的调用,使用call:echo2 "args1" args2 args3
来调用函数,参数可以用引号包裹起来(参数内有空格是必须包裹的),没有参数就直接写一个call:echo2
就完成了调用。
3. 获取用户的输入
bash中通过read
命令来获取输入,bat中通过set /p
来获取输入。
//bat中 set text=&set /p text=^> //bash中 read -rp "> " text
上面这个代码在不同环境中均会显示出"> "
,然后等待用户输入,回车后就会将文本内容存入text
变量中;值得要注意的是,bat中如果没有输入内容直接回车,变量将不会赋值为空,这个设定比较奇葩,因此需要在输入前提前把变量设为空,或者输入之后使用 || set text=
来设为空也可以。
4. bat文件老是乱码怎么办
嘿,bat脚本这玩意跟随系统默认编码,要是utf-8保存的文件,中文准要乱码,得在文件开头使用chcp 65001
强制切换成utf-8代码页,但下脚本是不乱码了,但调用很多程序命令输出的内容反而变成了乱码,还是老实用gbk编码。
注意到bat文件内所有多字节字符文本(中文)后面均特意多写了几个空格,这是为了防止在乱码时换行符、引号等符号被乱码吞掉(有无作用有待考证),就算bat文件乱码了,也能正确执行,并且输出里面的英文内容。上面代码里面有个 "版本%qjkTTT%"
,这个也是一个特殊处理,防止乱码时结尾的引号被吞掉,锟斤拷 · 烫烫烫 最终抗下了所有。
以上就是Shell脚本命令行批处理bash sh cmd bat函数极简学法的详细内容,更多关于Shell命令行bash sh cmd bat的资料请关注脚本之家其它相关文章!