シェルスクリプト総合 その9
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2007/08/15(水) 07:25:02スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。
前スレ
シェルスクリプト総合 その8
http://pc11.2ch.net/test/read.cgi/unix/1171517324/
0468名無しさん@お腹いっぱい。
2007/11/14(水) 11:48:18シェルの実装違い。
似たものに
while read〜do〜done < FILE
これについても各種シェルで動きが違う。
0469名無しさん@お腹いっぱい。
2007/11/14(水) 22:54:11↓ここも参照しる。
http://blog.goo.ne.jp/cars-kitahefu/e/4190a337427d7a8cfcb5a62f515c6936
0470466
2007/11/15(木) 02:30:33なんじゃそりゃという話でした…
0471名無しさん@お腹いっぱい。
2007/11/15(木) 18:33:38連番のファイルを作りたいんだけど、
なんかいい手ある?
for i in ${ABC}
do
cp XXX.txt ${i}.txt
done
個人的には、↑みたいなので簡単に出来るかと思ったけど
${ABC}にハメるAAA,AAB,AAC〜ZZZのリストが
作れなくて。
助けてエロい人。
0472名無しさん@お腹いっぱい。
2007/11/15(木) 18:49:30for in in {A..Z}{A..Z}{A..Z}
do
:
0473471
2007/11/15(木) 18:55:57スマソ、言葉足らずだった。
ウチのシステムsolaris8でbash-2.03なんだ。うん。
{A..Z}って、bash-3.0からの拡張機能だったような。
0474名無しさん@お腹いっぱい。
2007/11/15(木) 18:57:49を3回まわせばいいじゃん。
0475471
2007/11/15(木) 19:54:07言わんとしてることがイマイチ汲み取れなんだ。ごめん。
アホな俺にも分かるようにもうちょいとkwsk説明してくれん?
for i in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do
cp XXX.txt ${i}.txt
for i in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do
cp XXX.txt ${i}.txt
for i in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do
cp XXX.txt ${i}.txt
done
done
done
こう、ネストしろとか…じゃないんだよな。
0476名無しさん@お腹いっぱい。
2007/11/15(木) 20:32:50do
for j in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do
for k in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do
cp XXX.txt $i$j$k.txt
done
done
done
0477471
2007/11/15(木) 20:39:19本気でありがとう神様
0478名無しさん@お腹いっぱい。
2007/11/18(日) 03:10:54の http://xxx だけ抜き出したいのですが、ズバッと一つのコマンドで
できないでしょうか?
0479名無しさん@お腹いっぱい。
2007/11/18(日) 07:07:460480名無しさん@お腹いっぱい。
2007/11/18(日) 08:09:360481名無しさん@お腹いっぱい。
2007/11/18(日) 11:18:480482名無しさん@お腹いっぱい。
2007/11/18(日) 17:37:56478がどういうのを求めているか知らんが、それだと汎用性がなくて使えないのでは?
というかexprって計算以外にも使えるんだ
0483無名
2007/11/18(日) 20:05:48echo '<a href="http://xxx">' | sed 's/[^"]*"\(.*\)".*/\1/'
0484名無しさん@お腹いっぱい。
2007/11/18(日) 20:17:38汎用的にアンカー抜き出したいんなら、素直にHTMLパーサが利用できる
言語使えや
0485名無しさん@お腹いっぱい。
2007/11/19(月) 02:13:59perl -e 'for ($val = "AAA"; $val ne "AAAA"; $val++) { print $val, "¥n";}'
0486名無しさん@お腹いっぱい。
2007/11/19(月) 08:23:440487名無しさん@お腹いっぱい。
2007/11/19(月) 08:52:11perl -e 'print "$_\n" for "AAA".."ZZZ"'
0488名無しさん@お腹いっぱい。
2007/11/19(月) 09:56:22汎用性求めてるならそう書いてくれないと。
0489名無しさん@お腹いっぱい。
2007/11/20(火) 23:47:47シェルを作成したいのですがどのような構文を使用すれば
良いか教えて頂けないでしょうか。よろしくお願いします。
0490名無しさん@お腹いっぱい。
2007/11/20(火) 23:49:420491名無しさん@お腹いっぱい。
2007/11/20(火) 23:58:04if fi else test echo -eq -ge -le -a $1 $2
0492名無しさん@お腹いっぱい。
2007/11/21(水) 00:05:400493名無しさん@お腹いっぱい。
2007/11/21(水) 01:06:18シェルを作成したいのですがどのような構文を使用すれば
良いか教えて頂けないでしょうか。よろしくお願いします。
0494名無しさん@お腹いっぱい。
2007/11/21(水) 01:07:480495名無しさん@お腹いっぱい。
2007/11/21(水) 01:30:51>>493
構文としては順序構文と条件文でできるんじゃない?
0496名無しさん@お腹いっぱい。
2007/11/21(水) 01:54:440497名無しさん@お腹いっぱい。
2007/11/21(水) 06:52:410498名無しさん@お腹いっぱい。
2007/11/21(水) 07:13:300499名無しさん@お腹いっぱい。
2007/11/21(水) 21:36:16>>1 参照
0500名無しさん@お腹いっぱい。
2007/11/21(水) 21:43:34アフォか? >>1 のどこに書いてあるのかと。
0501名無しさん@お腹いっぱい。
2007/11/21(水) 22:00:33>>499はtypoにも気づかず流れも読めなかったのだろうね
0502名無しさん@お腹いっぱい。
2007/11/23(金) 15:22:11⊂二二二( ^ω^)二⊃ ブーン
0503名無しさん@お腹いっぱい。
2007/11/24(土) 07:02:18マジレス頼む。
0504名無しさん@お腹いっぱい。
2007/11/24(土) 09:23:110505名無しさん@お腹いっぱい。
2007/11/24(土) 11:05:490506名無しさん@お腹いっぱい。
2007/11/24(土) 19:48:21カーソル移動にはhjklを使えってことなんでしょうけど、でもviクローンなんかはカーソル有効になってるのも多いですよね。いい方法ないかなぁ。
0507名無しさん@お腹いっぱい。
2007/11/26(月) 13:01:12perlだとNGってことありますね。perl読み書きできない管理者多いし。
shスクリプトの場合は「読めない香具師が悪い」が正論として通る。
# ある程度の規模のものは perl, python, ruby で何とかしたい…
# ただの愚痴でした。
0508名無しさん@お腹いっぱい。
2007/11/26(月) 16:54:12かめれすだが、
perl -le 'print for "AAA".."ZZZ"'
で十分
0509名無しさん@お腹いっぱい。
2007/11/26(月) 23:16:16そうかなあ、用途によっちゃperlで作るけどね。
ただ鯖管理用途?だとシェルスクリプトのほうがシンプルにできると思うけど
0510名無しさん@お腹いっぱい。
2007/11/27(火) 15:00:07今の時間から明日の15時までの秒数、とかが知りたいのだが。
時刻はどちらも date コマンドの出力を前提に考えているけど、
少々なら事前にフォーマットをいじれる。でも UNIX TIME で
記録するのは勘弁な。
0511名無しさん@お腹いっぱい。
2007/11/27(火) 15:12:44普通に、
expr `date +%s -d 'tomorrow 15:00'` - `date +%s`
0512名無しさん@お腹いっぱい。
2007/11/27(火) 23:19:54511じゃないけど、これをperlでやるとなるとかなり面倒くさい。
だから鯖管理者にいやがられるんじゃないかな。
0513名無しさん@お腹いっぱい。
2007/11/28(水) 12:29:41そらぁシェルでかけるのをわざわざperlで書いたら怒られるだろ。
もっとこう、複雑なフィルタとか、DB使うとか、簡単でいいからメニューが欲しいとかいう
要求があるときにperlとかすんなり使わせてくれよということじゃないの?
0514名無しさん@お腹いっぱい。
2007/11/29(木) 02:15:11システム処理があって、
hogehoge | perl -e '
...
' | fugafuga
みないなことをする必要が出たりすると、#!/usr/bin/perl で書いた方が
きれいかも・・・と悩むことが極稀にあるな。もっともそうすると
$foo = `hogehoge`
system("fugafuga")
open("| herohero")
とかなって、今度は #!/bin/sh で書いた方がきれいかも・・・と悩むのだけど
0515名無しさん@お腹いっぱい。
2007/11/29(木) 06:18:040516510
2007/11/29(木) 15:09:20動かないなぁと悩んでたら、GNU の date じゃないと -d がないのね。
Mac で試してたんできがつかなかった..orz。
ターゲットマシンは Linux で問題なく動作しますたので、この方法で
いきます。
0517名無しさん@お腹いっぱい。
2007/11/29(木) 22:43:51非常に気持ち悪いんですけれど。
何か理由があるんでしょうか?
0518名無しさん@お腹いっぱい。
2007/11/29(木) 22:59:280519名無しさん@お腹いっぱい。
2007/11/29(木) 23:10:57もともとエラーコードだから。
エラーなしが 0 。だから 0 が真。
0520名無しさん@お腹いっぱい。
2007/11/29(木) 23:24:55どんな原因でエラーになったのか調べなきゃいかんからな。
0521名無しさん@お腹いっぱい。
2007/11/30(金) 00:59:52&&や||が逆転してやりづらかったとかとか。
0522名無しさん@お腹いっぱい。
2007/12/04(火) 16:36:46テキストエディタで、
#!/bin/sh
echo Hello World
って書いて、名前を付けて保存をして、
プロパティで実行属性にチェックを入れて、
ファイルのアイコンをクリックしたんですけど、
何も出てきません。何か設定が要るのでしょうか?
0523名無しさん@お腹いっぱい。
2007/12/04(火) 17:37:520524名無しさん@お腹いっぱい。
2007/12/04(火) 18:40:580525名無しさん@お腹いっぱい。
2007/12/04(火) 22:51:08「OSは何ですか」という質問を期待しているのだろうか?
0526名無しさん@お腹いっぱい。
2007/12/04(火) 23:18:49拡張子を .command にする。
どうだ?
0527名無しさん@お腹いっぱい。
2007/12/05(水) 20:18:44echo Hello World じゃなくて、
xmessage Hello World にしてみろ
0528名無しさん@お腹いっぱい。
2007/12/05(水) 22:59:26echo "Hello World"
って、誰も指摘せんの?
俺、空気読めてない?
0529名無しさん@お腹いっぱい。
2007/12/05(水) 23:02:42echo Hello World を、
echo Hello World にしても、間隔が広くなりません、という質問だったらよかった。
0530名無しさん@お腹いっぱい。
2007/12/05(水) 23:03:19Hello World
0531名無しさん@お腹いっぱい。
2007/12/05(水) 23:04:580532名無しさん@お腹いっぱい。
2007/12/06(木) 00:23:080533名無しさん@お腹いっぱい。
2007/12/06(木) 00:45:46オマイそんなこと知らないで
よく今までスクリプト組めたな
罰として、まずモナスクリプト書け
等幅フォント用とモナフォント用だ
0534531
2007/12/06(木) 00:50:490535名無しさん@お腹いっぱい。
2007/12/06(木) 01:16:01Hello World
Hello World
Hello World
0536名無しさん@お腹いっぱい。
2007/12/06(木) 07:50:42できました!! xmessageにしたらシェルが出ました
でも本には echoって書いてあったんですよ。ミスプリでしょうか?
0537名無しさん@お腹いっぱい。
2007/12/06(木) 08:52:370538名無しさん@お腹いっぱい。
2007/12/09(日) 21:07:10例えば、moreコマンドなんかの後のスペースキーだとかを
more /hoge/a.txt <<EOF
???
???
???
EOF
なんかで出来ないものでしょうか?
よろしくお願いします。
0539名無しさん@お腹いっぱい。
2007/12/09(日) 21:17:200540名無しさん@お腹いっぱい。
2007/12/10(月) 13:18:591000回程度のループ計算なんですが、計算式部分はfortranでサンプル拝借、代入&出力処理をシェルで書いてみました。
なんとなく出来上がったんですが、ひとつ疑問が浮上し、すぐに解決出来ないのでアドバイス下さい。
fortran90で全て書いた場合と、どの程度速度は劣るのでしょうか?
0541名無しさん@お腹いっぱい。
2007/12/10(月) 13:43:380542540
2007/12/10(月) 14:34:13他のスレではシェルを使っている人がいるか居るのか定かではありません。
僕のような2通りの方法で書いて比較した経験のある方がいらっしゃるのでは?
という淡い期待を持って質問した次第です。
すみません。スレ違いならこの質問は脚下でいいです。
0543名無しさん@お腹いっぱい。
2007/12/10(月) 20:39:200544名無しさん@お腹いっぱい。
2007/12/10(月) 21:16:20気になるなら自分で実測するのが確実。
(shの走る環境の、CPU性能メモリ量の差は非常に幅広いため、答えがない)
0545名無しさん@お腹いっぱい。
2007/12/10(月) 21:22:53CPU、メモリの差による違いは直接関係ないと思うが。
0546名無しさん@お腹いっぱい。
2007/12/10(月) 21:32:37>>542で「僕のような2通りの方法で書いて比較した経験のある方が」と言っている。
CPUやメモリ量が異なる環境での結果と、質問者の環境での結果を、比較しても無意味だ。
(ARM上の結果とCell上の結果を比較しても意味なかろ)
0547名無しさん@お腹いっぱい。
2007/12/10(月) 21:43:10どんなCPU/メモリ環境であろうが、
shとFortranとの速度差は同じような傾向になる。
よって、「CPU性能メモリ量の差は非常に幅広い」としても、
それは質問の本質には関係ない。答えはある。
0548名無しさん@お腹いっぱい。
2007/12/10(月) 21:47:29ARM上のshとFortranとの比較データがあれば、
それはCell上のshとFortranとの速度差(比)を推定する手がかりになる。
よって、大いに意味ある。
0549名無しさん@お腹いっぱい。
2007/12/10(月) 21:52:02ゆとり教育の成果か?
0550名無しさん@お腹いっぱい。
2007/12/11(火) 14:32:22bshで、あるテキストを2行ごとに1行にまとめたいのです。
たとえば、
$ cat aaa.txt
aaa
bbb
ccc
ddd
eee
fff
を
$ cat bbb.txt
aaa bbb
ccc ddd
eee fff
にしたいのです。
sedで置換したり、whileで回したりとかいろいろあるでしょうけど
確かコマンド一つで出来た記憶があるのです。
$ cat aaa.txt | コマンド . . > bbb.txt
うろ覚えですが、そのコマンドにパラメータを二つ(ドットを二個)で、
2行を1行にまとめる。。。だったような気がするのですが、
知っている人いたら教えてください。
0551名無しさん@お腹いっぱい。
2007/12/11(火) 14:40:28paste - - か?
あと、cat | じゃなく < でおk。
0552名無しさん@お腹いっぱい。
2007/12/11(火) 14:44:12pasteです。完全に思い出しました! そうですね、ハイフンですね。
すばやいレスありがとうございました。
0553名無しさん@お腹いっぱい。
2007/12/11(火) 18:00:200554名無しさん@お腹いっぱい。
2007/12/11(火) 18:04:40http://www.netmeister.org/misc/useless_use.pdf
0555名無しさん@お腹いっぱい。
2007/12/12(水) 01:57:08A
B
C
とあって、
2行目の下(この場合はBの下)に
BB
を入れて、
A
B
BB
C
とする
指定行数の下に文字列を挿入する
シェルスクリプトを作りたいのですが、
なにか良いアイデアはないでしょうか?
0556名無しさん@お腹いっぱい。
2007/12/12(水) 02:22:17sed '2a¥
BB
' < old > new
のようにすればできる。
行と挿入する文字列を変数展開するようにすればいいんじゃね?
0557名無しさん@お腹いっぱい。
2007/12/12(水) 02:22:570558名無しさん@お腹いっぱい。
2007/12/12(水) 22:55:420559名無しさん@お腹いっぱい。
2007/12/13(木) 02:40:12以下のHTMLタグがあるとします。
<option name=myname value="a1">b1</option>
<option name=myname value="a2">b2</option>
<option name=myname value="a3">b3</option>
上記の中から文字列処理を行い、以下の結果を導き出したいです。
a1,b1
a2,b2
a3,b3
このようにするにはどのように処理すればよろしいでしょうか?
よろしくお願いいたします。
0560名無しさん@お腹いっぱい。
2007/12/13(木) 03:12:040561名無しさん@お腹いっぱい。
2007/12/13(木) 08:25:29>>559
ほんとうにこの例だけなら、
sed -e 's/.*="//' -e 's/">/,/' -e 's/<.*//'
0562名無しさん@お腹いっぱい。
2007/12/14(金) 00:10:270563名無しさん@お腹いっぱい。
2007/12/14(金) 00:14:430564名無しさん@お腹いっぱい。
2007/12/14(金) 01:21:16m(__)m
全然分からなくて…
0565名無しさん@お腹いっぱい。
2007/12/14(金) 01:40:44wとかwhoとかlastとか調べてみるといいかもしれん
0566名無しさん@お腹いっぱい。
2007/12/14(金) 01:48:27そういうのは普通E4X
var x = <html>
<option name="myname" value="a1">b1</option>
<option name="myname" value="a2">b2</option>
<option name="myname" value="a3">b3</option>
</html>;
for each (var opt in x.option) {
print("" + opt.@value + "," + opt);
}
じゃなかったらXSLT
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="option">
<xsl:value-of select="@value"/>,<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
0567名無しさん@お腹いっぱい。
2007/12/14(金) 01:50:22while true; do
if [ ! -f /tmp/last.txt ] ; then
touch /tmp/last.txt
fi
mv /tmp/last.txt /tmp/last.txt.old
last > /tmp/last.txt
diff /tmp/last.txt.old /tmp/last.txt
sleep 5
done
基本はこんな感じか。これでもログイン/ログアウトの度に反応がでる。
あとは画面を生diffの結果から、も少し整形する必要があるわな。
< user pts/3 192.168.0.1 Fri Dec 14 01:43 still logged in
---
> user pts/3 192.168.0.1 Fri Dec 14 01:43 - 01:43 (00:00)
行の頭からログイン時刻までを一本の文字列にしてawkとかの連想配列のキーにして、
ログアウト時刻(またはstill logged inn)を保持しておくか...
あとlastのお尻の方はだんだん削られていくから、これも何とかする必要があるな。
■ このスレッドは過去ログ倉庫に格納されています