Kシェルが動作しない

このQ&Aのポイント
  • Kシェルが他のシェルから呼び出すと動作しない
  • 子シェルがメインシェルのwhile文の中に入れると無限ループする
  • 質問者はKシェルの動作が分からないため、助言を求めている
回答を見る
  • ベストアンサー

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 分かりづらいかも知れませんが、ご容赦願います。

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

  • ベストアンサー
  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.2

子シェルのreadが親の < /xxx/zzz.txtを読んでいるからです。 親のwhile read line のwhileの制御の方法と子シェルのreadがぶつかってます。

zuraoyaji
質問者

お礼

早速の回答有難うございます。 以下のようにすれば回避できました。 メインシェルにてloopさせていたzzz.txtの値を配列array[${count}]に入れる。 次にその配列を使用して子シェルを動かす。 #!/bin/ksh count=0 while read line do array[${count}]=${line} let count=count+1 done < /xxx/zzz.txt i=0 while (( ${i} < ${count} )) do echo ${array[$i]} let i=${i}+1 ksh /xxx/子シェル.ksh done ご教授いただきまして有難うございました。 大変助かりました。 以上

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4847/10260)
回答No.1

何をしたいのかよくわかりませんが、zzz.txt の中身は?ちゃんとYesとかNoだけの行が入ってますか? zzz.txt をメインシェルと子シェルが順番に読むので、ずれたりすると予想外の結果になるかも。 もしかして、メインシェルは、 while read line do $line を使った何らかの処理 ここでキーボードからYesとかNoとか入れてそれにより処理を変えたい done < /xxx/zzz.txt ということをしたいのですか?それなら全然駄目です。 もしそうなら、Yesが入ったらどうしたいのか、Noが入ったらどうしたいのか、どちらでもない物が入ったらどうしたいのか書いてみてください。

関連するQ&A

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

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

  • 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形式などは処理しない ■ネットワークファイルの書換え ■ネットワークサービスの再起動

  • シェルスクリプトのYes、Noの入力ロジックに関する質問

    こんにちは。 よろしくお願いします。 Linux(RHEL5)にて、以下のようなシェルスクリプトを作成しました。 ユーザにアンインストールを問い合わせるもので、 yesの時は処理が進み、noの時は処理が中断、 それ以外を入力した場合、再入力を促すようにしています。 echo "" echo "*** アンインストールを実行しますか? ***" read -p "  >>> 実行する場合「yes」、しない場合は「no」を入力してください <<< " YESNO while (test $YESNO != yes) && (test $YESNO != no) do echo "" read -p "  >>> 「yes」もしくは「no」を入力してください <<<  " YESNO done if (test $YESNO == yes) then continue else echo "****** アンインストールをキャンセルしました ******" && exit fi しかし、 何も入力せずに「Enter」を押した場合、 本来なら、再入力を促すように表示したいのですが、 以下のようにエラーが出て、終了してしまいます。 XXX.sh: line YYY: test; !=; unary operator expected XXX.sh: line ZZZ: test; ==; unary operator expected ****** アンインストールをキャンセルしました ****** 恐らくロジックのどこかに見落としがあると思うのですが、 原因がよく分かりません。 よろしくお願いします。

  • シェルスクリプトのYes、Noの入力ロジックに関する質問

    こんにちは。 よろしくお願いします。 Linux(RHEL5)にて、以下のようなシェルスクリプトを作成しました。 ユーザにアンインストールを問い合わせるもので、 yesの時は処理が進み、noの時は処理が中断、 それ以外を入力した場合、再入力を促すようにしています。 echo \"\" echo \"*** アンインストールを実行しますか? ***\" read -p \"  >>> 実行する場合「yes」、しない場合は「no」を入力してください <<< \" YESNO while (test $YESNO != yes) && (test $YESNO != no) do echo \"\" read -p \"  >>> 「yes」もしくは「no」を入力してください <<<  \" YESNO done if (test $YESNO == yes) then continue else echo \"****** アンインストールをキャンセルしました ******\" && exit fi しかし、 何も入力せずに「Enter」を押した場合、 本来なら、再入力を促すように表示したいのですが、 以下のようにエラーが出て、終了してしまいます。 XXX.sh: line YYY: test; !=; unary operator expected XXX.sh: line ZZZ: test; ==; unary operator expected ****** アンインストールをキャンセルしました ****** 恐らくロジックのどこかに見落としがあると思うのですが、 原因がよく分かりません。 よろしくお願いします。

  • シェルでのループ

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

  • シェルスクリプトの問題で困っています!

    シェルスクリプトの問題を解いているのですが、いまいち分かっていないところが多いです… X 年からY 年までのカレンダーをファイル(cal-年.txt)に出力するシェルスクリプト(mkcal.sh)を 作成せよ。 実行書式./mkcal.sh x y [必須項目] 1. ファイル作成と同時にメッセージを出力し,作成したファイルが分かるようにすること。 出力例 ./mkcal.sh 2010 2012 Making cal-2010.txt Making cal-2011.txt Making cal-2012.txt 2. 作成しようとしているファイル(cal-XXXX.txt)が既に存在する場合には,エラーメッセージ File exists: cal-XXXX.txt を表示して,ファイルを作成しないこと。 出力例(cal-2011.txt が存在する場合) ./mkcal.sh 2010 2012 Making cal-2010.txt Making cal-2011.txt File exists: cal-2011.txt Making cal-2012.txt [自由項目] 1. mkcal.sh の引数を3 つ与えて実行すると,z 年飛ばしでカレンダーを出力すること。 実行書式./mkcal.sh x y z という問題に対し #!/bin/sh n=$1 while [ $n -le $2 ]; do echo "Making cal-$n.txt" /usr/bin/cal $n > cal-$n.txt n=`expr $n + 1` done #!/bin/sh n=$1 while [ $n –le $2 ]; do echo "Making cal-$n.txt" if [ -f "cal-$n.txt" ]; then echo "File exists: cal-$n.txt" else /usr/bin/cal $n > cal-$n.txt fi n=`expr $n + 1` done #!/bin/sh n=$1 while [ $n –le $2 ]; do echo "Making cal-$n.txt" if [ -f "cal-$n.txt" ]; then echo "File exists: cal-$n.txt" else /usr/bin/cal $n > cal-$n.txt fi n=`expr $n + $3` done とやっているのですが、どこで保存をすればいいか、そもそもの保存をするコマンドが分かっていない、これは合っているのか…と色々と問題点があります 誰か助けてください…お願い致します

  • 【シェルスクリプト】 ローカル変数、グローバル変数

    シェルスクリプトのローカル変数、グローバル変数の取り扱いで迷っています。 ---------------- #!/bin/bash count=0 cat file | while read i do count=`expre $count + 1 ` done echo $count ---------------- fileの中身をcatで流して、それを一行ずつ読み込みます。 そのつど、count の値を増やしていくようにしたいのですが、最後の出力値は0となります。 cat→whileで読み込ませて処理している間はローカル変数として扱われているのでしょうか。 またそうであるならば、シェルスクリプトでグローバル変数を明示的に宣言するにはどうのようにすればいいのでしょうか。

  • 【シェル】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コマンドのオプション等で、テキスト内に特定の記号がある行は 無視して読み込ませる方法がありましたら、ご教授ください。 宜しくお願い致します。

  • シェルの変数の動作についての質問

    solaris8上で、シェルから別のシェルを子プロセスを動作させて その子プロセスが終了したかを判定するシェルを作成しました。 そのシェルの抜粋は下記のようになっています。 ---------------------------------------------------- "コマンド実行" & PID=$! i=0 ERR_FLG=1 echo " PID="$PID >> tmp.txt   ・・・・(1) while [ 1 ] do   if [ `ps -ef | grep $PID | grep -v grep | wc | awk '{print $1}'` -eq 0 ]; then     ERR_FLG=0     break   fi   "終了条件を満たしたかを確認するサブルーチン"   if [ $? -eq 1 ]; then     echo "Time out" >> tmp.txt     break   fi   i=`expr $i + 1 `   sleep 10 done echo `ps -ef | grep $PID | grep -v grep` >> tmp.txt ・・・・(2) ---------------------------------------------------- 殆どの場合問題なく動作しているのですが、 ごく稀に、(1)と(2)で取得した$PIDの値が異なるという現象が起きます。 当然サブルーチン上で、PIDを書換する処理もありません。 どのような状況の時に、現象が起きるかもはっきりしていません。 この現象の回避方法が判る方がおられましたら御教示の程、 宜しくお願いします。

  • シェルの変数セットについて

    どなたか教えてください。 以下のようなUNIXのシェルを作ってみたのですが変数がうまくセットされません。 これは仕様なんでしょうか??? シェルはkshでシェルの中でsuしているユーザはcshです。 例: ==test.sh== #!/bin/ksh A1="test test" su - user1 <<EOF echo "A1 :" $A1 set A2 =(test test) echo "A2 : " $A2 EOF exit ==実行結果== %./test A1 : test test A2 : %

専門家に質問してみよう