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) |