Paepoi » ShellScript Tips » ShellScript Tips | 入力
ShellScript Tips | 入力
# 最終更新日 2020.09.13
bash zsh 共通で基本は以下。
ただし macOS では sh で bash を起動すると -n オプションが反映されない。
必ず bash test.sh のように明確に指定してください。
他にもオプションはあるけど使わないと思う。
これも macOS では sh で起動すると正しく動かないので注意。
文字列中の \n を改行と見なしたりでワケワカメになります。
zsh では -E オプションを付けないと同じようになる。
標準入力
シェルで標準入力から読み込んだりファイルを読む場合は 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
オプション
オプション | bash | zsh |
---|---|---|
エスケープ文字の無効化 | -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 donezsh
#!/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.