シェルスクリプト総合 その2

このエントリーをはてなブックマークに追加
876名無しさん@お腹いっぱい。:2005/08/07(日) 13:39:50
ある数値をパイプで受け取ったとして、それの合計値を出したいときには
どうするのがいいんでしょうか??
877名無しさん@お腹いっぱい。:2005/08/07(日) 13:48:27
878名無しさん@お腹いっぱい。:2005/08/07(日) 13:53:01
>>877
ありがとうございます。これでなんで上手くいくのか分りませんがとにかくそういうもんだと思っておきます。
879名無しさん@お腹いっぱい。:2005/08/07(日) 16:11:32
>>872
シェルによって違う。
bourneとbashはパイプからだとサブシェルになる。
kornとzshはパイプからでもサブシェルにならない。
880名無しさん@お腹いっぱい。:2005/08/08(月) 23:29:21
当方kshを利用しているのですが、whileループを使用して2ファイルを
読み込む処理がうまく行きません。
外側のループが処理されずに抜けてしまいます。
(個人的な推測では内側のループで外側のカーソルも移動している気がします)
どなたか、対処の方法を教えてくだされ。

ソースはこんな感じです。
function funcA
{
while read LINEB
do
処理あれこれ
done <$LINEB
}

while read LINE
do
 funcA
done <$FILEA

881名無しさん@お腹いっぱい。:2005/08/08(月) 23:35:21
>>880
ヒント:リダイレクト、ファイル記述子
882名無しさん@お腹いっぱい。:2005/08/08(月) 23:38:46
$LINEBじは$FILEBの間違いって落ちじゃないよな。
883880:2005/08/08(月) 23:42:58
>>881さん
もうちょっと、ヒントをください。

>>882さん
先ほどのソースは間違ってますが、現実は「FILEB」です。
ご指摘ありがとうございます。
884名無しさん@お腹いっぱい。:2005/08/09(火) 00:04:59
1 #!/bin/ksh
2 FILEB=$0
3 CNT=0
4 function funcA
5 {
6 while read LINEB
7 do
8 echo $LINEB
9 done <$1
10 }

11 while read LINE
12 do
13 echo ------$CNT------
14 funcA $FILEB
15 CNT=`expr $CNT + 1`
16 done <$0

この例だと、同じファイルを読み込んでるけど、ちゃんと動くがなぁ。
885880:2005/08/09(火) 00:34:04
>>884さん
ほ、本当ですか?
自宅にはUNIX環境がないため、確かめることはできないのですが…
なんでだろうか。。
886名無しさん@お腹いっぱい。:2005/08/09(火) 06:20:17
起動したプロセスのプロセスIDをpidファイルに書き込みたいんですが、
どうすればいいでしょうか?
887名無しさん@お腹いっぱい。:2005/08/09(火) 06:35:34
>>886
echo $$ > pid

念のため言っておくけど、複数個起動すれば当然"pid"というファイルの
内容は書き直されちゃうからね。
888名無しさん@お腹いっぱい。:2005/08/09(火) 07:14:42
>>887
あざーっす!
参考になります。
ところで、やはりスクリプト内で別のスクリプトを読んでいる場合は
実プロセスIDではなくてスクリプトを実行しているプロセスのIDになってしまいますよね・・
889名無しさん@お腹いっぱい。:2005/08/09(火) 07:19:22
>>888
スクリプトを実行してるプロセスのIDになりました。
apacheとかはどうやって取得しているんでしょうか・・・
890名無しさん@お腹いっぱい。:2005/08/09(火) 07:23:10
バックグラウンドで起動した子プロセスのPIDなら「$!」
891名無しさん@お腹いっぱい。:2005/08/09(火) 07:55:48
>>890
あざーーっす!!!!
取れました!
1 #!/bin/sh
2
3 echo $$
4 ./test.sh &
5 echo $!

という超簡単なものなら行けたんですが・・・・・
実はtomcatの自動起動スクリプトを書いているんですが、
ソース晒して見てもらってもいいでしょうか?
892名無しさん@お腹いっぱい。:2005/08/09(火) 16:03:39
> あざーーっす!!!!
ってなんだよ?
893名無しさん@お腹いっぱい。:2005/08/09(火) 16:13:01
オヅラさんの挨拶は「おあざーっす」
894名無しさん@お腹いっぱい。:2005/08/09(火) 16:14:21
895名無しさん@お腹いっぱい。:2005/08/09(火) 16:15:07
「ありがとうございます」の発音の弱勢部分を崩したんじゃない?

当たってたら、なんかくれ。
896名無しさん@お腹いっぱい。:2005/08/09(火) 16:59:30
意味不明。
日本語を書くこと。
897名無しさん@お腹いっぱい。:2005/08/09(火) 17:40:18
いあいあとかふんぐるいとかあざーすとか。
898名無しさん@お腹いっぱい。:2005/08/09(火) 21:41:09
うがなぐるふたぐんとか
899名無しさん@お腹いっぱい。:2005/08/09(火) 21:43:31
いあいあはすたー
900名無しさん@お腹いっぱい。:2005/08/10(水) 09:20:00
sedやawkの使い方知らないから、いつもPerlに頼っちゃうんだけど、
こういうのあんまりよくない?
901名無しさん@お腹いっぱい。:2005/08/10(水) 10:18:29
どうでもいいよおもうよ 
902名無しさん@お腹いっぱい。:2005/08/10(水) 10:37:29
>>891
自己レスです。

結局
echo $(ps -ewo "%p %c %u %a" | awk "\$2==\"java\" && /catalina/ && \$3==\"$CATALINA_USER\" {print \$1}" | head -n 1) > $CATALINA_PID
こんな強引なやり方でプロセスID取得しました
903名無しさん@お腹いっぱい。:2005/08/10(水) 12:56:49
そんなことするより、起動スクリプトで echo $$ > pidfile したあと exec すれば?
904名無しさん@お腹いっぱい。:2005/08/10(水) 14:54:23
fifo つくって通信するとか
905名無しさん@お腹いっぱい。:2005/08/10(水) 19:16:47
>>902
Tomcatが8080で待ちうけている場合
/usr/sbin/lsof -t -i TCP:8080 -P

シェルスクリプトじゃないけどね。
906名無しさん@お腹いっぱい。:2005/08/10(水) 19:48:48
>>905
ええー、(環境によっては)lsofをわざわざインスコすんの…。

そりゃあ必要なものは何でもインスコしなきゃならんがの。プロセスidさえ
わかればよいという目的下だと、ちょっとバランスの悪さを感じる。(俺は)
907名無しさん@お腹いっぱい。:2005/08/10(水) 23:15:45
スミマセン、教えてください。
Kシェルで

count=`cat a.txt b.txt | grep ${検索条件} | wc -l`

というコマンドで検索条件に半角スペースを含む文字列を指定したい場合、どうしたら良いですか?
908名無しさん@お腹いっぱい。:2005/08/10(水) 23:23:53
count=`cat a.txt b.txt | grep "${検索条件}" | wc -l`
これじゃあかんの?
909907:2005/08/10(水) 23:39:59
>>908
それだと、なぜかcount=0になっちゃうんですよ。
もちろん、条件には引っ掛かる文字列もあります。
うーん。
910名無しさん@お腹いっぱい。:2005/08/11(木) 01:43:37
>>908
ksh使ってないんで本題はわからんが、grep -c って標準的じゃないの?
スペースの話を別にすれば
count=`grep -c $検索条件 a.txt b.txt`
でよかったんじゃないのかな。

本題も、wc -lを取り払って試せば、なぜなんだかわからないかな。
911名無しさん@お腹いっぱい。:2005/08/11(木) 02:03:08
grep -c -F でどうだろう?
912名無しさん@お腹いっぱい。:2005/08/11(木) 11:13:46
>もちろん、条件には引っ掛かる文字列もあります。

というところからして、検索文字列の正規表現が
おかしくてマッチしないだけというオチじゃなかろうか。
grep を fgrep に変えてみるとか。
913907:2005/08/11(木) 20:04:46
自己解決しました。
検索条件はファイルから読み込んでいるので、
半角スペースに見えているのは特殊文字かと思い、
cat -vしてみたら

行末に^Mの文字が‥
引っ掛からないわけでした。

やさしいunix板の皆様、ありがとうございました。
逝ってきます。
914名無しさん@お腹いっぱい。:2005/08/14(日) 08:45:19
csh使いのアホはいつになったら死滅するんでしょうか?
915名無しさん@お腹いっぱい。:2005/08/14(日) 10:05:52
BSDがあるかぎり何度でも甦るさ
916名無しさん@お腹いっぱい。:2005/08/14(日) 11:04:42
*BSDに関して一つだけ嫌いな点はデフォルトのログインシェルがcshって事だな。
NetBSDにstaticな/bin/bashを突っ込む俺も阿呆だと思うけど。
だってシングルユーザモードでもログインシェルにbashを使いたいんだよもん!
917名無しさん@お腹いっぱい。:2005/08/14(日) 17:35:45
tcshとかもいらない
918名無しさん@お腹いっぱい。:2005/08/14(日) 18:04:12
私も要らないんだけど、入ってないと年寄りが。。。
私はbashかksh。
919名無しさん@お腹いっぱい。:2005/08/14(日) 18:51:36
zsh
920名無しさん@お腹いっぱい。:2005/08/14(日) 19:41:53
ログインシェルの話はどこかよそでやっておくれやす
921名無しさん@お腹いっぱい。:2005/08/14(日) 22:12:16
出た自治厨
922名無しさん@お腹いっぱい。:2005/08/14(日) 23:23:49
>>921
明らかにスレ違いだし。
923名無しさん@お腹いっぱい。:2005/08/22(月) 17:31:43
シェルスクリプトを走らせると

????.sh: xrealloc: cannot reallocate 268435456 bytes (0 bytes allocated)
(????はファイル名)

というエラーがでます。
前同じスクリプトを動かしても何も普通に動いていたのに。。。
パーミッション、ファイルサイズ制限、ログインシェル、メモリ残量
はチェック済みです。。。

このエラーが起きる原因はなんでしょうか?
よろしくお願いします。
924923:2005/08/22(月) 18:14:30
解決できました。すみません(;´ω`)
925名無しさん@お腹いっぱい。
>>924
原因はなんだったんだよ!