Shell脚本の8つの信頼できる提案(コレクションに値する)


この8つの提案は,キーパーが数年間にわたりshellシナリオを作成するためのいくつかの経験と教訓から来ている。実際に書き始めたのはこの数本だけではなく、後に何度も考えて、何本かの無痛痒みを取り除いて、最後に8本が残ります。大袈裟に言っても、どれも厳選されています。いくつかの点がありますが、ありふれた話です。
1.指定bash
shellシナリオの最初の行は、菗!この後は何ですか?この質問を他人に聞けば、人によって答えが違ってくるかもしれません。
私は/usr/bin/env bashを見たことがあります。/bin/bashも見ました。また/usr/bin/shもあります。これはプログラミング業界の「ウイキョウ」の4つの書き方です。
多くの場合、上記の5つの書き方はすべて等価です。しかし、プログラムを書いた人はみんな知っています。「少数の場合」には思いがけない穴が隠れています。
もしシステムのデフォルトshellがbashではないならどうすればいいですか?たとえば、あるLinuxの発行版のあるバージョンは、デフォルトのshはbashではない。
もしシステムのbashが/usr/bin/bashでなければどうすればいいですか?
私は/usr/bin/env bashと/bin/bashをオススメします。前者はenvを通して中間層を追加して、envに$PATHの中でbashを検索させます。後者は公式裏書きで、決められたbashの位置を指しています。/usr/bin/bashはシンボルリンクの一つを指しています。
2.set-eとset-x
OKです。討論を経て、第一行が決まりました。次は二行目を書くべきですよね?
ちょっと待ってくださいあなたがアイデアを作り、具体的なコードロジックを書く前に、まずラインset-eとラインset-xを挿入します。
set-xは、行ごとにshellスクリプトを実行するとき、実行内容を出力します。これは現在実行されている状況を見せることができます。中に含まれる変数も実際の値に置き換えられます。
set-eはエラー実行時にプログラムを終了します。他の言語の「異常投げ」と同じです。正確に言えば、すべてのエラーが発生した場合はプログラムを終了します。下記の注を参照してください。
注:set-e終了プログラムの条件は複雑です。まんがバッシュの中で、いろいろな場面を一段の話で説明しました。ほとんどの実行はエラー時に終了します。シェルコマンドが以下の場合を除きます。
pipelineの非終端部分、例えばerror|ok
結合文の非終端部分、たとえばok&error𞓜other
一連の語句の非終端部分、例えばerror;OK。
判定文には、test、if、whileなどが含まれています。
この二つを組み合わせて使うと、デバッグの時にたくさんの時間を節約できます。防御プログラミングを考えると、最初の行の具体的なコードを書く前に挿入する必要があります。胸に手を当てて、コードを書く時一回で正しい回数を書くことができますか?ほとんどのコードは、提出前に繰り返しデバッグ修正を経験しています。この二つの構成を導入したのは、焦りの中で、最初からdebugに余裕を残しておいたほうがいいです。コードをやっと提出した後、保留するかどうかを考えても遅くないです。
3.shellcheckを持つ
はい、今はもう三行コードがあります。具体的な業務ロジックは一行も書いていません。書き始めるべきですか?
ちょっと待ってください仕事をよくしようとするなら,まず道具を研がなければならない.今回は、シェル脚本の神器を紹介します。
恥ずかしいですが、何年かshellのシナリオを書いていますが、文法の中にはまだよく覚えていません。この時はshellcheckを頼りに指摘します。shellcheckは文法の問題を注意する以外に、shellシナリオの作成によくあるbad codeもチェックできます。本来、私のN条の提案の中にはこれらのbad codeに関するものがいくつかありますが、shellcheckはこれらの問題を完全に発見できると考えて、痛みに耐えてそれらを全部取り除いてしまいました。もちろん、shellcheckを使って私のshell編纂技能に大きな飛躍をもたらしました。
いわゆる“巨人の肩に立ちます”、私達のこれらの新兵の卵、技能は老兵達に及ばないが、しかし私達は装備の上で相手に追いつくことができます!手を動かしてインストールして、1つの循環的な勧誘の“先生”を知り合いになることができて、何が楽しいですか?
ちなみにshellcheckはハスキーで書いています。ハスカルは詰め物にしか使えないと誰が言いましたか?
4.変数展開
shell脚本では、echo$xxx awk/sed/grep/cut…というやり方がたまに見られます。大きな状況のように見えますが、変数の値を変更したいだけです。鶏を殺すのになぜ牛の刀を使う必要があるか?bash内に建てられた変数展開メカニズムは、あなたの様々なニーズに十分満足しています。まだ古い方法です。read the f*k manaul!man bashは次にParameeter Expansionを検索します。次はあなたが望むテクニックです。
5.localに注意する
コードが多く書けば書くほど、繰り返した論理を関数に抽出し始めます。バックの穴に落ちるかもしれません。bashでは、local限定語を使わないと変数のデフォルトは大局的です。変数のデフォルトグローバル――これはjsとluaと似ています。しかし比較的に少ないです。最初からこの事実を教えてあげます。トップレベルのスコープでは、グローバル変数かどうかは重要ではない。しかし、関数では、グローバル変数が他の作用領域に汚染される可能性があると宣言しています。したがって、関数内で宣言する変数には必ずlocal限定語を付けてください。
6.trop信号
ちょっと複雑なことを書いていたら、バックグラウンドで実行しているプログラムは、posix規格の中の「信号」とは何かを知っているはずです。知らなかったら、直接に次の部分を見てください。他の言語のように、shellも信号処理をサポートします。trap sighandler INTはSIGINTを受信したときにsighandler関数を呼び出すことができます。他の信号を捕捉する方式はこれに類推する。
しかし、tropの主なアプリケーションシーンは、どの信号をキャプチャするものではない。trapコマンドは、「キャプチャ」の多くの異なる流れをサポートします。正確には、ユーザが特定のフローに関数を注入することができます。その中で一番よく使われているのは、trop func EXITとtrop func ERRです。
trop func EXITはスクリプト終了時に関数を呼び出すことができます。正常に終了しても、例外的に終了しても、登録された関数は呼び出されます。クリーン関数が必要なシーンでは、単にスクリプトの最後にクリーン関数を呼び出すのではなく、クリーン関数を登録します。
trop func ERRは、運転エラー時に関数を呼び出すことができます。一般的な技法は、グローバル変数ERRORを使用してエラー情報を保存し、登録した関数の中で記憶した値に基づいて対応するエラーレポートを作成することである。もともと四分五裂していたエラー処理ロジックを一箇所に集中すると、奇効が起こることがあります。ただし、プログラムが異常終了すると、EXIT登録の関数を呼び出したり、ERR登録の関数を呼び出したりします。
7.よく考えてから行います
以上のいくつかは具体的な提案で、残りの2つは比較的に虚をつく。
この提案の名前は「三思行」です。どんなコードを書いても、補助台本だけでも、慎重に考え、油断しないでください。いいえ、台本を書く時はもっと覚えてください。多くの場合、複雑なシナリオは数行の小さな命令に端を発します。この脚本を書き始めた人は、一過性の仕事だと思っているかもしれません。コードの中には外部の条件についての仮説があります。当時は正常だったかもしれませんが、外部環境の変化に伴って、これらは隠れた暗礁になりました。泣き面に蜂なのは、台本のテストをする人はほとんどいません。それを実行しない限り、正常に使えるかどうかは分かりません。
スクリプトコードの腐敗速度を遅くするには、どのような依存性が変わるのか、スクリプトの正常な動作に欠かせないかを書く必要があります。適切な抽象が必要で、変更可能なコードを作成する。同時に防御性のプログラミングの意識があって、自分のコードに1本の堀を与えます。
8.揚揚と短所を避ける
場合によっては、shellを使ってシナリオを書くと、移植が困難で、統一的にエラー処理を行いにくく、データをスムーズに処理することが困難であることを意味します。
外部のコマンドを使用すると、様々な複雑な機能が迅速に実現できますが、コインの裏面としては、grep、sed、awkなどの様々なツールによって、それらを接着しなければなりません。
マルチプラットフォーム対応の需要がある場合は、BSDやGNU coreutils、bashバージョンの違いなどの奇異な落とし穴にも注意が必要です。
完璧なデータ構造と一致したAPIがないため、shellスクリプトは複雑な論理を処理する上で力不足です。
特定の問題を解決するには適切なツールを使うべきです。いつshellを使うかを知っています。いつからもっと一般的なスクリプト言語に切り替えますか?通常のコマンドを組み合わせて作業を行うことができますし、簡単なデータだけが含まれている場合は、shellシナリオが適切なハンマーです。あなたのタスクが複雑な論理を含み、データ構造が複雑であれば、ルビー/pythonなどの言語でスクリプトを作成する必要があります。
以上は小编が皆さんに绍介したShell脚本の8つの信頼できる提案(コレクションに値する)です。皆さんのために役に立つことを望んでいます。ここでも私たちのサイトを応援してくれてありがとうございます。