シェルスクリプト総合 その8
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2007/02/15(木) 14:28:44スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。
前スレ
シェルスクリプト総合 その7
http://pc10.2ch.net/test/read.cgi/unix/1157601611/
0514名無しさん@お腹いっぱい。
2007/05/29(火) 10:12:43ファイル末尾に到達したら終了させるとか。
0515名無しさん@お腹いっぱい。
2007/05/29(火) 19:07:30書いてみよう
0516名無しさん@お腹いっぱい。
2007/05/29(火) 19:20:43>>513 がやろうとした事(間違ってるがw)
0517名無しさん@お腹いっぱい。
2007/05/29(火) 19:44:45こういう場合、ed を non-interactive に使うのがいい。
最後20行ということは、$-19から $までだから、
echo '$-19,$d
w outfile
q' | ed infile
↑で桶。
0518名無しさん@お腹いっぱい。
2007/05/29(火) 21:46:070519名無しさん@お腹いっぱい。
2007/05/30(水) 08:58:500520名無しさん@お腹いっぱい。
2007/05/30(水) 19:17:11#!/bin/sh -
tmpfile=/tmp/program.$$
cat "$1" | tr ' ' '\n' > tmpfile
while read word
do
grep ${word} "$2" | いろいろと処理・・・
done < tmpfile
てな感じのスクリプトなのですが、
第一引数のファイル中に、例えば -i と言うような語があると
grep がオプションと解釈するのか何なのか、直後に while ループが
終了してしまいます。
'${'"$word"'}' だと grep には ${word} として渡されてしまいます。
何とかシェルを騙して grep に '-i' として渡す方法は無いでしょうか?
(渡す前に条件判断して先頭文字が - なら sed などで先頭に \ を
付加すると言うのも行けそうな気はしますが、出来れば余計なIFとか
変数とか無しで行きたいものです)
0521名無しさん@お腹いっぱい。
2007/05/30(水) 19:35:35grep -
0523名無しさん@お腹いっぱい。
2007/05/30(水) 21:22:55結構な数のコマンドで使える。
0525名無しさん@お腹いっぱい。
2007/06/02(土) 11:43:37インターネットに接続できるか試すコマンドってありますか?
やりたいこと
インターネットに接続できたら echo "できます"
インターネットに接続できなかったら echo "できません"
としたいです。
0526名無しさん@お腹いっぱい。
2007/06/02(土) 11:59:130527名無しさん@お腹いっぱい。
2007/06/02(土) 12:05:24if ping -c 1 www.yahoo.com >/dev/null 2>&1; then
echo "出来ます"
else
echo "出来ません"
fi
0528525
2007/06/03(日) 03:05:39ありがとうございます
できればヤフーなどの特定のサイトに依存せず
確実にインターネットに繋がるかどうか判断したいです。
もし無理なら特定のサイトでも構いませんが
こういう場合通例としてyahoo.comを使うのが適切でしょうか?
0529名無しさん@お腹いっぱい。
2007/06/03(日) 07:09:14その通信相手にすればいいよ。
0530名無しさん@お腹いっぱい。
2007/06/03(日) 07:21:06何が目的なん?
0531名無しさん@お腹いっぱい。
2007/06/03(日) 08:59:25www.yahoo.comとかwww.google.comとか使えばいい。
0532名無しさん@お腹いっぱい。
2007/06/03(日) 11:01:00君のほうから、どことつながったらインターネットに繋がっていると言えるかの
判断基準を出してくれないと先に進めないと思うよ。
0533名無しさん@お腹いっぱい。
2007/06/03(日) 12:04:41ファイアウォールの具合でICMP通らないかもしらんし。
0534名無しさん@お腹いっぱい。
2007/06/03(日) 23:19:330535名無しさん@お腹いっぱい。
2007/06/04(月) 07:59:35>if ping -c 1 www.yahoo.com >/dev/null 2>&1; then
関係ないが、この 2>&1
エラー対策でつか?
0536名無しさん@お腹いっぱい。
2007/06/04(月) 14:12:29tail -r ファイル名| tail +20 | tail -r
でもいけた(tailばっかりでカッコ悪いか)
0537名無しさん@お腹いっぱい。
2007/06/04(月) 21:46:12終了ステータスだけとれりゃいいので、エラーメッセージとか捨てる。
0538名無しさん@お腹いっぱい。
2007/06/04(月) 21:50:180539ウサチャソ
2007/06/04(月) 23:49:23ウホッ
0540名無しさん@お腹いっぱい。
2007/06/04(月) 23:51:56*「アッー!」
0541名無しさん@お腹いっぱい。
2007/06/05(火) 06:33:28以前、gawkでstrftimeを利用して同じ事をしたのですが、今回使ってるサーバのawkは
gawkでない為に別の方法が必要です。
どうもウマイ方法が思いつきませんで・・・ご教示お願いします。
0542名無しさん@お腹いっぱい。
2007/06/05(火) 08:54:12vmstat 1 | perl -MPOSIX -pe 'BEGIN{$|=1} print strftime q{%H:%M:%S }, localtime'
0543名無しさん@お腹いっぱい。
2007/06/05(火) 08:59:20vmstat 1 | while read line; do echo `date +%H:%M:%S` $line; done
0544名無しさん@お腹いっぱい。
2007/06/05(火) 20:13:14DQ I ?
0545541
2007/06/05(火) 22:31:39HP-UX10.20だったのですがperlが入っていませんでした(汗
でも、これを機会にperlもちょっとづつ勉強したいと思います。どもでした。
>>543
readがそんな使い方できるとは知りませんでした。
おかげさまでばっちり動きました。ありがとうございます。
0546名無しさん@お腹いっぱい。
2007/06/05(火) 23:39:38echo hoge | read v
で
echo $V →hoge
になるように読める
で、できないってことはわかったんだけど結局readはどう使うんですか
なんでwhile中だとうまく動くんでしょう
0547名無しさん@お腹いっぱい。
2007/06/06(水) 00:17:57read で代入する変数はサブシェルのものだから、親シェルに戻ると忘れる。
while でなくても、下のような書き方をすれば {...} の中にかぎり有効。
echo hoge | {
read v
echo $v
}
あと、ksh はふつーに可能だったような記憶がうっすらとあるが自信ない。
0548名無しさん@お腹いっぱい。
2007/06/06(水) 15:14:41シェルスクリプトを、windowsでCD-Rに焼き、linuxで実行すると
改行がコマンドとして認識され、command not foundとなってしまいます。
普通に改行を改行として認識させることはできないのでしょうか?
0549名無しさん@お腹いっぱい。
2007/06/06(水) 16:33:410550名無しさん@お腹いっぱい。
2007/06/06(水) 16:52:46ありがとうとざいます
LFで保存したところ大丈夫でした。
ただし1行目だけはなぜかcommand not foundとなってしまう。。
0551名無しさん@お腹いっぱい。
2007/06/06(水) 20:15:14$logを 2007-01-01
という風に、[西暦]-[月]-[日]な形にしたいのですが、どすればよいでしょうか?
どなたか、お力をお貸し下さいませ。
.log と取って、4桁、2桁、2桁ごとに「-」を挟む。というのはわかるのですが
方法や何のコマンド使ってよいものやら見当もつきません。お願いします!
0552名無しさん@お腹いっぱい。
2007/06/06(水) 20:26:090553名無しさん@お腹いっぱい。
2007/06/06(水) 20:30:18sedは使えるつもりでいたんですが、まだまだの若輩者でしたorz
こんなに早く答えて頂いて本当に助かりました。
0554名無しさん@お腹いっぱい。
2007/06/06(水) 23:42:520555名無しさん@お腹いっぱい。
2007/06/06(水) 23:42:59専門用語を交えないで言うと、どういったものなのでしょうか?
0556名無しさん@お腹いっぱい。
2007/06/06(水) 23:44:510557名無しさん@お腹いっぱい。
2007/06/07(木) 00:11:41大分違うな…
0558名無しさん@お腹いっぱい。
2007/06/07(木) 00:35:32専門的な概念なのに専門用語使うなというのは無理な話。
0559名無しさん@お腹いっぱい。
2007/06/07(木) 02:08:21その説明で開眼しました!!
今ならどんなプログラムも書けそうです!!
(^ω^)
0560名無しさん@お腹いっぱい。
2007/06/08(金) 00:50:30then
echo "foo exists."
else
echo "foo does not exist."
fi
これを Solaris 8の bash, cygwinの sh, bashで実行するとOK。
でも Solaris 8の shで実行した時だけ
test: argument expected
と出てしまいます。どうにも分かりません。助けて下さい…
0561名無しさん@お腹いっぱい。
2007/06/08(金) 03:13:50これは外部コマンドのtestも同様。
0562名無しさん@お腹いっぱい。
2007/06/08(金) 06:27:46ダウト。
Solarisの外部コマンド版のtestの実体はkshスクリプトだから、
Solarisでも外部コマンド版のtestには -eオプションがある。
ただし、純正Bourneには -eがないので、使わないこと推奨なのは同意。
[ -f foo ] あたりで代用だな。
0563名無しさん@お腹いっぱい。
2007/06/08(金) 08:29:58たとえば、以下のようなファイルがある。
----------------------------
aaa
bbb
ccc
ddd
eee
fff
ggg
----------------------------
grepコマンドをつかって、
$ grep ddd -a 333
とすると
bbb
ccc
ddd
eee
fff
と表示されるようなやつよ。
0564名無しさん@お腹いっぱい。
2007/06/08(金) 08:45:56-A とか -B とかない?
0565名無しさん@お腹いっぱい。
2007/06/08(金) 10:35:48普通にgrepだけで行けるぞ
grep -A 3 -B 3 'ddd' filename
0566名無しさん@お腹いっぱい。
2007/06/08(金) 10:44:100567名無しさん@お腹いっぱい。
2007/06/08(金) 11:01:46-A がある grep とない grep がある。
それだけ。
0568名無しさん@お腹いっぱい。
2007/06/08(金) 11:02:540569名無しさん@お腹いっぱい。
2007/06/08(金) 11:03:45sedで : より前だけ取り出して
awkにくべて前後の必要な行番号を全部計算して
sort -nuして
sedでsedのコマンドに成形しなおして
sedで抽出。
てゆうか、grepにこだわらずにawk1個の方がめちゃ楽そう。
0570名無しさん@お腹いっぱい。
2007/06/08(金) 11:04:44awkだけだとどうなるの?
0571名無しさん@お腹いっぱい。
2007/06/08(金) 11:29:370572名無しさん@お腹いっぱい。
2007/06/08(金) 11:43:53普通は、prelとかrubyを使う
まあ、perlとかruby使えないから聞いてるんだろうけど
0573名無しさん@お腹いっぱい。
2007/06/08(金) 11:52:15sedやgrepでどうしようかななんて考えてる時間が無駄だよな
perl覚えちゃたほうがいいのにね、これを機会に
0574名無しさん@お腹いっぱい。
2007/06/08(金) 11:55:160575名無しさん@お腹いっぱい。
2007/06/08(金) 12:00:44perlやrubyを使ってもそれは同じじゃないかな。
sed+awkなら
sed -e "$(awk '/pattern/{for (i=-2;i<=2;i++)if(i+NR>=0)print (i+NR) "{p;d;}"}' file|sort -nu)"';d' file
zshでしか試してないのでクォート回りはshだと違うかも知れんが、
だいたいこんな感じで。
0576名無しさん@お腹いっぱい。
2007/06/08(金) 12:19:380577名無しさん@お腹いっぱい。
2007/06/08(金) 12:26:01だってGNU拡張は、ユーザが便利だと思うものを実装して
拡張していったんだから
きっと、>>563みたいなことを、数年前にも同じといってる人が
現れてんだよw
それで拡張されてる
0578名無しさん@お腹いっぱい。
2007/06/08(金) 12:40:490579名無しさん@お腹いっぱい。
2007/06/08(金) 15:54:550580名無しさん@お腹いっぱい。
2007/06/08(金) 16:04:210581名無しさん@お腹いっぱい。
2007/06/08(金) 16:14:46の意味がやっとわかったようでなにより
0582名無しさん@お腹いっぱい。
2007/06/08(金) 16:21:470583名無しさん@お腹いっぱい。
2007/06/08(金) 16:25:280584名無しさん@お腹いっぱい。
2007/06/08(金) 16:29:280585名無しさん@お腹いっぱい。
2007/06/08(金) 17:38:00キーワードを打ち込んで検索させたりはできないものなんでしょうか?
初心者なんで仕組みなどわかりませんので構造上できないものなら教えてください
0586名無しさん@お腹いっぱい。
2007/06/08(金) 17:49:58http://pc11.2ch.net/mac/
0587名無しさん@お腹いっぱい。
2007/06/08(金) 21:02:220588名無しさん@お腹いっぱい。
2007/06/08(金) 22:41:28---hoge.txt---
aaa
bbb
ccc
これを
---hoge.txt---
aaa
ccc
こうしたい。
sed -i "s/bbb//g" hoge.txtだと
---hoge.txt
aaa
ccc
こうなってしまう・・・
0589名無しさん@お腹いっぱい。
2007/06/08(金) 22:49:060590名無しさん@お腹いっぱい。
2007/06/08(金) 23:03:06ありがとうございます!
0591名無しさん@お腹いっぱい。
2007/06/08(金) 23:37:42それに、わざわざBourne Shellに縛ったスレなのに、GNU拡張に依存するのもどうかと思う
ポータビリティも勘案すると、perl使った方がいい
0592名無しさん@お腹いっぱい。
2007/06/09(土) 10:18:520593名無しさん@お腹いっぱい。
2007/06/09(土) 11:53:54モレも-Po がマジ便利だと思う。
0594名無しさん@お腹いっぱい。
2007/06/09(土) 12:23:490595名無しさん@お腹いっぱい。
2007/06/09(土) 12:49:240596名無しさん@お腹いっぱい。
2007/06/09(土) 14:42:530597名無しさん@お腹いっぱい。
2007/06/09(土) 14:54:080598名無しさん@お腹いっぱい。
2007/06/09(土) 15:01:51お行儀悪く書けてしまうのが悩みの種
0599名無しさん@お腹いっぱい。
2007/06/10(日) 01:08:21お行儀悪く書いても心が痛まないのがPerlの長所
0600名無しさん@お腹いっぱい。
2007/06/10(日) 01:10:390601名無しさん@お腹いっぱい。
2007/06/10(日) 22:37:24どうでもいい
0602名無しさん@お腹いっぱい。
2007/06/15(金) 02:31:42研究室で使うためです。
C言語もほとんど知らないので、取っ付きにくく、苦労してます。
今よく分からないのは、シェル変数と環境変数です。
普通に話に出てくるのですが、変数だとは理解してますが、違いが分かりません…
どなたか教えて頂けませんか?
0603名無しさん@お腹いっぱい。
2007/06/15(金) 02:41:57環境変数は(主に)呼び出されたコマンドが使う
それはいいとして、なんでcshかちゃんと確認しろ
csh使う必然性がなければ、shにしとけ
0604名無しさん@お腹いっぱい。
2007/06/15(金) 03:12:03シェル変数はそのシェルのみが使い、
子プロセスに引き継がれない。
0605602
2007/06/16(土) 01:09:53なぜcshなのかと言うと、 今研究室で使われてるのがcshだとしか…
Cで書かれたソースプログラムをcshに渡して、
結果を他のプログラムに渡して……
って感じらしいです。
まだ学部なので、難しいプログラムは書けず、
既成のプログラムの値を変えて走らせたりするようです。
最近の課題が、あるcshの中身を渡され、理解してくるものでしたが、
プログラムの知識が無い自分にはさっぱりというわけです…
0606名無しさん@お腹いっぱい。
2007/06/16(土) 01:58:470607名無しさん@お腹いっぱい。
2007/06/16(土) 03:31:440608名無しさん@お腹いっぱい。
2007/06/16(土) 15:17:350609名無しさん@お腹いっぱい。
2007/06/16(土) 15:47:46cshの中身というのはcshスクリプトという意味か?
0610名無しさん@お腹いっぱい。
2007/06/16(土) 16:11:270611名無しさん@お腹いっぱい。
2007/06/16(土) 16:53:100612名無しさん@お腹いっぱい。
2007/06/16(土) 18:01:050613名無しさん@お腹いっぱい。
2007/06/16(土) 18:02:26■ このスレッドは過去ログ倉庫に格納されています