当前位置: 首页 > news >正文

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

文章目录

  • 命令行脚本参考 - bat
  • 命令行脚本参考 - bash
  • 值得学习的知识点
    • 1. 识别终端使用的语言
    • 2. 函数的编写
    • 3. 获取用户的输入
    • 4. 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:echo2if "%CurrentLang%"=="1" echo %~1if "%CurrentLang%"=="0" echo %~2goto: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 ]; thenecho $1; #显示中文elseecho $2; #显示英文fi
}#测试
echo2 "显示语言:简体中文" "Language: English"
echo2 "脚本运行啦" "The script is running"
read -n1 #按任意键退出

以上bat、bash脚本代码参考自GitHub开源库: https://github.com/xiangyuecn/RSA-csharp ,Test-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)中定义函数的简单写法

文章目录 命令行脚本参考 - bat命令行脚本参考 - bash值得学习的知识点1. 识别终端使用的语言2. 函数的编写3. 获取用户的输入4. bat文件老是乱码怎么办 有时候为了方便别人使用,我们会选择去编写各种各样的命令行脚本:给Windows用户编写.bat cmd批处理脚…...

stringBuffer.append(analyze);使用这个拼接时候如何在字符串参数字符串参数整数参数字符串数组参数内容之间添加空格

stringBuffer.append(analyze);使用这个拼接时候如何在字符串参数字符串参数整数参数字符串数组参数内容之间添加空格? 在添加参数到 StringBuffer 时,你可以在每次添加参数之后都添加一个空格,如下所示: StringBuffer stringBu…...

点云从入门到精通技术详解100篇-大范围田间场景 3D 点云语义分割研究(续)

目录 3.2 自制数据集展示 3.2.1 收集航拍图像 3.2.2 3D 点云重建 3.2.3 语义标签标注...

Mysql详解Explain索引优化最佳实践

目录 1 Explain工具介绍2 explain 两个变种3 explain中的列3.1 id列3.2 select_type列3.3 table列3.4. type列3.5 possible_keys列3.6 key列3.7 key_len列3.8 ref列3.9 rows列3.10 Extra列 4 索引最佳实践4.1.全值匹配4.2.最左前缀法则4.3.不在索引列上做任何操作(计…...

STM32H7 Azure RTOS

STM32H7 是意法半导体(STMicroelectronics)推出的一款高性能微控制器系列,基于 Arm Cortex-M7 内核。它具有丰富的外设和高性能计算能力,适用于各种应用领域。 Azure RTOS(原名 ThreadX)是一款实时操作系统…...

基于LUT查找表方法的图像gamma校正算法FPGA实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将gamma2.2和gamma1/2.2的数据分别导入到matlab进行对比: 2.算法运行软件版本 matlab2022a 3.部分核心程序 timescale 1ns / 1ps //…...

Function模块

0 Preface/Foreword 1 数据结构 1.1 func_cb_t //task control block typedef struct {u8 sta; //cur working task numberu8 last; //lask task number #if BT_BACKSTAGE_ENu8 sta_break…...

Prometheus PromQL数据查询语言

PromQL 简介 PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询语言。支持用户进行实时的数据查询及聚合操作。 Prometheus 基于指标名称(metrics name)以及附属的标签集(labelset)唯一定义一…...

如何将转换器应用于时序模型

一、说明 在机器学习的广阔环境中,变压器作为建筑奇迹屹立不倒,以其复杂的设计和捕获复杂关系的能力重塑了我们处理和理解大量数据的方式。 自 2017 年创建第一台变压器以来,变压器类型呈爆炸式增长,包括强大的生成 AI 模型&#…...

数据结构:队列

文章目录 队列一,概述二,添加数据三,删除数据 队列 一,概述 队列是一种特殊的数据结构,它遵循先进先出(FIFO)的原则。在队列中,元素被添加到末尾,并从头部移除。队列只…...

AUTOSAR汽车电子嵌入式编程精讲300篇-基于AUTOSAR架构的AT控制系统研究与实现

目录 前言 国内外研究现状 国外研究现状 国内研究现状 2 AUTOSAR规范及开发流程...

计网第五章(运输层)(四)(TCP的流量控制)

一、基本概念 流量控制就是指让发送方的发送速率不要太快,使得接收方来得及接收。可以使用滑动窗口机制在TCP连接上实现对发送方的流量控制。 注意:之前在讨论可靠传输时,讨论过选择重传协议和回退N帧协议都是基于滑动窗口的机制上进行实现…...

【华为OD机试python】查找众数及中位数【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 众数是指一组数据中出现次数最多的那个数,众数可以是多个。 中位数是指把一组数据从小到大排序后,如果这组数据的总数是奇数, 那最中间的那个数就是中位数; 如果这组数据总数是偶数,那…...

阿里云无影云电脑详细介绍:价格、使用和功能优势说明

什么是阿里云无影云电脑?无影云电脑(原云桌面)是一种快速构建、高效管理桌面办公环境,无影云电脑可用于远程办公、多分支机构、安全OA、短期使用、专业制图等使用场景,阿里云百科分享无影云桌面的详细介绍、租用价格、…...

【实践篇】MySQL执行计划详解

文章目录 本文知识大纲速览1. 前言2. 基本介绍1. 什么是执行计划2. 如何查看执行计划3. 执行计划的组成部分 3. 执行计划的关键元素1. id2. select_type3. table:4. type:5. possible_keys:6. key:7. key_len8. ref:9. rows:10. Extra 4. 底层原理5. 执行计划示例解读本文知识图…...

二维凸包(Graham) 模板 + 详解

(闲话) 上了大学后没怎么搞oi,从土木跑路到通信了(提桶开润大成功!),但是一年上两年的课(补的),保研也寄掉了( 说起来自从博客被大学同学发现并…...

ElasticSearch(ES)简单介绍

ES简介 Elasticsearch(通常简称为ES)是一个开源的分布式搜索和分析引擎,旨在处理各种类型的数据,包括结构化、半结构化和非结构化数据。它最初是为全文搜索而设计的,但随着时间的推移,它已经演变成一个功能…...

OpenCV(三十五):凸包检测

1.凸包检测介绍 凸包检测是计算凸包的一种技术,凸包就是:给定二维平面上的点集,将最外层的点连接起来构成的凸边形,它是包含点集中所有的点。 2.凸包检测函数convexHull() void cv::convexHull ( InputArray points, OutputArra…...

PS 透视裁剪工具

上文 PS 裁剪工具及工具栏配置讲解 我们讲完了裁剪工具 然后 我们继续来研究 透视裁剪工具 切换到 透视裁剪工具 后 我们先点击左上方的清除 先不要这些多的配置 然后 我们可以先用鼠标在图像上 画出一个局域 然后 我们去拖他四个角中的其中一个 就能拖出一些不同的形状 然…...

每日一个C库函数-#1-memset()

每日一个C库函数-#1-memset() 来源 C 标准库 - <string.h> 声明 void *memset(void *str, int c, size_t n);str&#xff1a;要填充的内存块&#xff1b;c&#xff1a;要被设置的值&#xff08;以何值填充&#xff09;。该值以 int 形式传递&#xff0c;填充内存块时…...

GraphQL基础知识与Spring for GraphQL使用教程

文章目录 1、数据类型1.1、标量类型1.2. 高级数据类型 基本操作2、Spring for GraphQL实例2.1、项目目录2.2、数据库表2.3、GraphQL的schema.graphql2.4、Java代码 3、运行效果3.1、添加用户3.2、添加日志3.3、查询所有日志3.4、查询指定用户日志3.5、数据订阅 4、总结 GraphQL…...

【SA8295P 源码分析】97 - QNX AIS Camera 框架介绍 及 Camera 工作流程分析

【SA8295P 源码分析】97 - QNX AIS Camera 框架介绍 及 Camera 工作流程分析 一、QNX AIS Server 框架分析二、QNX Hypervisor / Android GVM 方案介绍三、Camera APP 调用流程分析四、QCarCam 状态转换过程介绍五、Camera 加串-解串 硬件链路分析六、摄像头初始化检测过程介绍…...

威胁的数量、复杂程度和扩散程度不断上升

Integrity360 宣布了针对所面临的网络安全威胁、数量以及事件响应挑战的独立研究结果。 数据盗窃、网络钓鱼、勒索软件和 APT 是最令人担忧的问题 这项调查于 2023 年 8 月 9 日至 14 日期间对 205 名 IT 安全决策者进行了调查&#xff0c;强调了他们的主要网络安全威胁和担忧…...

NSSCTF web 刷题记录2

文章目录 前言题目[广东强网杯 2021 团队组]love_Pokemon[NCTF 2018]Easy_Audit[安洵杯 2019]easy_web[NCTF 2018]全球最大交友网站prize_p2[羊城杯 2020]easyser[FBCTF 2019]rceservice方法一方法二 前言 今天是2023年9月13号&#xff0c;刷题记录2正式开始。时间来到九月十七…...

Linux驱动之INPUT子系统框架

目录 一、input 子系统简介 二、input 驱动编写流程 1、注册 input_dev 2、上报输入事件 三、input_event 结构体 按键、鼠标、键盘、触摸屏等都属于输入(input)设备&#xff0c; Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设…...

Long类型雪花算法ID返回前端后三位精度缺失问题解决

目录 一、问题描述二、问题复现1.Maven依赖2.application.yml 配置3.DemoController.java4.snowflakePage.html 页面5.DemoControllerAdvice.java 监听6.问题复现 三、原因分析四、问题解决方案一方案二 一、问题描述 Java 后端使用雪花算法生成 Long 类型的主键 ID&#xff0…...

6.8-SpringIoC之循环依赖底层源码解析

解决靠&#xff0c;三级缓存 创建Map&#xff0c;存不完整的Bean 存在问题&#xff1a;属性存在但没有值...

Springboot 实践(18)Nacos配置中心参数自动刷新测试

前文讲解了Nacos 2.2.3配置中心的服务端的下载安装&#xff0c;和springboot整合nacos的客户端。Springboot整合nacos关键在于使用的jar版本要匹配&#xff0c;文中使用版本如下&#xff1a; ☆ springboot版本: 2.1.5.RELEASE ☆ spring cloud版本 Greenwich.RELEASE ☆ sp…...

uniapp引入小程序原生插件

怎么在uniapp中使用微信小程序原生插件&#xff0c;以收钱吧支付插件为例 1、在manifest.json里的mp-weixin中增加插件配置 "mp-weixin" : {"appid" : "你的小程序appid","setting" : {"urlCheck" : false},"usingCom…...

自己记录微信小程序开发遇到的问题

在HBuilder X中【运行】--【小程序】--【运行设置】&#xff0c;小程序运行配置&#xff0c;将【微信开发者工具】的安装路径配置进去&#xff0c;首次运行会自动让你填写&#xff1b; 1、hbuildx运行到微信开发者工具报错 Error: Unbalanced delimiter found in string 错误…...

ecshop 网站标题修改/免费的网站域名查询565wcc

如新语法的字面含义&#xff0c;NOWAIT表示当无法获取到锁时直接返回错误&#xff0c;而不是等待&#xff1b;SKIP LOCKED表示忽略那些已经被其他session占有行锁的记录。下面看测试&#xff1a; 测试 一 session 1 : mysql> select * from t; ---- | a | ---- | 42 | | …...

城乡住房和城乡建设网站查询/免费合作推广

spring MVC框架controller间跳转&#xff0c;需重定向。有几种情况&#xff1a;不带参数跳转&#xff0c;带参数拼接url形式跳转&#xff0c;带参数不拼接参数跳转&#xff0c;页面也能显示。 首先先来介绍一下不带参数的重定向&#xff1a; 我在后台一个controller跳转…...

cms网站开发/推广app接单网

给你一个日志数组 logs。每条日志都是以空格分隔的字串&#xff0c;其第一个字为字母与数字混合的 标识符 。 有两种不同类型的日志&#xff1a; 字母日志&#xff1a;除标识符之外&#xff0c;所有字均由小写字母组成数字日志&#xff1a;除标识符之外&#xff0c;所有字均由…...

济南seo网站优化/免费优化网站排名

坑人的引用类型。。。。输出看看结果是什么 Queue<ParaInfo> strStranList new Queue<ParaInfo>();StringBuilder strSql new StringBuilder();strSql.Append("Update Jia72_Members Set ");strSql.Append("UserNameUserName,");strSql.Appe…...

网站设计需要什么/西安网络推广seo0515

C#一个到多个Cookie的字符串添加到CookieCollection集合中多个站点&#xff08;Domain&#xff09;与多个路径&#xff08;Path&#xff09;与多个Cookie名&#xff08;c.name&#xff09;的字符要添加到CookieCollection集合中在网上找不到可行的方法&#xff0c;isGood用一天…...

网站建设经营范围/公众号排名优化软件

PropertyDescriptor类&#xff1a; PropertyDescriptor类表示JavaBean类通过存储器导出一个属性。主要方法&#xff1a;   1. getReadMethod()&#xff0c;获得用于读取属性值的方法   2. getWriteMethod()&#xff0c;获得用于写入属性值的方法 注&#xff1a;…...