これらのコーディングのヒントを使用して、高速で読みやすいシェル スクリプトを作成します。
Bash は間違いなく、あらゆる最新の Unix 系システムまたは Unix ベースのオペレーティング システムのネイティブ組み込み自動化ソリューションになりました。プログラマーは Bash を使用してシェル スクリプトを作成し、反復的なコマンドライン タスクを自動化します。 Bash の主な目的は、他のプログラムを実行し、その終了コードと出力を処理するための最小限の構文を提供することです。ただし、最新の Bash インタープリターには、ほとんどの汎用プログラミング言語の機能を提供する完全なコマンド言語があります。したがって、従来のコマンド ライン呼び出しとアルゴリズム コードを組み込むことで、可読性の高いシェル スクリプトを作成できます。 Bash の最新バージョンでは、連想配列や参照渡しのサポートなどのパフォーマンス関連の機能が導入され、Bash にシェル スクリプトの準備ができている他の言語と競合できる機能が与えられました。
この記事では、シェル スクリプトを現代的で高速で読みやすいものにするために、シェル スクリプトに組み込むことができる Bash コーディングのヒントをいくつか紹介します。これらのヒントを使用すると、Bash を使用して一般的なプログラミングやアルゴリズムの実装 (アルゴリズム プロトタイプ、実装ユーティリティ、さらには競技プログラミングなど) を作成できます。
従来の Bash 変数には通常、型がありませんが、特定の処理コンテキストに応じて、整数、小数、または文字列として処理できます。通常、コマンド出力、アルゴリズム パラメーター、その他の一時値を保存するために Bash 変数を使用します。 Bash は、1 次元 (数値インデックス) と結合 (キーと値の構造) という 2 つの配列タイプもサポートしています。 Python、PHP、JavaScript などの他の一般的な動的型付け汎用言語と同様、Bash 配列の操作は非常に簡単です。 Bash で配列を作成する方法は次のとおりです:
リーリー上記のコードによって出力される配列の内容は次のとおりです:
次のように、declare 組み込みコマンドを使用して、各配列参照の宣言を確認できます。
Bash での配列宣言の確認 (作成者のスクリーンショット) 配列操作や、新しい項目の追加、既存の項目の削除、配列要素の処理、並べ替えなどの処理アクティビティに最小限の構文を使用することもできます。たとえば、次のコードは無効なスコア値を削除し、上位 3 つの最高スコアを出力します。 リーリー 上記のコードでは、sort 外部コマンドを使用しているため、並べ替えのための別のプロセスが生成されますが、Bash コードを使用して選択並べ替えなどの単純な並べ替えアルゴリズムを実装することで、これを回避できます。Bash バージョン 4.0 では、キーと値のデータを格納するための連想配列関数が導入されました。 Bash 連想配列の簡単な例を次に示します:
リーリーここでは、!mapvar[@] 構文を使用して、すべての辞書キーを配列として抽出し、反復処理しています。上記のコードは、次のようにすべてのキーと対応する値を出力します。
Bash を使用すると、最小限の構文を使用して連想配列データを操作したりアクセスしたりできます。 Bash 連想配列の使用は、Python 辞書を使用するのと同じように機能します。以下の例を参照してください:
リーリー 上記のソース コードは、ユーザーに x 座標と y 座標を要求し、欠落している軸の値にデフォルト値を設定して、それらを端末に出力します。通常、Python 辞書では not in を使用するため、ここでは ! -v 構文を使用します。
当您通过 Bash 解释器执行 shell 脚本时,操作系统会创建一个新的 Bash 进程,并将您的脚本文件作为第一个命令行参数。操作系统通常允许您将一系列参数传递给每个操作系统进程。当您为其他命令/进程提供命令行参数时,您也可以将它们传递到您的 Bash 脚本中。假设您需要将两个整数值传递给脚本。然后,您可以轻松使用 和2 分别访问第一个和第二个参数值。但是,当您使用更多索引参数并且需要实现可选参数(也称为命令行标志或选项)时,事情将变得复杂。
作为这种情况的解决方案,您可以使用内置的 getopts 来使用命名参数。使用以下 shell 脚本,我们可以覆盖一些脚本中的默认值:
#!/bin/bash #Linux迷 www.linuxmi.com title="Linux迷 www.linuxmi.com" message="Hello world!www.linuxmi.com Linux迷" while getopts ":t:m:" option; do echo $option case "${option}" in t) title=${OPTARG} ;; m) message=${OPTARG} ;; esac done zenity --info --title="$title" --text="$message"
默认情况下,上面的脚本显示一个带有默认标题和消息的 GTK 消息框,但是您可以使用命名的命令行参数来覆盖它们,如下所示:
./linuxmi.com.sh -t "hello" ./linuxmi.com.sh -m "world"
getopts 内置支持仅使用单个字母选项。您可以使用 getopt 来使用长形式选项(即–title),如此 gist 所示。
引用传递是一种编程语言特性,它允许您通过内存引用将数据传递到函数中,而不是将整个数据段复制到新变量中。C ++ 程序员总是努力编写性能优先的代码,对于类对象,结构体和字符串,使用引用传递而不是值传递。
如果您使用的是 Bash 4.3 或更新版本,则可以使用名称引用在 shell 脚本中实现引用传递。以下是一个简单的示例代码片段,通过函数更改字符串变量:
#!/bin/bash #Linux迷 www.linuxmi.com function change_str_var() { local str_new="Bash" local -n str_ref=$1 echo "$str_ref -> $str_new" # Python -> Bash str_ref=$str_new } str="Python" change_str_var str echo $str # Bash
上述 change_str_var 函数使用 local 命令创建一个局部的 str_ref 引用,引用全局的 str 变量。然后,它通过覆盖旧字符串值来分配一个新的字符串值。
一些程序员在函数内部使用 echo 命令,并通过命令替换特性调用特定函数以从 Bash 函数返回值(因为原生 Bash return 关键字仅支持返回有效的退出代码)。这会生成另一个子 shell 并消耗更多资源。因此,现在程序员可以使用引用传递并编写性能优先的Bash函数返回,如果他们使用新的 Bash 版本。
Bash 被称为一种无类型命令语言。换句话说,它通常将变量数据处理为字符串,但根据上下文(例如在算术扩展中)进行相应处理。另一方面,Bash 也允许程序员使用类型属性,并提供两种内置的数组类型。即使有了这些功能,我们也不能将 Bash 视为纯动态类型语言,但这些变量属性将Bash置于无类型和动态类型语言之间。
Bash 支持使用整数变量属性将特定变量标记为整数。一旦创建了一个整数变量,当您分配非整数值时,Bash 会发出警告,如下所示:
Bash 还允许使用 declare -r 命令创建常量。每当您的脚本尝试更改常量时,Bash 会在屏幕上打印错误消息。此外,正如我们之前使用的那样,您可以使用 declare 内置函数创建数组。
Bash 还允许您为变量添加一些修饰符属性。例如,您可以创建仅包含小写字母或大写字母的字符串,如下所示:
declare -l lc_str="Hello World" declare -u uc_str uc_str="Hello" uc_str="World" echo $lc_str # hello world echo $uc_str # WORLD
使用 Bash 变量属性,您可以编写更少出错、更易读、更现代的 shell 脚本。
相关:Bash 特殊变量(,?,#,@,$$,$*) 见 https://www.linuxmi.com/bash-special-variables.html
如果还有什么疑问与建议,请在评论栏里给我们留言。感谢您的阅读。
以上がLinux におけるパッケージの依存関係を理解するための 1 つの記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。