カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

ターミナルを使えてプログラミングできないなら、シェルスクリプトから始めよう

「黒い画面でバリバリ作業はできるのに、プログラミングとなるとちょっと・・・」みたいな人いますでしょうか。

grepとかcurlとかコマンドラインは得意なんだけど、オブジェクト思考とかメソッドとか変数とか抽象化とかそういうのになるとちょっと苦手という人。

そういう人こそ是非プログラミング学びましょう。この記事では、どうやっていくと心理的ハードルが低くなるかを書いていきます。

まずは動かす

まずは動けばよいでしょう。是非ローカルで実行してみてください。「bash ファイル名」とすれば実行できます。

#!/bin/bash

echo "hello, world"

hello, worldでも。

#!/bin/bash

grep "hogehoge" sample.txt

単なるgrepでもいいのです。とりあえず動かす。

終了ステータスを受け取って、if文で分岐

そしたら、次はちょっと込み入ったことをします。

#!/bin/bash

grep "hoge" sample.txt

exit_status=$?

if [ "${exit_status}" -eq 0 ]; then
  echo "match"
else
  echo "not match"
fi

$?を使うと直前のコマンドの終了ステータスを受け取れるので、grepが成功したかどうかわかります。grepの場合はマッチしたら0、マッチしなかったら1なので、上記のようにしています。

関数化する

もしマッチしているかどうかの判断を何回もしないといけなくなったらどうでしょう。よくある例として、メールの送信だったり、LBのコマンド叩いたり、SSHでコマンド叩いたりするような、何度も繰り返される場合です。

そのために関数を使いましょう。

#!/bin/bash

function grep_character() {
  local search_character="${1}"
  local file_name="${2}"

  echo "Search word: ${search_character}"

  grep "${search_character}" "${file_name}"
  EXIT_STATUS=$?

  if [ "${EXIT_STATUS}" -eq 0 ]; then
    echo "match"
  else
    echo "not match"
  fi
}


grep_character 'hoge' 'sample.txt'
grep_character 'hogehoge' 'sample.txt'

例外を追加する

では、grepする対象のファイルが存在しなかったらどうするのでしょう。 シェバンに-eつければできますが、ここではif文でちゃんとやってみましょう。

#!/bin/bash

function grep_character() {
  local search_character="${1}"
  local file_name="${2}"

  echo "Search word: ${search_character}"

  if [ ! -e "${file_name}" ]; then
    echo "not found: ${file_name}"
    exit 1
  fi


  grep "${search_character}" "${file_name}"
  EXIT_STATUS=$?

  if [ "${EXIT_STATUS}" -eq 0 ]; then
    echo "match"
  else
    echo "not match"
  fi
}


grep_character 'hoge' 'sample.txt'
grep_character 'hogehoge' 'sample.txt'
grep_character 'hogehoge' 'sample2.txt'

だいぶ長くなってきました。ひとまずこれで希望の挙動となるでしょう。 プログラミングに不慣れな人はまずここぐらいまではやってほしいのです。

まとめ

そして、こういうのを繰り返していくと、例外処理を一つ一つやっていくのめんどいとか、関数が増えすぎてファイルが大きくなってしまったとか、いつも使いまわす値があるからいい感じで使いまわしたいとか、色々欲がでてきます。

そうなったらRubyやPythonとか使えばいいと思うのです。もちろん、最初からそれらを使える人がいるならそれが一番よいでしょうが。

いずれにしても、少しずつやってみて、こうしたいという欲望が叶えられる言語を選び、よりスキルを磨いて経験を増やしていく。

ぜひぜひ小さなところから初めて、1, 2年経ったら色々身についているという状態を達成してほしいと思います。

シェルスクリプトの書き方はシェルスクリプトを書く際に気を付けていること8箇条や、定期実行スクリプトの綺麗なロギング3選に詳しく書いてますので、ぜひぜひ読んでみてください。

また、参考書としてはシェルスクリプト基本リファレンスがオススメなので、是非読んでみてください!

ではでは!