自転車とプログラミング

元自転車メーカーのマーケター、今は自社開発企業に勤めるエンジニアが主にプログラミングの話を書きます。

bashの()と[]と{}

職場でシェルスクリプトリファクタリングが回ってきたが思ったより読めず書けずで苦戦中。

スクールではそれほど書くこともなかったし、Linuxやシェルを学習したのももう何年も前のことだったので学び直しをしています。

色んなカッコに触れたので調べてみました

()

サブシェル

()内のコマンドがサブシェル、つまり子シェルを作って別プロセスで動作するようになります。 サブシェルで実行された処理は親シェルとは別スコープとなります。

(cd /tmp; ls)  # 一時的に /tmp にディレクトリを変更して ls を実行
echo $PWD      # 元のディレクトリに戻っている

配列

配列の定義も()を使います。

array=(1 2 3 4 5)
echo ${array[0]}  # 配列の最初の要素を表示

配列のインデックス指定

↑で使っている通り配列のインデックス指定で使います。

条件式の検証

if文で用いる条件式の検証でを使用します。

if [ -f xxx/xxx ]; then
  echo zzz
fi

拡張構文で[]というのもあります。 と比較して

  • 変数の引用符が不要
  • [[]]の中に複数条件がかける
  • ワイルドカードやパターンマッチングによる検証ができる

と、優れています。

if [[ -f /etc/passwd && -r /etc/passwd ]]; then
    echo "/etc/passwd exists and is readable."
fi

{}

コマンドグループ

コマンドをグループ化して同一シェルで実行します

{ echo “abc”; echo “def” }

変数展開

変数を展開するために使います。 {}を使うことで後続の文字列や要素との曖昧さを回避することができます。 また、{}を使った変数展開の機能として

  • デフォルト値指定
  • 文字数切り取り
  • パターン置換

などができます。

範囲展開

レンジ(範囲)の表示も可能です。

echo {1..5}
→1 2 3 4 5

ブレース展開

パターンによる展開ができます

echo {a,b,c}.txt  # a.txt b.txt c.txt と表示

shell奥深し

bashがあれば使えるシェルスクリプトは使い道が多そうな気がしてます。復習してよかったです。