シェルスクリプトとは: 初心者向けの解説

UB3/informatics/mac/shell

このページの最終更新日: 2024/09/30


このページでは、シェルスクリプトとは何か、sh と bash と zsh の違い、などシェルにまつわるトピックを紹介する。実際の使い方は ターミナルのページ が便利である。関数の一覧、パスの説明などがある。


  1. 概要: シェルスクリプトとは
  2. sh ファイルの基本構成と関連ルール
    • Windows の .bat ファイル
  3. オンラインのシェルコンパイラー
  4. sh/bash/zsh スクリプトについてのメモ

広告

概要: シェルスクリプトとは

基本的に MacLinux および Unix の全てに当てはまる説明なので、とりあえず区別せずに書く。これらのシステムは、図のような構造になっている。

シェルの概念図

コンピューターの中心部には、カーネル kernel がある。

ターミナルというプログラムにコマンドを入力することで、さまざまな操作を行うことができる。ここでターミナルに打ち込む言語を シェル shell という。

プログラミング言語のうち、比較的簡単で、複雑なプログラミングには向かないものを スクリプト言語 と呼ぶ。シェルは、一般にスクリプト言語に分類される。

このコマンド操作を連続して行いたい場合、

  1. .sh という拡張子のファイルに複数のコマンドを書き込み、
  2. そのファイルを sh コマンドで実行する

という手順を踏むことになる。複数のコマンドが書かれたファイルをシェルスクリプトという。

シェルスクリプトは単なる テキストファイル なので、一般的なテキストエディタで編集することになる。以下のようなテキストエディタを使ってみたことがあり、現在は Brackets または TextWrangler がお気に入りである。


sh, bash および zsh について

シェルとはカーネルとユーザー (アプリ) の間に位置するもののことで、特定のスクリプト言語の名前ではない。Unix/Linux/Mac でシェルに使われるスクリプト言語は、大きく sh 系と csh 系に分かれている (2)。

自分のコンピューターに入っているスクリプト言語の一覧をみるには、cat /etc/shells とする。私の Mac には bash, csh, dash, ksh, sh, tcsh, zsh などが入っており、Catalina 以前の Mac および Ubuntu では bash が使われていたことから、これが最も標準的なシェル用のスクリプト言語であると言っていいだろう。

macOS では、Catalina から何故かデフォルトのシェルが zsh に変更された。bash とは記述方法が微妙に異なるが、ここでは詳述しない。

sh ファイルの基本構成と関連ルール

上で述べたように、.sh という拡張子のファイルに複数のコマンドを書き込み、このファイルをターミナルから実行することで、一連のコマンドを連続して実行することができる。

sh ファイルの 1 行目には、通常は シバン shebang と呼ばれる記述から始まる。これは、そのファイルを処理するプログラムを指定するものである。ファイルが実行する内容は、シバンのあとに記載されることになる。

#!/bin/sh


.sh ファイルの名前に ( が含まれているとエラーになるようだ。-bash: syntax error neat unexpected token '(' のようなメッセージ。


Windows の .bat ファイル

Windows Command Prompt の場合は、.bat という拡張子のファイルがこれに相当する。

  • 最初にファイルを作るときは、echo abc > test.bat などのように、コマンドプロンプトから作ると問題が起きにくいだろう。これは Mac でも同様で、echo abc > test.sh として作る方が、テキストエディットで作って拡張子を変えるよりも良い。ときどき、勝手に拡張子を足すような設定になっている場合があるため。
  • sh ファイルは sh コマンドから実行するが、Windows では .bat のファイル名がそのままコマンドになる。または call コマンドで実行。Notepad で編集できる。
  • ワイルドカード * は、Windows でも同様に使える。
  • echo コマンドを batch ファイルに入れるとき、いちいちコマンドプロンプトに コマンドの内容が出てくるのがうっとおしい。コマンドの前に @ を置くことで、これをオフにできる (1)。

オンラインのシェルコンパイラー

CoCalc

あまり色々試したわけではないが、なんとなくこれが良さそう。

sh/bash/zsh スクリプトについてのメモ

  • for とかで変数を記述するとき、変数名は常にドル + 中括弧 ${ } でくくっておくようにしたい。ドルや中括弧がなくても動く場合が多いが、変数周辺の記述によってはおかしなことになる。つけておいて損はない、という感じ。
  • シェルスクリプト でなくても、ターミナル上で変数は保存できる。A="abc" として、echo=${A} とすれば abc と出力されるはず。なお、ここで echo A としてしまうと、変数が展開されず、ただ A 表示される。
  • 解析結果をファイルに保存するときは、アウトプットのオプションを使う場合と、> を使う場合がある。> result.out のように指定する。for loop や while read line で回すと上書きになってしまうので、>> result.out とする。> を 2 つつけると、ファイルの後ろに追記していくという意味になる。
  • sh ファイルの中で cd でパスを変更しても、sh ファイルの実行が終わると元のフォルダに戻ってくる。
  • コマンドの結果を変数に代入したい場合。いくつか方法があるが、例えば 変数=$(コマンド) とする方法がある (Ref)。たとえば USERNAME=$(whoami) とすることで、ユーザー名を USERNAME という変数に格納できる。
  • pwd の結果を変数に代入したスクリプトを書いたが、${PATH} および ${CURDIR} という名前は使わない方がいい。デフォルトの変数がこの名前であるようで、おかしな結果になる。${DIR} で大丈夫だった。
  • 文字列を変数に代入したり、スクリプト中で参照したりするときは、シングルクオーテーション ' ' またはダブルクオーテーション " " を使う。ダブルの場合、中の変数が展開される。たとえば USERNAME=$(whoami) のように変数を指定して "$USERNAME" とすると、実際のユーザー名が文字列として読み込まれる。シングル ' ' で囲った場合には、$USERNAME という文字がそのまま読み込まれる。
  • for などで 1 ループ回すごとに変数に +1 するには、このページ にあるように 変数名 = $((変数名 +1)) である。最初の変数名は $ や {} はなし。
  • ファイルの有無を条件にしたい場合は、if [ -e file ]; then で始め、fi で閉じる。詳細は ここ へ。

Python なら .py、R なら .R という拡張子で似たようなことができる。


広告

References

  1. エコー機能のON/OFFを切り替える (ECHO). Link: Last access 2019/10/17.
  2. 第10回 シェル・スクリプト入門 1. Link: Last access 2020/08/18.

コメント欄

サーバー移転のため、コメント欄は一時閉鎖中です。サイドバーから「管理人への質問」へどうぞ。