Yanonoblog!

こつこつと

シェルスクリプトの概要と使い方まとめてみた & 作ってみた

はじめに

多少は実践的にLinux使えるようになりたいと思い書籍「新しいLinuxの教科書」を読み進めています。

本記事では「新しいLinuxの教科書」で学んだ内容と別途気になって調べた内容や知識も含めアウトプットしていきます。

前回の記事の続きとなっております。

ファイルのテキスト処理に関するコマンドについてまとめてみた

(Chapter13~14はざっと目を通すのみでまとめていません。)

シェルスクリプトとは

シェルスクリプトとは、Linuxなどのシステムにおける、コマンドをまとめて自動化するために使用されるスクリプトを予め記述しているファイルのことを指します。

複数のコマンドを一つにまとめて、一連の処理を自動化するために利用されます。

シェルスクリプトの活用方法

シェルスクリプトを活用することで、以下のようなことができます。

  • ファイルの一括処理
  • プログラムの自動実行
  • システム管理タスクの自動化
  • サーバーの監視

シェルスクリプトの種類

シェルスクリプトには、いくつかの種類がありますが、代表的なものに「sh」と「bash」があります。

どちらを使っても基本的な機能は利用できますが、bashの方が機能が豊富で、プログラミング言語に近い文法を使うことができます。bashには、配列や関数、条件分岐、ループ、算術演算子正規表現などの機能があります。

シェルスクリプト作ってみた

シェルスクリプトとは一般的に、拡張子が「.sh`」で終わるテキストファイルにコマンドを記述したものを指します。

以下はbash_script.shというシェルスクリプトファイルを作成する例です。

# 実行
vi bash_script.sh

# 記述内容
#!/bin/bash
echo "シェルスクリプトファイル(bash_script.sh)に記述したスクリプトです"

上のコードの先頭では#!/bin/bashという記述がありますが以下で解説します。

#!/bin/bash - Bashシェルを指定

シェルスクリプトの一般的な拡張子は.shですが、先頭に「#!」(シバンまたはシェバン)を付けることで、どのシェルで実行するかを指定することができます。たとえば、「#!/bin/bash」を先頭に付けた場合は、Bashシェルで実行されます。

シェルの実行

シェルはファイルパスを指定して実行することができます。

カレントディレクトリにあるbash_script.shを指定して実行する例です。

# 実行
./bash_script.sh

# 結果
シェルスクリプトファイル(`bash_script.sh`)に記述したスクリプトです

このようにシェルスクリプトに記載したコマンドを実行することができます。

chmod +x 権限を付与

シェルスクリプトは実行されるファイルはじめに、権限を付与しないと実行できないことに注意してください。

以下のようにchmodコマンドで実行権限を設定しておく必要があります。

# 実行
./bash_script.sh

# 結果
zsh: permission denied: ./bash_script.sh

シェルスクリプトの実行形式

先ほどはシェルスクリプトを作成する際に、ファイルの先頭でbashの指定を#!という特別な宣言を行いました。

こちらの理解も重要と本書に書かれていたためまとめていきます。

シバン(シェバン)

Linuxでファイルを実行する際には以下のようにパス名を指定しました。

# 実行
./bash_script.sh

シェルから実行命令を受けたLinuxカーネルは、まず 対象のファイルの先頭を読み込みます。

#!があった場合には、指定されているパスからコマンドを実行するという動作を行います。

つまり、以下の例では「このシェルスクリプト/bin/bashから実行します」という宣言をしていることになります。

#!/bin/bash

シバンの書かれたシェルスクリプトLinuxカーネルに展開されて、シェルに自身のファイル名を引数として与えて実行されるようになっています。

上記のファイルは以下と同じ形式としてLinuxカーネルに会釈されます。

/bin/bash ./bash_script.sh

sourceコマンド - ファイルからコマンドを読み込んで実行する

上の解説ではファイル名のみを指定してシェルスクリプトを実行しましたが、類似する実行方法としてsourceコマンドがありますが、若干動作が異なります。

まず、以下のスクリプトファイルを追加で作成しました。

# 実行 (新規作成)
vi source_bash_script.sh

# 結果 (複数のコマンドをファイルに追記・シバンを記述していない)
echo "シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです"
echo "シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです"
echo "シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです"
echo "シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです"
echo "シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです"
echo "シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです"
echo "シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです"
echo "一行ずつ順番に実行されました"

sourceコマンドは、指定したファイルの内容をそのままコマンドラインに入力したときと同じように実行します。

下記のように実行することができます。

# 実行
source ./source_bash_script.sh                                                                                      

# 結果
シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです
シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです
シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです
シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです
シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです
シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです
シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです
一行ずつ順番に実行されました

実際に動作自体は変わっていませんが、sourceでは一行ずつ流し込むようにコマンドライン上で実行されていきます。

sourceを使用しない場合、ファイルを読み込んで実行される形で実行されます。

具体的にどう違うのか - sourceを使用しない

sourceコマンドを使用しない場合は、別のシェルで実行されるため、変数や関数は呼び出し元のシェルスクリプトでは利用できません。

具体的にどう違うのか - sourceを使用する

sourceコマンドを使用する場合は、読み込んだシェルスクリプト内で定義された変数や関数が、呼び出し元のシェルスクリプトでも利用可能になります。

sourceコマンドを使用することで、読み込んだシェルスクリプトでエラーが発生した場合、呼び出し元のシェルスクリプトでもエラーが発生するため、デバッグが容易になります。これに対して、sourceコマンドを使用しない場合は、別のシェルで実行されるため、エラーの原因が分かりにくくなります。

  • sourceコマンドを使用することで、変数や関数の共有が行われるようになる
  • そのまま実行する場合は新しいシェルで実行されるため、呼び出す関数や変数が参照できなくなる
  • sourceコマンド省略系

    sourceの部分を.にすることもできます。

    環境によってはsourceのほうが読み込まれないことがあるそうです。

    # 実行
    . ./source_bash_script.sh                                                                                      
    
    # 結果
    シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです
    シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです
    一行ずつ順番に実行されました

    【相棒】ChatGPT殿に聞いてみた

    質問: 以下の認識が正しいか教えてください。間違っていたり補足があれば記載してください

    実際に動作自体は変わっていませんが、sourceでは一行ずつ流し込むようにコマンドライン上で実行されていきます。sourceを使用しない場合、ファイルを読み込んで実行される形で実行されます。

    # 実行
    source ./source_bash_script.sh                                                                                      
    
    # 結果
    シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです
    シェルスクリプトファイル(source_bash_script.sh)に記述したスクリプトです
    一行ずつ順番に実行されました
    回答

    正しい認識です。sourceコマンドを使用することで、指定したシェルスクリプトの内容を現在のシェルに取り込み、現在のシェル上でそのシェルスクリプトの内容を実行します。そのため、sourceコマンドを使用した場合は、シェルスクリプトの内容が一行ずつ順番に実行されるようになります。一方、sourceコマンドを使用しない場合は、指定したシェルスクリプトを新しいシェル上で実行します。そのため、シェルスクリプト内の内容がまとめて実行されることになります。

    上記のように返答がありました。

    sourceを使用しない場合は、新しいシェル上(別のプロセス)シェルスクリプトが実行されるようですね。

    このようにChatGPTとすり合わせ出来ると理解が深まりそうです!

    普段の開発などでも活用できるか

    エンジニアにとって、シェルスクリプトはサーバー管理や自動化に役立つツールです。

    たとえば、デプロイスクリプトやデータベースバックアップスクリプトの作成などを作成することができます。

    また、cronジョブの設定や、サーバーメンテナンスなどにも利用できます。シェルスクリプトの知識を持つことで、より効率的なサーバー管理が可能になります。

    普段の開発体験や管理を効率化させることができる可能性を秘めた機能のため、常に効率化を考えられるよう心がけましょう。

    続く…

    コメント

    本記事の内容は以上になります!

    書籍の続きのアウトプットも随時更新したいと思います。


    プログラミングスクールのご紹介 (卒業生より)**

    お世話になったプログラミングスクールであるRUNTEQです♪

    https://runteq.jp/r/ohtFwbjW

    こちらのリンクを経由すると1万円引きになります。

    RUNTEQを通じて開発学習の末、受託開発企業をご紹介いただき、現在も双方とご縁があります。

    もし、興味がありましたらお気軽にコメントか、TwitterのDMでお声掛けください。

    https://twitter.com/outputky

    参考