はじめに
Bashスクリプトは、LinuxやUnix系の環境でシステムを効率的に操作するためのプログラミング言語になります。
単純なコマンドの自動化から、複雑な処理の実行まで柔軟に作ることができます!
Unix管理者やLinux管理者、ユーザーまで、知っておけばかなり楽になります。自動化が主になりますね!
システム管理者や開発者にとって、Bashスクリプトを使いこなせるかどうかは、業務の効率性に直結すると言えると思います。
例えば、定期的なバックアップ処理やログの解析、サーバー管理の自動化など、手作業では時間がかかる作業もスクリプトを
活用すればすぐに処理できます。
CronやSytemdタイマーでセットしておけば忘れないですしーーー(^^♪
Bashシェルスクリプトは、決して難しくなく (複雑な処理はあるけど。。。) コマンド処理を手続き的に記述していく感じです!
小さなコマンドの積み重ねが、やがて大きなシステム管理となります。
このページでは、Bashスクリプトをこれから学ぶ人に向けて、基本的な書き方や実践的な使い方をわかりやすく説明していきますね。
初心者でも理解しやすいように、シンプルな例から丁寧に説明します!
実際の活用方法へとステップアップできるようになっていただければなーーーー。
スクリプトを学ぶことで、日々の作業をより効率化し、自動化の力を享受してくださいませ!
シバン
シバンはスクリプトの最初の行に記述される #! で始まる指定で、スクリプトを実行する際に使用するインタプリタ(シェル)を指定する役割があります。
Bashスクリプトの場合、基本的には以下のように記述します。
![]() |
この記述により、スクリプトを実行すると /bin/bash が呼び出され、Bashとして処理されます。
シバンが抜けていると、スクリプトを直接実行した場合にシステムのデフォルトシェル(例えば /bin/sh)で処理され、
期待した動作をしないことがあるので注意ですね。
まずは、おまじない的に #!/bin/bash とやるのがいいと思います。
コメント(Comment)
Bashスクリプトでは、スクリプトの可読性を高めるために コメント を使います。他の人が見たときにどのような処理か
記載したりします。
コメントはプログラムの実行に影響を与えず、説明を加えるためのものです。可読性を高めるために積極的にコメントを
記載した方が良いです。
![]() |
![]() |
上記は、コンソールにHello World と表示するだけの1行のスクリプトになります。 #を行の先頭、に記載したら
その行は#以降はすべてコメントです。
もしくは、 echo "Hello World" #コメントで、#以降がコメントとして扱われます。
複数行のコメント
#を使ってコメントすることも出来る、多くの行をコメントしたい場合 <<COMMNT で始まり COMMENTで終わる書き方で、複数行のコメントの記載も可能です。
![]() |
![]() |
上記の実行結果のように、コメントは、スクリプトのコードに対し、何の影響もあたえません。
使ってみてー!
ヒアドキュメント
ヒアドキュメントは、複数行のテキストを処理する際に便利な方法です。特にスクリプト内で長いメッセージを出力するときや、一時的なファイルにデータを書き込むときに使います。
![]() |
![]() |
<<EOF の後に続く行はすべてヒアドキュメントとして扱われます。EOF(または他の識別子)を使って終了します。
まとめ
![]() |
標準入出力とリダイレクトとパイプ
◆標準入出力◆
標準入力(stdin)→ キーボードからプログラムに情報を送ることを想像してください。たとえば、コンピュータに何か指示を与えるために文字をタイプする時です。
標準出力(stdout)→ プログラムがその結果を画面に表示することを考えてみてください。
例えば、計算機に「2 + 2」と入力した後、画面に「4」が表示される時です。
標準エラー出力(stderr)→ 何かエラーが発生した時、それを画面に伝えることです。
例えば、「指定されたファイルが見つかりません」というエラーメッセージが表示される時です。
① 標準入力= キーボードからの入力もしくは、ファイル等からの入力と思ってください。
② 標準出力= 画面に出力されるメッセージや実行結果と思って下さい。
③ 標準エラー出力= 画面に出力されるメッセージと思ってください。
標準入力は、プログラムがデータを受け取る場所です。例えば、ユーザーがキーボードで入力したデータです。
標準出力は、プログラムが結果や情報を出力する場所です。通常は画面に表示されます。
標準エラー出力は、エラーメッセージを出力する場所です。標準出力とは別にエラーメッセージを表示します。
このように、標準入力、標準出力、標準エラー出力は、プログラムがどのようにデータを受け取ったり表示したりするかを
管理するための仕組みとなります。
◆リダイレクト◆
シェルスクリプトにおけるリダイレクトは、プログラムの入力や出力を指定された場所に変更するための方法です。これにより、コマンドの出力をファイルに保存したり、エラーを別の場所に送ったりすることができます。
![]() |
![]() |
上の例では、おなじみのコマンド ls -l の標準出力(画面表示)を切り替えて ./redirect.txt に結果を書き込んでします。
![]() |
実行して、確認してみます。実態のファイル ./bash.shを実行。llコマンドでファイルをリストするとredirect.txtが
出来ています。catコマンドで中身を確認すると、画面に表示するはずだった出力結果が、ファイルに
書き込まれているのが確認出来ます。
この様な手法をリダイレクトと言います!
ちょっと分かりずらいのが 2>&1 ですが、標準出力と標準エラーをリダイレクトします
よく、出力を破棄するとき使ったりします。
![]() |
なんとなく、分かってきましたね!
◆パイプ◆
パイプ ( | ) はシェルスクリプトにおいて便利なツールで、あるコマンドの出力を別のコマンドの入力として使用するために使われる。これにより、複数のコマンドを連携させて効率的にデータ処理を行うことができる。
![]() |
上記の場合、ls -l コマンドで /etcディレクトリのファイル一覧の出力を | (パイプ)で grep コマンドに渡して、
-i で大文字、小文字を区別しなくて、pass* でpassがつくファイルをフィルタする、みたいな感じです。
Unix、Linuxのコマンドでは、grep は、かなり汎用的に使うので、他の使い方とか調べておいた方がいいです。
特に正規表現で、該当行を抜き出したり、該当部分の取り出しとか、結構つかいます!
grepの基本的な使い方
| grep "検索文字列" ファイル名 |
grep "hello" hogehoge.txt
hogehoge.txt の中から "hello" を含む行を検索して表示します。
とりあえずは下記のオプションは、覚えておきたいところですかね(^_-)-☆
![]() |
正規表現については、別のメニューで取り上げますね。
まずは、お約束のHello Worldですかね
では、以下のコードを見てほしいです。
![]() |
![]() |
echo コマンドは、標準出力にテキストを表示する シンプルで便利なコマンドとなります。
シェルスクリプトではよく使われる基本コマンドのひとつですね!
exit0については、あってもなくても良いです。無くてもスクリプトが正常終了すれば、終了ステータス0となります。
$? は 「直前のコマンドの終了ステータス(終了コード)」 を表す特殊変数です。これは コマンドの実行結果が
成功したかどうか を確認するために使います。
$?に入る値は以下になります。(たくさんあるので、一般的な感じで)
![]() |
![]() |
まだ、if文とか説明してないけど、こんなように使います。$?は直前のコマンドが正常終了したかのステータスが
格納されます。試しにないコマンドを記載してエラーを起こしてみましょう。
![]() |
![]() |
3行目でコマンドがみつかりません になっていますね!ちなみにエラーを出力してスクリプトは終了していますので
スクリププトの終了ステータスは 0 になります。
では、コマンドの簡単なの記載して、成功しましたを表示させましょう。
![]() |
![]() |
うまく行きました。ls -l を出力して、$?に成功ステータス0となりif文で条件チェックで $status == 0 なので、成功しましたが
出力された感じです!
if文とかは、後ほど説明するので、心配無用です!
特殊変数の代表的なやつ
一応、覚えて置いた方が良い特殊変数、環境変数の代表的なのをリストします。
今は、こんなのがあるんだー的な感じでOKです。
![]() |
コマンド置換
Bashにはコマンド置換という機能があります。これは、コマンドの出力を別のコマンドの引数や変数に利用するための機能となります。
これにより、動的なデータを処理しながらスクリプトを実行できることになります。
シェルスクリプトは、各種コマンドの集合で、自動的に各コマンドを制御し、結果を出力します。
echo $(hostname) #hostnameコマンドを出力する。
local_host_name=$(hostname) #変数local_host_nameにhostnameコマンドの実行結果を格納する。
スクリプトの中でコマンドを実行するときは以下の方法で実行します。
![]() |
![]() |
期待通りの実行結果になりました。
コマンド置換では $( ) の中にコマンドを記述します。echoでコンソールに出力や、 変数=$(コマンド) で変数に結果を格納でも良いです!
※` ` バッククオートでも良いんだけど。$( )での記述が可読性がいいので、ここでは $( ) を使います。
変数
変数代入のやり方 変数に値を代入するには、以下のように書きます。
変数名と値の間にはスペースを入れないように注意してください。(他のプログラムではスペースを入れることがおおいですが、
シェルスクリプトの場合は、シェルが混乱してしまうからです)
![]() |
![]() |
※注意したいのが、Bash で変数に小数を格納できますが、Bash の変数は 整数型 として扱われるため、そのまま計算はできません。
計算できるが、小数点以下は無視されます。
他のbcコマンドとscaleコマンドを使って小数の精度を渡す方法で細かい精度の計算が出来ます。
変数の値を使用するには、変数名の前に $ を付けます。 echo $hensu めんどくさくなければ${ }を使った方が
可読性が良くなります。 echo ${hensu} みたいな感じ。
' と " の違い '(シングルクォート)は、文字列をそのままの形で扱います。変数の値は展開されません。
"(ダブルクォート)は、文字列の中で変数の値を展開します。
変数の定義
Bashでは、変数は宣言するだけで自動的に作成され、使用する前に値を代入します。
変数名には英数字とアンダースコア _ が使用でき、数字から始めることはできません。
変数を定義するときは、= の前後に スペースを入れないようにします。
![]() |
文字列は " " で囲む必要があります!
数値はそのまま代入できるが、小数点は bc などを使う必要があります。
変数の種類(ローカル変数)
ローカル変数は、スクリプトや関数内でのみ使用される変数。スクリプトが終了すると値も失われます。
Bash の変数には ローカル変数 と 環境変数 があり通常の変数は、定義したシェル内でのみ有効です。
count=10
echo "$count" # 10(現在のシェルで有効)
環境変数(グローバル変数)
これは、スクリプトを抜けても残る変数です。例えば、export ENV_VAR="environment value" を使って設定した環境変数は、
そのセッション(シェル)内でのみ有効です。したがって、そのシェルを閉じたりログアウトすると、設定された環境変数も失われます。
export を使うと、サブシェルでも利用可能な 環境変数 になります。
export PATH="/usr/local/bin:$PATH"
echo "$PATH" # 環境変数として有効
上記は、あくまでも一時的なものであり永続させるなら、以下の用途で対象ファイルに記述することで解決出来ます。
![]() |
位置パラメータ
これは、スクリプト実行時に引数として渡される値です。$1、$2、$3.......などの形式で使用します。
引数とは、シェルスクトに渡す値です。引数は、シェルスクリプト内で、1番目の引数は $1 で使え、二番目は $2、
以降三番目は$3 .......といくつでも引数を渡すことができます。
変数に対する文字列の操作
数値の操作、計算
数値の計算は$(( )) を使用します。これは 算術式展開と呼び、数値演算を実行できます。
![]() |
![]() |
このように 加算 (+)、減算 (-)、乗算 (*)、除算 (/)、剰余 (%) が使えまyo。 下記は変数との組み合わせです。
![]() |
![]() |
計算の時、${}を使わないのが普通です。${}を使うときは、文字列のなかに埋め込むときとかです。誤解しないように。
一応は、${ }しても動くけど。。。。
インクリメントとデクリメントの使い方
インクリメント ++ とデクリメント -- は、Bash などのプログラミング言語で 変数の値を 1 ずつ増減 させる演算子となります。
![]() |
![]() |
小数点の計算について
注意点: $(( )) は 整数計算のみ対応 しています。
小数を扱うには bc を利用する必要があります。(先ほどの scale の例が役立ちます!)
echo "scale=2; 5 / 3" | bc # 1.66
echo "scale=5; 5 / 3" | bc # 1.6666
![]() |
![]() |
以後、頑張って作成中




































