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

Linuxコマンドの基本:シェルの選択

シェルの選択

 シェルスクリプトを書く際に、どのシェルを選択するべきかは重要なポイントです。主に選択肢としては、sh(Bourne Shell:ボーンシェル)とbash(Bourne Again Shell)の二つがあります。それぞれの特徴や利点を理解し、適切なシェルを選ぶことで、スクリプトの互換性や機能性を高めることができます。

シェルの選択

 シェルスクリプトは、使用するシェルによって解釈や書き方が異なります。現在、シェルスクリプトを書く際の一般的な対象となるシェルは、shまたはbashです。

sh(Bourne Shell)

  • 特徴
    ・Unixの初期から存在する歴史あるシェル。
    ・基本的な機能のみを備えており、最新のシェルに比べて低機能。
  • 利点
    ・多くのLinuxディストリビューションにデフォルトで存在し、互換性・移植性が高いとされる。
    ・過去のシェルスクリプトの多くがsh向けに書かれている。

bash(Bourne Again Shell)

  • 特徴
    ・GNUプロジェクトによって開発されたsh互換のシェル。
    ・shに比べて多くの拡張機能や便利な機能を持つ。
  • 利点
    ・高度なプログラミング機能(算術演算、配列、関数など)をサポート。
    ・現在のほとんどのLinuxディストリビューションでデフォルトのシェルとして採用。

shとbashの選択に関する考察

shでシェルスクリプトを書いても互換性の問題は解決しない

  • Linuxディストリビューション間の違い
    CentOSなどのRed Hat系では、shは実際にはbashへのシンボリックリンクであり、shモードで動作します。
    UbuntuなどのDebian系では、shは軽量なdashシェルとして実装されています。
  • 互換性の問題
    ・シェルの実装が異なるため、sh向けに書いたスクリプトでも動作が異なる場合があります。
    ・商用システムであるSolarisshもLinuxのshと微妙に異なります。
  • bashの利点
    ・GNUプロジェクトによる一貫した実装のため、どの環境でも同じ動作が期待できます。
    ・多くのLinuxディストリビューションでデフォルトでインストールされており、利用しやすい。

bashにはシェルスクリプトを書く上で便利な機能が多く用意されている

  • 機能の豊富さ
    算術展開:外部コマンドを使用せずに計算が可能。
     例:i=$((i + 1))
  • 配列のサポート: 複雑なデータ構造を扱える。
  • 高度な文字列操作: パターンマッチングや置換が容易。
  • 効率性の向上
    ・外部コマンドの呼び出しが減り、スクリプトの実行速度が向上。
    ・コードがシンプルになり、可読性と保守性が高まる。

結論

 以上の理由から、シェルスクリプトを書く際にはbashを選択することが推奨されます。特に、bashの拡張機能を活用することで、効率的で強力なスクリプトを作成できます。

bashとshでのスクリプトの違いを比較

 実際に、bash用に記述されたscript1.shと、sh用に記述されたscript2.shを作成し、その違いを確認してみましょう。

※ここで作成する、script1.shscript2.shは、bashでもshでも動作します。

bash用のスクリプト script1.sh の作成

user01@ubuntu-vm:~$ nano script1.sh

script1.sh の内容

#!/bin/bash
count=1
while [ $count -le 5 ]; do
  echo "Count is $count"
  count=$((count + 1))
done

解説

  • #!/bin/bash: スクリプトがbashで実行されることを指定。
  • count=1: 変数countを初期化。
  • while [ $count -le 5 ]; do: countが5以下の間、ループを実行。
  • echo "Count is $count": 現在のcountの値を表示。
  • count=$((count + 1)): countを1増加させる(算術展開を使用)。

sh用のスクリプト script2.sh の作成

user01@ubuntu-vm:~$ nano script2.sh

script2.sh の内容

#!/bin/sh
count=1
while [ $count -le 5 ]; do
  echo "Count is $count"
  count=`expr $count + 1`
done

解説

  • #!/bin/sh: スクリプトがshで実行されることを指定。
  • count=’expr $count + 1`外部コマンドexprを使用してcount`を計算。

スクリプトの実行

script1.sh の実行

user01@ubuntu-vm:~$ bash script1.sh

出力結果

Count is 1
Count is 2
Count is 3
Count is 4
Count is 5

解説

  • bash script1.sh でスクリプトを実行。
  • count=$((count + 1)) により、内部で算術演算が行われます。

script2.sh の実行

user01@ubuntu-vm:~$ sh script2.sh

出力結果

Count is 1
Count is 2
Count is 3
Count is 4
Count is 5

解説

  • sh script2.sh でスクリプトを実行。
  • expr コマンドを使用して算術演算を行います。

スクリプトの削除

作業が終わったら、不要となったシェルスクリプトを削除します。

user01@ubuntu-vm:~$ rm script1.sh script2.sh

まとめ

  • シェルの選択
    ・シェルスクリプトを書く際には、bashを選択することが推奨されます。
    ・bashは機能が豊富で、互換性・移植性も高いです。
  • shとbashの違い
    ・shは古く、機能が限定的です。外部コマンドに頼る必要があります。
    ・bashは算術展開などの便利な機能を持ち、効率的なスクリプトが書けます。
  • スクリプトの作成と実行
    #!/bin/bash または #!/bin/sh でシェルを指定します。
    ・bash用のスクリプトでは算術展開 $(( )) が使えます。
    ・sh用のスクリプトでは expr コマンドを使って算術演算を行います。
  • おすすめ
    ・現在のLinux環境では、bashを用いてシェルスクリプトを書くことで、生産性と互換性を高められます。

 シェルスクリプトを効果的に活用するためには、適切なシェルを選択し、その機能を最大限に利用することが重要です。bashの機能を活用して、より効率的で強力なスクリプトを作成しましょう。