• ベストアンサー

Kシェルのreadコマンドについての質問。

Kシェルのreadコマンドについての質問。 簡単なサンプルですが、以下のように動作させたいのですが、 readコマンドが無視(動作しない)されております。 while read line do echo $line read ans  <--- 実行しても入力を求められない状況です。 echo $ans done < ./xxx 何かご存知でしたら、ご教授下さい。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4845/10255)
回答No.3

入力リダイレクトやパイプ入力で、標準入力が端末でなくなっているから、readを実行しても、標準入力から読むだけで、端末からは読まない。 というのが問題点ということですよね。 exec 3<&0 # 3番に標準入力(この時点では端末)をコピー while read line #標準入力(リダイレクトされているのでファイルxxx)から読む do echo $line read ans <&3 # 3番つまり端末から入力 echo $ans done < xxx

zuraoyaji
質問者

お礼

回答していただき、有難うございます。 上記内容にて、実行させて頂いたところ、readコマンドが使用できるようになりました。 (3番に標準入力では、エラーとなり、1番、2番に標準入力ではOKでした。) 以上、親切に回答していただき有難うございました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

いや, パイプでも同じだってば.... 入力リダイレクトもパイプも「標準入力を切り替える」という点では同じ.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

リダイレクトしてるからだったりして.

zuraoyaji
質問者

補足

早速の回答有難うございます。 以下のようにリダイレクトを使用しなくても 同じ結果になってしまいます。 cat ./aaa | while read line do echo $line read ans echo $ans done 尚、処理的にはbreakコマンドを使用して、loopを抜ければ回避はできるのですが…

関連するQ&A

  • Kシェルが動作しない。

    Kシェルが動作しない。 以下シェル自体ですが、単体では動作するのですが、メインのシェルから呼び出すと動作しなくなります。 動作しない条件としては、子シェルがメインシェルのwhile文の中に入れていると無限ループ???してしまいます。(for文やそれ以外では動作します。) なにかご存知でしたら、ご教授願います。 ・子シェル(Yes or Noを入力するまで無限ループする) #!/bin/ksh answer= echo "Do you add xxxx ? ---> [y/n]\c" while : do if [ "`echo -n`" = "-n" ]; then echo "$@\c" else echo -n "\@" fi read answer case "${answer}" in [yY] | yes | YES | Yes ) return 0 ;; [nN] | no | NO | No ) return 1 ;; * ) echo "Please enter y or n." ;; esac done ・メインシェル #!/bin/ksh while read line do /xxx/子シェル.ksh done < /xxx/zzz.txt 分かりづらいかも知れませんが、ご容赦願います。

  • メニュー画面よりコマンド実行して結果表示する

    シェルスクリプトでメニュー選択画面より選択してコマンドを実行して結果を表示する。 エンターキーを押して再度メニューに戻る。 そういうスクリプト作成したいのですがうまくいきません。 下記では何が誤っていて不足しているのでしょうか? 正しい構文を教えて下さい。 ・・・誤りばかりと思いますがすいません。 #!/bin/bash PS3="メニューを選択して下さい。" select ans in "$ans1" "$ans2" "$ans3" "終了!"; do $ans1="ifconfig" $ans2="df " $ans3="netstat " if [ -z "$ans1" ]; then echo " $ans1." read ifconfig clear; while :; do echo -n "^[[1;1H"; ifconfig ; sleep 1; done if [ -z "$ans2" ]; then echo " $ans2." read df clear; while :; do echo -n "^[[1;1H"; df ; sleep 1; done if [ -z "$ans3" ]; then echo " $ans3." read netstat clear; while :; do echo -n "^[[1;1H"; netstat ; sleep 1; done else break fi case "$ans" in "終了!") break;; "") echo "終了";; *) esac done echo "Good bye."

  • 【シェル】whileコマンドについて

    【シェル】whileコマンドについて OS:Solaris10 SH:Bシェル お世話になります。 whileコマンドにてテキストから、先頭に"#"(シャープ)が付いている行と、 空白行以外を読み込ませたいです。 ところが、メイン処理にawkコマンドを入れると、テキストを読む時点で、 行全体ではなく、指定したフィールド内の文字列を読みにいくため、 "#"(シャープ)が付いている行を無視することができません。 ====== while.sh ====== #!/bin/sh while read LINE do echo $LINE | awk '{print $2}' done < list.txt | grep -v "^#" | grep -v "^$" ====================== ------ list.txt ------ 1 2 3 #4 5 6 7 8 9 ---------------------- ****** 出力結果 ****** 2 5 8 ********************** ** 出力させたい結果 ** 2 8 ********************** whileコマンドのオプション等で、テキスト内に特定の記号がある行は 無視して読み込ませる方法がありましたら、ご教授ください。 宜しくお願い致します。

  • readコマンドによる\の読み込み

    Solaris8 Bshellにてシェルを作っています。 ------------------------ #!/bin/sh read ANS echo ANS exit 0 ------------------------ こんな感じでANSに文字列を入力させたいのですが \を入力するとechoで出力されません。 \がバックスラッシュの役目をしているのはわかるのですが 対処としてはどうすればよいのでしょうか? \\にすればいいのもわかるのですが、変換がうまくできませんでした・・・ よろしくお願いいたします。

  • シェルスクリプトにおけるreadコマンドについて

    シェルから読み込まれる"param_file"において、 A B といった途中に空白を含む行が存在する場合、 while read PARAM if [ $1 = ${PARAM} ] then break fi done < "param_file" を実行すると if文実行時に "too many arguments"エラーが発生します。 Solalis上で同じ処理を実行してもエラーが 発生ませんが、Linux特有なのでしょうか。

  • シェルスクリプトbashについての質問

    #!/bin/bash # トップ画面 function TOPVIEW() { echo "1)クイズ開始" echo "2)このアプリを終了" echo "3)アプリについて" echo "4)クイズ正解率" while echo -n "1,2,3,4を選択してください:" read ANS do case $ANS in 1) echo "正解" break;; 2) echo "終了します";; 3) echo "クイズアプリです";; 4) echo "正解率は";; *) echo "答えは1,2,3,4で入力";; esac done } # 問題作成 function QUIZ01() { echo "問題文" echo "(a)答えa(b)答えb(c)答えc" while echo -n "答えをa,b,cで入力してください:" read ANS do case $ANS in a) echo "正解" break;; b) echo "はずれ";; c) echo "はずれ";; *) echo "答えはa,b,cで入力";; esac done } function QUIZ02() { echo "問題文" echo "(d)答えd(e)答えe(f)答えf" while echo -n "答えをd,e,fで入力してください:" read ANS do case $ANS in d) echo "正解" break;; e) echo "はずれ";; f) echo "はずれ";; *) echo "答えはd,e,fで入力";; esac done } 最初の選択でクイズ開始を選択すると問題文に移行、、 終了を選択すると終了できるようにしたいのですが、 設定がわかりません どなたか教えてください お願いします

  • BシェルでIPアドレスの入力

    お世話になっております。 BシェルでIPアドレス、及び、SUBNETを 入力させるシェルを作成しております。 7桁以上15桁未満は処理しない方法は 分かるのですが 以下処理に困っております。 ・xxx.xxx.xxx.xxxの形式で処理する ⇒ 例) xxx..xxx.xxx.xxは処理しない ・数字以外は処理しない  ⇒ 例) 19a.168.11.1は処理しない 参考になるサイト、及び、情報などありましたら ご教示頂きたく宜しくお願い致します。 ■入力処理 while [ $ENV -eq 0 ]; do echo "IP" read SET_IP echo "SUBNET" read SET_SUBNET echo "IP :" $SET_IP echo "SUBNET:" $SET_SUBNET echo "yes/no" read ans case "$ans" in "yes" | "Yes" | "YES" | "y" | "Y" ) ENV=1 ;; "no" | "No" | "NO" | "n" | "N" ) ENV=0 ;; *) ;; esac done ■入力された値を確認する処理 追記したい処理  xxx.xxx.xxx.xxx形式である事を確認  条件  ⇒ 7桁以上15桁未満である   ⇒ xは数字である   ⇒ xx..xxx.xxx.xxx形式などは処理しない ■ネットワークファイルの書換え ■ネットワークサービスの再起動

  • シェルスクリプトbashについての質問

    シェルスクリプトbashについての質問 #!/bin/bash function QUIZ01() { echo "問題文" echo "(a)答えa(b)答えb(c)答えc" while echo -n "答えをa,b,cで入力してください:" read ANS do case $ANS in a) echo "正解" break;; b) echo "はずれ";; c) echo "はずれ";; *) echo "答えはa,b,cで入力";; esac done } function QUIZ02() { echo "問題文" echo "(d)答えd(e)答えe(f)答えf" while echo -n "答えをd,e,fで入力してください:" read ANS do case $ANS in d) echo "正解" break;; e) echo "はずれ";; f) echo "はずれ";; *) echo "答えはd,e,fで入力";; esac done } QUIZ01 QUIZ02 要件として トップ画面で選択肢 1.クイズ開始 2.アプリについて 3.アプリ終了 4.クイズ正解率 クイズを開始したら、 クイズは全5問で3問不正解でアプリを終了 問題の画面には現在の成果率が表示される 問題文は外部ファイルとする 問題の出現方法はランダムとして、問題は重複しない どうか教えてくださいお願いします

  • シェルでreadの文字数

    Bシェルでreadを使用する際に取得可能な文字数の制限ってあるのでしょうか。 スクリプト: 下記test.logのset行のみ、4つ目のカラムを0に変更し、 その他の行はそのまま表示させたい。 # cat test.log set test01 0 2222 6 0.83322 set test02 1 3429 7 test002 set test03 0 9872 222 0.704073409098534720779 #!/bin/sh RENAM_F=/tmp/test2.log while read F1 F2 F3 F4 F5 do if [ $F1 = "add" ]; then echo "$F1 $F2 $F3 0 $F5" >>$RENAM_F else echo "$F1" >>$RENAM_F fi done < test.log ============ 上記スクリプトを実行すると、長い文字列は切れてしまいます。 例えば、最後の値の「0.704073409098534720779」は「0.704073409098534」までしか 表示されません。

  • シェルでのループ

    プログラム完全初心者です。 whileを使って10~0までを表示するプログラムを作っているのですが 実行すると、何もコマンドがかえってきません。 文法が間違っているのでしょうか?? #!/bin/sh TOTAL=10 while [$TOTAL -lt 0] do TOTAL=`expr $TOTAL - 1` echo $TOTAL done

専門家に質問してみよう