Tech × Books plusシリーズ[改訂第4版]シェルスクリプト基本リファレンス
――#!/bin/shで、ここまでできる

[表紙][改訂第4版]シェルスクリプト基本リファレンス ――#!/bin/shで、ここまでできる

紙版発売
電子版発売

A5判/352ページ

定価2,970円(本体2,700円+税10%)

ISBN 978-4-297-14006-9

電子版

→学校・法人一括購入ご検討の皆様へ

書籍の概要

この本の概要

ロングセラー『シェルスクリプト基本リファレンス』の改訂第4版。

シェルスクリプトの知識は,プログラマにとって長く役立つ知識です。本書では,複数のプラットフォームにも対応できる移植性の高いシェルスクリプト作成を考慮しながら,基本から丁寧に解説。

本書では最新(執筆時点)のLinux/Ubuntu,FreeaBSD,Solarisに加え,組み込み分野等で注目度の高いBusyBoxもサポート。そして,第4版では新たにzsh&dashにも対応し,全収録スクリプトの動作確認,さらにはWindows(WSL2)とmacOS環境のbashにおけるテストも行い,さらなる移植性の高さを追求。しかし,この真意は移植性自体の確保ではなく,そこから見えてくるであろうUnix系統で受け継がれるOS&シェル環境の歴史や構造への着目にあります。そんな版を重ねたからこそ実現する,パワーアップした1冊をお届けします。

こんな方におすすめ

  • 日常的に使う,お気に入りのコマンドラインを,簡単にツール化したい方
  • 標準シェル「#!/bin/sh」の基本から学びたい方
  • 複数のプラットフォームで動く,移植性の高いシェルスクリプトを作ってみたい方
  • Unixコマンドなどの基本を学んだ後,一歩先のシェルスクリプトに挑戦したい方
  • Unix系統で受け継がれるOS&シェル環境の歴史や構造に興味をお持ちの方々

この書籍に関連する記事があります!

本書について──第4版改訂にあたって

本書のサンプル

本書の紙面イメージは次のとおりです。画像をクリックすることで拡大して確認することができます。

サンプル画像1

サンプル画像2

サンプル画像3

サンプル画像4

サンプル画像5

目次

第0章 シェル&シェルスクリプトの基礎知識

0.1 概要

  • シェルとシェルスクリプト
  • Column シェルスクリプトが使用されている場面

0.2 いろいろなシェル

  • 基本はBourne Shell
  • Column 自分のログインシェルを調べる

0.3 プログラムであるシェルスクリプト

  • シェルスクリプトとC言語との比較

0.4 移植性の高いシェルスクリプトについて

  • シェルスクリプトの移植性

第1章 シェルスクリプト入門

1.1 Hello World

  • シェルスクリプト作成の流れ ◆Hello Worldを書いてみよう

1.2 #!/bin/shの意味

  • #!/bin/shの意味 ◆シェルスクリプトの1行目

1.3 実行方法について

  • いろいろな実行方法 ◆コマンドとして実行する以外には

第2章 シェルスクリプトの基本事項

2.1 シェルスクリプトはフリーフォーマット

  • シェルスクリプトはフリーフォーマット ◆改行位置やインデントなどはかなり自由

2.2 コメントの書き方

  • コメントの書き方 ◆コメントを記入するには#記号を使う

2.3 コマンドの終了ステータス

  • コマンドの終了ステータス ◆条件判断を行う際に利用される

第3章 シェル文法の循環構造

3.1 コマンド➡パイプライン➡リストの循環

  • コマンド➡パイプライン➡リストの循環

3.2 コマンド/パイプライン/リスト

  • 単純コマンド ◆一般のUNIXコマンドは単純コマンドとして実行できる
  • 複合コマンド ◆構文/サブシェル/シェル関数などは複合コマンドとして解釈される
  • コマンド ◆単純コマンドと複合コマンドとを合わせてコマンドと呼ぶ
  • Column 「いわゆる」UNIXコマンド(単純コマンド)の調べ方
  • パイプライン ◆コマンドの標準出力を別のコマンドの標準入力に接続する
  • リスト ◆パイプラインを改行などで区切って並べたもの

3.3 &&リスト/||リスト

  • &&リスト ◆簡単な条件判断を行える
  • ||リスト ◆簡単な条件判断を行える

第4章 複合コマンド

4.1 概要

  • シェル文法における複合コマンド

4.2 構文

  • if文 ◆条件判断によってプログラムを分岐する
  • case文 ◆文字列をパターンごとに場合分けしてプログラムを分岐する
  • for文 ◆変数に、指定の値をそれぞれ代入しながらループする
  • 算術式のfor文 ◆ループ変数を使い算術式を評価しながらループを繰り返す
  • while(until)文 ◆条件が真であるかぎり(偽になるまで)ループを繰り返すにはwhile文を使う
  • select文 ◆選択メニューを表示しユーザ入力を受け付ける

4.3 サブシェルとグループコマンド

  • サブシェル ◆リストをまとめて別のシェルで実行する
  • グループコマンド ◆リストを1つのコマンドとしてまとめる

4.4 シェル関数

  • シェル関数 ◆一定の処理を関数としてまとめる

4.5 算術式の評価と条件式の評価

  • 算術式の評価 (( )) ◆算術演算を行いその結果によって終了ステータスを返す
  • 条件式の評価  ◆条件式を評価し、その結果によって終了ステータスを返す

第5章 組み込みコマンド[1]

5.1 概要

  • 基本の組み込みコマンドについて

5.2 組み込みコマンド(基本)

  • :コマンド ◆何もしないで単に「0」の終了ステータスを返す
  • .コマンド ◆現在実行中のシェルに別のシェルスクリプトを読み込ませる
  • break ◆for文/while文のループを途中で抜ける
  • continue ◆for文/while文のループを次の回に進める
  • cd ◆別のディレクトリに移動する
  • eval ◆引数を再度解釈しコマンドを実行する
  • exec ◆新しいプロセスを作らずにコマンドを起動する
  • exit ◆シェルスクリプトを終了する
  • export ◆シェル変数を環境変数としてエクスポートする
  • getopts ◆シェルスクリプトの引数に付けられたオプションを解析する
  • read ◆標準入力からの入力をシェル変数に読み込む
  • readonly ◆シェル変数を読み込み専用にする
  • return ◆シェル関数を終了する
  • set ◆シェルにオプションフラグをセットする、または位置パラメータをセットする
  • shift ◆位置パラメータをシフトする
  • trap ◆シグナルを受け取った時に指定のリストを実行させる
  • type ◆外部コマンドのフルパスを調べたり、組み込みコマンドかどうかをチェックしたりする
  • umask ◆シェル自体のumask値を設定/表示する
  • unset ◆シェル変数またはシェル関数を削除する
  • wait ◆バックグラウンドで起動したコマンドの終了を待つ

第6章 組み込みコマンド[2]

6.1 概要

  • 外部コマンド版も存在する組み込みコマンドと、拡張された組み込みコマンドについて

6.2 組み込みコマンド(外部コマンド版もあり)

  • echo ◆任意のメッセージを標準出力に出力する
  • alse ◆単に偽の終了ステータスを返す
  • kill ◆プロセスにシグナルを送る
  • printf ◆メッセージを一定の書式に整形して標準出力に出力する
  • pwd ◆カレントディレクトリの絶対パスを表示する
  • test ◆シェルスクリプトにおいて各種条件判断を行う
  • true ◆単に「0」の終了ステータスを返す

6.3 組み込みコマンド(拡張)

  • builtin ◆シェル関数と同名の組み込みコマンドを優先的に実行する
  • command ◆シェル関数と同名の組み込みコマンドまたは外部コマンドを優先的に実行する
  • let ◆算術式を評価するのにletコマンドを使う方法もある
  • local ◆シェル関数内でローカル変数を使う

6.4 組み込みコマンド(その他)

  • その他の組み込みコマンド

第7章 パラメータ

7.1 概要

  • シェルにおけるパラメータ

7.2 シェル変数の代入と参照

  • シェル変数の代入と参照 ◆変数や定数を使うにはシェル変数を使う

7.3 位置パラメータ

  • 位置パラメータ ◆シェルスクリプトやシェル関数の引数を参照する

7.4 特殊パラメータ

  • 特殊パラメータ $0 ◆起動されたシェルスクリプト名(# 第0引数)を参照する
  • 特殊パラメータ "$@" ◆シェルスクリプトやシェル関数の引数すべてをそのまま引き継ぐ
  • 特殊パラメータ $* ◆シェルスクリプトやシェル関数の引数すべてを1つに連結して参照する
  • 特殊パラメータ $# ◆シェルスクリプトやシェル関数の引数の個数を参照する
  • 特殊パラメータ $? ◆終了ステータスを参照する
  • 特殊パラメータ $! ◆直前にバックグラウンドで起動したコマンドのプロセスIDを参照する
  • 特殊パラメータ $$ ◆シェル自身のプロセスIDを参照する
  • 特殊パラメータ $- ◆現在のシェルに設定されているオプションフラグを参照する
  • 特殊パラメータ $_ ◆直前に実行したコマンドの最後の引数を参照する

7.5 環境変数

  • 環境変数の設定 ◆シェル変数をexportして環境変数を設定する
  • 環境変数の一時変更 ◆単純コマンドの左側に環境変数の代入文を記述する

7.6 特別な意味を持つシェル変数

  • PATH ◆外部コマンドの検索パスを設定するシェル変数
  • PS1 / PS2 ◆シェルのプロンプトを設定するシェル変数
  • HOME ◆自分自身のホームディレクトリが設定されているシェル変数
  • IFS ◆単語分割に用いられる区切り文字が設定されているシェル変数

第8章 パラメータ展開

8.1 概要

  • パラメータ展開の概要
  • Column パラメータ展開とダブルクォート

8.2 条件判断をともなうパラメータ展開

  • ${パラメータ:-値}と${パラメータ-値} ◆パラメータのデフォルト値を指定する
  • Column 空文字列のパラメータをセットするには
  • ${パラメータ:=値}と${パラメータ=値} ◆パラメータにデフォルト値を代入する
  • ${パラメータ:?値}と${パラメータ?値} ◆パラメータ未設定時にエラーメッセージを出してシェルスクリプトを終了する
  • ${パラメータ:+値}と${パラメータ+値} ◆パラメータが設定されている場合のみ指定の値に展開する
  • ${#パラメータ} ◆パラメータの値の文字列の長さを求める
  • ${パラメータ#パターン}と${パラメータ##パターン} ◆パラメータの値の文字列の左側から一定のパターンを取り除く
  • ${パラメータ%パターン}と${パラメータ%%パターン} ◆パラメータの値の文字列の右側から一定のパターンを取り除く
  • ${パラメータ:オフセット}と${パラメータ:オフセット:長さ} ◆オフセットや長さを指定してパラメータの値の文字列を切り出す
  • ${パラメータ/パターン/置換文字列}と${パラメータ//パターン/置換文字列} ◆パターンを指定してパラメータの値の文字列を置換する
  • ${!変数名@}または${!変数名*} ◆指定した文字列で始まる変数名を一覧表示する
  • 間接参照 ${!パラメータ} ◆パラメータの値をパラメータ名とみなし、さらにその値を参照する

第9章 クォートとコマンド置換

9.1 概要

  • クォートとコマンド置換

9.2 クォート

  • シングルクォート ' ' ◆文字の特殊な意味を打ち消して文字列を使用する
  • ダブルクォート " " ◆パラメータ展開とコマンド置換を除いて文字の特殊な意味を打ち消す
  • バックスラッシュ \ ◆次の1文字の特殊な意味を打ち消す

9.3 コマンド置換

  • コマンド置換 ` ` ◆コマンドの引数またはコマンド名を別のコマンドの標準出力で置換する
  • コマンド置換 $( ) ◆コマンドの引数またはコマンド名を別のコマンドの標準出力で置換する
  • $付きシングルクォート $' ' ◆バックスラッシュ(\)によるエスケープ文字も使えるシングルクォート
  • $付きダブルクォート $" " ◆言語設定による文字列変換が行われるダブルクォート

第10章 各種展開

10.1 概要

  • シェルにおける各種展開

10.2 パス名展開

  • パス名展開 * ◆0文字以上の任意の文字列にマッチさせる
  • パス名展開 ? ◆任意の1文字にマッチさせる
  • パス名展開 [a-z] ◆指定した条件の1文字にマッチさせる

10.3 ブレース展開

  • ブレース展開 {a,b,c} ◆複数の文字列の組み合わせから文字列を生成する

10.4 算術式展開

  • 算術式展開 $(( )) ◆算術式を評価しその演算結果の数値に展開する

10.5 チルダ展開

  • チルダ展開 ~ ◆ユーザのホームディレクトリに展開する

10.6 プロセス置換

  • プロセス置換 <( ) / >( ) ◆FIFOに接続した別プロセスを起動し、そのFIFO名に置換する

10.7 単語分割

  • 単語分割(IFS) ◆パラメータ展開などの結果をコマンド名や引数に分割する

第11章 リダイレクト

11.1 概要

  • リダイレクト
  • Column ファイル記述子について

11.2 いろいろなリダイレクト

  • 標準入力のリダイレクト < ◆コマンドの標準入力にファイルを入力する
  • 標準出力のリダイレクト > ◆コマンドの標準出力をファイルに出力する
  • 標準出力のアペンドモードでのリダイレクト >> ◆コマンドの標準出力をファイルに追加出力する
  • 標準エラー出力のリダイレクト 2> ◆コマンドの標準エラー出力をファイルに出力する
  • ファイル記述子を使ったリダイレクト >& ◆オープン済みの標準出力や標準エラー出力などを複製する
  • 標準出力と標準エラー出力の同時リダイレクト &> ◆標準出力と標準エラー出力を同時にファイルにリダイレクトする
  • ファイル記述子のクローズ >&- <&- ◆ファイル記述子をクローズするには>&-や<&-を用いる
  • 読み書き両用オープン < > ◆コマンドのファイル記述子を読み書き両用でオープンしたファイルにリダイレクトする
  • ヒアドキュメント << ◆コマンドの標準入力に一定の文書を入力する
  • ヒアストリング <<< ◆コマンドの標準入力に一定の文字列を入力する
  • Column ヒアドキュメントとヒアストリングの実際

第12章 よく使う外部コマンド

12.1 概要

  • シェルスクリプトで使う外部コマンド

12.2 シェルスクリプトならではのコマンド

  • expr ◆シェルスクリプトで数値計算を行う
  • basename ◆ファイル名からディレクトリ名部分や拡張子を取り除く
  • dirname ◆ファイル名からそのディレクトリ名部分のみを取り出す
  • cat ◆ファイルを連結し標準出力に出力する
  • sleep ◆一定時間待つ

12.3 一般コマンド

  • 一般コマンド ◆よく使う一般コマンド
  • grep ◆ファイルから特定の文字列を含む行を抜き出す
  • wc ◆ファイルの行数/単語数/ファイルサイズを表示する
  • head ◆ファイルの先頭から指定の行数だけを取り出す
  • tail ◆ファイルの末尾から指定の行数だけを取り出す
  • touch ◆ファイルの更新時刻を更新する
  • sed ◆ファイルの中の文字列を置換する

第13章 配列

13.1 概要

  • シェル上での配列

13.2 配列への代入と参照

  • 配列への代入と参照 ◆bashやzshではシェル変数として配列も扱える

13.3 配列の一括代入と一括参照

  • 配列の一括代入と一括参照 ◆配列のすべての要素について値を一括代入したり一括参照したりできる

13.4 bashやzsh以外のシェルで配列を使う方法

  • bashやzsh以外のシェルで配列を使う方法 ◆bashやzsh以外のシェルでもevalコマンドを用いて配列と同様の処理ができる

第14章 シェルスクリプトのノウハウ&定石

  • クォートのネスティングパズル
  • if文の代わりに&&や||を使う
  • do〜while構造の実現
  • すべての引数についてループする
  • 一定回数ループする
  • ラッパースクリプト
  • ファイル名に日付文字列を含ませる
  • ファイルを1行ずつ読んでループする

Appendix サンプルスクリプト

  • 引数の解釈状況をチェックする
  • 標準出力/標準エラー出力の出力先をチェックする
  • *.tar.gz/*.tar.bz2自動展開
  • Shift_JIS➡EUC-JP一括変換
  • Column 文字コードの変換を行うフィルタコマンド
  • EUC-JPの文字一覧出力
  • プログレスバー

著者プロフィール

山森丈範(やまもりたけのり)

大学時代にUNIXを触って以来,仕事でもプライベートでもUNIX系OSを使用しているプログラマ。SunOSやNEWS-OSなどが動くUNIXワークステーション上の/bin/shに長く慣れ親しみ,当時職場等でログインシェルとして与えられていたcshを,ヒストリもエイリアスも補完機能もない素の/bin/shに自主的に変更して使用したほどの/bin/sh好きである。メイン環境がLinux上のbashに変わった現在でも,/bin/shとの互換性/移植性を常に気に留めながらシェルスクリプトを書いている。