トップページunix
1001コメント301KB

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

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001ミスターシェル2006/09/07(木) 13:00:11
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
0811名無しさん@お腹いっぱい。2007/02/03(土) 16:54:59
区切りが809の通りならsort +1 -nr でいいんじゃないかな。
08128092007/02/03(土) 18:17:50
>>810
>>811
sort!!!!!
そ、そんな普段から自分でもよく使ってるやつで可能だったんですね!
さっそく>>811さんのようにやってみたらうまくいきました!

ありがとうございました。
0813名無しさん@お腹いっぱい。2007/02/03(土) 18:31:44
whileやfor構文で繰り返されて出力される結果を
>>out.txt
を使ってどんどんファイルに書き加えていくのはわかりました。
では、ファイルに出力するのではなく、
(変数として?)メモリ上に出力していく方法はありますか?
例えば、

1回目の繰り返し文によって、変数$ssの値が5になりました。
変数$yyの中身は
5
となりました。

2回目の繰り返し文によって、変数$ssの値が2になったので、
変数$yyの中身は
5
2
となりました。

3回目の繰り返し文によって、変数$ssの値が7になったので
変数$yyの中身は
5
2
7
となりました。

こんな$ssに対して$yyのように出力が可能な方法はありますか?
0814名無しさん@お腹いっぱい。2007/02/03(土) 18:39:33
while ...; do
 # ...
 yy="$yy
$sss"
 # ...
done

echo "$yy"


単純にこうやるとyyの中身の1行目に空の行が出来ちゃうから、
yyが空かどうかチェックしたほうがいいか。
0815名無しさん@お腹いっぱい。2007/02/03(土) 18:48:28
set -
while ...; do
set "$@" "$yy"
done

for a in "$@";do
echo "$a"
done
0816しまった2007/02/03(土) 18:50:23
set --
while ...; do
set "$@" "$yy"
done

for a in "$@";do
echo "$a"
done
0817名無しさん@お腹いっぱい。2007/02/03(土) 19:04:22
>>814
なるほど。言われてみると簡単ですね・・・。
実際に自分でやってみたら、確かにできました。
最初の空白行は
yyが殻かどうかチェックするより
最後にsedとかで削除した方が簡単なのでそうしようと思います。
sed '/^$/d'
これをパイプしようと思います。
ありがとうございました。

>>815
よく意味がわからないのですが、
とりあえず814さんの方法でできましたので
お気持ちだけいただいておきます。
ありがとうございました。
0818名無しさん@お腹いっぱい。2007/02/03(土) 19:21:52
815の方法は、setで $1, $2, ... に追加していって最後に
それら全体である$@をループで回すことで取り出してる。
0819名無しさん@お腹いっぱい。2007/02/03(土) 19:35:54
>>818
なるほど、意味がわかりました!
ありがとうございます。
0820名無しさん@お腹いっぱい。2007/02/03(土) 19:49:44
$echo test.txt
太郎 84 25
花子 83 21
裕子 98 24
尚美 91 23
冬美 84 21

このように名前 点数 出席日数があったとき、
第一ソートは点数で、第二ソートは出席日数でソートし、
裕子 98 24
尚美 91 23
太郎 84 25
冬美 84 21
花子 83 21
こういうふうに出力したいのですが、
$echo test.txt | sort +2 -nr | sort +1 -nr
こうして二段階のsortでいいのかな?と思ったけど、
むしろ必ず
冬美 84 21
太郎 84 25
と、逆になってしまいます。そこで、
$echo test.txt | sort +2 -n | sort +1 -nr
-rオプションを外してやってみても同じ結果でした・・・orz

なにか別のコツなどがあるのでしょうか?
0821名無しさん@お腹いっぱい。2007/02/03(土) 19:51:09
終了
08228202007/02/03(土) 20:08:12
自己解決しましたが、回答を書いておきます。
sortは一度に複数のオプションを指定可能なので
第1フィールドを昇順でソートし、
第2フィールドは降順でソート、
ということが可能のようです。
この場合、具体的には以下のようにします。

$echo "text.txt" | sort +1nr +2n

ちなみに>>819のようなことがやりたい場合は

$echo "text.txt" | sort +1nr +2nr
ですね。

参考
ttp://biking.taiiku.tsukuba.ac.jp/~takai/Unix/Unix-text.html
0823名無しさん@お腹いっぱい。2007/02/03(土) 20:12:13
echoじゃなくcatじゃないの?
というか、cat使うと「catイラナイ」と言われるけどさ。
0824名無しさん@お腹いっぱい。2007/02/03(土) 20:13:37
ここでは、「ぬるぽ」「ガッ」と同じくらい定番だもんなw
0825名無しさん@お腹いっぱい。2007/02/03(土) 20:17:10
ネコイラズとな
08268202007/02/03(土) 20:19:07
>>823
あ・・・、マジでごめソ・・・orz
cat text.txt
が正解。

というか初心者がパイプを覚えるには最も分かりやすい例だと思うけどね。
cat hoge.txt | sort
0827名無しさん@お腹いっぱい。2007/02/03(土) 20:23:03
初心者にそういう使い方教えると、>>820のようなダメ人間ができあがる。
0828名無しさん@お腹いっぱい。2007/02/03(土) 20:25:49
んまー、sortコマンドって難しいべ。
0829名無しさん@お腹いっぱい。2007/02/03(土) 20:27:31
>>827
べつにそういう使いかた教えたせいじゃないだろう
08308202007/02/03(土) 21:14:27
みなさまのおかげでついに完成しました。
「全国の都道府県庁所在地の中で
 2007年1月に冬日が多かった順に並び替えます」
その結果です。
http://sheel.mydns.jp/~sheel/fuyubikencho0701.txt
スクリプトはこちらです。
http://sheel.mydns.jp/~sheel/fuyubikencho0701.sh

「全国の都道府県庁所在地の中で
 2006年8月に猛暑日が多かった順に並び替えます」
その結果です。
http://sheel.mydns.jp/~sheel/moushobikencho0608.txt
スクリプトはこちらです。
http://sheel.mydns.jp/~sheel/moushobikencho0608.sh

これを見ると、
佐賀、熊本、京都、名古屋は
夏場は日本一暑い割に冬場も不相応に寒いことがわかりますね。
0831名無しさん@お腹いっぱい。2007/02/04(日) 01:24:10
awkを使って
変数$hogeaと変数$hogebを連結しようと思います。
$hogeaの中身は
1
3
5
4
8
7
3

$hogebの中身は
1023
1032
1001
1002
1003
1009
1018

これをこんなふうにしたいのですが、
1 1023
3 1032
5 1001
4 1002
8 1003
7 1009
3 1018

ちょっと勉強して感じではよくわかりませんでした。
もうちょっと勉強してみます。
0832名無しさん@お腹いっぱい。2007/02/04(日) 03:20:35
paste
08338312007/02/04(日) 04:33:44
>>832
できました!!!
変数が20個くらいあったのですが、
echo "$hogehoge1" | paste file1.txt - >file2.txt
echo "$hogehoge2" | paste file2.txt - >file3.txt
・・・・・
echo "$hogehoge20" | paste file20.txt - >out.txt

とやることでなんとかなりました。
これが47x12x47=26,508回繰り返さないと行けない処理で、
ハードディスクは痛めつけるますがこれ一回だけやればいいので
これでがまんすることにします。
もっとメモリ内のみで済む方法ってないんでしょうね・・・。
0834名無しさん@お腹いっぱい。2007/02/04(日) 07:57:23
echoを使うのはネタなのか、そうなのか!?
0835名無しさん@お腹いっぱい。2007/02/04(日) 07:58:30
スマソ、ほんとにそういう中身なのね。
0836名無しさん@お腹いっぱい。2007/02/04(日) 16:11:52
シェルスクリプト以外の方法でやればいいのに。
08378312007/02/04(日) 19:45:16
>>836
例えばどういう方法がありますか?
わたしがやりたいのは、
気象庁のWebサイトから各都道府県庁所在地の
1961年以降の毎日のデータを2007年1月まで
一気に取得し、
例えば2007年1月の熊本(47814)のデータを
あとでとりだしやすいように加工した後に
「20070147814」
というファイル名で保存していく、ということです。
今朝から一括ダウンロードを始めましたがまだまだ終わりそうにありません。
24時間くらいかかりそうです・・・orz

こういう一回だけやれば済む使い捨てスクリプトをかくのに
シェルスクリプト以外になにかいい方法がありますか?
08388312007/02/04(日) 19:59:03
ちなみに>>837の気象庁から一括ダウンロード(curl)する
シェルスクリプトはこんな感じ。
ttp://sheel.mydns.jp/~sheel/alldataget.sh.txt
使い捨てだね。
そのダウンロードの結果が例えばこれ。
ttp://sheel.mydns.jp/~sheel/19920147819.txt

2年ほど前もこのスレで言われてたんだけど、
毎回毎回気象庁にデータを取りに行くより
一回だけ一括ダウンロードしておいて
ローカルで参照した方がスクリプト自体も高速化する、ってことと
自分自身が一括ダウンロードをするだけのスキルが可能になったので
ついに念願の一括ダウンロードをやっています。

試しにダウンロードが終わった部分だけで
ある連続した5年間の1月の47都市の冬日の日数の平均値を計算し
その平均値の大きい順に並べ替えてみました。
こういうのをダウンロードでやろうとすると小一時間以上?かかるのだけど
ローカルに保存しておくと1〜2分くらいで終わりますね。
0839名無しさん@お腹いっぱい。2007/02/04(日) 20:17:39
>>837
PerlやRubyは考慮しないのかな、ということではないかと。

シェルスクリプトにはパズル的なおもしろさはあるけど、
若干の無理矢理感はあるし、外部コマンド使いまくりでモタモタするし。
08408312007/02/04(日) 20:36:39
>>839
なるほど。
モタモタして時間がかかるのは確かだしね。
つか、俺的にはPerlもRubyもシェルスクリプトの1コマンド、という認識。
Rubyはよく知らんけど
Perlはシェルスクリプトと比べて意味がわかりづらいので
なかなか重い腰が上がらないんだよね。

あと、こういうデータを元にして動的なWebコンテンツをつくるには
やっぱphpでつか?
0841名無しさん@お腹いっぱい。2007/02/04(日) 20:52:56
>>840
なんでもええよ。
シェルスクリプトでもいいし。
ある程度アクセス数が多くなるなら、シェルスクリプトではきついけどね。
0842名無しさん@お腹いっぱい。2007/02/04(日) 23:39:23
>>840
そんなあなたにはRubyお薦め。
Perl挫折した俺が言うんだからまちがいない。
0843名無しさん@お腹いっぱい。2007/02/05(月) 00:30:47
俺の知合いにはコマンドラインのちょっとしたスクリプトにもphpを使う奴がいるし、
その一方でウェブサービスをC++で書いたCGIで実現している奴もいる。
言語自体の得意分野や不得意分野があるのはその通りかも知れんが、
慣れた言語で適当にやるのも重要であるのだと思うぜ。所詮スクリプト。

そんな俺はPHPをおすすめしておこうかな
0844名無しさん@お腹いっぱい。2007/02/05(月) 00:40:44
bash最強、次点tcsh
0845名無しさん@お腹いっぱい。2007/02/05(月) 01:23:19
>>840
動的なWebコンテンツというなら、テキスト処理に長けていることが条件かな。
PHPでもPerlでもRubyでも、あるいは他のものでもいいと思う。
慣れているものを選べばいいのでは。
どれも初めてトライというなら、適当に情報を拾って見比べてみて、
自分に合いそうだと思ったものにすればいんじゃね?

シェルスクリプトは、テキスト処理能力に関しては
長けた言語と比べるとかなり見劣りする。
ちょっと凝ったものになると素のシェルスクリプトではとても苦しい。
>>837ぐらいの処理なら、シェルスクリプト(+awkやsed)でもどうにかなるだろうけど。
0846名無しさん@お腹いっぱい。2007/02/05(月) 16:28:42
cat hoge.txt | sort って何でcat要らんの??
0847名無しさん@お腹いっぱい。2007/02/05(月) 16:37:56
cat -sとか cat -nとかするなら意味があるけど、ふつうは
sort < hoge.txt
で済むから。
08488312007/02/05(月) 16:59:15
>>841
そうですか。ありがとう。
>>843
phpも挑戦したことはあるけど
なんかやっぱPerlほどではないけど小難しい感じがしました・・。

>>842
Rubyですか。
使ったことないけど今確認したら
ちゃんとMacOSXにもプリインストールされてるみたいなので、
Perlに挫折した俺としてもRubyに挑戦してみようかな。
日本人が作ったみたいだしね。
0849名無しさん@お腹いっぱい。2007/02/05(月) 17:08:42
>>847
非常に解りやすい説明をありがとう。
0850名無しさん@お腹いっぱい。2007/02/06(火) 22:48:39
>>847
sort hoge.txt
の方が1文字少ない
0851名無しさん@お腹いっぱい。2007/02/06(火) 22:53:30
>>850
sort hoge.txt だと、もしhoge.txtが存在しないか、またはpermission deniedの場合
にも、一旦sortコマンドが起動された後でエラーになるため、ちょっと無駄になる。
sort < hoge.txtだと、hoge.txtが読めない場合はシェルのレベルでエラーになり、
sortコマンド自体起動されないので無駄がない。
0852名無しさん@お腹いっぱい。2007/02/06(火) 23:27:58
というより、質問がsortだったから引数に書けたってだけの話だな。
trみたいなファイルを引数に取らないのもあるわけで。

cat hoge.txt | tr a-z A-Z → tr a-z A-Z < hoge.txt
0853名無しさん@お腹いっぱい。2007/02/06(火) 23:30:26
なるほどね
0854名無しさん@お腹いっぱい。2007/02/06(火) 23:46:29
cat hoge.txt | tr a-z A-Z
確かに、こっちの方がcat以外でも同じ書き方になるから、ぱっと見わかりやすいか。
0855名無しさん@お腹いっぱい。2007/02/06(火) 23:56:45
そんなあなたに
< hoge.txt tr a-z A-Z
0856名無しさん@お腹いっぱい。2007/02/07(水) 00:08:15
>>855
知らなかった
0857名無しさん@お腹いっぱい。2007/02/07(水) 00:36:54
tr < hoge.txt a-z A-Z
なんてのも可だったり。
08588312007/02/07(水) 03:53:44
普通にcat hoge.txt | tr a-z A-Zに一票。

理由
・初心者がパイプの意味を理解するのに適している
・ < を使う方法と大差ない
・後ろから < で入力とか気持ち悪い
0859名無しさん@お腹いっぱい。2007/02/07(水) 04:18:00
>>858
理由の一つ目は、リダイレクトなら
「初心者がリダイレクトの意味を理解するのに適している」
と言い換えられるな。

理由の二つ目は、全然「catの方がいい」理由にはなってないな。
あんたにとって「大差ない」かもしれないが、少なくとも
タイプ量が多いし、無駄なプロセスも増える。

理由の三つ目は、もはや意味不明だな。何だそりゃ。
シェルのシンタクスが非常に美的であるとは俺も言わないが、
リダイレクトはシェルの基本だろ。
0860名無しさん@お腹いっぱい。2007/02/07(水) 09:15:44
初心者にそういう使い方教えると、>>858のようなダメ人間ができあがる。
0861名無しさん@お腹いっぱい。2007/02/07(水) 09:44:29
まあ、両方わかるようにしておけばいいじゃない
0862名無しさん@お腹いっぱい。2007/02/07(水) 11:15:52
>>860
アンカ間違ってるぞ。 正しくは >>859 だろう。
0863名無しさん@お腹いっぱい。2007/02/07(水) 11:22:45
>>862
自演乙。
ダメ人間は >>858
0864名無しさん@お腹いっぱい。2007/02/07(水) 11:22:46
>>850
sort<hoge.txt
で文字数いっしょだ。
0865名無しさん@お腹いっぱい。2007/02/07(水) 11:29:17
自演じゃないし >>859 は間違いなくダメ人間だ。
0866名無しさん@お腹いっぱい。2007/02/07(水) 11:38:54
まあ、両方できるようにしておけばいいじゃない
0867名無しさん@お腹いっぱい。2007/02/07(水) 11:39:58
次の方どうぞ〜
0868名無しさん@お腹いっぱい。2007/02/07(水) 12:56:56
パイプで処理結果をつなげていくっていうのがわかりやすいってことだろ
cat hoge して中身を見て,その結果を | で別のコマンドに流し込んで...
という部分を省略できるようになると冗長と感じるわけで

オレはコマンドライン編集を使いながら書いていく方が多いから
いまだに cat hoge | から始まるよ

% cat hoge
...出力...
% cat hoge | awk -F: '{print $1, $8}'
...出力...
% ...

そりゃ後から見ながら最適化すれば < hoge とか
コマンドの引数に hoge 指定とかになるんだが
0869名無しさん@お腹いっぱい。2007/02/07(水) 12:59:13
>>868
初心者ですが、catの左側にある % というのは何のコマンドですか?
うちでは % を付けるとエラーになるのですが・・
0870名無しさん@お腹いっぱい。2007/02/07(水) 13:08:30
中身見るのにcat使う習慣はないなぁ。
英語のテキストならless、日本語ならlv、構文のあるテキストファイルならvim、バイナリならbvi。
よってcatは本当に結合したい時にしか使わんが、人それぞれか。
0871名無しさん@お腹いっぱい。2007/02/07(水) 13:09:09
一般ユーザのシェルのプロンプト。$とおなじ。
Bourneシェルのデフォルトが$、Cシェル系は%なので両方が見られる。
0872名無しさん@お腹いっぱい。2007/02/07(水) 13:13:10
マジレスはご遠慮ください。
0873名無しさん@お腹いっぱい。2007/02/07(水) 13:13:55
マジレス上等
ゴマエー
0874名無しさん@お腹いっぱい。2007/02/07(水) 13:22:21
>>859がダメ人間(かどうかは知らん)という命題と、>>858がダメ人間(これは確実)
という命題はは排他ではない。
0875名無しさん@お腹いっぱい。2007/02/07(水) 13:27:51
ははは 可愛い奴だなぁ
08768312007/02/07(水) 15:31:42
>>868
そうそう、まさにそのとおり。
俺もそんなやり方でやっている。
viとかpicoとかでは>>868のような処理はできんだろ。

意味分かる?w
0877名無しさん@お腹いっぱい。2007/02/07(水) 15:55:26
$ < hoge cat
...出力...
$ < hoge cat ← ここで Ctrl-Wを押す
$ < hoge ← catが消える
$ < hoge awk -F: '{print $1, $8}'
...出力...


↑こうすれば無問題。無駄なcatやパイプは要らない。
0878名無しさん@お腹いっぱい。2007/02/07(水) 15:57:20
無駄っつってもそんなにむちゃくちゃリソース食うわけでもないしな。
なんでそんなにこだわるのかわからん。
0879名無しさん@お腹いっぱい。2007/02/07(水) 15:58:36
コマンドを作り上げていく過程での話なら、好きにすればいいじゃん。


0880名無しさん@お腹いっぱい。2007/02/07(水) 16:33:11
cat hogeから始める必要は全然無い。

$ cat hoge
しまった長い... ^C
$ head hoge
考える...
$ tail hoge
考える...
$ sed -e '..' hoge |head
更に考える...
$ sed -e '..' -e '..' hoge |head
更に考える...
$ sed -e '..' -e '..' -e '..' hoge |head

やっぱ、catを使いたがるのは、ダメ人間だな。
0881名無しさん@お腹いっぱい。2007/02/07(水) 16:42:25
どうしよう、>>859 のダメ度がどんどん進行しちゃう
0882名無しさん@お腹いっぱい。2007/02/07(水) 16:56:48
ダメなのは >>858
0883名無しさん@お腹いっぱい。2007/02/07(水) 18:05:59
<span></span>の中のhtmlタグを消したいのですが、いい手はないでしょうか?
sed -n か awk を使えばできると思うのですが難しいです。

<span>
数行
</span>
数行
<span>
数行
</span>
0884名無しさん@お腹いっぱい。2007/02/07(水) 18:19:17
>>883
>>743
08858312007/02/07(水) 18:50:30
>>842
今日、仕事をサボって(w)
本屋に行ってきて物色してみました。
Rubyがよさげだったので
さっそく「たのしいRuby」という本を
買ってきました。
ttp://sheel.mydns.jp/~sheel/ruby.jpg

ワクワクしますよ。
0886名無しさん@お腹いっぱい。2007/02/07(水) 20:54:51
あたえられる文書が整形式のXMLの形になっているなら、
xmlstarlet とかのツールを補助に使えばいいと思うよ。
XSLT でも Xpath でも好きにコマンドラインから使える。
0887名無しさん@お腹いっぱい。2007/02/07(水) 22:52:08
>>883
<span> と </span> のが完全に1行ずつなら簡単だね
0888名無しさん@お腹いっぱい。2007/02/07(水) 22:55:59
>>887
そのように整形する前処理をするとかね
08898312007/02/08(木) 09:49:41
>>883
おれなら
cat -nとかでhtml書類を出力し
それをパイプしてgrepなどで一番最初に遭遇する
<span>と</span>をみつけ、
cut -d¥: -f1を使ってその行頭の数値(=行番号)をよみとり、

その結果をまた

それをパイプしてgrepなどで一番最初に遭遇する
<span>と</span>をみつけ、
cut -d¥: -f1を使ってその行頭の数値(=行番号)をよみとり、

という繰り返しでやるかな。
08908312007/02/08(木) 10:05:40
まちがいた・・・orz
>>883
おれなら
cat -nとかでhtml書類を出力し
それをパイプしてgrepなどで一番最初に遭遇する
<span>と</span>をみつけ、
cut -d¥: -f1を使ってその行頭の数値(=行番号)をよみとり、
cat -nする前のhtmlに対してその数値の間をsedのdオプションで削除し、

その結果をまた
cat -nとかで出力し、
それをパイプしてgrepなどで一番最初に遭遇する
<span>と</span>をみつけ、
cut -d¥: -f1を使ってその行頭の数値(=行番号)をよみとり、
cat -nする前のhtmlに対してその数値の間をsedのdオプションで削除し、

という繰り返しでやるかな。
0891名無しさん@お腹いっぱい。2007/02/08(木) 10:37:59
まぁ大抵の用途では「CDATAセクションに</span>がありました」
なんてケースは考えるだけ無駄だったりするよな。
0892名無しさん@お腹いっぱい。2007/02/08(木) 11:26:21
そう?
RSSとか扱ってると、結構あるけど
0893名無しさん@お腹いっぱい。2007/02/08(木) 11:30:47
その辺の要求仕様は本来なら質問者が書くべきだと思うんだが
たいていこういう質問投げるやつって投げっぱなしだよね。
0894名無しさん@お腹いっぱい。2007/02/08(木) 12:14:03
RSSはXMLのくせにwell-formedなんてくそくらえって感じの世界が……
08958832007/02/08(木) 14:59:16
自己解決しました
0896名無しさん@お腹いっぱい。2007/02/08(木) 16:26:18
ihsのログのローテーションについてのシェルで、次の2つのif文をfor文にまとめて書く書き方
知っているかた教えてください。

if [ -e /work/IBMIHS/logs/access_log ];
then
mv /work/IBMIHS/logs/access_log /logs/auditlog/access_log.$(date "+%Y%m%d") >> ${LOG_FILE}
echo "IHSログローテーション(アクセスログ)は成功しました。"
else
echo "IHSログローテーションは失敗しました。"
exit 1
fi

if [ -e /work/IBMIHS/logs/error_log ];
then
mv /work/IBMIHS/logs/error_log /logs/auditlog/error_log.$(date "+%Y%m%d") >> ${LOG_FILE}
   echo "IHSログローテーション(エラーログ)は成功しました。"
else
echo "IHSログローテーションは失敗しました。"
exit 1
fi
0897名無しさん@お腹いっぱい。2007/02/08(木) 16:45:32
何が困っている(問題となっている)のか読み取れないんだけど・・・
↑じゃダメな理由あるの?
0898名無しさん@お腹いっぱい。2007/02/08(木) 17:12:50
for log in access_log error_log; do
if [ -e /work/IBMIHS/logs/$log ];
then
else
fi
done
0899名無しさん@お腹いっぱい。2007/02/08(木) 17:13:19
シェルってゆうな

for f in access_log error_log; do ....
ってことをしたいのか?
0900名無しさん@お腹いっぱい。2007/02/08(木) 17:17:12
IHSというかapacheのログってmvではローテーションできないんじゃなかったっけ?

ま、それはおいといて、単純に繰り返し部分をまとめるだけなら、

SRCDIR="/work/IBMIHS/logs"
DESTDIR="/logs/auditlog"

for FN in "access_log error_log"
do
if [ -e "${SRCDIR}/${FN}" ]
then
mv "${SRCDIR}/${FN}" "${DESTDIR}/${FN}.$(date "+%Y%m%d")" >> ${LOG_FILE}
echo "IHSログローテーション(${FN})は成功しました。"
else
echo "IHSログローテーションは失敗しました。"
exit 1
fi
done

とか。
0901名無しさん@お腹いっぱい。2007/02/08(木) 17:32:12

for FN in "access_log" "error_log"
0902名無しさん@お腹いっぱい。2007/02/08(木) 19:58:24
シェルスクリプトとちょっとずれるかもしれないのですが、
sudo -u hoge echo "hoge" > test.txt
とすると
test.txt の所有権は hoge ではなく、
sudo の実行者になります。

test.txt を hogeの所有権のファイルとして作成したいのですが、
どこに間違いがあるかご教授お願いします。
0903名無しさん@お腹いっぱい。2007/02/08(木) 20:05:21
リダイレクトは sudo の実行前にシェルが解釈する。

sudo -u hoge sh -c 'echo "hoge" > test.txt'
0904名無しさん@お腹いっぱい。2007/02/08(木) 20:07:16
シェルがコマンドラインを受理した際、
1. > test.txt
2. sudo -u hoge echo "hoge"
の順で処理されるからね。

sudo -u hoge sh -c 'echo "hoge" > test.txt'


09059022007/02/08(木) 20:09:21
>>903
レスありがとうございます、
上の内容をためしたところ、存在しない、といったエラーが出てしまいました。
お助けを〜〜
sh: test.txt: No such file or directory
09069022007/02/09(金) 01:44:34
すいません、何か激しくボケていたようです。
再度試してみたらいけました。
ありがとうございました。
教えていただいた内容も納得です!

ちょっと関連した内容になるのですが、
"hoge"の部分に改行などを含んだ変数を入れたいのですが、
うまくいきません。
どうやら改行ごとに、シェルが実行されてしまっている?ようです。
複数行にわたった変数を使用したい場合、
どのように記述すればよいでしょうか?

何度もすいません orz
0907名無しさん@お腹いっぱい。2007/02/09(金) 06:43:27
改行を\でエスケープすれば効くかも。
0908名無しさん@お腹いっぱい。2007/02/09(金) 10:17:57
シェルによっては、echo "hogeの直後に改行すると、"を認識してそのまま
継続行を入力させてくれるかも。
0909名無しさん@お腹いっぱい。2007/02/09(金) 11:38:06
>>906
何もする必要ない。"hoge" の途中に改行があっても改行はそのまま保存される。
もし、そうならないなら、sudoを実行しているコマンドラインのシェルが、
普通のB-sh系のシェルじゃないんだろう。
(あるいは、sudo先のユーザーのログインシェルが B-sh系じゃないとか)
sh bash zsh ksh 等の B-sh系を使うこと。
09109022007/02/09(金) 15:59:08
そうですか・・・・
レスありがとうございます。

ある変数の内容をファイルに書き込みたい、
という場合、echo とリダイレクトを使う以外にありますでしょうか?
レス数が900を超えています。1000を超えると表示できなくなるよ。