やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Bashで確認用関数Confirmを書いた

readコマンドを使って。

成果物

使い方

  1. ファイルロード (source / .)
. Confirm.sh
  1. 関数呼出
Confirm yN- 質問文 "echo YES!!" "echo NO..."
  1. 表示
質問文 (y/N): 
  1. 選択&実行
質問文 (y/N): y
YES!!

関数の書式

Confirm type message [action ...]

type

type 表示
yn ([y]es [n]o)
ync ([y]es [n]o [c]ancel)
oc ([o]k [c]ancel)
o ([o]k)

短縮形

type 表示
yn- (y/n)
ync- (y/n/c)
oc- (o/c)
o- (o)

末尾にハイフンを付与すると短縮形になる。

大文字

y,n,o,cはそれぞれ大文字にできる。どの組合せでもOK。例えば以下のような。

type 表示
yN- (y/N)
Yn- (Y/n)
oC- (o/C)
YNC ([Y]es [N]o [C]ancel)

実行

[action ...]

Confirm oC- "実行するよ?" "{ echo 実行した!; echo 複数行もOK!; }" "echo やっぱやめた..."

選択後、任意の処理を実行できる。実行したい文を文字列で渡すとevalコマンドでそれを実行する。引数順はtypeの文字順に対応する。

actionは何も指定しなくてもいい。この場合、returnで選択値を判別できる。

Confirm oC- "実行するよ?"

return

戻り値(返り値)を取得できる。値は0から始まる選択した文字のインデックス。(typeyNのときy入力なら0, Nなら1

Confirm yN- "どうする?"
a=$?
[ 0 -eq $a] && { echo YES; echo YES; }
[ 1 -eq $a] && { echo NO; echo NO; }

$?で終了コードを取得できる。(関数実行後、すぐ変数に代入すること。さもなくば値が上書きされてしまう)

もちろんactionが設定されていても取得可能。

readコマンドじゃダメなの?

read -n1 -p "どうする? (y/n/c): " answer
[ 'y' = "$anser" ] && echo YES
[ 'n' = "$anser" ] && echo NO
[ 'c' = "$anser" ] && echo CANCEL

y,n,c以外の値が入力されたときループして欲しい。でも、してくれない。while文で書いたら汎用化したくなる。

細かいことを言えば以下もある。

  • 実行文とあわせて一行で書けない
  • 引数が暗号じみている
  • グローバル変数が必要
  • 質問文とif文のy,n,o,c記述ミスしそう