プロが教えるわが家の防犯対策術!

cshが詳しい方は教えてください
cshで、ソラリスOS上にtmp.outってのファイルを行ずつに読み込みしたいんですが
foreach f_list("`cat tmp.out`")
echo "${f_list}"
end
tmp.outの内容は以下です。
test3
if ( 0==mencmp("H",HOSTN,10) {
test345
testddd

2行目の最後"{"っての文字があれば、実行すると、うまくいけませんが。
『}が足りません。』ってのエラーになっちゃう、

"{"がcsh中で、特殊の文字と思ってますが、cshが詳しいかは対処方法を教えてくれませんか

以上です。よろしくお願いいたします。

A 回答 (4件)

> 一応tcshに試しましたが、やっぱりだめでした。


> エラー内容:間違った}です.

おかしいですね?
こちらのtcsh(ver.6.17.00と6.15.00)ではtmp.outと同じ内容が表示されましたが。
tcsh ~.csh
とかやって、ちゃんとtcshで動かしてますか?
対話シェルはtcshにしたけど、1行目が
#!/bin/csh
とかなってるのを
./~.csh
で実行したとか、
csh ~.csh
と実行したとかはないですよね?
# もしかしたら、古いtcshでは同じ現象が起るのかもしれませんが、確認はしていません。

> プログラムの実現の機能としてはファイル(temp.out)を行ごとに読み込み、指定されたキーワードがありましたら、
> その行の内容を別のファイルに出力する機能です。

単純に
grep 'キーワード' tmp.out > t.out
ではだめですか?(キーワードに正規表現の特殊文字が含まれていないとして) awk使うにしても、こんなまわりくどいことしなくても
awk '/キーワード1/{print} /キーワード2/{print} ' tmp.out > t.out
とかできますし。
    • good
    • 0
この回答へのお礼

kmeeさん
いろいろご回答してくれて、誠にありがとうございました
結局、一部の計算機能をやめて、内容だけ、ファイルに出力する方式に修正しました
『grep 'キーワード' tmp.out > t.out』のように修正しました
改めてありがとうございました。

お礼日時:2010/06/25 12:45

SunOS 5.8のcshで確認しました。


これは、バグといってもいい「仕様」なのでしょうね。
おそらく、"${f_line}"を展開した
echo if ( 0==mencmp("H",HOSTN,10) {
という行全体を eval している気がします。

対処法は次のものしか思いつきませんでした。

・他のシェルを使う
Bsh系にしましょう。
どうしてもCsh系を使いたいなら、せめてtcshを。(すくなくとも、この現象は発生しません)

・根本的にやりかたを見直す
1行ずつなんかの処理をしたいのでしたら、grep,sed,awk,perl、あるいはこれらの組み合わせで大抵のことはできます。

この回答への補足

kmeeさん

詳しくご回答ありがとうございました
現在のところで、Bシェルに変更して、時間が許しませんが
一応tcshに試しましたが、やっぱりだめでした。
エラー内容:間違った}です.

それとも awkで試しましたがやっぱりだめでした。
set i=1
set maxGyo = `awk 'END{print NR}' temp.out`
while ($i <= $maxGyo)
set line = `awk "{ if (NR==$i) print}" temp.out`
echo "$line"
@ i++
end

エラー内容:}が足りません。

プログラムの実現の機能としてはファイル(temp.out)を行ごとに読み込み、指定されたキーワードがありましたら、
その行の内容を別のファイルに出力する機能です。
元々のプログラムは下記のものです。
foreach f_list("`grep -n キーワード temp.out`")
echo "${f_list}" >> t.out
end

何かご存知でしたら、是非お願い申し上げます

補足日時:2010/06/24 21:06
    • good
    • 0
この回答へのお礼

kmeeさん

詳しくご回答ありがとうございました
現在のところで、Bシェルに変更して、時間が許しませんが
一応tcshに試しましたが、やっぱりだめでした。
エラー内容:間違った}です.

それとも awkで試しましたがやっぱりだめでした。
set i=1
set maxGyo = `awk 'END{print NR}' temp.out`
while ($i <= $maxGyo)
set line = `awk "{ if (NR==$i) print}" temp.out`
echo "$line"
@ i++
end

エラー内容:}が足りません。

プログラムの実現の機能としてはファイル(temp.out)を行ごとに読み込み、指定されたキーワードがありましたら、
その行の内容を別のファイルに出力する機能です。
元々のプログラムは下記のものです。
foreach f_list("`grep -n キーワード temp.out`")
echo "${f_list}" >> t.out
end

何かご存知でしたら、是非お願い申し上げます

お礼日時:2010/06/24 21:07

csh -x シェルファイル


とするとどうなりますか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました
やっぱりだめでした
前行の内容まで表示できて、end文字も表示しました、その後、}が足りません。
よろしくお願いいたします

お礼日時:2010/06/24 21:12

特殊文字なのは{じゃなくて$の方じゃないですか?


つまり2行目を
echo "$${f_list"
としてみたらどうかって事ですが。

この回答への補足

D-Matsuさん
回答ありがとうございました。
試しましたが、やっぱりだめでした
grep.out4中の最後の{を切ると、旨くいきました
やっぱり、ファイル中の{の問題と思ってます。
それで、{の後ろに}を付けて、試して、旨くいきましたが、表示するとき、最後の二つ文字{}が表示できなくなりました。

補足日時:2010/06/24 13:31
    • good
    • 0
この回答へのお礼

補足:
いろいろ試しましたが、cat,grepのコマンドの問題ではありません。
問題はバッククォーテーション(``)でcatを囲まれて、旨くいけません

お礼日時:2010/06/24 15:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!