Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Bashプログラミング入門:シェルスクリプトで日々の作業を自動化しよう

Unixに当初寄せられていた期待の一つは、日常的にコンピュータを使う誰もが、自分のコンピュータを細かく調整し、自分独自の働きスタイルに合わせられるようにする、というものでした。しかしそれから数十年が経ち、コンピュータのカスタマイズへの期待は次第に薄れ、多くのユーザーにとって「カスタム環境」とは、インストールしたアプリや利用するウェブサイトの集合体程度のものになってしまいました。その理由の一つは、多くのオペレーティングシステムの構成要素がオープンではなく、ソースコードが一般ユーザーの手に届かないことにあります。

ところがLinuxユーザーにとっては、カスタムプログラムは十分に現実的な選択肢です。システム全体が、ターミナルから利用できるコマンドを基盤として構築されているからです。ターミナルは、単に手軽なコマンドを実行したり高度なトラブルシューティングを行ったりするためのインターフェースではありません。面倒な定型作業を肩代わりしてくれる、立派なスクリプティング環境なのです。

プログラミングの学び方

これまでプログラミング経験がない場合、「コードの書き方を理解する」という課題と「何を書くべきかを理解する」という課題の、2つの異なるチャレンジがあると考えると分かりやすいでしょう。構文(シンタックス)は学べますが、言語としてどんな言葉が使えるのかを知らなければ、先には進めません。実際には、言葉を並べるためには構文が必要なので、両者は同時に学ぶことになります。最初は基本的なコマンドと基本的なプログラミング構造を使って簡単なタスクを書き、慣れてきたら言語のより多くの機能を探求して、プログラムにできることをどんどん増やしていけばよいのです。

Bashにおいて、使う言葉の大部分はLinuxコマンドであり、構文こそがBashです。すでにBashを日常的に使っているなら、Bashプログラミングへの移行は比較的容易です。まだBashを使っていなくても心配はいりません。Bashは明快さとシンプルさを目的として設計された、とても扱いやすい言語だからです。

インタラクティブな設計

プログラミングを学ぶうえで最も難しいのは、「コンピュータに何を任せられるのか」を見極めることかもしれません。コンピュータが勝手にすべてをやってくれるなら、もうキーボードに触れる必要すらないはずですが、現実には人間の関与が不可欠です。コンピュータに助けさせられるタスクを見つける鍵は、一週間の中で繰り返し行っている作業に気づくことです。コンピュータは反復処理が特に得意だからです。

ただし、コンピュータに何かを指示するには、自分自身がそのやり方を知っていなければなりません。ここでBashが真価を発揮します。それは対話的(インタラクティブ)なプログラミングです。ターミナルで操作を行うことは、そのままスクリプトの書き方を学んでいることと同じだからです。

たとえば筆者はかつて、大量のPDF書籍をインク消費量が少なくプリンタに優しいバージョンへ変換する仕事を任されました。一つの方法としては、PDFエディタでファイルを開き、数百個にも及ぶ画像(ページ背景やテクスチャも画像として数えられます)をひとつずつ選択して削除し、新しいPDFとして保存するやり方があります。しかしこの方法では、一冊処理するだけで半日かかってしまいます。

最初はPDFエディタをスクリプトで操作する方法を調べましたが、数日調査しても、(見苦しいマウス操作の自動化ハックを除けば)スクリプト化できるPDF編集アプリケーションは見つかりませんでした。そこで方向転換し、ターミナル内でこのタスクを達成する方法を探すことにしました。その結果いくつかの新発見があり、その中にはGhostScript——PDFの基盤となっている印刷用言語PostScriptのオープンソース実装——も含まれていました。GhostScriptを使って数日間試した結果、これが問題の解決策であることを確認できました。

あとは、PDFから画像を取り除くために使ったコマンドとオプションをそのままテキストファイルにコピー&ペーストすれば、基本のスクリプトは完成です。このファイルをスクリプトとして実行すれば、おそらく同じ結果が得られるはずです。

Bashスクリプトへの引数の渡し方

ターミナルでコマンドを実行する場合と、シェルスクリプトでコマンドを実行する場合の違いは、前者が対話的であるという点にあります。ターミナルでは、作業しながらその場で調整できます。たとえばexample_1.pdfを処理し終えて次のドキュメントに移るときは、ファイル名だけ変更すればコマンドを流用できます。

一方、シェルスクリプトは対話的ではありません。むしろ、シェルスクリプトが存在する唯一の理由は、人が付きっきりで世話をする必要をなくすためです。だからこそ、コマンド(およびそれを実行するシェルスクリプト)は引数を受け付けられるようになっています。

シェルスクリプトには、スクリプトの起動状態を反映するいくつかの定義済み変数が用意されています。最初の変数は$0で、スクリプトを起動するために発行されたコマンドそのものを表します。次の変数は$1で、シェルスクリプトに渡された最初の「引数」を表します。たとえばecho helloというコマンドでは、echo$0hello$1です。echo hello worldであれば、echo$0hello$1world$2となります。

対話型シェルでは次のように動作します。

$ echo hello world
hello world

非対話型のシェルスクリプトでも、ごく文字通りに同じことができます。テキストファイルに次の1行を記述し、hello.shという名前で保存してください。

echo hello world

そしてスクリプトを実行します。

$ bash hello.sh
hello world

確かに動きますが、スクリプトが入力を受け取れるという利点を活かせていません。hello.shを次のように書き換えてみましょう。

echo $1

複数の語を引用符でまとめて1つの引数にし、スクリプトを実行します。

$ bash hello.sh "hello bash"
hello bash

筆者のPDF圧縮プロジェクトでは、まさにこの種の非対話性が実際に必要でした。1件のPDFを処理するのに数分かかるからです。しかし入力を受け付けるスクリプトを作っておけば、複数のPDFファイルを一度に投入でき、スクリプトが順番に処理してくれます。全体で30分以上かかることもありますが、その30分間は他の作業に充てられる貴重な時間になります。

フロー制御

繰り返したいタスクを達成したときの手順を、そのまま文字起こししたようなBashスクリプトを作るのも、まったく問題ありません。ただし、情報の流れを制御できるようにすると、スクリプトはさらに強力になります。スクリプトのデータに対する応答を管理する一般的な方法は次のとおりです。

  • if/then 文
  • for ループ
  • while ループ
  • case 文

コンピュータは知的ではありませんが、データの比較や解析は得意です。スクリプトに少しでもデータ分析の仕組みを組み込めば、ぐっと賢く感じられるようになります。たとえば先ほどの基本的なhello.shは、表示すべき内容がなくても実行されてしまいます。

$ bash hello.sh foo
foo
$ bash hello.sh

$

入力がない場合にヘルプメッセージを表示してくれるほうが、はるかに親切でしょう。それを実現するのがif/then文です。Bashをごく基本的な使い方をしているだけだと、そんな構文が存在することすら気づかないかもしれません。しかしプログラミングとは言語を学ぶことであり、少し調べればif/then文について知ることができます。

if [ "$1" = "" ]; then
       echo "syntax: $0 WORD"
       echo "If you provide more than one word, enclose them in quotes."
else
       echo "$1"
fi

この新版のhello.shを実行すると、次のような結果になります。

$ bash hello.sh 
syntax: hello.sh WORD
If you provide more than one word, enclose them in quotes.
$ bash hello.sh "hello world"
hello world

スクリプトを書き進めるには

PDFファイルから画像を取り除きたいのか、散らかったダウンロードフォルダを整理したいのか、Kubernetesイメージの作成とプロビジョニングをしたいのか——目的が何であれ、Bashスクリプティングを習得するとは、まずBashを使ってみて、そこから単なるコマンドの羅列を、入力に応答できるものへと発展させる方法を学ぶことにほかなりません。これは通常、発見の連続となるプロセスです。テキストコマンドだけでこんなタスクがこなせるのだと想像もしなかった新しいLinuxコマンドに出会い、スクリプトをさまざまな実行方法に適応させるためのBashの新機能を見つけていくことになるでしょう。

こうしたテクニックを学ぶ一つの方法は、他人の書いたスクリプトを読むことです。人々が自分のシステム上で定型的なコマンドをどう自動化しているのか、感覚をつかんでください。自分に馴染みのある部分と馴染みのない部分を見分け、未知の部分についてはさらに詳しく調べてみましょう。

もう一つの方法は、私たちが提供している「Bashによるプログラミング入門」電子ブックをダウンロードすることです。Bash特有のプログラミング概念を紹介しており、そこで学んだ構造を組み合わせれば、自分だけのコマンドを作り始められます。もちろんダウンロードは無料で、Creative Commonsライセンスで公開されています。今すぐ入手してみてください。

Bashプログラミング入門 電子ブックをダウンロード!

  1. Clipchampの始め方|初心者向け動画編集の基本操作を徹底解説

    Clipchamp(クリップチャンプ)は、仕事用やSNS投稿用など、さまざまな目的の動画を誰でも手軽に作成できる動画編集ツールです。Microsoftが2021年に買収し、現在はWindows 10およびWindows 11ユーザー向けに無料で提供されています。当初はOffice 365への統合が予定されていましたが、方針が変更され、現在ではすべてのWindows 11デバイスに標準アプリとしてプリインストールされています。 Clipchampの特徴と料金プラン Clipchampは、ゼロからの動画制作に最適なツールです。チュートリアルやセールスプレゼンテーションといった長尺コンテンツの制作は

  2. Alexaスキルの作り方を徹底解説!Skill Blueprintsでオリジナルスキルを簡単に作成する方法

    Amazon Echoスマートスピーカーをお持ちなら、デジタルアシスタント「Alexa」はすでにおなじみのはず。Alexaは買い物リストの作成や音楽の再生、スマートホーム機器のコントロールだけでなく、実にさまざまなことができる優秀な音声アシスタントです。実は、想像以上に個人的なタスクまでサポートしてくれる頼もしい存在なんです。 さらに、「Amazon Skill Blueprints(スキルブループリント)」という機能を使えば、自分だけのAlexaスキルを作成することも可能。面白いジョークやクイズを作って、家族や友人との時間を盛り上げることができます。また、ToDoリストの作成や既存リストの編