bashでコマンドライン引数を扱う

Rust用のコンプロディレクトリを整備する際に、シェルスクリプトからコマンドライン引数を読み込みたかったのでメモっとく。

スクリプト実行時のコマンド名: $0

#!/bin/bash

echo ${0}

実行例

$ bash hoge.sh
hoge.sh
$ ./hoge.sh
./hoge.sh

これを応用し、実行したスクリプトの絶対パスを取得するワンライナーがある。
スクリプトの配置場所を起点として何らかの作業を自動化したい時などに、非常に重宝する。

#!/bin/bash

readonly SCRIPT_ROOT=$(cd $(dirname ${0}); pwd)
echo ${SCRIPT_ROOT}

実行例

$ ./hoge.sh
/home/guri/workspace

n個目の引数: $n

例えば3つの引数を渡されたときにしか実行したくない、みたいなスクリプトは以下のようになる。

#!/bin/bash

# $# には実際に渡されたコマンドライン引数の数が格納される
if [ ${#} -ne 3 ]; then
    echo "Error: expect arguments is 3."
    exit 1
fi

echo "${1} ${2} ${3}"

実行例

$ ./hoge.sh  aho boke kasu
aho boke kasu