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

UB3/informatics/mac/shell

このページの最終更新日: 2021/07/08


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


  1. 概要: シェルスクリプトとは
    • sh, bash および zsh について
  2. sh ファイルの基本構成と関連ルール
    • Windows の .bat ファイル
  3. 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)。

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.

コメント欄

各ページのコメント欄を復活させました。スパム対策のため、以下の禁止ワードが含まれるコメントは表示されないように設定しています。レイアウトなどは引き続き改善していきます。「管理人への質問」「フォーラム」へのバナーも引き続きご利用下さい。

禁止ワード: http, the, м (ロシア語のフォントです)


このページにコメント

Name:


Comment:



これまでに投稿されたコメント

Date Name Comment

2021-06-18 15:57:06.066325

Toby Coats

Hello from FbCourses.net Want to pay $0.01 a click? We got you covered. A great team of Global Digital Marketing experts have compiled this list of 13 Best + Free Facebook Advertising Training, Classes and Courses to help you learn and excel at Facebook Ads & Marketing. Thousands of professionals have already benefited from this list on Facebook Training. Regards, Toby

2021-05-11 14:56:01.084306

Alisia Toomey

Hello from SendBulkMails.com, We have a special limited offer for you to send unlimited emails. We allow non-permission based emails and you won't ever get blocked. We also buy your domain for you and give you a clean IP and setup your DNS records. Check us out on SendBulkMails.com

2021-04-14 05:31:55.070231

Sherlyn Wannemaker

Hello, Send unlimited emails to unlimited lists with one click and no monthly fees! $99 once off! LifeMailNow.com

2021-03-25 05:30:06.316963

Liam Sheil

Hello, BestLocalData.com has a special package you get any group of databases for $49 or $249 for all 16 databases and unlimited emails for a year(Domain, IP, Dashboard included). You can purchase it on BestLocalData.com and see samples if you are interested.

2021-02-26 01:57:12.979092

SendBulkMails.com

SendBulkMails.com allows you to reach out to clients via cold email marketing. - 1Mil emails starter package - Dedicated IP and Domain Included - Detailed statistical reports (delivery, bounce, clicks etc.) - Quick and easy setup with extended support at no extra cost. - Cancel anytime! SendBulkMails.com

2021-02-16 02:29:33.005490

Carina Robinette

Use SendBulkMails.com to run email campaigns from your own private dashboard. Cold emails are allowed and won't get you blocked :) - 1Mil emails / mo @ $99 USD - Dedicated IP and Domain Included - Detailed statistical reports (delivery, bounce, clicks etc.) - Quick and easy setup with extended support at no extra cost. - Cancel anytime! Regards, www.SendBulkMails.com

2021-02-02 13:17:41.236771

Vincent Strode

Use SendBulkMails.com to run email campaigns from your own private dashboard. Cold emails are allowed and won't get you blocked :) Starter Package 50% off sale - 1Mil emails / mo @ $99 USD - Dedicated IP and Domain Included - Detailed statistical reports (delivery, bounce, clicks etc.) - Quick and easy setup with extended support at no extra cost. - Cancel anytime! Regards, www.SendBulkMails.com

2021-01-18 05:59:01.124451

Armando Loche

It is with sad regret to inform you StarDataGroup.com is shutting down. It has been a tough year all round and we decided to go out with a bang! Any group of databases listed below is $49 or $149 for all 16 databases in this one time offer. You can purchase it at www.StarDataGroup.com and view samples. - LinkedIn Database 43,535,433 LinkedIn Records - USA B2B Companies Database 28,147,835 Companies - Forex Forex South Africa 113,550 Forex Traders Forex Australia 135,696 Forex Traders Forex UK 779,674 Forex Traders - UK Companies Database 521,303 Companies - German Databases German Companies Database: 2,209,191 Companies German Executives Database: 985,048 Executives - Australian Companies Database 1,806,596 Compani