Linux Shell スクリプト入門:入出力と条件判定

read コマンドによる標準入力の処理

readコマンドは、標準入力から1行分のデータを読み取り、指定した変数に格納します。EOFに到達した場合は終了コードが1となり、それ以外は0となります。

主なオプション

  • -p "prompt":ユーザーに表示するプロンプト文を指定します。
  • -t 秒数:入力待ちのタイムアウト時間を秒単位で設定します。Time-out後は処理を中断します。

使用例

read username   # 変数 username に標準入力を格納
# 入力: acwing yxc
echo "$username"   # 出力: acwing yxc

read -p "名前を入力してください: " -t 15 username   # 15秒以内に入力必須
# 出力プロンプト後、入力: acwing yxc
echo "$username"   # 出力: acwing yxc

echo コマンドによる出力制御

echoは文字列や変数を出力する基本コマンドです。

基本的な出力方法

  • 通常文字列:引用符は任意。例:echo "hello" または echo hello
  • エスケープ処理:双引号内でのみ有効。-eオプションを付与することで有効化。

応用的な出力パターン

# 改行指定
echo -e "Top\nBottom"
# 出力:
# Top
# Bottom

# 行末で改行抑止(\c)
echo -e "同じ行へ\c"
echo "つなげて出力"
# 出力: 同じ行へつなげて出力

# 変数展開(双引号必須)
name="sato"
echo "氏名: $name"

# 展開・エスケープを無効化(単引号)
echo '$name\t`

# 出力: $name\t`

# コマンド結果の埋め込み
echo "現在時刻: $(date)"

printf コマンドによる柔軟なフォーマット出力

printfはC言語互換のフォーマット指定に基づく出力コマンドで、末尾に自動改行しません。

基本構文

printf "書式文字列" [引数...]

使用例

printf "%8d\n" 7     # 右詰めパディング(合計8桁)
printf "%-6.2f\n" 3.1415  # 左詰めパディング、小数点以下2桁
printf "氏名: %s, 年齢: %d\n" "tanaka" 25

# 式計算結果の埋め込み
printf "積: %d\n" $((4 * 7))     # 結果: 28
printf "和: %d\n" $(expr 12 + 8) # 結果: 20

条件判定:test コマンドと [] 構文

Shellでは「この条件を満たすか否か」をコマンドの終了ステータスで表現します。

  • 終了コード 0:真
  • 終了コード 非0:偽

論理演算子の動作原理

  • &&(論理積):左辺が偽なら右辺は評価されません(ショートサーキット)
  • ||(論理和):左辺が真なら右辺は評価されません

test コマンドによる比較とファイル判定

# 数値比較
test 5 -gt 3 && echo "真"   # 出力: 真
echo $?  # 終了コード:0

# ファイル存在確認
test -f data.log && echo "ファイルあり" || echo "ファイルなし"

# 各種ファイル属性チェック
test -r script.sh  && echo "読み込み可能"
test -x script.sh  && echo "実行可能"
test -d logs       && echo "ディレクトリ"

等価な [] 構文(POSIX準拠)

[ -f example.txt ] && echo "ファイル存在"
[ "abc" = "abc" ]  && echo "一致"
[ 10 -ge 5 ]      && echo "10は5以上"

ファイル判定の代表的なオプション

オプション意味
-eファイルまたはディレクトリの存在確認
-f通常ファイルかどうか
-dディレクトリかどうか
-r読み込み権限があるか
-w書き込み権限があるか
-x実行権限があるか
-s空でないサイズがあるか(サイズ > 0)

タグ: linux Shell read echo printf

5月18日 21:44 投稿