Bash

Commands

test

test はその構文糖である [ ] で記述することも多いが、このブラケットもコマンドなので前の句やブラケットの内側に空白を空ける必要があることに留意。
  • [ 1 -eq 1 ] - 数値が等しい。
  • [ "$target_toml" = "NOT_SPECIFIED" ] - 文字列が等しい。
  • [ -n "$var" ] - 文字列の長さが 0 でない。
  • [ -z "$var" ] - 文字列の長さが 0 である。
  • [ -f "$target_toml" ] - 存在する通常ファイルである。
  • [ ! -f "$target_toml" ] - 存在する通常ファイルではない。

Snippets

そのシェルスクリプトがあるディレクトリの絶対パスを取得

コマンド置換 $( ... ) 内部はサブシェルで実行されるので、この中で cd しても外側のシェルには影響しない (移動する必要がある場合は別途 cdpushd をする)。

script_dir="$(cd "$(dirname "$0")" && pwd)"

特定の文字列を含むテキストファイルを検索


grep ',=""' docs/articles/*.html

コマンドライン引数のデフォルト値を設定

${引数番号:-デフォルト値} で設定する (- は初期値の一部ではないので注意)。

#!/bin/bash
target_toml="${1:-NOT_SPECIFIED}"  # 指定されなければ NOT_SPECIFIED
action="${2:-NOT_SPECIFIED}"  # 指定されなければ NOT_SPECIFIED

キー入力を待つ

続行するかどうかを選択させる例。。

#!/usr/bin/bash
read -p '続行しますか? (y/n): ' ans
[ "$ans" = 'y' ] || { echo '中止します'; exit 0; }
echo '続行します'
選択肢に手動で記号を割り当てて選択させる例。

#!/usr/bin/bash
echo "/c/Users/Cookie/.bashrc への操作を選択してください"
read -p "l=ローカルを登録, s=ソースを適用 > " key
case "$key" in
  l)
    echo "ローカルを登録します"
    ;;
  s)
    echo "ソースを適用します"
    ;;
esac

/c/Users/Cookie/.bashrc への操作を選択してください
l=ローカルを登録, s=ソースを適用 > l
ローカルを登録します
選択肢に自動で番号を割り当てて選択させる例 (select はリストの各要素に番号を割り当てて表示し、ユーザ入力を待機し、ユーザ入力に対応する要素を変数に代入することを繰り返す)。

#!/usr/bin/bash
echo "/c/Users/Cookie/.bashrc への操作を選択してください"
select key in "ローカルを登録" "ソースを適用"; do
  case "$key" in
    "ローカルを登録")
      echo "ローカルを登録します"
      break ;;
    "ソースを適用")
      echo "ソースを適用します"
      break ;;
    *)
      echo "入力が無効です"
      ;;
  esac
done

/c/Users/Cookie/.bashrc への操作を選択してください
1) ローカルを登録
2) ソースを適用
#? 3
入力が無効です
#? 2
ソースを適用します

重複排除してソート

-u で重複排除する。

#!/bin/bash
fruits=(
  "banana"
  "apple"
  "banana"
  "lemon"
  "apple"
)
fruits=($(for v in "${fruits[@]}"; do echo "$v"; done | sort -u ))
for fruit in "${fruits[@]}"; do
  echo $fruit
done

apple
banana
lemon

キーを指定して数値降順にソート

-k 2 -t @@ をデリミタとして 2 列目をキーとする。-n -r で数値降順にソートする。

#!/bin/bash
members=(
  "Taro=engineer@35"
  "Jiro=dentist@30"
  "Saburo=lawyer@25"
  "Shiro=chef@40"
)
members=($(
  for v in "${members[@]}"; do
    echo "$v"
  done | sort -k 2 -t @ -n -r
))
for member in "${members[@]:0:3}"; do
  name=${member%=*}
  occupation=${member#*=}
  occupation=${occupation%@*}
  age=${member#*@}
  echo $name $occupation $age
done

Shiro chef 40
Taro engineer 35
Jiro dentist 30

正規表現マッチ

[[ ... =~ ... ]] で正規表現マッチを判定できる。

#!/bin/bash
command="bash -c 'source ~/.claude/scripts/ask.sh' 1"
pattern="^bash -c 'source ~/\.claude/scripts/ask\.sh'"
if [[ "$command" =~ $pattern ]]; then
  echo "OK"
else
  echo "NG"
fi

OK