0Pricing
Linux Command Line & Bash Scripting Mastery · レッスン

スクリプトのベストプラクティスとLint

コーディング規約やコメントの書き方、「ShellCheck」などのツールを学び、クリーンで読みやすく、エラーのないBashスクリプトを書きます。

「スクリプトのベストプラクティスとLint」はCoddyKit上の無料Linux Command Line & Bash Scripting Masteryレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLinux Command Line & Bash Scripting Mastery学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Linux Command Line & Bash Scripting Masteryコースには全4レッスンが含まれています。

スクリプトのベストプラクティスが必要な理由

Bash スクリプトは強力ですが、よい習慣がなければ、理解や保守、デバッグが難しくなります。

ベストプラクティスとは、簡潔で堅牢かつ読みやすいコードを書くための指針です。これにより、スクリプトは次のようになります。

  • 読みやすい: 自分にとっても他の人にとっても理解しやすくなります。
  • 保守しやすい: 更新や修正が簡単になります。
  • エラーが起きにくい: よくあるミスを防げます。
  • 共同作業に適している: コードの見た目や動作の規則を統一できます。

わかりやすさのためのコメント

コメントは、コードが何をするかだけでなく、なぜその処理をするのかを説明するために重要です。将来の自分や他の開発者に向けたメモとして機能します。

コメントは次の用途に使います。

  • スクリプト全体の目的を先頭に記述する。
  • 複雑なロジックや扱いが難しい部分を説明する。
  • 関数の目的、引数、戻り値を記録する。

#(ハッシュ)記号でコメントを始めます。

#!/bin/bash
# This script demonstrates commenting best practices.
# Author: CoddyKit
# Date: 2023-10-27

# Function: greet_user
# Description: Prints a greeting message to the console.
# Arguments:
#   $1 - The name of the user to greet.
greet_user() {
  local name="$1" # Store the first argument in a local variable.
  echo "Hello, ${name}!" # Output the greeting message.
}

# Main script execution starts here.
echo "Script execution started."
greet_user "CoddyKit Learner" # Call the function with a specific name.
echo "Script execution finished."

明確な命名規則

意味のある名前を付けると、スクリプトを追いやすくなります。一般的なループカウンター(i や j など)を除き、1 文字だけの変数名は避けてください。

一般的な規則は次のとおりです。

  • 変数: 説明的な名前を使います(例: user_name、log_file)。環境変数やグローバル定数には UPPERCASE を使い、スクリプト内のローカル変数には lowercase_with_underscores を使います。
  • 関数: lowercase_with_underscores を使い、動詞で始めることが多いです(例: process_data、check_status)。
  • スクリプト: lowercase_with_hyphens を使います(例: backup-script.sh)。

一貫した書式とインデント

インデントや空白などの書式を統一すると、読みやすさが大幅に向上します。段落の字下げが統一されていない本を読むところを想像してみてください。

重要なポイントは次のとおりです。

  • インデントには 2 個または 4 個のスペースを使います(タブは避けることが多いです)。
  • 行を短く保ちます(ターミナルでは 80 文字以内が目安です)。
  • 空行を使って、コードの論理的なまとまりを分けます。
  • 関連する要素は、適切な場合に揃えます。

具体的なスタイルよりも、一貫性を保つことのほうが重要です。

堅牢性: 'set -u'(nounset)

set -u(または set -o nounset)オプションは、タイプミスや意図せず設定されていない変数が原因のバグを防ぐのに役立ちます。スクリプトが値を代入されていない変数を使おうとすると、set -u はエラーを出してスクリプトを直ちに終了させます。

これにより、エラーを早期に検出し、スクリプトの後半で予期しない動作が起こるのを防げます。

以下のコードを実行してみましょう。UNSET_NAME が定義されていないため、早い段階で終了するようになっています。

#!/bin/bash
# Demonstrating 'set -u' (nounset)

set -u # Exit if an unset variable is used

MY_GREETING="Hello"
echo "${MY_GREETING}, CoddyKit!"

# This variable is NOT set. With 'set -u', the script will exit here.
echo "Your name is: ${UNSET_NAME}" 

echo "This line will NOT be reached if 'set -u' is active and UNSET_NAME is indeed unset."

堅牢性: 'set -o pipefail'

コマンドをパイプでつなぐ場合(例: cmd1 | cmd2 | cmd3)、Bash は通常、パイプ内の最後のコマンドの終了ステータスだけを報告します。つまり、cmd1 が失敗しても、cmd2 と cmd3 が成功すれば、パイプ全体が成功したと報告される可能性があります。

set -o pipefail を使うと、この動作が変わります。パイプ内のいずれかのコマンドが失敗した場合(ゼロ以外の終了ステータスを返した場合)、パイプ全体の終了ステータスも、そのゼロ以外のステータスになります。

これにより、途中のコマンドが失敗したことをすぐに把握でき、パイプラインの信頼性が高まります。

#!/bin/bash
# Demonstrating 'set -o pipefail'

set -o pipefail # Ensures pipe's exit status is the last non-zero command

echo "Running a failing command in a pipe:"
echo "---"

# 'false' command always fails (exit status 1).
# 'cat /dev/null' always succeeds (exit status 0).
# With 'set -o pipefail', the pipe's overall exit status will be 1 from 'false'.
false | cat /dev/null

# This line will only be reached if the pipe above succeeds.
echo "---"
echo "Script finished successfully (this line won't show if pipe failed with set -o pipefail)."

ShellCheck の紹介

ベストプラクティスに従っていても、小さな構文エラーやよくある落とし穴を見落とすことは簡単です。そこで役立つのが ShellCheck です。

ShellCheck は、シェルスクリプト用の静的解析ツール(「リンター」)です。スクリプトを読み取り、次のような問題を指摘します。

  • 構文エラー。
  • 初心者によくあるミス。
  • 見つけにくい意味上の問題。
  • 異なるシェル間での移植性の問題。

詳しい説明へのリンクとともに、役立つ提案を示してくれることもあります。

ShellCheck の動作を確認する: 悪いスクリプト

よくある問題をいくつか含むスクリプトを見てみましょう。これらはスクリプトをすぐにクラッシュさせるとは限りませんが、悪い習慣や潜在的なバグにつながります。

bad_script.sh という名前で次のスクリプトを保存したとします。これに対して ShellCheck を実行するには、shellcheck bad_script.sh と入力します。

ShellCheck を実行する前に、問題を見つけられるか確認してみましょう。

#!/bin/bash
# A script with some common issues

MY_NAME=coddykit # Variable assignment needs no space, but quoting is good for values
echo "Hello $MY_NAME!" # Missing quotes around variable expansion

if [ $1 = "admin" ]; then # Missing quotes around $1
  echo "Welcome, administrator."
fi

# A simple loop with potential issues
for file in *.txt; do # Unquoted glob could expand to multiple arguments
  echo File: $file # Missing quotes around $file
done

ShellCheckの警告を修正する

ShellCheckは、次のような出力を表示します。SC2086: Double quotes missing around "$MY_NAME"。多くの場合、詳細を確認できる特定のコード(SC2086など)も示されます。

以下は、ShellCheckの推奨事項と一般的なベストプラクティスに従って修正した、先ほどのスクリプトです。

単語分割やグロブ展開を防ぐため、変数展開やコマンド置換を二重引用符""で囲んでいる点に注目してください。これらはバグのよくある原因です。

#!/bin/bash
# A script with issues fixed by ShellCheck

MY_NAME="CoddyKit" # Quote variable assignment values
echo "Hello ${MY_NAME}!" # Always quote variable expansions

if [ "$1" = "admin" ]; then # Quote positional parameters like $1
  echo "Welcome, administrator."
fi

# A simple loop with corrected quoting
for file in *.txt; do 
  echo "File: ${file}" # Quote variable expansions, especially in loops
done

ベストプラクティスの確認

Bashスクリプトを作成する際に、よいプラクティスとされるものは次のうちどれですか?

振り返り:プロフェッショナルなスクリプト作成

おめでとうございます。Bashスクリプトを、動くだけのものからプロフェッショナルなものへと改善する方法を学びました。

次の内容を扱いました。

  • 読みやすさと保守性を高めるベストプラクティスの重要性
  • 明確さを高めるためのコメントと命名規則の使用
  • set -uとset -o pipefailによる堅牢なスクリプトの作成
  • 問題を自動的に見つけ、コードを改善するShellCheckの威力

これらの原則を適用すれば、より信頼性が高く、理解しやすく、共同作業にも適したBashスクリプトを書けるようになります。練習を続けてください。

よくある質問

「スクリプトのベストプラクティスとLint」レッスンは無料ですか?

はい。「スクリプトのベストプラクティスとLint」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Linux Command Line & Bash Scripting Masteryコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Linux Command Line & Bash Scripting Masteryコースには全4レッスンが含まれています。

「スクリプトのベストプラクティスとLint」で何を学びますか?

コーディング規約やコメントの書き方、「ShellCheck」などのツールを学び、クリーンで読みやすく、エラーのないBashスクリプトを書きます。 ブラウザで直接実行するハンズオンコードでLinux Command Line & Bash Scripting Masteryを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Linux Command Line & Bash Scripting Masteryを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLinux Command Line & Bash Scripting Masteryは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「スクリプトのベストプラクティスとLint」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLinux Command Line & Bash Scripting Masteryレッスンでコードを書いて実行できますか?

はい。すべてのLinux Command Line & Bash Scripting Masteryレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Bashスクリプトのデバッグ(set -x、trap)
  2. エラー処理と終了ステータス
  3. スクリプトのベストプラクティスとLint
  4. BatsによるBashスクリプトのテスト
← Linux Command Line & Bash Scripting Masteryに戻る