シェルスクリプトについてすこし学んだ

「今年はインフラやデプロイやシェルスクリプトはできなくていい」とはいったものの、ある人のスクリプトがたしかに便利でいい感じだった。ので、ちょっと触発されて少しだけかいて学んだ。以下、簡単なメモ。

[改訂新版] シェルスクリプト基本リファレンス  ??#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

[改訂新版] シェルスクリプト基本リファレンス  ??#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

最速文法的な

まあググるといいけど。以下、コメントにかく

# 宣言時はなにもつけない
a='hoge'
# 使用するときは $a と $ をつける
# 変数を展開するときはダブルクォーテーション
echo "$a"
# 変数を展開しないときはシングルクォート
echo '$a'

ここまではまあいいとして、if の [ の実態や () や $ のつかわれかたがまちまちでかなり混乱してた。メモ。

# if のあとの [ ] の実態は test コマンド
# test のエイリアスが [
# [ コマンドの最終引数が ] だと test コマンドの終了を意味する
if [ -f ~/path/to/file ]; then
  echo 'hoge'
fi
# なので以下と同等
if [ -f ~/path/to/file ]
  then
  echo 'hoge'
fi
# [[ ... ]] も test コマンドとして似たような挙動をするけど、判定や終了コードの扱いが若干違う
# {} は関数定義などのブロック
# 関数定義
func (){...}
# (()) は算術式。そのなかで定義された変数はローカル変数として扱える
# () はサブシェル。コマンドをまとめるときにつかう
# 関数定義の () とは違う
# 絶対パスを求める。 dirname $0 は相対パスになってしまうため
BASE_DIR=$(cd $(dirname $0); pwd)
# 関数定義で引数を使うときは $@ で可変長引数、 $1, $2 などで参照する
# ${hoge:~/path/to/file}ってのはなんかこうラベルを貼った参照?あまりよくわからない

[[]] について if 文と test コマンド - UNIX & Linux コマンド・シェルスクリプト リファレンス

まあ

あんまりまだちゃんとできなくていいけど、ちょっとしたときに使える武器はほしい。実際簡単なスクリプトをつくったけど、なかなか便利だった。