Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Linuxシェル・Bashスクリプト作成に役立つ実践ヒント集

Linuxでシェルスクリプトを書く際に覚えておきたい、実用的なヒントをご紹介します。

シェルスクリプトは、Linux(MacOSや、WSL(Windows Subsystem for Linux)環境のWindowsでも)におけるワークフロー自動化に活躍する万能な手法です。しかし、シェルスクリプトの構文や挙動には独特の癖がある一方で、スクリプトをシンプルにするための便利なショートカットも数多く存在します。

Bashスクリプティングのヒント

ここで紹介するヒントは、インターネット上で収集したものに、筆者自身の経験から得た知見を加えてまとめたものです。

Bashスクリプトはエラーが起きても実行が続いてしまう!

この仕様は、特にユーザー入力を受け付けたりファイルを操作したりする場合に問題を引き起こしかねません。この挙動を防ぐには、次のsetコマンドをスクリプトの先頭に追加しましょう。

set -eu

-eはエラー発生時にスクリプトを終了させるオプション、-uは未定義の変数が参照された時点で終了させるオプションです。

必ずshebang(シバン)を1行目に書く

スクリプトの1行目には、必ずshebangを含めましょう。

#!/bin/sh

shebangは、システムに対して「どのシェルでこのスクリプトを解釈すべきか」を伝える重要な宣言です。Bash向けに書いたスクリプトでも、Zshなど別のシェルで実行すると挙動が変わる可能性があります。shebangを明示しておけば、意図したシェルで確実に解釈されるため、互換性の面でも安心です。

スクリプトの中でsudoを使わない

スクリプト内でsudoを使うと、実行方法が曖昧になり、パイプやリダイレクトを組み合わせたときに予期しない問題が起こることがあります。セキュリティ上のリスクにもなるため避けるべきです。スクリプトにroot権限が必要な場合は、スクリプト全体をrootとして実行するか、sudo経由で起動する設計にしましょう。

root/sudo権限で実行されているかスクリプト内でチェックする

次のコードをスクリプトの冒頭に追加すれば、root/sudo権限で実行されているかを事前に確認できます。これにより、root権限が必要なコマンドを実行しようとして失敗する前に、スクリプトの開始時点で処理を中断できます。

# root権限で実行されているか確認
if (( EUID != 0 )); then
    printf "Please run as root\n"
    exit 1
fi

aptコマンドには-yを付けてプロンプトをスキップ

aptコマンドの末尾に-yを付けると、インストール確認のプロンプトが表示されなくなり、ユーザー入力なしでスクリプトを完走できるようになります。

sudo apt install nano -y

または

sudo apt upgrade -y

パスは必ずダブルクォートで囲む!!!

Bashスクリプトでは、パスを必ずクォートで囲むようにしましょう。スペースを含むパスや特殊文字の扱いで起こりがちなトラブルを防げる、非常に重要な基本テクニックです。

カレントワーキングディレクトリへの対応も忘れずに

スクリプト自身の場所を基準にファイルを扱う場合は、次のようにdirnameコマンドでスクリプトのディレクトリを取得しておくと安心です。

CURR_DIR="$(dirname "$0")"
printf -- 'moving application to /opt/app.jar\n'
mv "${CURR_DIR}/application.jar" /opt/app.jar

ユーザー入力にはデフォルト値を設定する

ユーザーに入力を促すときは、次のように書くことでデフォルト値を設定できます。

echo "Enter a value"
read val
val=${val:-"Default Value"}

readで読み込んだ後に変数valが空だった場合、自動的にデフォルト値が代入されます。

コメントをたくさん残す

コメントは未来の自分のためにつけるものです。「何をしているのか」「なぜそうしているのか」を丁寧に説明しておきましょう。コードの意図を明確にすることはロジックの妥当性を確認する良い機会になり、デバッグの助けにもなります。コメントが充実していれば、時間が経ってからコードを見返したときもすぐに内容を理解できます。

出力、出力、とにかく出力する

できるだけ多くの情報をコンソールに出力しましょう。スクリプトがクラッシュしたとき、「どこで」クラッシュしたのかを特定できれば原因の切り分けが格段に楽になります。Bashスクリプトはデフォルトでは必ずしも詳細なログを出さないため、printfやechoで進行状況を意識的に出力するのがおすすめです。

適切な終了ステータスを返す

スクリプトがエラーに遭遇したら、適切な終了コード(exit status)を返して終了するようにしましょう。そうすることで、そのスクリプトを呼び出す他のスクリプトが結果を受けて適切に対応できるようになります。

  1. Windows 10にBash(Linuxシェル)をインストールして使う方法【WSL完全ガイド】

    Windows上でLinuxシェルをセットアップして使う方法を、Windows Subsystem for Linux(WSL)を使って解説します。 このチュートリアルは、2020年以降にリリースされた最新版のWindows 10を対象としています。古いバージョンのWindows 10でのWSLの使い方や、Windows 8/7/XP向けの別の方法については扱いません。サポートが終了したソフトウェアの使用は避けるべきだからです。どうしてもWindowsを使わなければならない場合は、必ずセキュリティ更新プログラムが提供されているバージョンを使用してください。 WSLは非常に優れたツールで、まるで

  2. 実用的な5つの例で学ぶBashスクリプト入門チュートリアル

    Unix SedやUnix Awkシリーズと同様に、本シリーズではBashスクリプティングに関する記事を複数回にわたって公開します。実用的なサンプルを交えながら、Bashスクリプティングのテクニックを幅広く解説していきます。 シェルとは、ユーザーが入力したコマンドを解釈して実行するプログラムです。コマンドはユーザーが直接入力するか、「シェルスクリプト」と呼ばれるファイルから読み込まれます。 ユーザーからの入力を直接読み取る場合、そのシェルは対話型(インタラクティブ)シェルと呼ばれます。 一方、ファイルからコマンドを読み込んで実行する場合は非対話型(ノンインタラクティブ)シェルと呼ばれます。この