シェルスクリプトについて学んでみる

今日の18時にお客様と技術面談があるんですけど
僕、シェルスクリプト書いたことないんですよね。
ただ、今日の面談で絶対に話題になるキーワードなので「へー、そういうのもあるんですね」とは

何があっても言うわけには行かない。
じゃあ、勉強しましょう!

そもそも、シェルスクリプトって何か

シェルが何かも分かっていないので、調べ方も下手くそかと存じますが
調べてみました!

シェルスクリプトとは
・UNIXコマンドを並べて実行するだけのスクリプト
多くの記事で、この文字を見かけるんですけど個人的には
実行時に毎回処理を記述しなくても、ある程度実行する処理が確定しているのであれば
予め1つのタスクにしておきましょう。と言うものかな?と認識しました。

シェルスクリプトの中で変数を定義したり、シェル実行時に引数を渡して実行する事ができる。
そのため、引数を渡してSQL文を作成したり、メールテンプレートの作成などが作れたりしそうだなと思いました。

シェルスクリプトのお約束
・シェルスクリプトファイルは通常は.shの拡張子で作成します。
※調べると、特に無いとダメというわけでは無い。ただテキストファイルなどで編集する際に拡張子は必須

・実際のコードを書く前に最初の一行目は #!/bin/shを書き、
システムにこれからシェルスクリプトを書きますようと知らせるものです。
※試してみましたが、実際これが無いと動作しないという訳ではなかったです。

・実行権限の付与

chmod u+x ファイル名.sh

上記のように、作成したシェルスクリプトには所有権(u)と実行権限(x)を付与しましょう。
※余談ですが、chmodはパーミッション(権限)を設定するコマンドです。
chmod(権限変更)について知りたい方は下記が参考になるかと存じます。
パーミッションなどを設定する!chmodコマンドの詳細まとめ【Linuxコマンド集】

実際に書いてみよう

シェルスクリプトに関してざっと知れたので、実際に書いてみましょう。
プログラミング言語とかでも、
そうですけど一度書いた処理って数日後に再度見返すと処理を追うのに少し時間が掛かりますよね。

そういった、無駄とも言える時間を削減するためにも
自分で書いた処理には、コメントを記載してあげる事が、
この後、入社される方や引き継ぐ方のためにもなるかと存じます。

コメントの記述方法

コメントの書き方はRuby言語を触った事がある方なら馴染みやすいかと存じますが
#←これです。
ただ、これだと行頭に必ず#を記述しなければならず、改行をするのが
嫌になってしまいますよね。

シェルスクリプトでの複数行のコメントアウトのやり方は以下のようです。

<< COMMENTOUT
echo "出力されません"
COMMENTOUT

インデントが気持ち悪いことになりそうだなって思うけど、
これは慣れるまでの時間が解決してくれそうですね。。。

シェルスクリプト実行時に入力と出力をする

インタプリタだと、入力を求める処理も実行したい時ありますよね。
まさに僕がシェルスクリプトに期待してるのが、入力して、入力した内容によって処理を
分岐することにあるので、これが出来てくれないと、学習する意味が思いつきません。

何かプログラミング言語を触った事がある方なら、共通してるのではないかなと存じますが
出力は[ echo ] 入力は[ read ]になります。

出力は、僕のメイン開発言語がPHPになるので、
ターミナル上でインタプリタで使う機会が少なく入力を求めるのは、
これまでフロント部分のJSにて対応をしておりましたので、慣れませんが
インタプリタでは、readなんですね。

read Sample←$はつけないことに注目
echo ${$Sample}←出力する際には$をつける

処理としては、上記のように使うみたいです。
入力を求める処理は入力を求めることしかしないんですね。
さすが、スクリプト言語。
シンプルで分かりやすいですね。

上で、さりげなく使ってますけど$Sample←変数です。
※シェルスクリプトでは、定数も定義できるが下記のように記述する必要がある。

readonly 定数名=値

readonlyが見慣れなかっただけで、constとかと書き方は一緒ですね。
ただこのreadonly少しプログラミグで使う定数とは違った使い方もできるみたいで

readonly 定数名

値を代入しなくても定数にできる
他のプログラミング言語の場合は、定数を作成する時必ず初期値で値を代入する必要がありますが
シェルスクリプトなら、readonlyとする前の段階で変数として使い回しをして
一定の箇所から定数として扱うことも出来そうですね。

特別な変数

これが、理解が追いついていないのですが
シェルスクリプトでは以下の特別な変数があるようです。

変数機能
$0スクリプト名
$1 ~ $9引数、1番目の引数を$1、2番目の引数を$2でアクセスする
$#スクリプトに与えた引数の数
$*全部の引数をまとめて1つとして処理
$@全部の引数を個別として処理
$?直前実行したコマンドの終了値(0は成功、1は失敗)
$$このシェルスクリプトのプロセスID
$!最後に実行したバックグラウンドプロセスID

上は、実際に使いながら覚えるとして、今はふーんって感じに思うようにします。

最後に

この記事を書いた目的は、お客様と話をするためだけの学習が目的だったのですが
シェルって学んでみると面白いですね。

書いてる最中に、git statusで差分確認して拡張子が特定の拡張子のファイルのみpushする
シェルとか作ったら、コミットまで自動化できるなとか、使い道があるかは別として
普段めんどくさいなって感じる処理は、シェルでまとめていく癖をつけないとまずいなぁ。。。
時間が結構短縮できそう。

後、シェル実行時に引数の指定方法を探していたんですけど

./ファイル名.sh 1番目の引数 2番目の引数 3番目の引数

上記のように、半角スペースで間隔をあけてあげれば、良いみたいですね。

echo "\$0(スクリプト名): $0"
echo "\$1(1番目の引数): $1"
echo "\$2(2番目の引数): $2"

上記出力参考例

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA