当サイトについて

UNIX & Linux コマンド・シェルスクリプト リファレンス

当サイトは管理人 SUNONE による、UNIX & Linux のコマンドおよびシェルスクリプト(bash)の中~上級者向けリファレンス・サイトです。

(シェルスクリプト初心者向けに、「シェルスクリプト入門」を書いてみました。 シェルスクリプトを始めたばかりの人は、先にこちらを参照してください。)

当サイト内の情報は主に Linux 環境をターゲットとしているため、UNIX 環境では動作しないコマンド・シェルスクリプトがあります。 また、Linux 環境においても bash のバージョン等の環境差分により、コマンド・シェルスクリプトの実行結果が当サイトの内容と異なる場合があります。

なお、当サイトの情報を利用されたことにより損害が生じたとしても、管理人 SUNONE は一切責任を負いません。

はじめに

シェルスクリプトは CUI 作業において非常に強力な機能を提供してくれるため、UNIX/Linux を扱う技術者にとって重要な技術のひとつです。 近年は Perl や Python、Ruby 等のスクリプト言語を、シェルスクリプトの代替として使用することが多くなっていると思いますが、 それでも仕事上でどうしてもシェルスクリプトを用いて開発を行わなければいけない、といった場面が職場によっては多々ある思います。

筆者がシェルスクリプトの技術を身につけたのも、仕事でシェルスクリプトでの開発を要求されたためです。 (なぜか Perl 等の他のスクリプト言語を使おうとしない職場でした。もっとも筆者は Perl を使えませんが・・・。) 当サイトで紹介している情報は、そのときに得たノウハウ(バッド・ノウハウも含む)がほとんどです。

そんな(バッド)ノウハウを駆使してまでわざわざシェルスクリプトでやるくらいなら、最初から Perl でやればいい、というようなことを言う人がいますが、それは全くその通りです

ただ、中には筆者と同じくシェルスクリプトを使わざるを得ない状況にある人もいるはずです。 当サイト内で紹介している Perl でやれば簡単にできるようなことを、 わざわざコマンドやシェルスクリプトでやっているような情報は、そのような人たちに向けたものです。 もちろん、普通にシェルスクリプトの技術を身につけたい人に参考にしてもらってもかまいません。 他のスクリプト言語に押され気味の技術ではありますが、それでもシェルスクリプトは技術者として生きていく上での強力な武器となってくれるはずです。

筆者がシェルスクリプトを学習・使用するに当たって、分かりづらかった部分、苦労した部分を重点的に記載したつもりなので、参考にしていただけると幸いです。

目次

シェルスクリプト Tips

コーディング・スタイル

複数行の一括コメントアウト

変数の命名規則

関数の振る舞いを変数で変更する

パイプライン処理

ループ処理を使うな

ループ処理のネストより関数

パイプの先はサブシェル

コマンド Tips

ファイル操作

・指定した容量のダミーファイルを作成する

・複数のファイルをまとめてリネームする

・diffコマンドに一時ファイルを作らずにコマンドの実行結果を渡す

プロセス

・プロセスをツリー形式で表示する

変数を使用する

一般的な変数の設定と参照

・変数に値を設定する

・コマンドの実行結果を変数に設定する

・変数の値を参照する

・変数の特殊な参照方法

・変数の値を変数名として値を参照する

・変数を削除する

・変数を読み取り専用に設定する

特殊な変数とその参照

・さまざまな情報が設定される変数

・実行時のパラメータ数が設定される変数

・全パラメータが設定される変数

・位置パラメータ

・環境変数

配列を使用する

・配列に値を設定する

・配列の各要素に値を設定する

・配列に要素を追加する

・配列の要素を参照する

・配列の要素数を参照する

・配列の要素でループする

・配列の要素をソートする

入力と出力

リダイレクションとパイプ

・リダイレクション [>, >>, <]

・パイプ [ | ]

・ヒアドキュメント [<<]

・プロセス置換 [<()]

標準入力を使用する

・キーボードからの入力を読み取る

・ファイルからの入力を読み取る

標準出力を使用する

・ディスプレイにメッセージを出力する ~ echo コマンド

・整形してメッセージを出力する ~ printf コマンド

標準エラー出力を使用する

・ディスプレイにエラーメッセージを出力する

複数コマンドのリダイレクトとパイプ

・複数コマンドの出力をまとめてリダイレクトする

・複数コマンドの出力をまとめてパイプに流す

if 文と test コマンド

if 文とは?

test コマンド

・数値の比較

・文字列の比較

・ファイルの比較

・その他の評価条件

・略式testコマンド

・AND 条件と OR 条件 ~その1~

・AND 条件と OR 条件 ~その2~

・NOT 条件

・補足 ~「 [ ] 」と「 [[ ]] 」の違いは?~

if 文の使用例

・if文を使用したシェルスクリプト

if 文の応用

・条件式に任意のコマンドを使用する

for文の使用方法

for文とは?

for文の使用例

・値のリストを直接指定する

・変数の値を値リストに指定する

・コマンドの実行結果を値リストに指定する

・一定回数のループ処理を作成する

・ループを制御する

while文の使用方法

while文とは?

while文の使用例

・一般的な使用方法 1 ~条件式に test コマンドを使用する~

・一般的な使用方法 2 ~条件式に test 以外のコマンドを使用する~

・一般的な使用方法 3 ~無限ループ~

ループを制御する

・break コマンドでループを途中で終了する

・continue コマンドでループをスキップする

case 文の使用方法

case 文とは?

case 文の使用例

・パターンに文字列を指定する

・パターンにワイルドカードを指定する

・パターンに OR 条件を使用する

・パターンに変数を使用する

関数の使用方法

関数とは?

関数の戻り値

関数の引数

ローカル変数

関数の使用例

・引数の合計値を出力する関数

引数を処理する

引数とは?

引数を使用したシェルスクリプト

・引数処理に使用する変数

・指定された引数の数をチェックする

・オプション解析コマンドgetoptsを使用する

終了ステータス

終了ステータスとは?

終了ステータスを判定してコマンドを実行する

・コマンドが成功した場合のみ次のコマンドを実行する

・コマンドが失敗した場合のみ次のコマンドを実行する

・「 rm -f 」の終了ステータス

終了ステータスの応用

・入力値が数値か文字列かを判別する

・パイプ処理の終了ステータスを取得する

シグナルと trap コマンド

シグナル

・シグナルとは?

・シグナルを送出する

・各シグナルの意味

trap コマンド

・trap コマンドの使用方法

・trap 処理をリセットする

・trap コマンドの応用 1

・trap コマンドの応用 2

フィルタを使用した文字列操作 1

フィルタとは?

sed コマンドを使用したフィルタリング

・文字列Aを文字列Bに置換する

・文字列の削除

・正規表現を使用した文字列置換

・変数を使用した文字列置換

・行を指定した置換

・特定の行を削除する

・特定の行のみを表示する

・特定の位置の文字列を切り出す

・"^M" などの制御文字を削除する

フィルタを使用した文字列操作 2

cut コマンドを使用したフィルタリング

・特定のフィールドを切り出す

・特定の位置の文字を切り出す

grep コマンドを使用したフィルタリング

・特定の文字列を含む行のみを表示する

・特定の文字列を含まない行のみを表示する

・行番号を付加して表示する

・A行からB行までを切り出す

head コマンドと tail コマンドを使用したフィルタリング

・先頭行から n 行を表示する

・先頭行から下から n 行目までを表示する

・最下行から n 行を表示する

・先頭行 n 行目から最下行までを表示する

・上から N 行目~下から M 行目までを表示する

その他のコマンドを使用したフィルタリング

・アルファベットの小文字を大文字に変換する

・空白で区切られた特定のフィールドを切り出す

・空白で区切られたフィールドの順番を入れ替える

日付を取得する

昨日の日付を取得する

・拡張された date コマンド「GNU date」が使用可能な場合

・「GNU date」が使用できない場合

明日の日付を取得する

・拡張された date コマンド「GNU date」が使用可能な場合

・「GNU date」が使用できない場合

先月の月を取得する

日付のフォーマットを指定する

日付取得の応用

・過去・未来の日付を求める

・日付の比較を行う

文字コードと改行コード

文字コード

・使用されている文字コードを調べる

・文字コードを変換する

・Shift-JIS から UTF-8 に変換する

・EUC-JP から UTF-8 に変換する

改行コード

・使用されている改行コードを調べる

・改行コードを LF に変換する

・改行コードを CR+LF に変換する

シェルスクリプトのデバッグ

シェルスクリプトをデバッグするには

・「-x」オプションを使用する

・「-v」オプションを使用する

・ヌルコマンドを応用したデバッグ

シェルスクリプトを部分的にデバッグする

デバッグ用関数を自作する

AWK リファレンス

AWK とは?

AWK の構文

・パターンとアクション

・パターン

・アクション

AWK スクリプトの例

シェルスクリプトとAWKスクリプト

・シェルスクリプトからAWKスクリプトに変数を渡す 1

・シェルスクリプトからAWKスクリプトに変数を渡す 2

AWKスクリプトTips

・正規表現内に変数を使用する

シェルスクリプト ライブラリ

※仕事でシェルスクリプトを使う機会がほとんどなくなったので完全に放置していますが、 シェルスクリプトの応用技術としてそれなりに有用な情報になっていると思うのでこのまま公開しておきます。

© 2005-2012 SUNONE