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

【完】

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

  1. shell脚本批量ssh登陆主机并执行命令

    shell脚本批量ssh登陆主机并执行命令 今天在客户现场遇到了这个问题,客户没有管理工具,无法批量登陆主机下发命令,几个个C段啊,让我一个一个登陆,.................. 所以写了个s ...

  2. Winform下的语言国际化,几行代码轻松实现

    最近做了一些关于winform的项目,需要用到winform的语言国际化,在初使化的时候用起来非常方便.可以参考一下: 核心逻辑: 预览效果演示: OK,以下是核心代码和操作流程 一,添加Langua ...

  3. Linux Shell 脚本学习第一天: 使用grep 命令,lsusb, ps -ef, 实现树莓派(Debian OS)时检测到依赖的USB设备启动后,启动终端自动执行shell脚本

    1.应用背景: 无人监测的设备,常需要设置应用程序开机启动,程序启动前需要保证调用的设备先启动,运行环境先启动. 2.test.sh部分源码 #!/bin/sh #查看桌面是否启动 while tru ...

  4. linux下shell脚本执行方法及exec和source命令

    exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell的命令分为两 ...

  5. Linux 桌面玩家指南:06. 优雅地使用命令行及 Bash 脚本编程语言中的美学与哲学

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  6. Linux命令行–更多bash shell命令(转)

    4.1.1 探查程序 ps 命令 默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户进程的进程 显示的当前进程的项目 进程号 运行在哪个终端(tty) 进程占用的CPU时间 Linux系统支 ...

  7. 中文/英文双语言版本TWRP for Nexus5 -hammerheadcaf

    编译及作者:laser杨万荣 编译时间: 2015-05-17 编译目的:用于刷cm-12.0 和cm-12.1 ROM 因为现在Nexus5 最新的 CM是 hammerheadcaf ,即和 ao ...

  8. VIM打开shell脚本中文乱码解决

    1. 查找 .vimrc文件 通常有2个地方保存这个文件的: (1) 在/etc/文件夹下面,是所有用户的vim配置 (2)每个用户的开始登录的文件夹下面,有些不一定有,比如hadoop用户,则在/h ...

  9. shell脚本实现git和svn统计log代码行

    实现的功能 git 根据传入的三个参数:起始统计日期.结束统计日期.git仓库地址. 脚本统计的是git仓库内的所有分支的log信息. 脚本统计的是指定时间段内.每一个提交人指定的git地址的所有分支 ...

  10. CentOS中使用Shell脚本实现每天自动备份网站文件和数据库并上传到FTP中(转)

    http://www.jb51.net/article/58843.htm 一.安装Email发送程序 复制代码 代码如下: yum install sendmail mutt 二.安装FTP客户端程 ...

随机推荐

  1. SCI 投稿中像素、DPI、图片分辨率的一些知识

    最近在学习 Linux 命令行下的 ImageMagick 图像处理,对图像本身的一些概念有点懵,搜集整理了一点资料,仅供自己和大家学习与参考. SCI 期刊对分辨率大多都有一定的要求,例如一段来自 ...

  2. Java如何实现去重?这是在炫技吗?

    大家好,我3y啊.由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧.austin支持两种去重的类型:N分钟相同内容达到N次去重和一天内N次相同渠道频次去重. Java开源 ...

  3. App性能测试之iTest

    本文主要介绍下App性能测试工具iTest_V4.7的使用. 功能简介 1.监控Andorid系统(支持手机,平板,电视,车机等智能终端设备)以及应用app的cpu.内存.流量.电池.帧率.页面耗时等 ...

  4. 衔尾法解决当无法使用空闲中断以及DMA中断时配置DMA接收串口不定长数据

    [Ooonly新人贴]记录工作中遇到的问题,话不多说先上干货 问题:类似K线与蓝牙接收部门模块,要求由原来的接收串口中断改为DMA接收.据说要用到空闲中断与DMA中断,但是经仿真发现DMA每完成传输一 ...

  5. Mysql 5.7 的安装

    Mysql的安装 1 windows两种安装方式,入门选手推荐第二种(win10演示) Mysql官网下载地址:https://dev.mysql.com/downloads/mysql/ 2 开始准 ...

  6. CoFiltering:BestPracticesandTechniquesinTextGeneration

    目录 Co-Filtering: Best Practices and Techniques in Text Generation Introduction: Text generation has ...

  7. requests Python中最好用的网络请求工具 基础速记+最佳实践

    简介 requests 模块是写python脚本使用频率最高的模块之一.很多人写python第一个使用的模块就是requests,因为它可以做网络爬虫.不仅写爬虫方便,在日常的开发中更是少不了requ ...

  8. Terraform 系列-使用 for-each 对本地 json 进行迭代

    系列文章 Terraform 系列文章 Grafana 系列文章 概述 前文 Grafana 系列 - Grafana Terraform Provider 基础 介绍了使用 Grafana Terr ...

  9. vue-router之hash与history,以及nginx配置

    本篇讲解前端项目的路由模式(以vue-router为例),以及history模式下的项目部署问题. vue-router的路由模式可以通过指定mode属性值控制,可选值:"hash" ...

  10. Apache Hudi 元数据字段揭秘

    介绍 Apache Hudi 最初由Uber于 2016 年开发,旨在实现一个交易型数据湖,该数据湖可以快速可靠地支持更新,以支持公司拼车平台的大规模增长. Apache Hudi 现在被业内许多人广 ...