サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
都知事選
shellscript.sunone.me
bash シェルスクリプト入門 -シェルスクリプトのいろは- 意外に知らない人が多いシェルスクリプトについて、基本的な部分の解説。主に初心者をターゲットとした内容。 シェルスクリプトとは? 複数のコマンドと条件分岐やループ処理等を使用し、一連の処理を実現するプログラムのことである。bash、zsh などのシェルを利用し、シェルによって解釈・実行されるスクリプトなので、シェルスクリプトと呼ばれる。 まれに 「シェルスクリプト」を単に「シェル」と呼ぶ人がいるが、それは厳密には間違いである。「シェル」と「シェルスクリプト」は、無関係ではないが厳密には別物である。 当ページ 管理人のネット上・実社会での観測結果によると、「シェルスクリプト」を「シェル」と呼ぶ人のスキルは著しく低い傾向がある。 同感である。 シェルスクリプトを作成する シェルスクリプトを作成するにあたって、まず使用するシェルを決める
→ 値のリストで変数を初期化する。 括弧内に値のリストを指定したものを変数に設定することで、その変数を配列として使用することができる。 ※ ksh の場合は set コマンドを使用して配列の設定を行う。括弧を使用した設定方法は使用できないこともあるので、ksh で配列を使用する場合は、set コマンドを使用する。 $ array=(111 "foo" 222 "bar" 333 "foobar") #↑配列に値を設定する。 $ echo $array 111 #↑インデックスを指定しない場合は、先頭の値のみが出力される。 $ echo ${array[@]} 111 foo 222 bar 333 foobar #↑全ての値を出力する場合は、インデックスに「@」を指定する。 ksh の場合は以下のように set コマンドを使用する。 $ set -A array 111 "foo" 222
文字コードと改行コード 文字コード 古くから UNIX の日本語環境では EUC-JP が標準の文字コードとして使用されてきたが、近年の多く普及している Linux の日本語環境は UTF-8 が一般的になっている。さらに Windows では Shift-JIS が標準であるため、これらの環境を同時に使用している場合は、文字コードへの理解と各種文字コードの相互変換作業が必要となってくる。 使用されている文字コードを調べる →使用されている文字コードを調べるには nkf コマンドの -g オプションを使用する。 ファイルなどに使用されている文字コードを調べるには、後述する文字コードの変換に使用する nkf コマンドの -g オプションを使用する。 実際に文字コードの判別を行ってみる。 $ nkf -g sjis.txt Shift_JIS #↑sjis.txt は Shift-JIS で保
case 文の使用方法 case 文とは? case 文は C言語や Java言語の switch 文に該当する制御文で、if 文と同じように処理を分岐するために使用されるものである。 分岐条件には判定対象となる 1つの値と、その値と照合される複数のパターンを指定する。case 文は値とパターンの照合を行い、パターンと一致した場合はそのパターンと共に指定されている処理を実行する。 case 文は if 文のように複雑な分岐条件を評価するのには向かないが、単純な分岐条件での多方向分岐に優れた文である。 → case 文は指定した値と複数のパターンとのマッチングにより多方向分岐を行う。 case 文には判定に使用される値と、それと照合される複数のパターン、およびそのパターンに一致した場合に実行する処理を指定する。 パターンは任意の数指定可能で、上から順に値との照合を行い、一番最初に一致したパタ
シェルスクリプト Tips コーディング・スタイル ここに書かれている内容は、あくまで筆者の好みでありほぼ完全に主観ではあるが、経験的に行き着いたスタイルでもあるので推奨します。 スクリプトのヘッダを作成する 最近はあまり使用されることもないのかもしれないが @(#) の記述と、スクリプトの使用方法、および概要をファイルの前方にコメントとして記述しておくようにする。 ※ @(#) は what コマンドで参照する情報を記述するための記号です。詳細は「whatコマンドについて」を参照。 #!/bin/bash # # @(#) hoge.sh ver.1.0.0 2008.04.24 # # Usage: # hoge.sh param1 param2 # param1 - パラメータ1です. # param2 - パラメータ2です. # # Description: # hoge.shスク
→ 関数名を指定したブロック内に処理を定義する。 関数名とその関数の処理を定義することで、一連の処理を関数を呼び出すことが可能になる。通常、関数の最後には return コマンドを指定し、その引数として与えた値が関数の終了ステータスとなる。 return コマンドの引数に指定できる値は、0 もしくは 1~255 の正の整数値のみである。マイナスの値も指定可能であるが、-1 を指定した場合は結果的に 255 になる。紛らわしいので、0 もしくは 1~255 の正の整数以外は指定しないようにする。 この return コマンドは省略可能で、省略された場合は関数内で最後に実行されたコマンドの終了ステータスが、関数自体の終了ステータスとなる。 関数を呼び出すときは、関数名と引数のリストを指定する。引数は省略可能である。呼び出すときの関数名は C言語などのように () を付ける必要はない。func(
シェルスクリプトのデバッグ シェルスクリプトをデバッグするには プログラムにバグはつきものであり、それはシェルスクリプトも例外ではない。bash にはシェルスクリプトのデバッグに非常に有効なオプションが用意されているので、「Syntax Error」で実行できない場合や、変数にどんな値が設定されているのか確認したい場合は、それらオプションを指定した上で実行することで、簡単にデバッグを行うことができる。 「-x」オプションを使用する -x オプションは、シェルスクリプト内で実際に実行されたコマンドを表示するオプションである。変数が使用されている場合は、その変数の値が展開された状態で表示される。 → bash に -x オプションを指定し、引数にデバッグするシェルスクリプトを指定する。 -x オプションでシェルスクリプトを実行すると、echo コマンドなどの出力に加えて、スクリプト内で実際に実
for 文の使用方法 for 文とは? for 文は一定回数の繰り返し処理を行う場合に使用するループ制御文である。もしくはある値の集合に対して、それぞれの要素を処理するループ制御文である。 一般的には処理回数や、処理対象となる集合が明確な場合には for 文を使用する。その他の場合は while 文を使用することになる(シェルスクリプトでの for 文は決まった回数のループ処理というよりも、リストに対するループ処理といった方が正しいかもしれない)。 → ループに使用される値のリストと、値リストの各要素がループ毎に設定される変数を指定する。 for 文は値リストに指定された1つ目の値を変数に設定し、do と done の間の処理を実行する。処理後、同様にして値リストに指定された2つ目の値を変数に設定し、再び do と done の間の処理を実行する。3つ目以降も同様にして、全ての値リストが消
AWK リファレンス AWK とは? AWK はフィルタリングによく使用されるコマンドであるが、同様にしてフィルタリングに使用される grep や cut と決定的に違うところは、AWK 自体が独立した一つのスクリプト言語であるということだ。つまり、AWK は正確にはコマンドではなく、AWK スクリプト・インタプリタである。 例えばテキストから 1 フィールド目を抽出する場合には、awk '{ print $1 }' と実行するが、ここで引数として AWK に渡している { print $1 } の部分が AWK スクリプトのソースになっている。 ちなみにこの { print $1 } は「全ての行に関して 1 フィールド目を標準出力に出力せよ」という意味になる。 この AWK は Perl などといった他のスクリプト言語ほど高機能ではないが、単一のテキストファイルや標準入力からのテキスト
→ パイプでフィルタに加工したいデータを受け渡し、目的とする文字列を抽出するフィルタリング処理を行う。 パイプを使用して不必要な文字列を消去する、または適切な位置に文字列を付加する、といったフィルタを挟み込むことで目的とするデータを抽出する。 また、フィルタをパイプで複数連結することで、より複雑なフィルタリング処理を実現することができる。 sed コマンドを使用したフィルタリング 文字列 A を文字列 B に置換する sed コマンドはさまざまな機能を持ったコマンドだが、主には文字列の置換処理に利用されるコマンドである。置換処理を行う場合には、置換対象と置換後の文字列を指定してコマンドを実行する。置換対象の指定には一部の正規表現を使用することも可能である (一部の正規表現は使用できない。また、sed のバージョン等により使用できる正規表現も異なる)。 各行の最初に一致した文字列のみ置換 →
入力と出力 リダイレクションとパイプ コマンドの実行結果は通常、標準出力であるディスプレイに出力される。この実行結果はリダイレクション(>、>>)やパイプ(|)を使用することにより、ディスプレイではなくテキストファイルやコマンドに対して出力するように切り替えることができる。 また、リダイレクションはコマンドの出力先をテキストファイルに切り替える以外にも、これとは逆にコマンドへの入力元をテキストファイルに切り替えることもできる。 なお、リダイレクションとパイプは次のように使い分ける。 リダイレクション データを渡す対象がファイルである場合はリダイレクションを使用する。 パイプ データを渡す対象がコマンドである場合はパイプを使用する。 リダイレクション [>, », <] コマンドの出力を file へ上書きする → コマンドの実行結果の出力先を、ディスプレイからファイルへ切り替えたい場合は、
フィルタを使用した文字列操作 2 cut コマンドを使用したフィルタリング 特定のフィールドを切り出す テキストファイルなどから n フィールド目を切り出す、n-m フィールド目を切り出す、といった処理には cut コマンドを使用する。 # numフィールド目を切り出す。 cut -d'デリミタ' -fnum # num1フィールド目とnum2フィールド目を切り出す。 cut -d'デリミタ' -fnum1,num2 # num1-num2フィールド目を切り出す。 cut -d'デリミタ' -fnum1-num2 → cut コマンドの -d オプションで特定のフィールドを切り出す。 cut コマンドにフィールド間の区切り文字となるデリミタと切り出すフィールド番号を指定することで、指定したデリミタによって区切られた特定のフィールドを切り出すことができる。 デリミタを指定しない場合は、デフォ
while 文の使用方法 while 文とは? while 文は「ある条件が成り立っている間のみ繰り返し処理を実行する」といった、不定回の繰り返し処理を行う場合に使用するループ制御文である。 一般的に処理回数が明確である場合には for 文を用いるが、処理回数が開始時点では不明確な場合はこの while 文を用いる。 while 文は始めに指定された条件式の終了ステータスを判定し、結果が真である場合のみループ処理を継続する。ループ毎に条件式を評価し真であれば処理を実行する。これを繰り返し、条件式が偽になった時点でループ処理をを終了する。 → 処理回数が開始時点では不明確なループ処理には while 文を使用する。 while 文にはループの継続条件となる条件式を指定する。条件式には test コマンドを使用するのが一般的だが、当然その他のコマンドも使用可能である。 while 文により条件
→ -d 'N days ago' オプションで N 日前の日付を取得できる。 Linux では拡張された GNU date コマンドが使用できるので、簡単に過去の日付を取得できる。 $ date 2007年 6月 2日 土曜日 23:05:20 JST #↑そのまま実行すると当日の日時が表示される。 $ date -d '1 days ago' 2007年 6月 1日 金曜日 23:05:31 JST #↑1日前を指定すると、現在日時から24時間前の日時が表示される。 「GNU date」が使用できない場合 → 一時的に環境変数 TZ を変更した上で date コマンドを実行する。 古い UNIX マシンなどでは、「GNU date」が使用できない場合が多い。そういった環境では、一時的にタイムゾーンを変更して date コマンドを実行することで、過去の日付を取得することができる。 $ e
終了ステータス 終了ステータスとは? コマンド終了時には「終了ステータス (exit-status)」と呼ばれるコマンドの成否を表す数値が特殊変数 $? に自動で設定される。 各コマンドにより異なるが、一般的には、 コマンド成功時には「0」 失敗時には「1」(コマンドやエラーの種類によっては 0 以外) が設定される。 → 直前に実行したコマンドの成否は、特殊変数 $? に設定されている値で確認する。 終了ステータスを設定 シェルスクリプトでは exit コマンドに指定したパラメータ (0 もしくは 1 ~ 255 の正の整数値のみ可) が、そのシェルの終了ステータスとなる。シェルスクリプトにおいても正常終了時は exit 0 で、異常終了時には exit 1 で終了するようにするのが慣例である。 関数も同様に return コマンドに指定したパラメータが終了ステータスとなる。 → シェル
シグナルと trap コマンド シグナル シグナルとは? シグナルとは、実行中のプロセスに対して、さまざまなイベントを通知するために送出されるものである。 よく使用される、プロセスを終了するためのシグナルである SIGTERM や SIGKILL などのほかにも、数十種類のシグナルが存在する。 使用可能なシグナルの一覧は、コマンドラインから kill -l を実行することで参照可能である。 $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19)
引数を処理する 引数とは? 引数 (ひきすう) とはコマンド (シェルスクリプト) 実行時に、コマンドラインから渡される値のことである。 引数は実行時にプログラム内で参照され、シェルスクリプトの実行結果 (動作) に影響を与える。引数はパラメータと呼ばれることもある。 → コマンド名に続けて引数としてコマンドに渡したい値のリストを指定する。 引数はコマンド名に続けてスペース区切りで指定する。引数として指定可能な値の数は各コマンドにより異なる。 【参考】 引数とオプション コマンド実行時に指定する値には引数とオプションがある。引数は実行に使用されるファイル名や出力されるメッセージなどを指定するのに使用される。 一方、オプションは -f などのように - (ハイフン) とアルファベット1文字で表記され、主にコマンドの振る舞い方を指定する目的で使用されるものである。 また、オプションは -a -
if 文と test コマンド if 文とは? if 文とは、与えられた条件式が真のときのみ処理を行い、それ以外の場合は処理をスキップする、などといった場合に使用される条件分岐処理である。 条件式には一般的に test コマンドを用いるが、ls コマンドや grep コマンド等の他のコマンドを用いても構わない。 if 文は条件式に指定されたコマンドの終了ステータスを判定し分岐を行う。終了ステータスが「0」の場合は真、その他の場合は偽となる。 if 文 タイプ 1
目次 当サイトについて bash シェルスクリプト入門 -シェルスクリプトのいろは- コマンド Tips シェルスクリプト Tips 変数を使用する 配列を使用する 入力と出力 if 文と test コマンド for 文の使用方法 while 文の使用方法 case 文の使用方法 関数の使用方法 引数を処理する 終了ステータス シグナルと trap コマンド フィルタを使用した文字列操作 1 フィルタを使用した文字列操作 2 日付を取得する 文字コードと改行コード シェルスクリプトのデバッグ AWK リファレンス (Deprecated) シェルスクリプト ライブラリ 『ether.sh』 お知らせ Bluesky を始めました @sunone.me 変更履歴 2023.10.07 ページ内リンクを修正した。 2021.02.01 このサイトに「もう 1 ページ追加しよう」と思ってから、も
→ 他のプログラミング言語と同様に = を使用する。 シェルスクリプトでも C言語などと同様に = を使用することで変数に値を設定することができる。ただし、C言語とは違い = の前後にスペースがあってはいけない。 また、変数名の大文字と小文字は区別されるため変数 VAR と変数 var は別物として扱われる。さらにシェル変数に「型」は存在しないので、文字列や数値を区別なく設定できる。 ポイントをまとめると以下のとおりとなる。 = を使う 値の設定時は変数名の先頭に $ を付けない ($ は参照時のみ) = の前後にスペースを入れない (前後にスペースがあるとエラー) 型は存在しない (declare コマンドや typeset コマンドで似たようなことができるが推奨はしない) 変数名の大文字・小文字は区別される (VAR と var は別物) 特に「2」は初心者が犯しがちなミスなので注意す
このページを最初にブックマークしてみませんか?
『UNIX & Linux コマンド・シェルスクリプト リファレンス』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く