31
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

bash, zshでyes/no判定をするワンライナー

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

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
31
Help us understand the problem. What are the problem?