首页 > 系统相关 >Shell脚本中文英文多语言国际化和命令行批处理(bash sh cmd bat)中定义函数的简单写法

Shell脚本中文英文多语言国际化和命令行批处理(bash sh cmd bat)中定义函数的简单写法

时间:2023-09-13 09:55:54浏览次数:48  
标签:脚本 bat Shell 函数 cmd 乱码 sh echo2 bash

目录

有时候为了方便别人使用,我们会选择去编写各种各样的命令行脚本:给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-csharpTest-Build-Run.batTest-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%",这个也是一个特殊处理,防止乱码时结尾的引号被吞掉,锟斤拷 · 烫烫烫 最终抗下了所有。

【完】

标签:脚本,bat,Shell,函数,cmd,乱码,sh,echo2,bash
From: https://www.cnblogs.com/xiangyuecn/p/17698735.html

相关文章

  • linux shell 字符串变量 有双引号和无双引号的区别
     001、[root@pc1test02]#lsa.shb.sh[root@pc1test02]#cata.sh##测试程序1#!/bin/bashstr1="ab_cd_ef"tmp1=$(echo$str1|sed's/_/\n/g')echo$tmp1[root@pc1test02]#catb.sh##测试程序2#!/bin/bashstr1="ab_......
  • Ceph Enable Dashboard
    本次演示环境配置如下:hostnameIProlesnode01.srv.world192.168.10.101ObjectStorage;MonitorDaemon;ManagerDaemonnode02.srv.world192.168.10.102ObjectStoragenode03.srv.world192.168.10.103ObjectStoragedlp.srv.world192.168.10.142clientwww.srv.world192.168.10.140RAD......
  • 如何在 Zsh 中启用语法高亮?
    在Zsh中启用语法高亮可以让我们在终端中更加方便地识别命令的关键字、参数和特殊符号,提高工作效率和命令行使用体验。在本文中,我们将介绍如何在Zsh中启用语法高亮。Zsh是什么?Zsh是一种Unixshell,是Bourneshell的一种替代品。它提供了更多的功能和特性,比如命令补全、自动纠错、历......
  • 谈谈与Elasticsearch创始人Shay Banon面对面交流后的意外收获
    还记2017年11月,当时在阿里巴巴云栖大会上Elasticsearch与阿里云宣布达成战略合作,为中国市场提供崭新的用户体验。当时在现场听完Elasticsearch创始人ShayBanon的讲演受益匪浅,他在搜索的领域至今已经深耕了20多年,Elasticsearch第一个公开版本在2010年2月发布,2012年创建Elastic公司......
  • Powershell校验AD用户密码有效性
    Powershell校验AD用户密码有效性AD(ActiveDirectory)由微软公司开发的一种目录服务,提供了一种集中式存储和管理用户、计算机、打印机、文件共享等网络资源的方法。主要提供一些关键特点和功能:1.用户和计算机管理:AD允许管理员创建、管理和删除用户帐户以及计算机帐户。这包括设置......
  • cmd快速拷贝文件不计算文件
    例:将a文件夹内的所有内容(包括子文件夹)复制到b文件夹xcopya*b/y/e/i/q如xcopyE:*G:\test/y/e/i/q拷贝E盘文件到G盘下的test文件夹说明:/y:不弹出“确认是否覆写已存在目标文件”的提示/e:复制文件及子文件夹内所有内容,包括空文件夹(对比/s,/s不复制空文件夹)/i:如果b......
  • ubuntu通过.sh实现快捷启动——打开多个终端并自动执行多个程序(转)
    gnome-terminal--tab--bash-c"ifconfig;execbash"gnome-terminal--tab--bash-c"ls;execbash" [DesktopEntry]Name=检查从站状态Exec=gnome-terminal--tab--bash-c"ethercatslaves;execbash"Icon=/home/minsion/cog_edit.......
  • ShutdownHook妙用
    上期文章分享了ShutdownHook的API和基本使用,但是少了一些实际工作中的案例,总感觉没啥大用一样。最近总结工作中可以用到ShutdownHook来解决一些实际问题的例子,分享给大家。任务统计FunTester测试框架定义了好几个自定义的异步关键字,例如fun、funny、funner等。一旦使用到异步,肯......
  • Blas xGEMV launch failed : a.shape=[1,2048000,50], b.shape=[1,50,1], m=2048000,
    BlasxGEMVlaunchfailed:a.shape=[1,2048000,50],b.shape=[1,50,1],m=2048000,n=1,k=50问题描述:使用tensorflow2运行模型时报错:2rooterror(s)found.(0)Internal:BlasxGEMVlaunchfailed:a.shape=[1,2048000,50],b.shape=[1,50,1],m=2048000,n=1,k=5......
  • K8S集群常见问题总结 集群服务访问失败 集群服务访问失败 集群服务暴露失败 外网无法
    问题1:K8S集群服务访问失败?原因分析:证书不能被识别,其原因为:自定义证书,过期等。解决方法:更新证书即可。问题2:K8S集群服务访问失败?curl:(7)Failedconnectto10.103.22.158:3000;Connectionrefused原因分析:端口映射错误,服务正常工作,但不能提供服务。解决方法:删除svc,重新映射端口......