このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:シェルスクリプトの基本

シェルスクリプトの基本

 シェルスクリプトを書くためには、シェルの文法や機能を理解することが重要です。しかし、最初からすべての機能を覚える必要はありません。まずはシェルで何ができるのか、どのような文法があるのかを把握することから始めましょう。シェルスクリプトの文法は、コマンドラインから直接シェルを使う場合でも、スクリプト内で使う場合でも基本的に同じです。

シェルスクリプトの行

 シェルスクリプトでは、実行したいコマンドをファイルに順番に記述することで、複数のコマンドを連続して実行できます。以下では、echodatedffree の4つのコマンドを使用したシェルスクリプトの例を紹介します。

複数のコマンドを実行するシェルスクリプトの作成

ステップ1:info.sh の作成

user01@ubuntu:~$ nano info.sh
info.sh の内容
#!/bin/bash

echo "system info"
date
df -h .
free -h

解説

  • #!/bin/bash:スクリプトが bash シェルで実行されることを指定するシェバン行です。
  • echo "system info":文字列 "system info" を表示します。
  • date:現在の日時を表示します。
  • df -h .:カレントディレクトリのディスク使用状況を人間に読みやすい形式で表示します。
  • free -h:システムのメモリ使用状況を人間に読みやすい形式で表示します。

ステップ2:実行権限の付与

user01@ubuntu:~$ chmod +x info.sh

解説

  • chmod +x info.shinfo.sh に実行権限を付与します。

ステップ3:シェルスクリプトの実行

user01@ubuntu:~$ ./info.sh

出力結果

system info
2024年 11月 14日 木曜日 00:49:03 JST
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        24G   11G   12G  50% /
              total        used        free      shared  buff/cache   available
Mem:           3.8Gi       1.2Gi       1.3Gi        35Mi       1.6Gi       2.6Gi
Swap:          3.8Gi          0B       3.8Gi

解説

  • echo コマンドが "system info" を表示します。
  • date コマンドが現在の日時を表示します。
  • df -h . コマンドがカレントディレクトリのディスク使用状況を表示します。
  • free -h コマンドがシステムのメモリ使用状況を表示します。

コマンドを1行にまとめる

複数のコマンドをセミコロン ; で区切ることで、1行にまとめて書くことができます。

例:1行にまとめたシェルスクリプト

#!/bin/bash

echo "system info"; date; df -h .; free -h

解説

  • 各コマンドを ; で区切ることで、同じ効果を持つスクリプトを1行で記述しています。

空行と可読性

  • 空行は無視されます:シェルスクリプトでは、空行は無視されるため、コードの可読性を高めるために自由に空行を挿入できます。
  • シェバンの後に空行を入れる:一般的に、#!/bin/bash の後に1行空行を入れることで、スクリプトの見た目を整えます。

複数行での記述

 コマンドラインが長くなる場合、行末にバックスラッシュ( \ )を置くことで、コマンドを複数行に分割できます。これは、シェルが次の行と連結してコマンドを解釈するためです。

例:\ を使った複数行のシェルスクリプト

ステップ1:disp.sh の作成

user01@ubuntu:~$ nano disp.sh
disp.sh の内容
#!/bin/bash
echo \
"system info"

ステップ2:実行権限の付与

user01@ubuntu:~$ chmod +x disp.sh

ステップ3:シェルスクリプトの実行

user01@ubuntu:~$ ./disp.sh

出力結果

system info

解説

  • echo コマンドの後に \ を置くことで、次の行の "system info" と連結して実行されます。
  • コマンドラインが長くなる場合、この方法でスクリプトを見やすく整理できます。

シェル上での複数行記述

 コマンドラインでも同様に、行末に \ を入力して Enter キーを押すと、次の行に入力を続けることができます。

例:シェルでの複数行入力

user01@ubuntu:~$ echo \

解説

  • プロンプトが > に変わります。これはセカンダリプロンプトと呼ばれ、入力が続いていることを示します。
  • シェル変数 PS2 を変更することで、このセカンダリプロンプトの表示をカスタマイズできます。

複数行入力の実行例

user01@ubuntu:~$ echo \
> "Hello \
> World"
Hello World

解説

  • echo コマンドで複数行にわたって文字列を入力し、最終的に "Hello World" が表示されます。

パイプラインでの改行

 パイプ | を使ってコマンドをつなぐ場合、パイプの後で改行してもコマンドを続けることができます。

例:パイプラインの複数行記述

user01@ubuntu:~$ ls -l |
> grep "^d" |
> wc -l
11

解説

  • ls -l の出力を grep "^d" でディレクトリの行だけに絞り、wc -l で行数を数えています。
  • コマンドを複数行に分割することで、長いパイプラインを見やすく整理できます。

コメント

 シェルスクリプトでは、# を使ってコメントを書くことができます。コメントはスクリプトの動作には影響しませんが、スクリプトの説明やメモを書くのに重要です。

コメントの書き方

行全体をコメントにする:行の先頭に # を置く。

# これはコメントです

行の途中でコメントを書く:コマンドの後に # を置く。

echo "Hello World"  # 画面に挨拶を表示

例:info.sh にコメントを追加

info.sh を以下のように修正します

#!/bin/bash

echo "system info"
# 1. 日時を表示
date
# 2. カレントディレクトリ内の空き容量を表示
df -h .
# 3. システムのメモリ使用状況を表示
free -h

解説

  • 各コマンドの上にコメントを追加し、スクリプトの目的や各コマンドの役割を明確にしています。

コマンドの一部をコメントアウト

一時的に特定のコマンドを実行しないようにする場合、# を使ってコメントアウトできます。

例:date コマンドをコメントアウト

echo "system info"
# 1. 日時を表示
# date
# 2. カレントディレクトリ内の空き容量を表示
df -h .
# 3. システムのメモリ使用状況を表示
free -h

実行結果

user01@ubuntu:~$ ./info.sh
system info
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        24G   11G   12G  50% /
              total        used        free      shared  buff/cache   available
Mem:           3.8Gi       1.2Gi       1.3Gi        35Mi       1.6Gi       2.6Gi
Swap:          3.8Gi          0B       3.8Gi

解説

  • date コマンドがコメントアウトされているため、日時の表示が省略されています。

不要となったファイルの削除

不要となったシェルスクリプトを削除します。

user01@ubuntu:~$ rm disp.sh info.sh 

まとめ

  • シェルスクリプトは、実行したいコマンドをファイルに順番に記述することで作成します。
  • 複数のコマンドは改行またはセミコロン ; で区切って記述できます。
  • 行末に \ を置くことで、長いコマンドを複数行に分割できます。
  • # を使ってコメントを記述し、スクリプトの可読性を向上させましょう。
  • コメントアウトを活用して、一時的にコマンドの実行を無効化できます。

 これらの基本を理解することで、シェルスクリプトを効率的に作成・管理できます。シェルスクリプトの作成に慣れてきたら、さらに高度な機能や文法を学び、自分の作業を自動化・効率化していきましょう。