bashの機能いろいろ

2023/12/31に公開

シェルスクリプトを書いていると「それはbash独自機能だから」「POSIXシェルには無い機能だから」と言われることがよくあります。だいたいは「それみんな使ってるのでPOSIXで標準化されてると思った」といったものなのですが、本記事では便利なものから「え、それやるくらいならPythonでよくない?」まで、bashの機能を紹介しようと思います。

for文でC言語っぽくループを回す

シェルスクリプトでfor文といえばfor i in $(seq 10)とかをよく使いますが、bashだと以下のように書けます。

for ((i=1;i<=10;i++)) ; do
	echo "${i}"
done

POSIXシェルには無いのですけど、とくに手打ちするような場合は便利なので私はよく使います。

正規表現

以下のように書くと正規表現を使えます。

VAR=foo
if [[ "${VAR}" =~ fo ]] ; then
	echo matched
fi

稀に使うことがありますが、ほとんどの場合はgrepやsedでなんとかしちゃいます。bash組み込みの正規表現のほうがgrepやsedを呼び出すより高速でちょっとだけ見やすいですが、シェルスクリプトで速度を気にしなきゃいけない場面はほとんどないですし、可読性を気にするなら他の言語で書くほうがよいです。

配列

以下のように書くと配列を使えます。

array=("foo" "bar" "baz")
for e in "${array[@]}" ; do
	echo "${e}"
done

以下のようにすれば添え字を使ったアクセスもできます。

for i in "${!array[@]}" ; do
	echo "${array[i]}"
done

トイプログラム以外で使ったことはないです。これを使うくらいならPython使います。

map

以下のように書くとmapも使えます。

declare -A map=(["foo"]="hoge" ["bar"]="huga" ["baz"]="piyo")
for k in "${!map[@]}" ; do
	echo "${map[$k]}"
done

こちらもトイプログラム以外では使ったことないです。

おわりに

bashでできることは他にもたくさんあるので興味があればman bashを見てみてください。

Discussion