シェルスクリプトの本を読んでシェルを書いてみた
「シェルスクリプト 基本リファレンス」の本について
今回、読んでみた本は以下の「シェルスクリプト 基本リファレンス」だ。
[改訂新版] シェルスクリプト基本リファレンス ??#!/bin/shで、ここまでできる (WEB+DB PRESS plus)
- 作者: 山森丈範
- 出版社/メーカー: 技術評論社
- 発売日: 2011/04/27
- メディア: 単行本(ソフトカバー)
- 購入: 9人 クリック: 119回
- この商品を含むブログ (9件) を見る
総評
まず対象としてる読者はLinux で基本的なコマンド(ls, cp, mv など)を使うことができる人となっているが、 一から説明してるので初心者でも大丈夫だ。
内容としてはBシェル系、Cシェル系の違いや「#!/bin/sh」の説明など基本的なことから、 シェルの文法、シェルのコマンドなど基礎的な事柄をしっかり説明している。 ノウハウなど一部、実践的なことも書いてある。
総評としてはシェルを書き慣れていない人にはオススメの一冊である! 是非とも読んでみてほしい。
シェルスクリプト解説
#!/bin/sh, #!/bin/bash の意味
正直、シェルスクリプトの一行目に「#!/bin/sh」を書くのは慣例だと思っていた。 が、違った!ちゃんと意味があった。
単純に言えばシェルスクリプトに何を使うか、だ。
#!/bin/sh
と書くと、Bourne Shell が使われる。 「#!/bin/bash」ならBourne-Again shell だ。bash のほうがsh より高機能。
では、ターミナルを開いたときにどのシェルと使ってるかは以下のコマンドで調べられる。
echo $SHELL
パラメータ展開
パラメータは$をつけることで表される。 主なところはこんな感じだ。
書き方 | 説明 |
---|---|
"{$HOME}" | 変数の値を参照 |
"$1","$2",.. | シェルスクリプト、シェル関数の引数を参照 |
$0 | シェルスクリプト名を参照 |
"$@" | シェルクリプト、シェル関数の引数全てを参照 |
$# | シェルスクリプトの引数の個数 |
$? | 直前のコマンドの終了ステータスを参照 |
ついでにダブルクォートで囲んでいるのは パラメータ展開をしたあとの文字列をパラメータ展開などを行わずに 文字列として展開することを示している。
例えば
file=* echo $file # 現在のディレクトリの全ファイル、フォルダが表示 echo "$file" # * が表示
のように、ダブルクォートで参照した文字列を再度、展開することを避けてくれる。
$#,$?などは数字の文字列が返ってきて、パラメータ展開などされる心配がないので、 ダブルクォートで囲んでいない。
シングルクォート、ダブルクォート、バックスラッシュ、バッククォートの違い
正直これはこの本を読むまで全く分からなかった。 これが分かっただけでもこの本を読む価値がある。
ここでは簡単なまとめを表にする。
パラメータ展開 | コマンド置換 | 説明 | |
---|---|---|---|
シングルクォート | × | × | 文字通りの意味として解釈される |
ダブルクォート | ○ | ○(``で囲む) | $,`,\ の特殊文字が解釈される |
バックスラッシュ | - | - | 次の文字が特殊な意味を失う |
バッククォート | × | ○ | 囲まれた部分がコマンドとして実行される |
echo '$HOME' # $HOME echo "$HOME" # /home/aha_oretama echo \$0 # $0 echo `expr 1 + 1` # 2
役立つテンプレート
他の人のシェルを見てると使い方、初期チェックなど お決まりの定型句があるように見えるが、 その定型句が人によってバラバラだったので全然覚えられなかった。
ここでは自分が一番良いと思った定型句を書く。
#!/bin/sh ← 何のシェルスクリプトを使うかを指定 # 使い方を指定 usage () { cat <<EOT Usage: "$0" [-o outputPath] targetFile Description: Unzip file. File extension includes .tar .tar.gz .tar.Z .tar.bz2 .zip Options: -o output-directory EOT ## ヒアドキュメントで記載 ## <<HOGEで始まり、次にHOGEが出るまでヒアドキュメントとなる exit 1 } # オプションの設定 # o: のようにコロンはオプションに引数があることを示す while getopts ho: option do case $option in o) OUTPUT_PATH="$OPTARG" ;; h) usage ;; \?) usage ;; esac done # オプションを除く shift `expr "$OPTIND" - 1` # オプション以外の引数を確認 if [ $# -lt 1 ]; then usage fi
最後に
この本はシェルスクリプトを学びたい人にとっては 基礎を固める最良の本となる。
この本を読んで作った簡単なUtil シェルを GitHub にあげたのでぜひ参考にしてほしい。