Paepoi

Paepoi » ShellScript Tips » ShellScript Tips | 入力

ShellScript Tips | 入力

# 最終更新日 2020.09.13

標準入力
シェルで標準入力から読み込んだりファイルを読む場合は read コマンドを使います。
bash zsh 共通で基本は以下。
#!/bin/sh

read anser
echo 入力されたのは $anser です
通常は以下のようにプロンプトを出して入力を促すと思います。
ただし macOS では sh で bash を起動すると -n オプションが反映されない。
必ず bash test.sh のように明確に指定してください。
#!/bin/sh

# プロンプトを bash zsh 共通にしたい場合こういう手段がある
echo -n '> ' ; read anser
echo 入力されたのは $anser です

# bash のみ
read -p '> ' abash
echo $abash

# zsh の場合は ? を使う、ただしエスケープしないといけない
read zsh_a\?'> '
echo $zsh_a
# 又は全体をダブルクオートで囲む
read "zsh_b?> "
echo $zsh_b

オプション
オプションbashzsh
エスケープ文字の無効化-r同じ
入力を表示しない-s同じ
タイムアウトを秒で指定-t[num]同じ
入力の終了を改行ではなく char にする-d[char]同じ
指定文字数入力-n[num]-k[num]
y が押された場合以外は n 無し-q

他にもオプションはあるけど使わないと思う。

YN 判定
bash
#!/bin/bash

# Y か N が押されるまでループ
# 大文字小文字を区別しない
 
while :; do
    echo -n 'スズキのバイクはかっこいい? (Y|N)' ; read -n1 yn
    echo
    case $yn in
        Y|y) echo "キミもかっこいいよ" ; break ;;
        N|n) echo "死ねよブタ野郎" ; break ;;
    esac
done
zsh
#!/bin/zsh

# y 又は Y が押された場合以外は全部 n になる確認
# ループしたい場合は上記 bash コードを -k オプションに書き換え

echo -n 'スズキの車は素敵? (Y|N)' ; read -q yn
echo
case $yn in
    y) echo "あなたもも素敵ですよ" ;;
    n) echo "おまえのカーチャン出べそ" ;;
esac

# -q オプションは y 以外では終了コードが 1 になるのを利用する手段もある
echo -n 'スズキの湯呑み欲しい? (Y|N)' ; read -q && echo "\nですよね" || echo "\nそう..."

ファイルの読み込み
以下のようにすればファイルの中身を一行ずつ処理できます。
これも macOS では sh で起動すると正しく動かないので注意。
文字列中の \n を改行と見なしたりでワケワカメになります。
#!/bin/bash

while read -r line; do
    echo in: $line
done < input.txt

zsh では -E オプションを付けないと同じようになる。
#!/bin/zsh

while read -r line; do
    echo -E in: $line
done < input.txt

パイプ入力との振り分け
#!/bin/sh

# stdin のファイルディスクリプタはゼロ

if [ -t 0 ]; then
    echo 何か入力してください
    read text
    echo $text が入力されました
else
    echo パイプから以下を受け取りました
    while read line; do
        echo $line
    done
fi

Copyright(C) sasakima-nao All rights reserved 2002 --- 2024.