はじめに
シェルスクリプトは複雑な操作を1つのコマンドにすることで様々な作業の効率化を図ることができます。
覚えておくと便利。
ということでシェルスクリプトの基礎をまとめました。
この記事に書くこと
- シェルスクリプトの概要
- シェルスクリプトのファイルについて
- シェルスクリプトの変数について
シェルスクリプトの概要
シェルスクリプトはコマンドを1つのファイルに集約することです。
利用シーン
シェルスクリプトは同じOSなら、誰が動かしても同じ結果になります。
その利点を生かして以下の利用シーンが考えられます。
- 同じコマンドを何度も実行する作業の自動化
- デプロイで必要なコマンドの一括実行
- 計算後にファイル抽出などレポートの作成
- 引き継ぎ
- 複雑な処理もシェルスクリプトのファイルを渡すだけでOK
シェルスクリプトの欠点
- 他のプログラミング言語に比べて特殊な書き方やルールが多い
- 開発環境やテスト環境が貧弱
- 大人数の作業に不向き
シェルスクリプトのファイルについて
ひとまずHello,World
#!/bin/bash
echo 'Hello,world!'
拡張子が.shな理由
シェルスクリプトの拡張子はなんでも構いません。hello
でもhello.yahooooo
でも動きます。
しかし、慣習的に拡張子は「.sh」を使うことが多いです。
そのため、特別な理由がない限りは「.sh」を使いましょう。
#!/bin/bash
はなにをしているか
これはshebang(シェバン)と呼ばれるもので、「このスクリプトはbashで動作しますよ」という印です。
この行を追加することでファイルを呼ぶだけで実行できるようになります。
~ ./hello.sh
Hello,world!
もしsh
コマンドで動かす場合は 以下のように一行目を書き換えてください。
なお、bashで使えて、shで使えない機能があるため、すでにshで作られているシェルスクリプトでなければ、#!/bin/bash
にすることをお勧めします。
#!/bin/sh
標準出力 echo
echo
コマンドは引数で指定された文字列を出力するコマンドです。
-nオプションをつけると改行されずに出力されます。
#!/bin/bash
echo -n 北海道
echo -n は
echo -n でっかいどう
~ ./echo.sh
北海道はでっかいどう
シェルスクリプトの変数について
多くのプログラミング言語と同様に、bashでも変数が使用できます。
bashの変数名は、アルファベット、数字、_(アンダースコア)の組み合わせが使えます。
ただし数字は先頭には使えません。
利用可能な変数例
利用可能 | app1 |
_tmp | |
AppScript | |
利用不可 | my-app(ハイフン不可) |
1th_name(先頭に数字不可) | |
変数の宣言
変数は「変数名=値」の形式で値を代入します。
=
の間にスペースやタブを入れてはいけません。
変数に入れた値はdeclareなど宣言がなければ文字列として扱われます。
そのため、「'(コーテーション)」や「"(ダブルコーテーション)」は省略できます。
しかし、スペースやタブの入った1つの文字列として扱いたい場合は「'」か「"」で囲む必要があります。
#!/bin/bash
# 変数は文字列として扱われる
ROOT_DIR=/home/shell
# 空白を含み、1つの文字列として扱いたい場合は''か""で囲む
SPACE_TEXT1='Document file'
# 出力結果はSPACE_TEXT1と同じ
SPACE_TEXT2=Document file
# 値を入れなければ、空文字になる
empty=
変数の参照
変数を参照するときは定義した変数の先頭に「$」をつけます。
なお、「$」は変数を参照時のみです。
代入時に「$」をつけるとエラーになります。
#!/bin/bash
ROOT_DIR=/home/shell
SPACE_TEXT='Document file'
empty=
# 参照時は$を先頭につける
echo $ROOT_DIR
echo $SPACE_TEXT
echo $empty
# 最後の行は空文字
~ ./variable.sh
/home/shell
Document file
変数と文字列を組み合わせる
変数の直後に文字列をつなげたい場合、変数を${}で囲みます。
#!/bin/bash
item=pen
echo I have a ${item}s
~ ./variable.sh
I have a pens
おわりに
シェルスクリプト超入門として、ファイル作成と変数を記事にしました。
シェルスクリプトを自作できれば、色んな業務効率化ができそうです。
環境設定を対話方式で行うときにシェルスクリプトを使えば実装できるんじゃないかなーと思ったので今度試してみたいです。
参考