シェルスクリプト

HOME > シェルスクリプト

シェルスクリプト:記事リスト

シェルスクリプトのカテゴリーには以下の記事がリストされています。

シェルスクリプトのリトライ設計|指数バックオフと回数制限でコマンド再実行を安定させる方法

「APIへのリクエストが一時的なネットワーク障害で失敗してバッチ処理全体が止まった」「データベース接続の取得でタイムアウトが出るたびにcronジョブが終了し、翌朝データが欠損している」

シェルスクリプトで外部リソース(API・データベース・ファイルシステム)を扱う場合、一時的なエラーが起きることは避けられません。そういった「一時的な失敗」に対して、単純に set -e でスクリプトを止めるのではなく、リトライ(再実行)で自動回復させる設計が実務では重要です。

この記事では、シェルスクリプトでのリトライ設計の基本から、指数バックオフ・ジッター・タイムアウトとの組み合わせまで、RHEL 9.4(bash 5.1)で動作確認した実践的なパターンを解説します。

この記事のポイント

・固定間隔リトライより指数バックオフで、サーバーへの集中アクセスを避けられる
・retry関数として実装することで、どのコマンドにもリトライを適用できる
・ジッターを加えると並行実行時の「連鎖障害」を防げる
・timeoutと組み合わせると、1回のリトライに上限時間を設けられる

続きを読む "シェルスクリプトのリトライ設計|指数バックオフと回数制限でコマンド再実行を安定させる方法"

bashのexecとファイルディスクリプタ操作|スクリプト全体のログをリダイレクトする設計

「シェルスクリプトのすべての出力をログに残したいのに、毎行に >> logfile を書き足すのは手間だ。しかも書き忘れた行の出力がどこへ行ったのかわからなくなる」

cronジョブやバッチ処理を設計したことがある人なら、一度は感じたことがある悩みです。

bash には、スクリプト起動直後にたった2行書くだけで、スクリプト全体のstdout(標準出力)とstderr(標準エラー出力)をまとめてログファイルにリダイレクトできる仕組みがあります。それが、bashの組み込みコマンド exec によるファイルディスクリプタ(FD)操作です。

この記事では、bashのexecを使ったFD操作の基礎から、cronジョブのログ集約・バッチ処理への応用・trapとの組み合わせまで、実務で使える設計パターンを具体的なコード例とともに解説します。

この記事のポイント

・exec 1>>logfile 2>&1 でスクリプト全体の出力を一括ログ保存できる
・exec はbashの組み込みコマンドであり、docker exec とは別ツール
・exec 3>&1 でFDを複製しておけば、途中でstdoutを元に戻せる
・trap EXIT と組み合わせてFDを確実に閉じる設計が現場の定石

続きを読む "bashのexecとファイルディスクリプタ操作|スクリプト全体のログをリダイレクトする設計"

bashのサブシェルと変数スコープの罠|()と{}の違い・パイプ先で変数が消える問題の対処

「whileループの中でカウンタを増やしているのに、ループを出たら0に戻っている」
「パイプで繋いだコマンドの中で変数に代入したのに、後で参照したら空だった」

シェルスクリプトを書き始めると、必ずといっていいほどこの罠にハマります。原因はbashの「サブシェル」の仕様です。パイプや()でくくったコマンドは、現在のシェルとは別のプロセス(サブシェル)として実行されるため、変数への変更が親シェルには伝わりません。

この記事では、サブシェルの正体(何が起きているのか)から、(){}の違い、パイプ後の変数消失の回避策(process substitution・lastpipe・一時ファイル)まで、実際のコードで解説します。RHEL 9 / bash 5系で動作確認済みです。

この記事のポイント

・パイプ(|)の右辺はサブシェルで動き変数変更が親に戻らない
・()はサブシェル生成、{}はカレントシェル実行で動作が全く異なる
・解決策は < <(...) のprocess substitutionが最もスマート
・bash 4.2以降はshopt -s lastpipeでパイプのまま対処できる

続きを読む "bashのサブシェルと変数スコープの罠|()と{}の違い・パイプ先で変数が消える問題の対処"

シェルスクリプトのエラー通知設計|mailx・sendmail・Webhookで障害をすぐ知らせる仕組みの作り方

「夜中の2時に実行されているcronのバックアップスクリプトが失敗していた。気づいたのは翌朝9時。すでに24時間分のバックアップが取れていない状態で業務が始まっていた」

これは特別なケースではなく、自動化が進んだサーバー運用現場では日常的に起きる「静かな失敗」の典型例です。cronで実行されるスクリプトがエラーで終了しても、誰かがログを確認しに行かない限り誰も気づきません。

この記事では、シェルスクリプト エラー通知の設計手法として、mailxによるメール送信・sendmailによるMTA直接利用・Slack Webhookによるリアルタイム通知の3方式を、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認した実行例とともに解説します。trapコマンドと組み合わせた自動通知テンプレートも紹介するので、既存のcronスクリプトにすぐ組み込めます。

この記事のポイント

・シェルスクリプト エラー通知の最短実装は「echo 本文 | mailx -s 件名 宛先」の1行
・trap ERR でエラーを自動検知し、通知関数を呼び出すのが実務の基本設計
・Slack Webhook は curl 1コマンドで送れ、メールより即時性が高い
・sendmail はメールヘッダを自由に制御でき、From アドレスを明示したい場合に使う

続きを読む "シェルスクリプトのエラー通知設計|mailx・sendmail・Webhookで障害をすぐ知らせる仕組みの作り方"

自作シェルスクリプトをsystemdサービス化して常駐運用する方法|Unitファイル作成・Restart設定・ログ確認

「シェルスクリプトを書いたのに、サーバーを再起動するたびに手動で起動し直すのが面倒だ」
「スクリプトが落ちたとき、自動で再起動させたい」

定期実行ならcronで済みますが、「常に動かし続けたい」用途にはcronは向いていません。そこで登場するのが、systemdのServiceユニットです。Serviceとして登録することで、OS起動時の自動起動・異常終了時の自動復旧・journaldによるログの一元管理が実現します。

この記事では、自作シェルスクリプトをsystemdサービスとして常駐運用する手順を解説します。Unitファイルの基本構造、ExecStartPre/ExecStartPost、Restart設定、journalctlによるログ確認、よくあるエラーと対処法、そしてバックアップスクリプトのサービス化まで、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認した手順をお伝えします。

この記事のポイント

・.serviceファイルはUnit/Service/Installの3セクションで構成する
・ExecStartには必ず絶対パスを指定する(相対パスはNG)
・Restart=on-failure + RestartSec=10 で自動復旧を設計できる
・journalctl -u サービス名 -f でリアルタイムログを確認できる

続きを読む "自作シェルスクリプトをsystemdサービス化して常駐運用する方法|Unitファイル作成・Restart設定・ログ確認"

bashのPIPESTATUSとset -o pipefailでパイプラインの失敗を検知する方法|パイプ途中のエラーを見逃さない設計

「バックアップスクリプトが正常終了しているのに、バックアップファイルの中身が壊れていた」
「ログ集計コマンドでパイプ途中にエラーが出ていたのに、スクリプトは終了コード0を返していた」

こういったトラブルの多くは、bashのパイプラインが持つデフォルト動作に起因しています。bashは標準設定では パイプラインの最後のコマンドの終了コードだけを参照します。途中のコマンドが失敗していても、スクリプトはそのまま次の処理に進んでしまいます。

この記事では、bashの組み込み変数 $PIPESTATUSset -o pipefail を使って、パイプライン途中の失敗を確実に検知する方法を解説します。RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した実行例とともに、バックアップスクリプト・ログ処理パイプラインへの実践的な適用方法まで網羅します。

この記事のポイント

・set -o pipefail を設定するとパイプ途中の失敗でパイプライン全体が非ゼロを返す
・$PIPESTATUS 配列で各コマンドの終了コードを個別に参照できる
・$PIPESTATUS はすぐに上書きされるため、実行直後に別変数にコピーするのが定石
・set -e・set -u・set -o pipefail の3つを組み合わせると堅牢なエラー検知になる

続きを読む "bashのPIPESTATUSとset -o pipefailでパイプラインの失敗を検知する方法|パイプ途中のエラーを見逃さない設計"

シェルスクリプトのセキュリティ設計|クォート徹底・コマンドインジェクション対策・evalを避ける書き方

「シェルスクリプトにユーザーの入力をそのまま渡したら、意図しないコマンドが実行されてしまった」
「ファイル名にスペースが入っていただけで、バックアップ処理が途中で壊れた」

シェルスクリプトの脆弱性は、難解な暗号理論や複雑なプロトコル知識とは無縁のところで生まれる。クォートの省略、外部入力の無検証使用、eval の安易な利用——いずれも「ちょっとした書き方の癖」が招く問題だ。

この記事では、シェルスクリプトのセキュリティ設計の基本を具体的に解説する。RHEL 9.4 / Ubuntu 24.04 LTS の bash 5.x 環境で動作確認した実例をもとに、クォートの徹底からコマンドインジェクション対策、eval を避ける書き方、set -u・mktemp・IFS リセットまでを体系的にカバーする。

この記事のポイント

・変数は必ずダブルクォートで囲む("$var" が安全な基本形)
・外部入力はバリデーション後にコマンドへ渡す(インジェクション対策の核心)
・eval は使わない。配列・declare・case 文で安全に代替できる
・set -u・IFSリセット・mktemp でスクリプト全体を堅牢化する

続きを読む "シェルスクリプトのセキュリティ設計|クォート徹底・コマンドインジェクション対策・evalを避ける書き方"

#!/bin/shと#!/bin/bashの違いとPOSIX互換スクリプトの書き方|dash環境で壊れないための移植性設計

「#!/bin/sh で書いたシェルスクリプトが、Ubuntu でだけ動かない。」
RHEL では問題なく動いていたのに、Ubuntu に持っていったとたん構文エラーが出る。この現象で困ったことはないでしょうか。

原因のほとんどは、シェバン行(shebang)の意味を正確に理解していないことにあります。#!/bin/sh はすべての環境で bash を呼び出すわけではありません。Ubuntu では /bin/shdash(軽量POSIXシェル)に向いているため、bash 固有の構文(bashism)を含むスクリプトが即座に壊れます。

この記事では、#!/bin/sh#!/bin/bash の本質的な違いから、Ubuntu の dash 環境で壊れる典型パターン、POSIX準拠の書き方、そして checkbashisms コマンドによる自動検出まで、sh bash 違い posix の観点から移植性の高いスクリプト設計を体系的に解説します。
動作確認環境: Ubuntu 24.04 LTS(dash 0.5.12)/ RHEL 9.4(bash 5.1.8)

この記事のポイント

・#!/bin/sh は OS 標準シェルを使う指定。Ubuntu では dash、RHEL では bash が実行される
・bash 固有構文(bashism)を使うと Ubuntu の dash で構文エラーになる
・POSIX準拠で書けば sh/bash どちらの環境でもそのまま動く移植性になる
・checkbashisms コマンドで bashism を事前に自動検出できる

続きを読む "#!/bin/shと#!/bin/bashの違いとPOSIX互換スクリプトの書き方|dash環境で壊れないための移植性設計"

readとselectで対話式シェルスクリプトを作る方法|確認プロンプト・メニュー選択・入力検証の設計

「削除してしまってから気づいた。確認を挟めばよかった」
バックアップスクリプトや設定変更スクリプトを書いていると、ひとつのミスで取り返しのつかない操作を実行してしまうことがある。

この記事では、bash組み込みコマンドの readselect を使った対話式シェルスクリプトの作り方を解説する。確認プロンプト・番号付きメニュー選択・入力検証のパターンを、実際のスクリプトとともに紹介する。

なお expect コマンドは「スクリプトが受け取るプロンプトへ自動で答える」ツールであるのに対し、read/select は「人間の判断をスクリプトに組み込む」用途に使う。棲み分けを押さえておくと迷わない。

この記事のポイント

・read -p でプロンプト付きのユーザー入力を1行で受け取れる
・select でPS3プロンプト付きの番号メニューを簡単に実装できる
・while ループと条件分岐で「正しい入力が来るまで繰り返す」UIが作れる
・入力検証を外出しした関数にすると再利用しやすい

続きを読む "readとselectで対話式シェルスクリプトを作る方法|確認プロンプト・メニュー選択・入力検証の設計"

bats-coreでシェルスクリプトをテストする方法|ユニットテストの書き方とCI自動実行

「シェルスクリプトを書いたあと、テストは毎回手動で実行しているだけになっていませんか。」
少し修正するたびに全パターンを手動で確認するのは、スクリプトが複雑になるほど現実的ではありません。バグを気づかずに本番環境へ持ち込んでしまったり、修正のたびに既存の動作を壊していないか不安になったりすることもあるでしょう。

この記事では、Bash製シェルスクリプト向けテストフレームワーク bats-core を使って、ユニットテストを自動実行する方法を解説します。
インストールから基本的なテストの書き方、前処理・後処理(setup/teardown)、モック関数の定義、GitHub ActionsでのCI設定まで、実際のコードを交えて説明します。

動作確認環境:Ubuntu 24.04 LTS / RHEL 9.4(Rocky Linux 9.4 でも確認済み)

この記事のポイント

・bats-coreはBashスクリプト専用テストフレームワーク
・@testブロックでテストケースを簡潔に定義できる
・setup/teardownで前後処理を各テストから分離できる
・GitHub ActionsでCI自動テストの実行が可能

続きを読む "bats-coreでシェルスクリプトをテストする方法|ユニットテストの書き方とCI自動実行"

シェルスクリプトの設定を外部ファイル化する設計|sourceと.envで環境別に切り替える方法

「本番サーバーのDBにテストデータを流し込んでしまった」「認証情報をGitリポジトリにそのままコミットしてしまった」。こういった事故の原因を辿ると、シェルスクリプトへの設定値の直書きが起点になっていることが多い。
規模が小さいスクリプトならハードコードでも何とかなる。しかし、環境が開発・検証・本番と増え、複数人で管理するようになった瞬間、その設計の甘さが噴き出す。

この記事では、sourceコマンドを使ってシェルスクリプトの設定を外部ファイルに切り出す方法と、環境別(開発・本番)に設定を切り替える実践的な設計を解説する。RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTS で動作確認済みのコード例を交えて紹介する。

この記事のポイント

・source コマンドで外部設定ファイルを読み込み、設定とロジックを分離できる
・APP_ENV 変数で development/production を判定し、設定ファイルを自動切り替えできる
・.env 形式に export を付けた設定管理が現場での実務標準
・必須変数チェックと :=(デフォルト値)で、想定外エラーを未然に防げる

続きを読む "シェルスクリプトの設定を外部ファイル化する設計|sourceと.envで環境別に切り替える方法"

bashのパラメータ展開で文字列処理を完結させる方法|${var%}・${var//}でsed・awkの外部呼び出しを減らす設計

bashのパラメータ展開で文字列処理を完結させる方法|${var%}・${var//}でsed・awkの外部呼び出しを減らす設計

「ファイル名から拡張子だけ取り除きたいのに、毎回sedを書くのが面倒で...」
「ループの中で変数の一部を置換したいだけなのに、awkまで呼び出してしまっている」

こういった状況に覚えがあるなら、bashのパラメータ展開を使いこなすことでスクリプトをシンプルかつ高速にできます。bashには変数の中身を直接操作する組み込みの文字列処理機能が揃っており、外部コマンドを呼ばずにほとんどの変数内文字列操作を完結できます。

この記事では、bashパラメータ展開の基本構文から実践的な設計パターンまでを体系的に解説します。sed・awk・cut・trといった外部コマンドとの使い分けの指針も示します。動作確認環境はbash 5.2.x(RHEL 9.4 / Ubuntu 24.04 LTS)です。

この記事のポイント

・${var%pattern}と${var#pattern}で拡張子・ディレクトリを分離できる
・${var//pattern/replacement}でsed不要の変数内一括置換が可能
・${var^^}/${var,,}でtr不要の大文字・小文字変換ができる
・ループ内の外部コマンド呼び出しを排除しスクリプトを高速化できる

続きを読む "bashのパラメータ展開で文字列処理を完結させる方法|${var%}・${var//}でsed・awkの外部呼び出しを減らす設計"

shellcheckでシェルスクリプトを静的解析する方法|インストールからCI組み込み・頻出警告の直し方まで

「シェルスクリプトをテスト環境で動かしたのに、本番でいきなりエラーが出た」「ファイル名に空白が入っていてコマンドが期待どおり動かない」——こうしたトラブルの多くは、実行する前に shellcheck で発見できた問題だ。

bash や sh のスクリプトには型チェックもコンパイルもない。変数展開のクォート漏れ・バッククォートのネスト・非推奨構文といったバグは、実際に走らせてみるまで気づきにくい。

この記事では、shellcheck 静的解析の実践的な使い方を解説する。インストール方法(apt・dnf・brew・バイナリ)から、SC2086・SC2006・SC2046 など頻出警告の読み方と修正法、Vim・VS Code でのエディタ統合、そして GitHub Actions / GitLab CI への組み込みまでを実際の出力例と合わせて説明する。

動作確認環境: RHEL 9.4 / Rocky Linux 9.4 / Ubuntu 24.04 LTS / shellcheck 0.9.0

この記事のポイント

・shellcheck は実行前に静的解析でバグを検出するコマンドラインツール
・SC2086(クォート不足)・SC2006(バッククォート)が最多の警告パターン
・apt/dnf/brew/バイナリでインストール可能。GitHub Actions なら公式 Action あり
・set -x は実行時デバッグ、shellcheck は実行前の静的検査——役割がまったく異なる

続きを読む "shellcheckでシェルスクリプトを静的解析する方法|インストールからCI組み込み・頻出警告の直し方まで"

bashで関数を定義して再利用する方法|シェルスクリプトのライブラリ化と実践例

「同じ処理を何度もスクリプトに書き直している」「コピペで済ませているが、バグを直すたびに複数のスクリプトを修正するはめになる」

Linuxのシェルスクリプトを書いていると、こうした非効率にぶつかります。解決策は関数(function)です。繰り返し使う処理を関数にまとめておけば、呼び出すだけで済み、修正も1箇所で完結します。

この記事では、bashで関数を定義・呼び出す基本構文から、引数の扱い・戻り値・ローカル変数の使い方、さらに複数スクリプトから再利用できる「ライブラリ化」の手法まで、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認した実践例とともに解説します。

この記事のポイント

・bash の関数は function 名 { } または 名 () { } の2通りで定義できる
・引数は $1 $2 ... で受け取り、return で整数の終了ステータスを返す
・local 宣言でローカル変数にすればグローバル変数との衝突を防げる
・source(.コマンド)でライブラリ化し、複数スクリプトから共有する

続きを読む "bashで関数を定義して再利用する方法|シェルスクリプトのライブラリ化と実践例"

シェルスクリプトでバックアップ自動化を作る実践|cronとログ設計まで

「毎晩バックアップを手動で動かすのは面倒だ」 「cronで自動化したいけど、エラーが出ても気づけない」 そんな悩みを抱えているサーバー管理者は多いはずです。

バックアップの自動化は、シェルスクリプトとcronを組み合わせるだけで実現できます。ただし、動けばOKのスクリプトと、現場で長期間安定稼働するスクリプトには大きな差があります。

この記事では、シェルスクリプトでバックアップ処理を書き、cronで定期実行し、ログに残すところまでを実践的に解説します。RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みのコードを使って、コピーして使えるレベルまで仕上げます。

この記事のポイント

・シェルスクリプトでrsyncを使ったバックアップ処理を安全に書ける
・cronで定期実行するときの環境変数・パスの落とし穴を避けられる
・ログファイルにタイムスタンプ付きで記録し、エラーを判定できる
・バックアップの世代管理(古いファイルの自動削除)を実装できる


シェルスクリプトでバックアップ自動化を作る実践|cronとログ設計まで

続きを読む "シェルスクリプトでバックアップ自動化を作る実践|cronとログ設計まで"

現場で壊れないシェルスクリプト設計|エラー処理とtrapで安定運用する書き方

「バックアップスクリプトが途中で失敗していたのに、ずっと気づかなかった」
「一時ファイルが大量に残ってしまい、ディスクがあふれた」

現場でシェルスクリプトを運用していると、こういった事態に一度は遭遇します。スクリプト自体は「動いている」のに、エラーが発生してもそのまま処理が継続してしまい、気づいたときには手遅れ。こうした問題の根本原因は、エラー処理が考慮されていない設計にあります。

この記事では、シェルスクリプト trap コマンドとエラー処理の組み合わせについて、現場で即使えるパターンを解説します。
「set -e の落とし穴」「trap の正しい使い方」「バックアップスクリプトへの実践的な組み込み方」「エラーログと通知設計」まで、壊れないスクリプト設計の全体像をカバーします。

この記事のポイント

・set -e と set -u でコマンド失敗・未定義変数を即検知できる
・trap でシグナル受信時・スクリプト終了時の後処理を自動実行できる
・一時ファイルの自動削除・エラーログ出力を trap に集約するのが定石
・EXIT シグナルを使えば「正常終了でも異常終了でも後処理」が保証される

続きを読む "現場で壊れないシェルスクリプト設計|エラー処理とtrapで安定運用する書き方"

expectコマンドでLinuxの対話型処理を自動化する方法|パスワード入力・SSHログイン・telnetの自動操作実践例

「パスワードを手動で入力しないとスクリプトが進まない……自動化できないのか?」
ssh-keygen や sudo passwd など、対話的に応答を求めてくるコマンドは、通常のシェルスクリプトでは自動化が難しい。sshpass は使えても、複数の質問に順番に答えるような複雑な対話は手に負えなかったりする。

この記事では、対話型コマンドを自動化するためのツール expect の実践的な使い方を解説する。基本構文から、SSHログイン自動化、パスワード変更スクリプト、タイムアウト処理まで、現場で実際に使えるパターンを紹介する。
動作確認環境: RHEL 9.4 / Ubuntu 24.04 LTS

この記事のポイント

expectspawn(起動)・expect(待機)・send(入力)の3コマンドで構成される
・SSHのパスワード入力やsudo対話を完全無人化できるが、鍵認証の方が安全でシンプル
spawn -noecholog_user 0 でパスワードをターミナルに表示しないよう制御できる
expect_background ではなく exp_continue でループを回すのが実践の定番パターン

続きを読む "expectコマンドでLinuxの対話型処理を自動化する方法|パスワード入力・SSHログイン・telnetの自動操作実践例"

flockコマンドでシェルスクリプトの排他制御を行う方法|二重実行防止とロックファイルの実践例

「cronで定期実行しているスクリプトが、前の処理が終わらないうちに次の実行が始まってしまった」
「複数のサーバーから同じスクリプトを呼び出すと、データが壊れることがある」

こうした問題は、排他制御(ロック)の仕組みを使えば防ぐことができます。Linuxには flock という便利なコマンドがあり、シェルスクリプトに数行追加するだけでスクリプトの二重実行を確実に防げます。

この記事では、flock コマンドの基本的な使い方から、cronとの組み合わせ方、ロックが残り続けるデッドロックの防ぎ方まで、RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した実践的な手順を解説します。

この記事のポイント

・flock コマンドはロックファイルを使ってスクリプトの二重実行を防ぐ
・flock -n でロック失敗時にすぐ終了、-w でタイムアウト付き待機ができる
・cron + flock の組み合わせで定期ジョブの重複実行を防ぐのが定番構成
・スクリプト終了時にロックは自動解放されるためデッドロックになりにくい

続きを読む "flockコマンドでシェルスクリプトの排他制御を行う方法|二重実行防止とロックファイルの実践例"

mkfifoコマンドで名前付きパイプを作成する方法|プロセス間通信とパイプの実践例

「コマンド同士でデータをやりとりしたいけど、パイプだと一方向にしか流せない」「シェルスクリプトで2つのプロセスを協調動作させたいのに、うまくつなぐ方法が分からない」

こういった場面で役立つのが、名前付きパイプ(FIFO)です。通常のパイプ(|)は2つのコマンドを直結するだけですが、名前付きパイプはファイルシステム上にパイプを「実体化」します。異なるシェルや無関係なプロセス同士でも、ファイル名を通じてデータをやりとりできる点が大きな違いです。

この記事では、mkfifoコマンドの使い方を基礎から解説します。名前付きパイプの仕組みと通常のパイプとの違い、実際の作成手順、プロセス間通信への応用例、そしてよくある落とし穴まで、実機での動作確認をまじえて説明します。

この記事のポイント

・mkfifo コマンドでFIFO特殊ファイル(名前付きパイプ)を作成できる
・名前付きパイプは異なるシェル・プロセス間でデータを受け渡す手段になる
・FIFOへの書き込みは読み手がいるまでブロックされる特性がある
・rm で削除するまでファイルシステム上に残り続ける点が通常パイプと異なる

続きを読む "mkfifoコマンドで名前付きパイプを作成する方法|プロセス間通信とパイプの実践例"

Linuxでファイルパス一覧から各ファイルを別フォルダへ一括移動する方法|while readループの実践

「パス一覧が書かれたファイルがあるんだけど、ここに書かれた全ファイルを別のフォルダにまとめて移動したい。どうすれば一番スッキリ書けるだろう?」
現場でこういう作業は珍しくありません。バックアップ対象のパス一覧、移行対象ファイルのリスト、ログ整理の候補ファイル一覧……テキストファイルに書き出されたフルパスを読み込んで一括処理したい場面は意外と多いものです。

この記事では、while readループを使ってパス一覧から各ファイルを別フォルダへ一括移動する方法を実践的に解説します。
基本形から始まり、移動先フォルダの自動作成・コピー版・エラースキップまで、現場で使える応用例も網羅します。

この記事のポイント

・while read line; do mv "$line" 移動先; done < ファイル一覧が基本形
・IFS= read -r line で行頭・行末スペースとバックスラッシュを安全に扱える
・mkdir -p "$(dirname ...)" でフォルダ自動作成しながら移動できる
・移動失敗時は || echo で続行させてログに残すのが現場の鉄則

続きを読む "Linuxでファイルパス一覧から各ファイルを別フォルダへ一括移動する方法|while readループの実践"

bashの配列(Array)の使い方|宣言・追加・ループ・連想配列の実践例

「シェルスクリプトで複数のサーバー名や設定値をまとめて扱いたいのに、毎回変数を個別に定義するのが面倒だ」
そんな悩みを抱えながら、変数1個ずつを地道に書き続けていませんか。

この記事では、bashの配列(Array)の宣言・要素の追加・ループ処理・連想配列(Associative Array)まで、実務で使える形で一通り解説します。
RHEL 9.4 / Ubuntu 24.04 LTS のbash 5系で動作確認済みの手順です。配列をマスターすると、複数ホストへの一括処理やバックアップスクリプトの記述がぐっとシンプルになります。

この記事のポイント

・bash配列は `arr=(a b c)` で宣言し、`${arr[0]}` でインデックス参照できる
・`${arr[@]}` で全要素展開、`${#arr[@]}` で要素数の取得が可能
・連想配列は `declare -A` で宣言し、キーと値のペアで管理できる
・for文との組み合わせでサーバー一括処理・ファイル操作の自動化に直結する

続きを読む "bashの配列(Array)の使い方|宣言・追加・ループ・連想配列の実践例"

bashのヒアドキュメント(here document)の使い方|設定ファイル生成・コマンド入力・インデントの実践例

「設定ファイルをcatで上書きしたいけど、複数行の文字列をどう扱えばいいんだろう」
「スクリプトの中でコマンドに複数行の入力を渡したい」

こうした場面で使うのがbashのヒアドキュメント(here document)です。
echo を何十行も並べる必要はありません。<< 演算子を使えば、複数行のテキストをそのまま扱えます。

この記事では、ヒアドキュメントの基本構文から、設定ファイルの生成・シェルスクリプト内でのコマンド入力・インデント制御まで、現場で即使える実践的な使い方を解説します。RHEL 9.4 / Ubuntu 24.04 LTS で動作確認済みです。

この記事のポイント

<<EOF で複数行テキストをそのままコマンドに渡せる
<<'EOF'(シングルクォート)で変数展開を抑止できる
<<-EOF でインデントのタブを自動除去できる
・設定ファイル生成・mysql入力・ssh越し実行の3パターンが定番

続きを読む "bashのヒアドキュメント(here document)の使い方|設定ファイル生成・コマンド入力・インデントの実践例"

gitコマンドの使い方入門|init・clone・commit・pushの基本とLinuxサーバーでの実践例

「gitって名前は知っているけど、コマンドの使い方がよくわからない」
「git commit や git push の違いが頭の中でごっちゃになっている」

Linuxサーバーを扱う現場では、設定ファイルやスクリプトのバージョン管理にgitを使うケースが当たり前になっています。コンテナ・IaCツール(Ansible、Terraform)との連携でも、gitの操作は避けて通れません。

この記事では、Linuxサーバー上でgitコマンドを初めて使う方に向けて、インストールと初期設定からcommit・push・branchの基本操作、よくあるエラーの対処法まで体系的に解説します。RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。

この記事のポイント

・git init でローカルリポジトリを作成し、git add → git commit の流れで変更を記録する
・git clone でリモートリポジトリをサーバーへ取得し、git push で変更を反映する
・ブランチを使うことで本番環境への影響なく設定変更をテストできる
・.gitconfigの初期設定(user.name・user.email・core.editor)は最初に済ませる

続きを読む "gitコマンドの使い方入門|init・clone・commit・pushの基本とLinuxサーバーでの実践例"

bashのfor文・while文・until文の使い方|ループ処理の基本から実践例まで

「シェルスクリプトでファイルを一括処理したいが、ループの書き方がよくわからない」
「for文とwhile文の使い分けが曖昧なまま、なんとなくコピペして使っている」

こう感じたことがある方は多いはずです。ループ処理はシェルスクリプトの核心部分であり、ここを押さえるだけで自動化できる作業の幅が一気に広がります。

この記事では、bashのfor文・while文・until文の書き方を基礎から解説します。単純な繰り返しから、ファイル一括処理・カウンタループ・break/continueによる制御まで、現場で実際に使えるパターンを中心に紹介します。

この記事のポイント

・for文はリストの各要素を順番に処理する基本ループ
・while文は「条件が真の間」繰り返す。ファイルの行読み込みに最適
・until文は「条件が偽の間」繰り返す。ポーリング処理に便利
・break/continueで途中スキップ・終了ができる

続きを読む "bashのfor文・while文・until文の使い方|ループ処理の基本から実践例まで"

bashのif文とtest条件式の使い方|ファイル・文字列・数値の比較から実践例まで

「シェルスクリプトでif文を書いたら、思ったように動かない」
「test条件式の書き方がいくつかあって、どれを使えばいいのか分からない」

bashのif文はシェルスクリプトの中で最も使用頻度が高い構文のひとつです。ファイルの存在確認、文字列の比較、数値の大小判定など、スクリプトの自動化ロジックはほぼすべてif文で成り立っています。ところが、testコマンドや[ ]、[[ ]]など複数の書き方があり、初めて学ぶ人が混乱しやすいポイントでもあります。

この記事では、bashのif文とtest条件式の基本から、ファイル操作・文字列・数値・コマンドの終了ステータスを使った実践的な比較パターンまで体系的に解説します。RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。

この記事のポイント

・ bashのif文はtest/[ ]/[[ ]]の3種類があり、用途で使い分ける
・ ファイル確認は-eや-fなど単項演算子、文字列比較は= と!=が基本
・ 数値比較は-eq・-lt・-gtなどtestコマンド専用の演算子を使う
・ 実務では終了ステータス($?)の活用とelifによる多岐分岐が重要

続きを読む "bashのif文とtest条件式の使い方|ファイル・文字列・数値の比較から実践例まで"

atコマンドでLinuxのワンショットジョブを実行する方法|crontabとの使い分けと実践例

「バッチ処理を1回だけ深夜に走らせたいのに、crontabに書くのは大げさだし、実行後に消し忘れそうで怖い」
そんな場面に刺さるのが at コマンドです。

at は「指定した時刻に1回だけコマンドを実行する」ためのジョブスケジューラーです。crontab のように繰り返し実行する設定は不要で、実行が終わればジョブは自動的に消えます。

この記事では、at コマンドの基本的な使い方から、ジョブの確認・削除、crontab・systemd timer との使い分けまでを RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した内容をもとに解説します。

この記事のポイント

・at コマンドは「1回だけ・指定時刻に」ジョブを実行するワンショットスケジューラー
・at -l(atq)でキュー確認、atrm でジョブ削除ができる
・crontab は繰り返し実行、at はワンショット、systemd timer は高機能な1回実行に使い分ける
・atd サービスが起動していないと at は動かない——まず systemctl status atd で確認する

続きを読む "atコマンドでLinuxのワンショットジョブを実行する方法|crontabとの使い分けと実践例"

while readコマンドでシェルスクリプトのファイルを1行ずつ処理する方法|IFS設定とCSV・ログ解析の実践例も

「シェルスクリプトでファイルの中身を1行ずつ処理したいのに、うまくいかない」
そんなつまずきを抱えたまま、forループやcatを組み合わせて試行錯誤していませんか。

実は、Bashには while read というファイルを1行ずつ読み込むための専用の書き方があります。
ログファイルの解析、CSVの一括処理、サーバー一覧への順次SSH接続など、現場で繰り返し使う場面がある実務必須の構文です。

この記事では、while read の基本構文から、IFSによる区切り文字のカスタマイズ、CSVやTSVの処理、
よくあるトラブルの対処法まで、RHEL 9.4 / Ubuntu 24.04 LTS の動作確認済みコマンドで解説します。

この記事のポイント

・ while read line でファイルを1行ずつ確実に処理できる
・ IFS=","で区切り文字を変えればCSV・TSVにも対応できる
・ while readはfor+catより安全で空白・改行を壊さない
・ 末尾改行なし・バックスラッシュ・末尾スペースに注意が必要

続きを読む "while readコマンドでシェルスクリプトのファイルを1行ずつ処理する方法|IFS設定とCSV・ログ解析の実践例も"

mktempコマンドでシェルスクリプトの一時ファイルを安全に作成する方法|並列処理の衝突防止と自動削除も

「シェルスクリプトで一時ファイルを /tmp/tmp_file.txt と決め打ちしていたら、別のプロセスと衝突してデータが壊れた」
そんな経験はありませんか?

一時ファイルの名前を固定していると、並列実行時の上書き・競合リスクがあります。
mktemp コマンドを使えば、重複しないユニークなファイル名を自動生成できます。

この記事では、mktemp コマンドの基本的な使い方から、シェルスクリプトでの安全な一時ファイル管理、自動削除(trap との組み合わせ)まで解説します。
RHEL 9.4 / Ubuntu 24.04 LTS で動作確認済みです。

この記事のポイント

・mktemp でユニークな一時ファイルを自動生成できる
・-d オプションで一時ディレクトリも作れる
・trap と組み合わせてスクリプト終了時に自動削除する
・並列実行時の競合・上書き事故を根本から防げる

続きを読む "mktempコマンドでシェルスクリプトの一時ファイルを安全に作成する方法|並列処理の衝突防止と自動削除も"

printfコマンドでシェルスクリプトの出力を整形する方法|echoとの違いや書式指定・色付き出力も

「echoで出力していたら文字化けした」「ログに日時を付けたいけどフォーマットが揃わない」「シェルスクリプトのデバッグ出力を色分けしたい」
こんな悩みを持ったことはありませんか?

Linux の printf コマンドは、C言語の printf 関数と同じ書式指定でテキストを出力できるコマンドです。echo では難しい「フォーマット制御」「数値のゼロ埋め」「エスケープシーケンス」などを正確に扱えます。

この記事では、printf コマンドの基本構文から始まり、書式指定子・エスケープシーケンス・実務でよく使うパターン・echo との使い分け・トラブルシュートまでを実行例付きで解説します。

この記事のポイント

・printf "%s\n" で echo より確実に文字列を出力できる
・%d・%05d・%f で数値のゼロ埋め・小数点桁数を制御できる
・\e[32m 等のANSIコードで端末出力を色付けできる
・echo と printf の使い分けは「書式が必要かどうか」で判断する

続きを読む "printfコマンドでシェルスクリプトの出力を整形する方法|echoとの違いや書式指定・色付き出力も"

set -xコマンドでシェルスクリプトをデバッグする方法|set -e・set -uとの組み合わせも

「シェルスクリプトを書いたのに、なぜかエラーになる」
「どこで止まっているのか、原因が全くわからない」

シェルスクリプトのデバッグは、初心者だけでなく中級者でも手が止まりやすいポイントです。Linuxサーバーの運用自動化を進めるほど、スクリプトが複雑になり、バグの原因追跡が難しくなります。

この記事では、Bashの組み込みオプション set -x(トレースモード)を中心に、set -e(エラー即終了)・set -u(未定義変数をエラーに)・trap ERR(エラー時のクリーンアップ)との組み合わせによるデバッグ・安全化の手法を解説します。RHEL 9.4 / Ubuntu 24.04 LTS で動作確認済みの実践的な内容です。

この記事のポイント

・set -x を使うと実行コマンドがトレース表示されデバッグが容易になる
・set -e でスクリプトをエラー発生時に即終了させ被害を最小化できる
・set -u で未定義変数を早期検知し変数名ミスのバグを防げる
・trap ERR/EXIT を加えるとエラー時の後片付けを確実に実行できる

続きを読む "set -xコマンドでシェルスクリプトをデバッグする方法|set -e・set -uとの組み合わせも"

jqコマンドでJSONを解析・加工する方法|フィルタ・整形・抽出の実践例も

「curlでAPIのレスポンスを取得したけれど、JSONが1行に詰まっていて読めない」 「シェルスクリプトでJSONの特定フィールドだけ取り出したいのに、awkやsedでは複雑すぎる」 サーバー運用やインフラ自動化の現場では、APIやクラウドのCLIツールがJSON形式でデータを返してくることが日常茶飯事です。そこで必須になるのが jq コマンドです。 この記事では、jq の基本的なインストールから、JSON整形・フィールド抽出・配列処理・条件フィルタリング、そしてシェルスクリプトへの組み込みまで、現場で実際に使われるノウハウをまとめて解説します。 RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。

この記事のポイント

・jq . でJSONを整形して人間が読みやすい形に変換できる
・.フィールド名でネストしたキーも簡単に抽出できる
・.[index]や.[]で配列要素の取り出しや展開ができる
・select()で条件フィルタリングし、必要なデータだけ抽出できる

続きを読む "jqコマンドでJSONを解析・加工する方法|フィルタ・整形・抽出の実践例も"

envsubstコマンドでシェル変数を環境変数で展開する方法|テンプレートファイルの動的生成と実務活用も

「設定ファイルをサーバーごとに手書きで変えるのが面倒だ。」
「Dockerfileや nginx.conf のIPアドレス・ドメインをまとめて差し替えたい。」

こういった悩みを抱えているなら、envsubst コマンドがそのまま解決策になります。
envsubst は環境変数をテンプレート文字列に埋め込むだけのシンプルなコマンドですが、
設定ファイルの動的生成・CI/CD パイプライン・Docker エントリーポイントと組み合わせると
驚くほどの作業を自動化できます。

この記事では、envsubst コマンドの基本から実務でよく使うパターンまで
RHEL 9.4 / Ubuntu 24.04 LTS の実機で確認した手順で解説します。

この記事のポイント

・envsubst はテンプレートの $VAR を環境変数で一括置換するコマンド
・置換対象変数を限定する書き方で誤置換を防げる
・nginx.conf や Docker エントリーポイントとの組み合わせが実務の定番
・変数が未定義の場合は空文字に展開される点に注意

続きを読む "envsubstコマンドでシェル変数を環境変数で展開する方法|テンプレートファイルの動的生成と実務活用も"

timeoutコマンドで制限時間付きでコマンドを実行する方法|ハングアップ対策とシェルスクリプト活用も

「コマンドを実行したら、いつまで経っても終わらない」
サーバー運用をしていると、ネットワーク遅延やデッドロックでコマンドがハングアップするケースは珍しくありません。

この記事では、timeout コマンドを使って制限時間付きでコマンドを実行する方法を解説します。
シェルスクリプトでのタイムアウト処理、終了コードの読み方、実務でよく使う組み合わせパターンまでカバーします。

この記事のポイント

・timeout コマンドで指定秒数を超えたプロセスを自動終了できる
・終了コード 124 で「タイムアウトによる終了」を判定できる
・--kill-after で SIGTERM の後に SIGKILL を送るダブル保険が設定できる
・cron ジョブや API 呼び出しのハングアップ対策として積極的に使う

続きを読む "timeoutコマンドで制限時間付きでコマンドを実行する方法|ハングアップ対策とシェルスクリプト活用も"

trapコマンドでbashスクリプトのシグナルを捕捉・処理する方法|一時ファイル削除やエラー終了処理の実践例も

「スクリプトをCtrl+Cで止めたら、一時ファイルが残ったままになってしまった…」
そういった経験をしたサーバー管理者は多いはずです。

bashスクリプトで本番運用をしていると、途中終了・割り込み・エラー時のクリーンアップは避けて通れません。一時ファイルやロックファイルを作るスクリプトが不意に中断されると、次回実行時に「古いロックファイルが残っている」「tmpディレクトリが膨らんでいる」という問題が起きます。

この記事では、bashの組み込みコマンド trap を使ったシグナルの捕捉と後処理の方法を解説します。
一時ファイルの自動削除、エラー時の強制終了処理、複数シグナルへの対応まで、RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した手順でお伝えします。

この記事のポイント

・trap はbash組み込みコマンドでシグナル受信時に任意の処理を実行できる
・trap "rm -f /tmp/$$.lock" EXIT で終了時に一時ファイルを自動削除できる
・INT/TERM/ERRの3シグナルを押さえれば実務の9割のケースに対応できる
・trap '' SIGINT でシグナルを無視し、重要処理を割り込みから守れる

続きを読む "trapコマンドでbashスクリプトのシグナルを捕捉・処理する方法|一時ファイル削除やエラー終了処理の実践例も"

getoptsコマンドでbashスクリプトの引数を処理する方法|オプション解析と実践例も

「シェルスクリプトにオプションを渡したいけど、$1・$2で受け取ると順番が変わったら壊れる…」
そういう悩みを抱えているサーバー管理者は多いです。

bashスクリプトを書き始めると、最初は位置パラメータ($1、$2…)で引数を受け取ります。しかしスクリプトが育ってきて「-v(詳細表示)」「-o 出力先」「-n(ドライラン)」といったオプションが増えてくると、位置パラメータでの管理はすぐに破綻します。

この記事では、bashの組み込みコマンド getopts を使ったオプション解析の方法を解説します。
基本的な1文字オプションの受け取り方から、引数付きオプション、エラー処理、実務で使えるスクリプト例まで、RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した手順でお伝えします。

この記事のポイント

・getopts は bash 組み込みのオプション解析コマンドで外部コマンド不要
・while getopts "ab:c" opt; do case $opt in で1文字オプションを処理できる
・コロン付き(b:)は引数ありオプション、$OPTARG で値を取得する
・先頭コロン(":ab:")でエラーを自前処理してサイレントモードにできる

続きを読む "getoptsコマンドでbashスクリプトの引数を処理する方法|オプション解析と実践例も"

nohupコマンドでSSH切断後もコマンドを実行し続ける方法|バックグラウンド実行とログ保存の実践例も

「長時間かかる処理を実行中にSSHが切れてしまった」——そんな経験を持つサーバー管理者は少なくないでしょう。
SSH切断と同時にコマンドが強制終了してしまうのは、端末を閉じたときにHUPシグナル(ハングアップシグナル)がプロセスに送られるためです。

この記事では、nohup コマンドの使い方を解説します。SSHが切断されても処理を継続させる基本手順から、バックグラウンド実行の組み合わせ、出力ログの管理まで、実務で即使える内容を網羅します。

この記事のポイント

・nohup コマンドで SSH 切断後もプロセスを継続実行できる
・nohup コマンド & でバックグラウンド実行と組み合わせるのが基本形
・出力は nohup.out に保存され、リダイレクトで任意ファイルに変更できる
・screen/tmux との違いと使い分けを押さえておくと現場で迷わない

続きを読む "nohupコマンドでSSH切断後もコマンドを実行し続ける方法|バックグラウンド実行とログ保存の実践例も"

typeコマンドでシェル組み込みと外部コマンドを区別する方法|whichとの違いやalias確認も

「このコマンドはどこにあるんだろう?」と思って which を打ったら何も出てこない——そんな経験はないでしょうか。
実は which が見つけられないコマンドが存在します。シェル組み込みコマンド(built-in)と呼ばれる種類です。

この記事では、type コマンドの使い方を解説します。コマンドがシェル組み込みなのか、外部バイナリなのか、エイリアスなのかを一発で判別できるようになります。シェルスクリプトのデバッグや、予期しない動作の原因調査にも役立ちます。

この記事のポイント

・type コマンドでシェル組み込み・外部コマンド・alias を即座に判別できる
・which が何も返さない場合は type で確認するのが正しい手順
・type -a で同名コマンドの全候補をまとめて確認できる
・スクリプトのデバッグや意図しない動作の原因特定に実務で頻繁に使う

続きを読む "typeコマンドでシェル組み込みと外部コマンドを区別する方法|whichとの違いやalias確認も"

シェルのオプション|bash の set コマンドで切り替える主要オプション実務集

「シェルスクリプトで set -e を入れるかどうか、毎回迷う」「ignoreeof は便利だけど、ログアウトできなくて困った」
bashのシェルオプションは40個以上あり、すべてを使いこなすのは難しいですが、実務で押さえるべきは10個ほどです。

この記事では、シェルのオプション機能を set コマンドで切り替える基本から、シェルスクリプト品質を上げる set -e / -u / -o pipefail、対話シェルで安全性を高める noclobber まで、現場で実際に使うオプションに絞って解説します。
bash 5.x / RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTS で動作確認済みです。

この記事のポイント

・bash の set コマンドでシェルのオプションをon/offできる
・スクリプトには set -euo pipefail を入れるのが現場の標準
・対話シェルでは noclobber を有効にして上書き事故を防げる
・現在の設定一覧は set -o で確認できる

続きを読む "シェルのオプション|bash の set コマンドで切り替える主要オプション実務集"

Linux無料マニュアル(図解60P) 名前とメールで30秒登録