プロンプトを出す。

ユーザに何か入力してもらうためにプロンプトを出したい。

プロンプトは出力に混じらないように標準エラー出力に出す。

$ cat sample
    ...
echo "Are you sure? " >&2
read ask

case $ask in
[Yy]) ... ;;
    ...

$ ./sample
Are you sure?
_

echo にそのままプロンプト文字列を渡すと、プロンプトなのに改行されてしまう。

改行の抑止

BSD
-n オプションを使う。
echo -n "Are you sure? "
SystemV 系
\c を表示する。
echo "Are you sure? \c"

どっちでも行けるようにするには、echo 自身にどっちの方法が使えるのか聞いてみればいい。

$ cat sample
    ...
if [ x`echo -n` = x ]; then
  ECHO_N='-n'
else
  ECHO_C='\c'
fi

echo $ECHO_N "Are you sure? $ECHO_C" >&2
read ask

case $ask in
[Yy]) ... ;;
    ...

$ ./sample
Are you sure? _

-n オプションの使えない echo なら、echo -n すると -n と出力される。

相手の確認

入力してくれる相手が人でない場合に、いちいちプロンプトを出しても仕方ない。*1

相手が端末でなければプロンプトを出さない。

    ...
[ -t 0 ] && echo $ECHO_N "Are you sure? $ECHO_C" >&2
read ask
    ...

まとめ

  • プロンプトは標準エラー出力に出す。
  • echo で改行しない方法には方言がある。
  • 相手は端末でなければプロンプトを出さない。

*1:そうとも言いきれないが ……