read
コマンドを使って。
成果物
使い方
- ファイルロード (
source
/.
)
. Confirm.sh
- 関数呼出
Confirm yN- 質問文 "echo YES!!" "echo NO..."
- 表示
質問文 (y/N):
- 選択&実行
質問文 (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から始まる選択した文字のインデックス。(type
がyN
のとき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
記述ミスしそう