シェルスクリプトで定義された関数を簡単に記述する方法 中国語と英語の多言語国際化とコマンドラインバッチ処理 (bash sh cmd but)

場合によっては、他の人が使いやすくするために、.batWindows ユーザー向けに cmd バッチ スクリプトを作成したり、 .shmacOS および Linux ユーザー向けに bash シェル スクリプトを作成したりするなど、さまざまなコマンド ライン スクリプトを作成することを選択することがあります。

国内ユーザー向けのスクリプト表示言語は当然中国語が第一候補ですが、海外ユーザーにも対応するなら国際多言語対応( )がベストで、英語版のみの方が楽ですが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 #按任意键退出

上記のバットおよび 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 のバット スクリプトには関数を具体的に定義する構文はありませんが、タグと goto ジャンプをサポートしています。どこでも実行できます。非常に柔軟で、タグは呼び出しをサポートしています。特殊なタグを使用すると、呼び出し元に戻ることがcall:lableできますeofcallポイント。

したがって、bat スクリプトでは、:echo2関数の開始位置を定義し、goto:eof関数の終了位置を定義し、%1 %2 %3 ...関数内のパラメータを取得できます。%1このメソッドでは、パラメータの最初と最後の引用符は削除されません。このメソッドを使用すると、パラメータは%~1削除されます。最初と最後の引用符。

:echo2label で関数を定義していますecho2、bat スクリプトを実行するとラベル以降の関数内容が一行ずつ実行されるため、関数本体を前に渡してスキップする:echo2必要があるため、最後に labelを付けています。関数の(ラベル名は任意)、関数の先頭に1を付けて実行時に関数本体をスキップします。goto:func__echo2goto 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

上記のコードは、さまざまな環境で表示され"> "、ユーザーの入力を待ちます。Enter キーを押すと、テキストの内容が変数に保存されます。text入力内容がなく、直接 Enter キーを押すと、変数が格納されることに注意してください。この設定はかなり変わっているので、入力する前にあらかじめ変数を空に設定しておく必要がありますが、入力後に変数を空 || set text=に設定することもできます。

4. バットファイルが常に文字化けする場合はどうすればよいですか?

chcp 65001バット スクリプトはシステムのデフォルトのエンコーディングに従います。ファイルを UTF-8 で保存すると、中国語の文字が文字化けします。ファイルの先頭で UTF-8 コード ページに強制的に切り替える必要があります。ただし、の場合、スクリプトは文字化けしませんが、多くのプログラムが呼び出され、コマンドによって出力される内容は文字化けし、gbk エンコードが引き続き使用されます。

バット ファイル内のすべてのマルチバイト文字テキスト (中国語) は、意図的にその後にいくつかの余分なスペースを付けて書かれていることに注意してください。これは、改行、引用符、その他の記号が文字化けに飲み込まれるのを防ぐためです (影響があるかどうかは関係ありません)。要検証)、batファイルが文字化けしている場合でも、正しく実行でき、中の英語の内容が出力されます。上記のコードには 1 つあります "版本%qjkTTT%"。これは、コードが文字化けしたときに最後の引用符が飲み込まれないようにするための特別な処理でもあります。Kun Jin Kao · ホット、ホット、ホットはついにすべてに抵抗しました。

【以上】

おすすめ

転載: blog.csdn.net/xiangyuecn/article/details/132845702