シェルスクリプトでのメッセージ出力

シェルスクリプトでのメッセージ出力についてのメモ書きです。*1 シェルに依存する部分については、必要に応じて読み替えてください。
(参考:バッチファイルでのメッセージ出力)

echoコマンド
  • メッセージ出力には、echoコマンドを使う。
  • echoコマンドの出力先は、標準出力となる。
  • 「echo -n」とすることで、改行されなくなる。
  • 空行を出力する場合は、文字列指定なしでechoコマンドを実行する。
  • echoコマンドの出力文字列は、引用符(一重・二重)で囲むこともできる。*2
  • 特殊文字を出力する場合は、文字列を引用符(一重・二重)で囲み、特殊文字を「\」でエスケープする。(「\\」、「\n」、「\t」など) *3
#!/bin/sh

# 通常
echo メッセージ

# 改行しない
echo -n あいう
echo えお

# 空行
echo

# 引用符付き
echo '一重引用符で囲まれた文字列'
echo "二重引用符で囲まれた文字列"

# 特殊文字のエスケープ (シェルによっては-eが必要)
echo "ABC\tDEF"
#echo -e "ABC\tDEF"
一時停止
  • 一時停止には、readコマンドを使用する。
  • 適当な変数に、入力を読み込む。
#!/bin/sh

# 一時停止
echo -n "何かキーを押すと終了します..."
read x
ユーザ入力
  • readコマンドを使うことにより、ユーザが入力した文字列を変数にセットできる。
  • ユーザにメッセージを表示する場合は、readコマンドの前にechoコマンドを実行する。
#!/bin/sh

# ユーザ入力
echo -n "Yes or No? (y/n): "
read yn

# 入力値の判定
echo -n "答え: "
if [ "${yn}" = "Y" -o "${yn}" = "y" ]
then
    echo Yes
else
    echo No
fi
標準エラー出力
  • 標準エラー出力にメッセージを出力する場合は、echoコマンドとリダイレクトを組み合わせる。*4
  • コマンドを括弧で囲むことにより、複数コマンドの出力をまとめてリダイレクトできる。*5
#!/bin/sh

# 標準エラー出力 (1行)
echo メッセージ1 1>&2

# 標準エラー出力 (複数行)
(
    echo メッセージ2
    echo メッセージ3
    echo メッセージ4
) 1>&2

*1:Ubuntu 8.04(/bin/dash)で確認しました。

*2:一重引用符か二重引用符かによって変数展開などの挙動が変わります。シェル一般の話なので、詳細は省略します。

*3:シェルによっては「-e」が必要です。

*4:リダイレクトの表記は、シェルに依存します。

*5:「)」と「1>&2」の間では改行する場合は、行末に継続行を示す「\」を記述します。