bash
case文分岐
ググるとよく出てくるやつです。
bashでyN聞く(基本型)
read -p "ok? (y/N): " yn
case "$yn" in
[yY]*) echo hello;;
*) echo "abort";;
esac
bashでyN聞く(ワンライナー)
read -p "ok? (y/N): " yn; case "$yn" in [yY]*) echo hello;; *) echo "abort";; esac
'yno'とか受け付けると、一文字目がyなのでhelloが出力されます。
参考: シェルスクリプトでY又Nの入力のみ受け付ける機能を作る
参考: BASHシェルスクリプトで「キー入力待ち」プロンプトを実装する
入力受付一文字のみ
一文字だけ、yとかnとか押したら即座に次に進んでほしいとき、readコマンドのオプション-nを使用します。
Enterだけ押すと$yn
の中が空になるので、abortと表示されます。
bashでyN聞く(入力1文字だけ)
read -n1 -p "ok? (y/N): " yn; case "$yn" in [yY]*) echo hello;; *) echo "abort";; esac
if文分岐
テストコマンド[
をダブルで使う、つまり[[
が重要です。
bashでyN聞く(if文を使う)
read -n1 -p "ok? (y/N): " yn
if [[ $yn = [yY] ]]; then
echo hello
else
echo abort
fi
bashでyN聞く(if文を使うワンライナー)
read -n1 -p "ok? (y/N): " yn; if [[ $yn = [yY] ]]; then echo hello; else echo abort; fi
if then
は &&
else
は ||
に置き換えられるので、下のようにして更に短くできます。
これが一番短くて良いと思います。
bashでyN聞く(testコマンドを使うワンライナー)
read -n1 -p "ok? (y/N): " yn; [[ $yn = [yY] ]] && echo hello || echo abort
チルダを使ってもyとYをまとめて判定してくれます。
bashでyN聞く(testコマンドとチルダを使うワンライナー)
read -n1 -p "ok? (y/N): " yn; [[ $yn =~ y|Y ]] && echo hello || echo abort
参考: bashでif に正規表現を使った文字列マッチ条件分岐
zsh
zshでy/Nを聞く場合はよりシンプルです。
変数を用意する必要もなければ、プロンプト表示オプション-p
もありません。
if
ステートでread -q
を書くだけで一文字bashのread -n1
とcaseによる条件分岐と同じ意味になってくれます。
zshでyN聞く(基本型)
echo "ok?(y/N): "
if read -q; then
echo hello
else
echo abort
fi
zshでyN聞く(ワンライナー)
echo "ok?(y/N): "; if read -q; then; echo hello; else echo abort; fi
if then
を&&
, else
を||
に置き換えれば更にシンプルになります。
zshでyN聞く(if文を使わないワンライナー)
echo "ok?(y/N): "; read -q && echo hello || echo abort