1 名前:名無しさん@お腹いっぱい。 [2008/05/20(火) 20:58:04 ] シェルスクリプトの総合スレです。 スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。 シェルスクリプト総合 その10 pc11.2ch.net/test/read.cgi/unix/1202725267/
6 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/20(火) 21:07:57 ] □関連書籍と関連リンク: FreeBSD Hypertext Man Pages www.freebsd.org/cgi/man.cgi Linux JF (Japanese FAQ) Project. www.linux.or.jp/JF/ Unix Programming Frequently Asked Questions 日本語訳 www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html UNIXプログラミング環境 www.amazon.co.jp/exec/obidos/ASIN/4871483517/ □人間初心者へのお願い: ・このスレはシェルスクリプトについてのスレです。 シェルの対話的な利用についての話やスクリプトと関係ないコマンドの 使い方の質問などはスレ違いなので無用に願います。 □シェルスクリプトでよく使うコマンド: 制御・条件判定系: [,test,expr,true,false,yes,getopts テキスト処理系: cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join ファイル検索系: find,xargs (スペースなどを含むファイル名を正しく処理するため、 findは -print0、xargsは -0オプションを常に付けることを推奨 ただし、Solarisでは未対応。どうするんだろ?) ディレクトリ系: basename,dirname 出力系: echo,printf 対話コマンド制御系: expect http/ftpの処理自動化: wget,curl
7 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/20(火) 21:08:37 ] シェルにはAシェル系、Bシェル系、Cシェル系、と種類があるようですが、 僕のPCのシェルはXtermというものみたいです。 これは、シェル系に当てはめると何シェル系なんでしょうか?
8 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/20(火) 21:15:51 ] >>7 X系。
9 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/20(火) 22:18:01 ] >1 乙 >2 追加したほうがいいかもしれない関連スレとただし書き LinuxユーザはLinux板へ シェルスクリプト総合@LINUX Part4 pc11.2ch.net/test/read.cgi/linux/1210999497/
10 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 00:11:21 ] >>7 端末(端末エミュレータ)とシェルは別の存在。 あなたは端末エミュレータの中でシェルを動かしているはず。 echo $SHELL
11 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 00:16:58 ] solarisのdfとかduで、サイズをギガ表記にしたいんだけどスクリプトでちょちょいとできないですかね?
12 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 00:18:21 ] solaris10以降は、-hオプションがついてる。
13 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 00:42:41 ] -hがないんですよ バージョンは失念しました
14 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 06:46:50 ] SolarisのdfってBLOCKSIZEはみないのか?
15 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 08:37:13 ] $(command) 1より `command` が推奨なのってなんで?
16 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 08:45:55 ] SunOSとかNEWS-OSとかでも動くから
17 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 09:44:41 ] 1 が不要だから。
18 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 11:53:48 ] コマンドをパイプで複数実行する際に最初のコマンドでエラーだったら その後のパイプ以降は実行しないというのは可能ですか?
19 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 12:17:42 ] パイプってのは、あるコマンドを実行してそれが終わったら出力を 次のコマンドに流して、という仕組みではない。 どうしてもそういうことがやりたければパイプを使わない。 commandA > tmpfile.$$ && commandB < tmpfile.$$ # unix ではなく dos のパイプはこういう仕組みだったりする。
20 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 23:27:43 ] シェル用語では、コマンド1個だけでもパイプラインと言う。 パイプライン1(=command1)がエラーなら パイプライン2(=command2)を実行しないのなら、 command1 && command2 でよい。 >>18 は command1 と command2 の標準入出力を、 pipe(2)でつなぐとは言っていないのだから。
21 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 23:36:39 ] こじつければ(形式的には)個々はパイプラインかもしれないが、 「パイプで複数実行」には到底ほど遠いだろう
22 名前:名無しさん@お腹いっぱい。 [2008/05/22(木) 21:37:11 ] 質問させてください。 a.txtファイルにbbbと言う文字があった場合、その文字を完全に削除するにはどうしたらいいでしょうか? ----- aaa bbb ccc ----- 例えばa.txtの内容が上ようなとき、下のように置換したい。よろしくお願いします。 ----- aaa ccc -----
23 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/22(木) 21:46:57 ] grep -v bbb a.txt>b.txt
24 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/22(木) 22:03:03 ] >>23 すみません。それをa.txtに保存したいです。
25 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/22(木) 22:13:05 ] (rm a.txt; grep -v bbb > a.txt) < a.txt
26 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/22(木) 22:42:55 ] $ sed -e '/bbb/d' -i '' a.txt
27 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/22(木) 22:43:28 ] >>25 すみません。iノード番号を変えずに保存したいです。
28 名前:22本人です ◆wSaCDPDEl2 mailto:sage [2008/05/22(木) 22:50:27 ] >>26 ありがとう!sedでやりたかったです。 でもsedは使えるはずなのにエラーが出てしまいました。 エラー「sed: を読み込めません: そのようなファイルやディレクトリはありません」 バージョンが違うのでしょうか?ちなみにLINUXでやってます。
29 名前:22本人です ◆wSaCDPDEl2 mailto:sage [2008/05/22(木) 22:53:42 ] あ、できました。 sed -i '/bbb/d' a.txt みなさん初心者にも親切に教えてくれてやさしいですね。 ありがとうございました。
30 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/22(木) 23:24:52 ] >>29 おいおい、 sed -i '/bbb/d' a.txt だと i-node番号変わるぞ。i-node番号変えちゃ駄目(>>27 ) じゃないのか?
31 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/22(木) 23:30:06 ] それは俺の創作だ。正直すまんかった。
32 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/22(木) 23:34:24 ] >>22 >>27 iノード番号を変えずに a.txtを修正する方法の正解の md5を貼っておくぞ。 25fe9a9dfa4248593f6aa361db01a222 さあ、オマエラ考えてみろ。
33 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/23(金) 00:30:59 ] cat a.txt > tmp; sed '/bbb/d' tmp > a.txt; rm tmp
34 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/23(金) 00:39:56 ] なんでiノード番号変わっちゃだめなの?
35 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/23(金) 06:44:52 ] >>33 一時ファイル作っちゃ駄目
36 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/23(金) 06:49:17 ] >>34 a.txtが他のファイルとハードリンクしていた場合、 sed -i とかだとハードリンクが切れてしまう。
37 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/23(金) 09:35:47 ] printf "g/bbb/d\nwq\n" | ed a.txt
38 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/23(金) 11:25:56 ] >>36 sed -iって、viなんかで編集するのとは違う理屈で動いているってことかな?
39 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/23(金) 23:19:47 ] GNU sedのソースを見てみたが、inplace編集では、テンポラリファイルを 開いて書き込んだのちリネームしているね。 sed-4.1.5/sed/execute.c:658 (開く方) sed-4.1.5/sed/execute.c:712 (閉じる方)
40 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/24(土) 16:21:15 ] オーナーを保存できないじゃないか
41 名前:名無しさん@お腹いっぱい。 [2008/05/25(日) 08:58:02 ] カレントディレクトリに、 hoge-1.22.3.tar.gz hoge-1.23.tar.gz hoge-1.24.1.tar.gz fuga-3.31.1.tar.gz fuga-3.5.4.tar.gz : みたいなソースのtarボールがたくさんあります。 これらのファイルのファイル名を見て、 最新バージョンだけ残して、最新以外のファイルを削除するシェルは どうやったら発行できますか? なお、タイムスタンプは当てにならないので、 あくまでファイル名だけで判断してください。
42 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 09:09:54 ] シェルってゆうな。クズ。 発行ってゆうな。クズ。
43 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 09:23:44 ] 定番の突っ込み乙。で回答は?
44 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 09:35:44 ] >>42 ウチの会社でシェって呼ぶ人もいるよ
45 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 10:19:39 ] >>43 そもそも最新バージョンとそれ以外を同じところに溜めたのが間違い。
46 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 12:39:54 ] パッケージ名の定義、バージョンの新旧の定義をしろ。
47 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 13:18:17 ] >>46 お前自身の定義でいいから答えてみろよw
48 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 14:06:29 ] 断る。
49 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 15:06:27 ] ×断る。 ○能力不足のためできない。
50 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 15:38:11 ] 「答えられないなら黙ってろ」というポリシーは変えたのか? www
51 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 15:54:09 ] >>45-46 >>48 答えられないなら黙ってろ
52 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 17:39:31 ] ぽまいら へるぷ! hoge0501-0000.wav hoge0501-0100.wav hoge0501-0900.wav の複数ファイルをmp3で小さくしたいのですよ hoge0501-0000.wav → hoge0501-0000.mp3 ってか0000の部分を0000のままにしたいのですが… なんかいい知恵を!!! おながいします lameとかgogoの使い方は大丈夫ですw
53 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 17:51:01 ] >>52 infile=hoge0501-0000.wav outfile=`basename $infile .wav`.mp3 あとは lameとかで $infile と $outfile を参照。
54 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 18:04:34 ] >>52 おお、ファイル名そのものを変数としるのね dクス! さっそくやってみます!!
55 名前:便乗炭/びんじょうたん mailto:sage [2008/05/25(日) 22:20:47 ] あのぉ〜。。。。。 >>53 を連続で処理するには?
56 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 22:32:03 ] for infile in "$@";do outfile=`basename $infile .wav`.mp3; 変換する ;done
57 名前:便乗炭! mailto:sage [2008/05/26(月) 00:17:11 ] >>56 ご丁寧にありがとうございます orz szo ヘコヘコ
58 名前:名無しさん@お腹いっぱい。 [2008/05/27(火) 18:01:23 ] 質問です。 if文で現在起動中のデーモンを確認するにはどうしたらいいでしょうか?
59 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 18:14:00 ] >>58 pc11.2ch.net/test/read.cgi/linux/1211384088/211 の人?
60 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 18:14:58 ] そんな事どうだっていいだろうがカス
61 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 18:18:01 ] 図星かw
62 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 18:51:36 ] >>59 >>61 わからないなら黙ってろ
63 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 19:07:31 ] >>60 >>62 君も黙ってなよw 言ってることは同意だけど。
64 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 19:09:55 ] pgrepは戻り値返すよ。 if pgrep hoge; then 何か fi で桶。
65 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 20:15:40 ] >>64 ありがとうございました
66 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 21:20:30 ] >>64 pgrep で確認してるのであって、if で確認してるわけじゃないと思うが。
67 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 21:34:58 ] >>66 本人がいいって言ってるんだから、それがすべて
68 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 01:35:31 ] >>66 Cでも何でも条件で確認して、ifはその結果で分岐するだけだと思うが。
69 名前:名無しさん@お腹いっぱい。 [2008/05/28(水) 21:18:30 ] 1から100までの乱数を得るとかってでないですかね
70 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 21:22:39 ] >>69 echo $((RANDOM*100/32768+1))
71 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 22:07:29 ] ありがとうございます 変数であるんですね ちなみに32768というのは?
72 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 22:09:29 ] 2の15乗。15bit乱数だから。
73 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 22:10:32 ] bash依存乙w
74 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 22:28:12 ] だからksh由来だと何度(ry
75 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 22:29:03 ] >>73-74 わからないなら黙ってろ
76 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 22:45:00 ] 純正シェルだとどうやるの?
77 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 23:09:49 ] 純正ってナニ?
78 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 23:16:10 ] bshじゃないか? bashじゃ無いオリジナルの
79 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 01:10:09 ] むかし、Bee Shell(ミツバチシェル)ってのを使ったことがあるせいか、 Bourne Shellのことはshか/bin/shと書いた方がいいような気がする。
80 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 02:18:20 ] sh が bashのリンクになってるのって最近のlinuxだけ?
81 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 03:11:30 ] >>79 HP-UXやAIXはksh改変版が使われている。 なんで、kshで拡張された便利機能もほとんど使えるようになっている。
82 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 05:28:36 ] >>80 UbuntuやDebianの/bin/shはdash
83 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 06:45:40 ] 能書きはいいから、純正シェルでのやりかた答えろ
84 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 07:08:01 ] >>66 >>83 なんなの、この屑は
85 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 07:24:03 ] 純正シェルなんて言葉どこで覚えてきたんだ?
86 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 07:27:42 ] >>85 わからないなら黙ってろ
87 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 07:28:49 ] はーーーーーーい
88 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 07:34:09 ] >>83 echo $$
89 名前:69 mailto:sage [2008/05/29(木) 10:47:07 ] すいません >>79 をループして繰り返すと 3 20 43 70 81 10 15 49 60 87 みたいに1から100の間で増えて戻って増えてを繰り返します この規則性をなくせないですか?
90 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 11:10:35 ] >>89 echo $(($(head -c 2 /dev/urandom | od -An -d)*100/65536+1))
91 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 12:59:00 ] おお 意味はまったく理解不能ですがこれでいけそうです ありがとうございます
92 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 13:20:20 ] >>90 OS依存、GNU依存、bash依存乙。
93 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 13:24:26 ] >>92 わからないなら黙ってろ
94 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 13:34:33 ] 純正シェルではどうやるの?
95 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 16:32:15 ] 純正シェルでは rm /bin
96 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 17:05:04 ] >>95 わからないなら黙ってろ
97 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 17:14:20 ] >>96 わからないなら黙ってろ
98 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 18:14:00 ] わからないならオナってろ
99 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 22:09:56 ] >>92 いちいち五月蝿いよ。 よりポータブルに直したい奴は、直して自分で書けばいいよ。
100 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 23:02:12 ] >>99 >1 > bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 って事なんじゃね。 つまり嫌味を言いながら実はこの決まりを代行してるツンデレ。 あと>92-94は>73-76の74が足りないな。おしい。
101 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 23:12:48 ] >>100 わからないなら黙ってろ
102 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 23:14:45 ] うるさいのが一人いるなッ
103 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 00:38:12 ] ッ
104 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 00:42:35 ] でも、言ってることは正しいな 書くべきだよねえ
105 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 06:43:58 ] >>101 わかっているから黙ってない
106 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 07:57:37 ] >>100 明記できる奴は明記すればいい。 ポータブルに直せる奴は直せばいい。 >>92 みたいな屑が一番邪魔。
107 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 08:45:48 ] 質問者が環境をちゃんと書けばいいんだよ。
108 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 08:50:20 ] 質問者の環境にかかわらず、純正シェルで動くことが条件。
109 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 09:59:15 ] 質問テンプレ 使っているOS名・バージョン: (※LinuxユーザはLinux板へ) 使っているシェルの名前・バージョン: 使っているシェルのフルパス: 移植性: 上記環境で動けば十分 / 多くの環境で動かす必要がある
110 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 10:12:44 ] GNU/Linux, *BSD使い始めたころから補完ができるってだけの理由で特に理由もなくBash使ってるけど 他に何か良いShellないかな。 Bashに特に不満はないけど。
111 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 10:28:30 ] zsh使ってみれば
112 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 10:28:37 ] >>109 氏からの回答が欲しい場合は >>109 に従ってね。 でも俺はエスパーだから、OSとかバージョンとか書かなくても回答できちゃうよ。 気軽に質問してね。もち、Linuxユーザーの質問もOK。
113 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 11:14:08 ] エスパー>>112 からの回答が欲しい場合はエスパースレへ。 pc11.2ch.net/test/read.cgi/unix/1207042632/ 前任のエスパーは質問者の環境壊して再インストールさせる低レベルだったけど、 >>112 はそんなアホじゃないだろうと期待。
114 名前:名無しさん@お腹いっぱい。 [2008/05/30(金) 11:41:59 ] カレントに移動しないと起動できないソフトがあります。 これを、カレントを移動しなくて済むようにするシェルはできませんか? >>109 さん以外の方、回答をよろしくお願いします。
115 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 13:39:40 ] CentOS bin/bashの条件式での質問です。 前提としまして、file1、file2、file3、file4という似たファイル名が 複数あるとします。 そこで条件式内で、[ -e file* ] というようなfileから始まるファイルに一致させたいのですが どのように記述したら宜しいのでしょうか?
116 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 13:40:52 ] >>115 シェルスクリプト総合@LINUX Part4 pc11.2ch.net/test/read.cgi/linux/1210999497/
117 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 13:44:34 ] >>115 そういう場合はlsの戻り値を使う。 if ls file* > /dev/null 2>&1 ; then hoge fi
118 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 13:45:16 ] >>116 わからないなら黙ってろ
119 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 13:48:09 ] >>116 スレ間違えてしまいすいません、誘導ありがとうございます。 >>117 lsの戻り値を条件式で使えたとは盲点でした。多少分からない 箇所がありますので調べつつ挑戦します。ありがとうございました
120 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 14:10:40 ] >>118 わかっちゃいるけどやめられない
121 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 20:38:57 ] >>114 普通に、 #!/bin/sh cd /path/to/hoge exec ./hogesoft "$@" で桶。cdしてしまうように見えるが、シェルスクリプト自体が別シェルなので カレントディレクトリは実行時のディレクトリから変わらない。
122 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 03:49:40 ] こんなスクリプトを書いてプロセス監視&常時起動させていますが、 数時間走らせると、★の行を食ったまま、停止してしまいます。 orz 原因&解決策か、もしくはタイムアウトを設定する方法を ご教示いただけませんでしょうか。。 #!/bin/sh while true do ★ret=`ps -ef | grep "collector.php" | grep -v grep | wc -l` if [ $ret -eq 0 ]; then php /hoge.php & fi sleep 1 done
123 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 06:14:58 ] pgrepないの?
124 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 07:19:56 ] >>122 まず、wc -lしたりretに代入したりしてるのが無駄。 grepは戻り値返すから、 if ps -ef | grep "collector.php" | grep -v grep > /dev/null; then で桶。
125 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 07:34:52 ] >>122 発想を転換しろ。 もし、php /hoge.phpを起動して、落ちたら再度起動、ってやりたいだけなら、 while : do php /hoge.php done だけでOK。&は付けない。sleepもpsも必要なし。
126 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 17:03:52 ] >>123 ,124 ありがとう、おっしゃる通り。 試してみます。 >>125 惜しい。 実はhoge.phpは1種類ではなく、3種類存在します。 実際はret〜fi間が、3個あり、hoge1.php〜hoge3.phpを対象にチェックしています。 #>>122 のコードで、collector.phpとhoge.phpは同一です。コピペミススマソ。 #!/bin/sh while true do ★ret=`ps -ef | grep "hoge1.php" | grep -v grep | wc -l` if [ $ret -eq 0 ]; then php /hoge1.php & fi ★ret=`ps -ef | grep "hoge2.php" | grep -v grep | wc -l` if [ $ret -eq 0 ]; then php /hoge2.php & fi ★ret=`ps -ef | grep "hoge3.php" | grep -v grep | wc -l` if [ $ret -eq 0 ]; then php /hoge3.php & fi sleep 1 done hoge1.php の終了を待たずに hoge2.php や hoge3.php の プロセスチェック&起動を行いたいため、末尾に&を付けている次第です。 hoge1.php〜hoge3.php毎にシェルスクリプトを3個作成すれば >>125 の通りで期待が叶いますが、それはそれで無駄な感じがしまして。
127 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 17:23:55 ] >>126 シェルスクリプトひとつでできる。 while文の最後のdoneに &を付けるのがポイント。 while : do php /hoge1.php done & while : do php /hoge2.php done & while : do php /hoge3.php done &
128 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 18:12:48 ] >>127 げ、すげぇ。できました。。プロセスが3つ立ち上がるのですね。 ありがとうございます!! シェルスクリプトすごいっすねぇ。。。感動。
129 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 18:53:56 ] 質問: grep の -q オプションってどの grep(1) でも使えたっけ?
130 名前:名無しさん@お腹いっぱい。 mailto:age [2008/05/31(土) 18:55:12 ] 年中無休発狂妄想爆裂憤死寸前粘着真性キチガイ包茎池沼病気猿男(狂猿)◆QfF6cO2gD6による気違いカキコの続き: 初心者もOK! FreeBSD質問スレッド その95 pc11.2ch.net/test/read.cgi/unix/1210728872/706-708,710,712 706 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/05/31(土) 16:24:19 AAとコピペばっか 707 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/05/31(土) 16:25:33 アク禁報告を誰もしてないのが不思議w してても無視されてるのか 708 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/05/31(土) 16:31:15 >>704 假性ですが何か? 710 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/05/31(土) 17:45:14 粘着キチガイ男(狂犬)をアク禁にしたらリアルに無差別殺人起こす可能性が高いからな。 712 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/05/31(土) 17:59:51 ビビって書き込み止めたのか?と煽ってみる -------------------------------------------------------------------------------------------- UNIX板のあちこちのスレッドを荒らしている凶悪メンヘラ・真性キチガイ猿粘着◆QfF6cO2gD6。 いつも荒らしを憎むようなレスをするが、実際に荒らしているのは自分。 気色の悪い年中無休発狂粘着真性キチガイ包茎池沼病気猿男(狂猿)◆QfF6cO2gD6があちこちのスレに 遂に理解できないような基地害カキコをし始めた!気持ちが悪い…。
131 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 19:09:54 ] >>129 unlike GNU grep, traditional grep did not conform to POSIX.2, because traditional grep lacked a -q option and its -s option behaved like GNU grep’s -q option. Shell scripts intended to be portable to traditional grep should avoid both -q and -s and should redirect output to /dev/null instead.
132 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 19:11:42 ] ヘブライ語でおk
133 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 19:24:58 ] 要約すると、-qオプションがない古いgrepもあるから、 grep hoge > /dev/null にした方が移植性が高いってこと。
134 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 19:36:58 ] >>131 >>133 Danke schoen
135 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 19:48:04 ] Bitte schöen
136 名前:名無しさん@お腹いっぱい。 [2008/06/01(日) 08:07:21 ] 質問です。 5から10までの数字をランダムに、しかも2桁に揃えて表示させたい。 空欄を埋めてください。 #!/bin/sh 空欄 echo $randtime
137 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/01(日) 08:12:38 ] >>136 randtime=`expr 0$((RANDOM*6/32768+5)) : '.*\(..\)'`
138 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/01(日) 16:33:54 ] rand() { dd if=/dev/random bs=1 count=2 2>/dev/null | od -A n -t u } randtime=$(printf "%02d" $(( 5 + $(rand) % 6 )))
139 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/01(日) 17:01:40 ] 純正シェル、かつ、printf(1)なし環境でも動く方法: randtime=`expr 0\`expr \\\`date +%S\\\` % 6 + 5\` : '.*\(..\)'` ` `が3重ネストしてるので注意。
140 名前:名無しさん@お腹いっぱい。 [2008/06/01(日) 19:57:10 ] (;ω;)たちけて〜 #!/bin/sh i=0 while [ $i -le 23 ] ;do time=`printf $i"%02d\n"` i=`expr $i + 1` echo $time done ↓結果↓ ↓目的↓ 000 0000 100 0100 200 0200 ・・・略 1000 1000 1100 1100 ・・・略 2300 2300 0000〜2300 最初から出力4桁にしたいでつ・・・ どこがおかしいのかおせいて〜(;ω;)ブワッ
141 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/01(日) 20:02:40 ] printf "%02d00\n" {01..23}
142 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/01(日) 20:18:41 ] >>140 i=0;while [ $i -le 23 ];do printf '%02d00\n' $i;i=`expr $i + 1`;done >>141 bash依存失格。
143 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/01(日) 20:33:37 ] seqが使えるなら seq -f "%02g00" 0 23 awkで書くなら awk 'BEGIN { for (i = 0; i < 24; i++) printf("%02d00\n", i) }'
144 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/01(日) 20:51:55 ] printfがないOSもある。 i=0;while [ $i -le 23 ];do expr 0"$i"00 : '.*\(....\)';i=`expr $i + 1`;done
145 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/01(日) 20:58:05 ] exprはどこにでもあるの?
146 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/01(日) 21:05:12 ] exprもないOSのために、 純正シェルで、内部コマンドのみで実現。 z=0;set -;while [ $# -le 23 ]; do [ $# -ge 10 ] && z=; echo $z$#00; set "$@" d; done
147 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/01(日) 23:56:19 ] >>140 でつ >>141 エラーが出てしまった・・・・・・{01..23}の書き方はzshらしいです >>142 でけた! >>143 sedあります! あ、seqか 出来た出来たです! >>144 printfあるけどその方法もでけた! >>145 Linux/FedoraとCentには入ってましたSunOSや*BSDは存じ上げません >>146 set の使い方がにくいですw >>142-146 Grateful !!
148 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 00:13:39 ] cat -n とか nl とか使う手もあるよね
149 名前:名無しさん@お腹いっぱい。 [2008/06/02(月) 01:37:46 ] Bシェルで質問です。 あるディレクトリのstyファイルの文字コードを全てnkf -sで変換するシェルを作りたいのです。 しかし、全てのファイルに対して操作する方法がわかりません。 つまり、 nkf -s *.sty > *.sty2 mv *.sty2 > *.sty rm *.sty2 みたいなことがやりたいんですが、この部分どうしたらいいのでしょうか。
150 名前:名無しさん@お腹いっぱい。 [2008/06/02(月) 01:58:11 ] >> 149 for i in *.sty; do nkf -s $i > $i.sjis; mv $i.sjis $i; done
151 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 01:59:07 ] find使う
152 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 09:07:16 ] >>149 シェルってゆうな。クズ。
153 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 11:15:53 ] >>149 nkf -s --overwrite *.sty
154 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 11:19:34 ] シェルってゆうなってうるさい奴ってなんなの?バカなの? スクリプトのスレなんだから分かるだろうが。氏ねよめんどうくせえ
155 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 11:23:38 ] HDDのバックアップを効率的に行なうシェルを発光したいんですが、 初心者でも簡単にできますか?
156 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 11:25:29 ] スルーできないやつってなんなの?
157 名前:名無しさん@お腹いっぱい。 [2008/06/02(月) 11:27:00 ] お助けください。 .(ドット)で区切って後ろから1番目と2番目を抜き取るにはどうしたらいいでしょうか? 例えば aaa.bbb.ccc.dddをccc.dddに置換したいです。
158 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 11:30:19 ] >>157 sed 's/[^\.]*\.[^\.]*\.//' cut -d. -f3-
159 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 11:32:03 ] あ、前2つを削るんじゃなく後ろ2つを残すのか。
160 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 11:33:56 ] >>157 hoge=aaa.bbb.ccc.ddd expr $hoge : '.*\.\([^.][^.]*\.[^.][^.]*\)' と言うシェルが発酵できます。
161 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 11:48:33 ] 純正シェル、内部コマンドオンリーバージョンを求めるなら、 hoge=aaa.bbb.ccc.ddd IFS=. set $hoge while [ $# -gt 2 ]; do shift; done echo $1.$2
162 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 11:52:17 ] echo "aaa.bbb.ccc.ddd" | sed -e 's/^\(.*\)\.\([^\.]*\)\.\([^\.]*\)$/\3.\2/'
163 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 11:53:41 ] ごめん。なんで \2 \3を入れ替えたんだろう?w echo "aaa.bbb.ccc.ddd.eee" | sed -e 's/^\(.*\)\.\([^\.]*\)\.\([^\.]*\)$/\2.\3/'
164 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 12:38:02 ] 腐ってやがる 早すぎたんだ
165 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 13:11:19 ] >>155 rsyncかddでググれ。 話はそれからだ。
166 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 13:18:04 ] >>165 発光は?
167 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 17:16:08 ] echo ^G
168 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 17:22:42 ] vbell限定だた
169 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 17:24:11 ] while : do xset led 1 sleep 1 xset -led 1 sleep 1 done
170 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 17:35:15 ] for hoge in *.*.* do mv $hoge $(echo $hoge |awk -F. '{print $(NF-1)"."$NF}') done
171 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 17:36:25 ] あ、違った
172 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 19:32:14 ] banner をもっと長い文字列で使いたいんですが
173 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 21:28:24 ] そうですか
174 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 21:34:12 ] 自分で発光したシェルをコマンド化するにはどうするんですか? もしかして、コンパイルとか打つんですか?
175 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 21:39:12 ] そーでーす
176 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 21:45:14 ] ふたつのテキストファイルがあったとします。 テキストファイルの中の文章は単語が改行で区切られています。 $ cat 1.txt apple book cat desk earth fuck $ cat 2.txt april born cook dinner engine fuck 1.txt と 2.txt で完全一致しているものを抽出するシンプルな方法を 探しています。何か良い方法ありませんか?
177 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 21:55:33 ] sortしたものをdiffやcommに食わせるのが簡単だけど。 並べ替えアウト?
178 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 21:59:29 ] それぞれ、中身に同じ行がないなら、 sort 1.txt 2.txt | uniq -d かな
179 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/02(月) 22:02:55 ] >>177 OKです。 >>178 完璧です。ありがとうございました。
180 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 00:15:13 ] sh -c 'echo $1' a b c で、b が出るのは正常?
181 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 00:39:14 ] 正常
182 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 02:06:40 ] >>158 >>160 >>161 ありがとうございました!感謝!
183 名前:名無しさん@お腹いっぱい。 [2008/06/03(火) 03:43:47 ] 質問です。 aaa=`commando1` bbb=`commando2` このような「``」内のコマンドを1つにまとめるにはどうしたらいいでしょうか? 例えば #!/bin/sh temp=`ls -l $1` pram=`echo $temp | cut -d " " -f 6-8` echo $pram tempとpramで分けてるものを1行でまとめたいです。
184 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 04:07:13 ] ネストすればいい。
185 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 06:53:17 ] >>183 ネストする必要ない。というか、tempに入れる必要ない。 pram=`ls -l $1 | cut -d " " -f 6-8`
186 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 12:01:25 ] >>184 一般論の話だろ。 その例に限れば、それでいいけど。
187 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 12:44:26 ] POSIXシェルを仮定して「$()」使うのが正解。
188 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 13:08:58 ] >>187 アフォか
189 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 13:12:22 ] >>183 一般論として、 aaa=`command1` bbb=`command2 $aaa` なら、 bbb=`command2 \`command1\`` で桶。
190 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 13:17:54 ] >>188 なんで?
191 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 13:19:05 ] 純正シェルで動かないから。 >>189 という正解があるのに、わざわざポータビリティを落す $()を使う必要ないから。
192 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 13:21:04 ] >>191 可読性が落ちる。
193 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 13:22:50 ] >>192 それはシェルに慣れてないお前だけ。
194 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 13:23:46 ] 3重、4重のネストが必要なときはどうするのだ? www 大半のシステムで使用できる$()を避けて可読性を劣化させる必要は無い。 このスレに巣食っている原理主義者以外は$()使うのが正解。
195 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 13:24:12 ] >>181 一般論として仮定しちゃって良い?
196 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 13:24:13 ] 可読性を言うなら、むしろネスティングを避けて 一旦別変数に入れる方式の方がいいぞ。 >>183 の質問の逆をやれってことね。
197 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 13:24:53 ] >>194 Solarisは大半のシステムじゃないのかい?
198 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 13:27:12 ] Solaris?なにそれ、おいしいの?
199 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 13:34:17 ] Solarisを見落としていた >>194 の負けだな
200 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 13:36:22 ] >>194 3重ネストは \\\`command\\\` 4重ネストは \\\\\\\`command\\\\\\\` 何か問題ある?w
201 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 13:41:28 ] Solarisならば、普通kshかxpg4シェル。
202 名前:名無しさん@お腹いっぱい。 [2008/06/03(火) 20:09:41 ] 質問させてください。 テキストファイルの内容が以下のようになっています。 日付 文字列 上記文字列に改行コードが存在する場合、以下のようになります 20080602 aaabbbccc 20080602 dddee ef ff 20080602 ggghhhiii これをこのように正しく変換するにはどうしたらいいでしょうか? 20080602 aaabbbccc 20080602 dddeeefff 20080602 ggghhhiii
203 名前:名無しさん@お腹いっぱい。 [2008/06/03(火) 20:18:28 ] 202の続き とりあえずない頭を絞って先頭文字が「2008」でない行に|を入れて以下のような レイアウトにし 例) 20080602 aaabbbccc 20080602 dddee |ef |ff 20080602 g |gg |hhhi |ii 過去ログにあったコマンドを参考に以下のコマンドを実行しましたが 「(rm a.txt; sed 'N; s/\n|//; P; D' > a.txt) < a.txt 」 例) 20080602 aaabbbccc 20080602 dddeeef |ff 20080602 ggg |hhhiii と、いった感じですべて変換することができません。 よろしくお願いします。
204 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 20:41:47 ] >>202 これでどうだ。 頭に余分な空行が出るのは無視してね ↓ while read line do set $line if [ $# = 1 ]; then echo -n $1 else echo echo -n $1 $2 fi done < file.txt echo
205 名前:名無しさん@お腹いっぱい。 [2008/06/03(火) 21:33:33 ] >>204 ありがとうございます。 すみません。わたしの記載漏れになりますが文字列の中にはスペースも存在します。 詳しく言いますとこの文字列とはSQLなのです。 なので「select * from table」のようになります。 せっかく考えて頂いたのにすみませんでした。
206 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 21:38:11 ] 後出し乙。これで回答を得られることはないであろう。
207 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 21:46:02 ] わしが代わりに答えてあげよう。 正解のmd5じゃ。 9c42265ebade7ace4e45b75b8d41f7ab
208 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 22:45:18 ] 初心者な質問ですいません。 自分で書いたシェルをコマンドとして発光するにはどうするんですか?
209 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 22:47:26 ] 発酵させるには、ながーい時間がかかるよ
210 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/03(火) 23:22:26 ] >>207 お題を自分で解いた(かもしれない)だけで、答えたことになってないよな
211 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/04(水) 06:27:08 ] >>207 そのmd5逆算したところ、確かに動きました。感謝です。
212 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/04(水) 07:33:03 ] すげぇなおい
213 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/04(水) 11:28:09 ] >>202 どっちも書き方として邪道かつ汚いけど結果オーライなら。 cat $SQL_FILE | awk '{ if(/^20[0-9]+ /) { printf "\n"; } printf $0; } END { printf "\n" }' cat $SQL_FILE | perl -ne 'chop; print "\n" if(/^\d{8}\s/); print; END{ print "\n" }'
214 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/04(水) 15:08:22 ] 全然シェルスクリプトじゃない件
215 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/04(水) 15:17:43 ] #!/bin/sh awk '{ if(/^20[0-9]+ /) { printf "\n"; } printf $0; } END { printf "\n" }'
216 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/04(水) 15:22:33 ] awkスレと聞いて
217 名前:215 mailto:sage [2008/06/04(水) 15:27:14 ] まぁ >>6 にも入ってるし、sed awk はテキスト処理では欠かせないな。 >>213 は、改行コードの扱い方が珍妙で、よく出来てると思った。
218 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/04(水) 23:33:14 ] 192168000001 を 192.168.0.1 に変換するスマートな方法を教えてください。 一オクテットが、3 ケタずつに区切られています。
219 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/04(水) 23:43:18 ] echo 192168000001 | sed 's/.../& /g' | awk '{print $1+0 "." $2+0 "." $3+0 "." $4+0}'
220 名前:202 mailto:sage [2008/06/04(水) 23:45:50 ] >>213 ありがとうございます。 出来ました。 なるほど改行コードを削除することに躍起になっていましたが、 マッチした時だけ前に改行コードを付けるというやり方もあるんですね。 なかなか思いつかない発想だったので勉強になりました
221 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/04(水) 23:54:42 ] echo 192168000001 | sed 's/.../&./g;s/¥.0*/./g;s/¥.¥./.0./g;s/¥.$//' s/¥.00?/./ とか書きたいにゃー。
222 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 00:02:30 ] echo 192168000001 | sed 's/.../& /g;s/ $//;s/ /./g'
223 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 05:47:11 ] sh -c 'echo fugafuga' と eval 'echo fugafuga' が異なるのは、どのような時なのでしょうか。 fugafugaの部分は任意です。
224 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 06:33:34 ] >>220 おいおい、>>213 の改行付加の発想は >>204 と同じだぞ。 >>204 の時点でその方法に気づけ。 >>204 を改良して、スペースが入った場合の問題は対処できる。 awk/perlなどのシェル以外のものを使わずにね。
225 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 06:37:46 ] >>223 たとえば、 set hoge sh -c 'echo "$@"' と、 set hoge eval 'echo "$@"' は異なる。
226 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 14:30:52 ] すいません スペース区切りの文字列をカンマ区切りに変えたいんですが、 スペースが一つとは限りません a hoge b ge c h これを a,hoge b,ge b,h こんな感じです bashでできないですか? awkも使えます
227 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 14:33:22 ] すいません 条件がもう一つ カラム数は固定じゃないです
228 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 14:33:44 ] sedは禁止? sed 's/ */,/g'
229 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 14:35:50 ] while read line do set -- $line echo -n $1 shift for i in "$@" do echo -n ,$i done echo done
230 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 14:40:56 ] >>228 ダウト。試してから書き込めよ。
231 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 14:42:08 ] >>230 試したよ。 何で2ch読んでる?
232 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 14:45:44 ] 何をどう試したんだ
233 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 14:47:20 ] >>228 echo 'aaa bbb ccc' | sed 's/ */,/g' ,a,a,a,b,b,b,c,c,c,
234 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 14:48:54 ] $ echo 'aaa bbb ccc' | sed 's/ */,/g' aaa,bbb,ccc
235 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 14:49:14 ] sedなら正解は、 sed 's/[ ][ ]*/,/g' だな。
236 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 14:50:50 ] >>234 をコピペして実行してみろw $ echo 'aaa bbb ccc' | sed 's/ */,/g' ,a,a,a,b,b,b,c,c,c, この問題を避けるには、>>235 が正解。
237 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 15:05:50 ] 「この問題」って、専ブラを使わずに煽る○○がいる問題って意味だな
238 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/05(木) 15:27:44 ] で、>>226 は納得したのか?
239 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 00:58:06 ] >>235 これの意味がよくわからんのだが・・・ なんでこれでいいの?
240 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 01:19:14 ] [ ] の意味と>>230 がキレた理由はわかるかね?
241 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 01:23:10 ] >>239 解説するのも野暮だが… >>230 ,>>232 はスペースが2個あることに気付かず醜態を晒してしまったわけだが、 >>235 のように書いておけば見落とし確率が下がって嬉しいという記法。
242 名前:239 mailto:sage [2008/06/06(金) 01:37:14 ] >>240 >>241 すまん shなんだけどlinux(fedora8) じゃだめなんかな? sh-3.2$ echo 'aaaaaa bbbbbbb ccc' | sed 's/[][]*/,/g' ,a,a,a,a,a,a, , , , , , , , , , , , , , ,b,b,b,b,b,b,b, , , , , , ,c,c,c, sh-3.2$
243 名前:239 mailto:sage [2008/06/06(金) 01:39:25 ] 自己解決 []じゃなくえ[ ]だったわ あほだおれ
244 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 04:51:10 ] あの夜、俺は初めて彼女とMMXした。 「もうそろそろiiyama? 君のI/ODATAを確かめたいんだ。XT」 MITSUMIあうと、彼女のMECはALBATRONとしていた。 緊張した俺は焦り彼女のソケット478をAOpenしようとした。 「ちょ、ちょっとRADEON!何をSis」もう俺は既にエレコム。 Sound Blasterのホックを外すとはちきれそうなPioneerがBarracuda でもBIOSTARは意外と玄人志向だった。 「恥ずかしいわ。あまりミネベア・・・」 SCSIをTORICAるとKEIANをSOLTEKした痕がアルファデータ。 あそこはSUPERMICROだった。OMEGAドライバも少し鼻についた。 しかし、彼女のCREATIVEを刺激しつつ俺のセレロンを 彼女のSerial-ATAからASUSに這わせると、「FireWire〜ン」 「もう、ATI」「COREGA欲しいんだろ?」「早くリテール」 俺は激しくTSUKUMO。「インテルはいってるっ!IEEE!1394!」 「あぁ・・・もうDell!」
245 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 06:19:56 ] OFSのあるawkなら、 awk 'BEGIN { OFS=","} { $1 = $1; print $0 }'
246 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 06:32:12 ] >>241 見落としたのじゃなくて、本当に(HTML解釈上で)複数のスペースが 1個のスペースで表示されてしまうから、「>>228 >>234 をコピペしても動かない」が正解。 >>235 のように書き込めば、コピペしてもちゃんと動く。 醜態を晒したのは >>228 >>234 の方。 ちなみに、宣ブラ使ってもやっぱり >>228 >>234 のスペースはひとつだよ。
247 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 08:07:53 ] ダサい専ブラ
248 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 08:20:28 ] たしかにダサい専ブラだな。
249 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 08:31:46 ] ブラウザ依存も、Bash依存同罪。 ポータビリティ考えて書き込めよ。
250 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 08:41:33 ] いつのまにか落ちてたので、立てました。 zsh その5 pc11.2ch.net/test/read.cgi/unix/1212677877/
251 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 08:45:33 ] sed -r 's/ +/,/g' の方が良くね?
252 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 08:49:28 ] どこのsedだよ
253 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 08:50:10 ] /bin/sed
254 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 08:51:37 ] $ type sed sed is a shell builtin
255 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 09:02:22 ] 大半のシステムで使用できる sed -r を避けて可読性を劣化させる必要は無い。 このスレに巣食っている原理主義者以外は >>251 使うのが正解。
256 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 09:20:12 ] 自分が読めない = 可読性が低い
257 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 10:01:25 ] sed 's/ */,/g' これなら文句はねえよな?
258 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 10:09:26 ] >>257 >>228 と同じじゃん。 文句あるみたいよ。
259 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 10:11:21 ] >>258 >>228 とは違う。こっちはちゃんと を使ってるんだが まだ空白がつながって見えるかな? ナマの空白をつなげたら、HTML仕様的にはくっつくのが当たり前だよ
260 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 11:49:01 ] >>226 tr -s ' ' , でいけないか。
261 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 20:02:12 ] sed 's/ * /,/g'
262 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/07(土) 10:18:23 ] >>254 いいな
263 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/08(日) 02:28:12 ] 結婚を考えていた彼女が処女じゃなかったんです7 1 :最強の負け組み:2008/03/01(土) 05:37:53 ID:YrfLoASe ショックでした。 もしやもしやと思っていたのですが 面と向かって告白された時は目の前が真っ暗になりました。 「処女とかそんなの関係ない!」 そう自分に言い聞かせてきましたが、やはり限界がきてしまい 彼女に別れを告げました。 知り合いに言うと 「は?そんなくっだらない事であんないい子と別れたの? ばっかじゃね?もうあんな子絶対知り合えないぞ?」 とボロかすに言われました。 頭では判っているのに心で理解できないんです。 私自身、もう頭の中がぐちゃぐちゃで訳がわかりません。 彼女を傷つけてしまったのでしょうか? 別れの時、彼女は黙って頷き 「じゃあね」 と笑って去っていきました。 もう私には彼女の気持ちがどうなのか あの微笑がなんだったのか理解できないのです。 やはり私は馬鹿な事をしたのでしょうか?
264 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/08(日) 05:17:54 ] >>263 echo じゃあね : -P exit
265 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 01:04:38 ] ふともも画像が100〜400x810pxくらいのサイズであったとします。 横幅が1440pxを超えないように画像を結合するスクリプトを書きたいのです。 結合する画像の組み合わせは特別に指定しません。 横幅が1440以下でかつなるべく大きければ何でもいいです。 たとえば、画像は40枚とします。 1.jpg 300x810 2.jpg 300x810 3.jpg 300x810 4.jpg 300x810 5.jpg 300x810 6.jpg 300x810 ************** 40.jpg 200x810 だとしたら、1,2,3,4 を結合させて image1.jpg (1200x810px)を作ります。 それ以降も同様なことを繰り返します。 お願いします。
266 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 01:23:06 ] ふともも画像について詳しく
267 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 01:51:05 ] うん、画像のふとももが実際どうなのかによって対処法も違うよね。
268 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 05:26:55 ] おまいら少しは協力してやれよw で、画像の件なんだがね。。。
269 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 10:51:46 ] 画像のサンプルがないことにはどうにもならん。
270 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 11:56:21 ] >>265 いわゆるナップサック問題なので、最適解を求めるのはシェルスクリプトには荷が重い。
271 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 12:23:52 ] >>270 最適解じゃなくていいから、指定サイズ以下に並べられる シェルを書いてうpしてください。
272 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 13:08:20 ] 最適じゃなくていいなら 頭から順にならべて1440を越えたら次に行けばいいだけじゃん。
273 名前:265 mailto:sage [2008/06/09(月) 13:08:54 ] サンプル画像です。 素材に対する文句はいっさい受け付けません。 home2.dip.jp/upload100_download.php?no=28514 mai 最近大量に脚画像つくったのがこれしかなかったので。 >>270 そうですか。 でも、しばらく回答を待ちます。 >>271 脚画像をならべるスクリプトは需要があるようですね。
274 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 14:02:24 ] >>272 2次元だから、最適じゃなくても単純にはいかないだろ。
275 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 22:31:54 ] ここは楽しい モーレツインターネッツ教室でつね ワッフルワッフル
276 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 22:41:50 ] X軸方向に複数画像並べるだけで、Y軸方向には画像は並べない(1枚だけ)という仕様なの?
277 名前:265 mailto:sage [2008/06/09(月) 22:49:54 ] >>276 そうです。
278 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 22:56:48 ] 条件後出し乙。 だったら質問するまでもない簡単な問題じゃん。 アフォらしいから回答するの辞めた。
279 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 23:14:13 ] 便乗質問します。 X座標のドット数も、Y座標のドット数も可変の画像ファイルが複数あります。 これを、引数指定のX/Y座標の画面サイズに収まるように、 なるべく多く、なるべくすき間なく画像を並べるようなシェルを発光してください。 なお、実際の画像結合処理は別コマンドにやらせるので、 入力としては、各画像ファイルのファイル名とX/Yサイズが書かれたテキストファイルの $ cat input.txt 1.jpg 300 200 2.jpg 530 250 3.jpg 410 180 4.jpg 640 480 を入力として、 $ hoge input.txt 1200 1280 とやると、 出力として、 1.jpg 0 0 2.jpg 300 0 3.jpg 0 300 : みたいに、画像を配置するべき座標を画像の左上のオフセットで指定して 出力できればいいです。 最適配置にする必要はありませんが、当たり判定はちゃんとやって、 画像が重ならないようにしてください。
280 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 00:02:57 ] いつからここは エロ画像処理スレッドになったんでしょうか。
281 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 00:04:47 ] しかも画像も貼らずに質問とは。
282 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 01:46:24 ] ImageMagick で一発?
283 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 14:18:30 ] シェルスクリプトでやる意味があるのか分からない。 ってのは禁句でしたかな。
284 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 19:31:40 ] >>283 ぶっちゃけシェルスクリプトの最大の利点は手軽さなので、 わざわざ人に1から10まで聞くという手間をかけてまでシェルスクリプトでやる理由はないな。
285 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 19:42:03 ] 普段からシェルを使い慣れてないならあえて選ぶ意味はないような.
286 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 21:32:49 ] じゃなくて、人に聞いてるんじゃなくて、オマエラに「お題」を出してるんだよ。 シェルで発光する方法を考えて、おおいに盛り上がってくれ。
287 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 21:36:09 ] はい次の質問どぞ
288 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 21:37:08 ] シェルで発光する方法まだーーーー???
289 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 21:46:34 ] >>288 はいよLinuxオンリーだが setleds +num +caps +scroll で発光できる
290 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/12(木) 09:37:20 ] お疲れさまでした。 では、次の課題です。 シェルで発酵する方法について考えましょう。
291 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/12(木) 10:01:50 ] ところで「シェルを発行する」っていうのはなにか決まった言いまわしなのか? 普通はこんな言いかたしないと思うんだけどこのスレではよく見る気がする
292 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/12(木) 10:12:17 ] pc11.2ch.net/test/read.cgi/unix/1202725267/860 のネタからでしょ
293 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/12(木) 10:29:40 ] >>292 それのさらなる元ネタはあるんだろうか
294 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/12(木) 11:15:26 ] >>293 ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%81%E5%87%A6%E7%90%86
295 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/12(木) 12:11:11 ] issue とか perse とか英語でも色んな言い方するよねえ
296 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/12(木) 12:17:40 ] >>293 pc11.2ch.net/test/read.cgi/unix/1187130302/312
297 名前:名無しさん@お腹いっぱい。 [2008/06/14(土) 08:48:18 ] 引数指定のディレクトリを頂点として、それ以下のサブディレクトリを含む ディレクトリツリー中のシンボリックリンクを探し、 そのシンボリックリンクそれぞれについて、 冒頭のディレクトリツリー内を指しているか、 それとも、ディレクトリツリーの外を指しているのかを 判断するシェルを発行してください。 なお、シンボリックリンクの先に実際にファイルがない場合もありますが、 実際にファイルがあるかどうかに関係なく、あくまでシンボリックリンクの 内容のPATHだけで判断してください。 (ブロークンリンクだからといって外部と判断してはいけないということ) 以上、お願いします。
298 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 09:03:06 ] 作ったシェルスクリプトを僕のPC上で発行しました どうぞ
299 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 16:32:04 ] ここってさ、人にシェルスクリプト書いてもらうスレだったっけ?
300 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 16:35:34 ] >>299 >>1 >スクリプトのお勉強・自慢・腕試しなどにどうぞ。 だそうなので、腕試しのお題を出しているんじゃない?
301 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 18:40:09 ] できないなら黙ってろの人最近来ないね。
302 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 18:50:22 ] >>298-299 わからないなら黙ってろ。
303 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 19:00:44 ] >>301 召喚士現る。
304 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 19:02:21 ] >>301 君、腕良いね
305 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 19:05:04 ] お題としてはなかなかいいんじゃない? symlink読んでリンク先のフルパスに変換する関数を書くあたりがキモかな。
306 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 19:09:49 ] >>305 わからないなら黙ってろ
307 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 19:48:53 ] $RANDOM って癖があるのは仕様なんすか? 俺の環境でecho $((RANDOM*10/32768))を 出力させ続けると0と8がやたら多いw なんかハードウェアのノイズを拾って数値化してるとか いうのは読んだことあるけど。。。(実装によるとは思うけど) これってもうしょうがないんすかね? 立派なアルゴリズムをもった乱数生成器とまでは いかないものの、そこそこ精度が高い(?)乱数を シェルコマンドで作るってできないすかね??
308 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 20:06:23 ] >>307 >>90
309 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 20:11:25 ] /dev/*はOS依存なので、 メルセンヌツイスターあたりをシェルスクリプトで実装する方向で。
310 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 20:26:02 ] /dev/urandomはOS依存じゃないだろ。
311 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 23:12:06 ] >>297 ちょっと考えると簡単なようで、実はすごく難しいんじゃないかと思う。 find(1) + readlink(1) を使って基本的な判定はできる。 んが、ディレクトリへのリンクがあったり、意図的に難解なリンクが 作成されてたりすると非常に厄介じゃね? 具体的には、 ../../../usr/local/../local/etc みたいなのとか。このぐらいなら、 dirname(1) + cd + pwd(1) でまだ何とかなりそう。 じゃあ今度は、 /usr/local -> /var/local という(変な)環境で、 /usr/local/etc/a.conf -> ../etc/b.conf とかなっちゃってると、 /usr/local/etc 内にあるようで実は /var/local/etc にあるということになる。 漏れのオツムじゃ解はよくわかんね。パス正規化ツールみたいなのあると 面白いかもね。
312 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/15(日) 00:44:25 ] シェルを発行だとか純正シェルだとか、 このスレは読んでて正直気恥かしくなる
313 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/15(日) 00:46:06 ] >>312 わからないなら黙ってろ
314 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/15(日) 00:57:49 ] >>312 もしかしてここがネタスレだと分かってなかったのか?
315 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/16(月) 22:34:33 ] まあ叩き台ってことで、こんな感じ? #!/bin/sh base="`readlink -f $1`" find $base -type l -print | while read i do echo "`readlink -f $i` $i" done | grep ^$base
316 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/17(火) 01:43:42 ] なんかシェルでゲーム作りたいんだけど 画面のクリアとかってどうやればいいの?
317 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/17(火) 02:26:15 ] clear
318 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/17(火) 10:07:08 ] realpathは使わないの?
319 名前:名無しさん@お腹いっぱい。 [2008/06/17(火) 10:25:04 ] #!/bin/csh -f set com=$0 if ($#argv < 1 || $#argv > 3) then echo Usage:$com start_line total_lines '[file_name]' exit 1 endif if ($#argv == 2) then set s=$1 set t=$2 tail +$s | head -$t else set s=$1 set t=$2 set f=$3 cat $f | tail +$s | head -$t endif exit 0 echo ------------------ これだとエラーがでます。どなたか改良してください。お願いします。
320 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/17(火) 10:35:51 ] >>319 以降はこちらへ ↓ csh初心者質問コーナー pc11.2ch.net/test/read.cgi/unix/1094041299/
321 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/17(火) 16:55:34 ] >>310 Solaris8 は標準では /dev/u?random はなかったはず。 Sun がパッチを配ってたので事実上あるような扱いだったけど。 Sol7 だとそれもなくて、フリーのデバドラをインストールしてた。
322 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/17(火) 16:58:56 ] すでにEOLですからw
323 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/23(月) 21:24:15 ] カンマ区切りcsvからhogeというカラムとその右4カラムを切り出したい ただしhogeが何カラム目にあるかは不定 というのはちょちょいとできないですか?
324 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/23(月) 21:33:07 ] フルスペックのcsvをシェルスクリプトで扱うのは荷が重い ちょちょいでは無理
325 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/23(月) 21:36:17 ] >>323 こういうことか? ↓ #!/bin/sh IFS=, while read line; do set $line while [ $# -gt 0 ]; do if [ "$1" = hoge ]; then echo "$1","$2","$3","$4","$5" break fi shift done done
326 名前:名無しさん@お腹いっぱい。 [2008/06/23(月) 22:09:52 ] 「,」を含む文字列で発狂するから駄目。
327 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/23(月) 22:53:43 ] ""ん中に改行まで入ることあるしな
328 名前:323 mailto:sage [2008/06/23(月) 22:57:51 ] >>325 おお完璧です どうもありがとうございます。 IFSってawkの変数かと思ってましたけど、shでも同じなんですね sh-3.2$ cat a.csv ,,,,,hoge,,1,11,3,3nd ,,,,,,,,,,,,,,,,,,,,,,,,,,,,hoge,,1,11,3,3nd ,,,,,1,fds,3,hnd ,g b,,,,,,hoge,,1,11,3 a ,,,,,,,,,,hoge,,1,13,d sh-3.2$ cat a.csv | ./kkkk hoge,,1,11,3 hoge,,1,11,3 hoge,,1,11,3 hoge,,1,13,d sh-3.2$
329 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/23(月) 23:00:57 ] 質問者が「おお完璧です」と言った後の >>326-327 が不憫。
330 名前:323 mailto:sage [2008/06/23(月) 23:02:39 ] >>326 >>327 さすがにそんなに意地悪な仕様ではないんで問題なしです。 欲を言うならシェルを作らず手で打てるレベルのものがいいなぁ・・というくらいです。
331 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/24(火) 11:26:40 ] シェルってゆうな。クズ。
332 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/24(火) 11:46:49 ] >>331 よう、久しぶりw 相変わらず怒ってんなあwww
333 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/24(火) 15:07:43 ] ゆうって言うな。クズ。
334 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/24(火) 15:11:50 ] シェルで発酵する方法まだーーーーーーーーーーー??????
335 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/24(火) 15:28:14 ] CPUヒートシンクの上に、藁に包んだ大豆を載せ while :;do :;done
336 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 07:27:59 ] FAN止めないと乾燥するな
337 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 07:35:42 ] 水冷にすればいいんじゃね?
338 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 11:45:53 ] hoge1.txt に日付のテキストが数百行あります。 ---------------------- $ cat hoge1.txt Fri, 16 May 2008 09:39:25 +0900 Sun, 18 May 2008 09:30:21 +0900 Mon, 02 Jun 2008 08:15:45 +0900 ---------------------- フォーマットを下記のように年月日のみに変えて hoge2.txt に書き出すシェルスクリプトを作りたいのです。 ---------------------- 2008.5.16 2008.5.18 2008.6.2 ---------------------- sed や awk を使うのか?ということまではわかってきたのですが、初心者なもので詰まってしまっています。どなたか ご教示お願いいたします。
339 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 11:50:21 ] ここでGNU date でやり方書くやつがでて、 Linux厨乙!的な流れですね、わかります。
340 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 11:51:01 ] GNU dateがあるとして、 while read x; do date --date="$x" '+%Y.%-m.%-d' done < hoge1.txt
341 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 11:51:34 ] Linux厨乙!
342 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 12:20:32 ] × …hoge2.txt に書き出すシェルスクリプトを作りたいのです。 ○ …hoge2.txt に書き出すシェルを発行したいのです。
343 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 12:21:46 ] BEGIN{ m["Jan"] = 1 m["Feb"] = 2 ... m["Dec"] = 12 OFS = "." } { print $4, m[$3], $2+0 }
344 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 12:27:11 ] >>343 それ間違ってるよ。動作確認してから書くこと。
345 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 12:47:44 ] はて、うちの手元では動いてるけど、環境依存な部分あるかな?
346 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 12:48:19 ] Mon,
347 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 12:51:31 ] >>344 うちでも動いてる。 >>346 Mon, は関係ないだろ
348 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 12:52:40 ] 月の名前と曜日の名前の区別がつかないんですね、わかります
349 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 13:02:27 ] で、そろそろ純正シェルでの解法を誰かが投稿する時間だな
350 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 13:08:17 ] >>338 本当に日付は >>338 のフォーマットしかないと限定していいの? だったら >>343 でも動くだろうけど、 中には、 Mon Jun 2 08:15:45 JST 2008 みたいな行もあるという仕様じゃないの? だったら、 (今のところ) >>340 が正解。
351 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 13:09:45 ] ずいぶん勝手な解釈だな。
352 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 13:11:05 ] #!/bin/sh month() { case "$1" in May) echo 5;; Jun) echo 6;; esac } cat <<END | Fri, 16 May 2008 09:39:25 +0900 Sun, 18 May 2008 09:30:21 +0900 Mon, 02 Jun 2008 08:15:45 +0900 END while read line do set -- $line echo $4.`month $3`.$2 done
353 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 13:13:38 ] ああ echo $4.`month $3`.`expr $2 + 0` かな。
354 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 13:15:05 ] いや、>>344 は、>>343 をシェルで実行しようとしたんじゃないだろうか? どこにも○○○だとは書かれてないから。
355 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 13:31:19 ] >>350 だったら、4桁数字だったら西暦、 2桁数字だったら日付、 Jan Feb等に一致したら月、 それ以外のフィールドは無視、というように 全フィールドをチェックすればできるな。
356 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 14:22:51 ] 338です。 あっという間にたくさんのレスが。ありがとうございます。 >>340 >>343 >>352 ありがとうございます。 #!/bin/sh の後に書いてやってみていますが、まだうまくいきません。 基本的な書き方がわかっていなさすぎなんでしょうね。 >>350 日付のフォーマットはこれだけ限定です。 過去スレ等、さらに読みに行ってきます。 本当に皆さんありがとう。
357 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 14:31:41 ] >>355 だったら ↓だな。 #!/bin/sh while read line; do for f in $line; do case $f in [0-3][0-9]) d=$f;; [1-2][0-9][0-9][0-9]) y=$f;; Jan) m=1;; Feb) m=2;; Mar) m=3;; Apr) m=4;; May) m=5;; Jun) m=6;; Jul) m=7;; Aug) m=8;; Sep) m=9;; Oct) m=10;; Nov) m=11;; Dec) m=12;; esac done printf '%d.%d.%d\n' $y $m $d done
358 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 14:43:10 ] 宗教的に問題ないなら GNU date 入れちゃいなよ。 便利だよ。
359 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 14:44:15 ] 宗教上の理由でそれは出来ません
360 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 14:46:23 ] ならしょうがない。
361 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 19:29:20 ] 輸血と献血とGNU date は家訓で禁じられてます
362 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 20:25:21 ] perlで我慢しる $ cat <<END | perl -ane 'use Date::Parse; $t = str2time($_); ($s,$m,$h,$d,$M,$y) = localtime($t); print $y+1900 . "." . $M . "." . $d . "\n"' Fri, 16 May 2008 09:39:25 +0900 Sun, 18 May 2008 09:30:21 +0900 Mon, 02 Jun 2008 08:15:45 +0900 END 2008.4.16 2008.4.18 2008.5.2
363 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 20:27:13 ] use Date::Parse; ($s,$m,$h,$d,$M,$y) = strptime($_); print $y+1900 . "." . $M+0 . "." . $d+0 . "\n";
364 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 21:12:11 ] >>362 純正シェルでの >>357 の回答の後にperl出しても意味ないなぁ。
365 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 22:43:18 ] perlやGNU dateの方が書式に寛容
366 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 22:47:29 ] perlが入っててもDate::Parseが入ってない環境が多いから動かない環境が多い。
367 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/26(木) 01:57:12 ] 純正シェル(笑)
368 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/26(木) 02:04:04 ] シェルってゆうな。クズ。
369 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/26(木) 02:05:33 ] 貝殻
370 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/26(木) 02:12:50 ] ゆうなって言うなこのクズ
371 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/26(木) 03:07:08 ] 稲村
372 名前:265 mailto:sage [2008/06/26(木) 17:31:41 ] bashのshはシェルの略なので これからはbaと呼ぶことにします。
373 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/27(金) 10:24:30 ] 338、356です。 勉強始めたばかりで適切なスレを見つけるのもままならない。 質問した後に、スレ違いだったようだと反省している。 実はbashでやっているんだが・・・ってこれを最初に言うべきだったんだね。 皆さんにいただいたヒントでなんとかしようとさらに勉強するつもりだ。 ほんとに親切な人が多いスレで感激しているよ。 頑張ってみる。ありがとう。
374 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/27(金) 10:27:48 ] まだ出来てないのかよ。
375 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/27(金) 10:32:36 ] >>373 >>357 をコピペして、適当なファイルに保存(ファイル名hoge)する。 $ chmod +x hoge $ ./hoge < hoge1.txt 2008.5.16 2008.5.18 2008.6.2 ここまで書かないとわからなかったのかな? パーミッションとか、リダイレクトとか、./ を付けることとか、、
376 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/27(金) 10:36:14 ] パーミッションとかわからければ、テキストファイルとして保存して $ sh hoge < hoge1.txt でいいし。
377 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/27(金) 10:47:21 ] >>375 できましたっ! みんな、ありがとう!
378 名前:名無しさん@お腹いっぱい。 [2008/06/28(土) 16:35:09 ] ホストをIPに変換するシェルを発行する時、 getentを使いたいのですが、getentって純正シェルでも使えましたっけ? あと、他にgetentが使えないシェルはありますか?
379 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 16:58:49 ] ホストの人かコンピューターをプロトコルに変換するシェルを開発されるスーパーハカーの方ですねわかります
380 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 17:48:26 ] >>378 外部コマンドならシェルの種類は関係ないでしょ。
381 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 18:18:22 ] zshではシェル関数になっていた > getent
382 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 18:21:22 ] それは俺の知らないzshだ
383 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 18:25:32 ] >>381 それは漏れの知らないzshだ
384 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 18:27:34 ] ashでは not foundって言われた > getent
385 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 18:31:13 ] /usr/share/zsh/4.2.6/functions/compaudit の中に [[ -x /usr/bin/getent ]] || getent() { if [[ $2 = <-> ]]; then grep ":$2:[^:]*$" /etc/$1 else grep "^$2:" /etc/$1 fi } と書いてあった。コマンド実体がない場合にちょー簡略版を定義してるのね。
386 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 21:36:48 ] >>385 その定義だと、コロンで区切られてる前提になってるから、 passwdとgroupにしか使えないね。 (hostsには使えない)
387 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 21:47:04 ] getent hostsって微妙だからな。 libresolv直接叩いているアプリも結構あるし。
388 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 03:08:38 ] 行中にIPアドレスらしき文字列が含まれていたら、それを出力するって こんな感じで問題ないですかね? もっと綺麗に書ける気もするが・・・ # 1行に1つしか含まれてないと仮定して問題なしです。 text='0.0 192.168.0.1 0.0' regex='[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*' echo "$text" | grep "$regex" | sed -e "s/.*[^0-9]\($regex\).*[^0-9]*/\1/"
389 名前:388 mailto:sage [2008/06/29(日) 03:13:28 ] 全然ダメだったorz 教えてください。
390 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 03:30:41 ] echo $text | grep -E -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' -oなんてオプション他のgrepにあるか知らないけど
391 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:32:03 ] >>388 grepとsedを一緒に使うのは無駄。sedだけでできる。 sed '/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/'
392 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:34:43 ] すまん、-n p 忘れた。訂正。 sed -n '/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/p'
393 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:35:43 ] sed -n 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/p' の間違いだろ。初心者はもっと謙虚なレスを書きなさい。
394 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:38:27 ] >>392 それだと頭の数字が食われることがある。 ↓ sed -n '/[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/p' とした方がいい。
395 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:40:50 ] だからぁ〜、sedはスレ違い。 >>393 は何を言いたいんだ? (392のあとで)
396 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:43:09 ] と言うか、>>393 の頭の 's/ の部分ですでにsed文法エラーじゃん。 初心者はちゃんと動作確認してから書きなさい。 >>394 が正解。
397 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:50:09 ] >>394 でも、 hoge123 192.168.123.45 みたいな入力があると失敗する。続きは sedスレでやってくれ。
398 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:52:24 ] sed -n '/.*\(\<[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\>\).*/s//\1/p' で改善されるか?
399 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:54:07 ] 模範解答の発行まだー??
400 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 10:04:16 ] 398 で桶
401 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 21:24:06 ] sed -n 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/p'
402 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 21:44:44 ] >>401 >>397 の指摘で失格
403 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/30(月) 01:27:41 ] よほどパフォーマンスに差がありでもしないかぎり、 書き易く読み易いようにすればいい。
404 名前:388 mailto:sage [2008/06/30(月) 01:39:46 ] みなさま色々とありがとうございました。 >>398 ちゃんと処理できるみたいですし、このスレでも良い評価なので これを使ってあげようかと思います。感謝してください。 この処理は、あるとても重要な国家プロジェクトで使用されます。 コメントで Powered by 398 と入れておきますね。
405 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/30(月) 01:59:48 ] なわけねーだろ
406 名前:名無しさん@お腹いっぱい。 [2008/07/02(水) 17:31:55 ] 誰かお願いします。 wk=f 配列にa b c d とそれぞれ入ってるとして ループでぐるぐるっと、wkと一致するものを探したいんですが、 もし一致するものが無かった場合の終了条件って、どうしたらいいですか。
407 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 17:41:16 ] 日本語でおk
408 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 17:42:11 ] 純正シェルに配列はない。配列に相当する別の処理をしているなら、 その処理方法を明示して質問し直した方がいい。
409 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 17:43:56 ] >>406 多少エスパーして回答。 ループにwhileを使うんじゃなくて、 forで配列の要素分ループすれば、たとえ一致するものが無かった場合でも ループはちゃんと終了するから問題なし。
410 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 17:48:51 ] ループの返り値ってことなら、breakとかを使わん限り最後のコマンドの実行結果になるから、 ループの最後にfalseを置いとけばいいんじゃないかね。 成功した場合はbreakで抜ける、ということならば、だけど。
411 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 17:51:11 ] >>406 の日本誤訳: 以下のようなシェルを発行しようとしたのですが、 もし一致するものが無かった場合、うまくいきません。 どうすればいいですか? #!/bin/bash wk=f array=(a b c d e) i=0 while [ ${array[i]} != $wk ]; do ((i++)) done
412 名前:名無しさん@お腹いっぱい。 [2008/07/02(水) 17:57:26 ] 皆様あざーっす! とりあえず今、KSHって何だって事から教わりました。怒鳴り含み。 ちょっと参考にして、考えます。皆暖かいアドバイスども!
413 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 17:59:21 ] 突然何を言い出すんだ?
414 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 18:08:51 ] キチガイ警報
415 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 22:22:49 ] 作成したいファイル名が書かれたtxtのリストから、 ファイルを作成するにはどうすればよいでしょうか? たとえばテキストの中身に、 hoge foo bar とあったとして、 hogeとfooとbarというファイルを作成したいのです。
416 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 22:34:11 ] >>415 touch $(cat txt)
417 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 22:46:52 ] >>416 なんでこれでできるのかわからないですができました ありがとうございます
418 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 02:22:28 ] >>416 それだと大量だった場合に引数溢れのエラーにならないかな?
419 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 02:25:14 ] >>418 じゃあ cat txt | xargs touch
420 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 03:05:13 ] cat txt|while read FNAME do touch $FNAME done べたですがw
421 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 07:17:23 ] >>419 xargsは使っちゃいけないコマンド。 >>420 それだと catが無駄。touchがむだ。 while read FNAME do > "$FNAME" done < txt
422 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 07:19:13 ] >>416 bash依存、失格。 > `cat txt`
423 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 07:23:31 ] >>421 415とは関係ないんだけど パイプでxargsに渡すときに空白をエスケープするにはどうすればいいの 例えばfindで見つけたパスに空白が含まれてた場合とか
424 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 07:49:19 ] >>423 テンプレ>>6
425 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 07:55:01 ] >>424 テンプレにあったとは すいませんでした
426 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 08:02:10 ] テンプレにはないが、find -print0 | xargs -0 するんじゃなくて、 find -exec + するのが今後のお勧めだな。-exec の後ろ、\; じゃなくて + ね。 これでxargsは完全に不要!
427 名前:名無しさん@お腹いっぱい。 [2008/07/03(木) 11:31:21 ] 質問です。 case文でwhile文を使用する時 case "$a" in "a.c") while[ $flag = false || $i -ne 10 ] ; do 処理1 done の時、doneの跡に;;でおkですか?
428 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 11:56:24 ] >>421 がFAだけど、敢えてxargs -0で。 cat list.txt | perl -ane '{ chop; printf("%s%c", $_, '\0'); }' | xargs -0 touch
429 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 11:57:44 ] >>426 この+でappendって、最近のfindはどれにもあるの?
430 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 11:58:53 ] 純正findにないから使っちゃだめ
431 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 12:18:04 ] >>430 純正findにもあるんだなぁ、+ が。よって find -exec + で FA。
432 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 12:31:00 ] xargs を使っちゃいけない理由キボンヌ 便利だし早いからコマンドラインで結構使うんですが・・・
433 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 12:31:12 ] 純正find にないのは -print0 の方ですね。
434 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 12:40:55 ] 純正なんとかっていう意味の曖昧な言い方は止めろ 今はPOSIX準拠かどうかの話をしてるようだが、 純正シェルは古い/bin/shの話だったりでわからん
435 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 12:45:23 ] >>432 $ printf "This is\na test.\n" This is a test. $ printf "This is\na test.\n" | xargs -n 1 echo This is a test. $ printf "This is\na test.\n" | perl -ane 'chop; printf("%s%c", $_, '\0');' | xargs -0 -n 1 echo This is a test. $
436 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 12:46:31 ] & >>6 (>>424 は読んだ?)
437 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 13:03:20 ] >>435 なるほど、理解しますた。分かってれば使えないことはないですな。
438 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 16:40:13 ] まぁ実験して動いたらそれでまずOK。 でその後にリファイン(リファクタリング?) これが大事。
439 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 17:28:35 ] >>6 > (スペースなどを含むファイル名を正しく処理するため、 > findは -print0、xargsは -0オプションを常に付けることを推奨 > ただし、Solarisでは未対応。どうするんだろ?) $ cat print0 #! /bin/sh while read x; do printf "%s\0" "$x" done $ find 〜 | print0 | xargs -0 〜 でいいんじゃね? # printfは許してね。
440 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 18:16:12 ] >>439 いや、だから、Solarisでも find dir -exec hoge + が使えるんだよ。 よってprint0云々は一切不要。
441 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 18:21:41 ] >>439 ファイル名に \ が含まれていた場合、readが誤動作する(違うファイル名とみなされる) Solarisの xargsには -0 オプションがない。 で、>>440 の方法で解決。
442 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 18:58:56 ] トレースしてみた。 strace -f find /tmp -exec file {} + 2>&1 execve("/usr/bin/file", ["file"..., "/tmp"..., "/tmp/.ICE-unix"..., "/tmp/mysql.sock" ..., おお、すげぇ。ちゃんと引数まとめて実行してるね。 strace -f find /tmp -exec file {} \; 2>&1 execve("/usr/bin/file", ["file"..., "/tmp"...], [/* 21 vars */]) = 0 execve("/usr/bin/file", ["file"..., "/tmp/.ICE-unix"...], [/* 21 vars */]) = 0 execve("/usr/bin/file", ["file"..., "/tmp/mysql.sock"...], [/* 21 vars */]) = 0 こっちは1個ずつ実行するから大量だとクソ遅い。 勉強になりまつた。
443 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 19:55:30 ] やっぱ速さってみんな気になるん? しっかりきっちり動けば、速度は問題ないって思ってる俺は未熟? いかにもベターってのはやらないけどー。
444 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 20:03:16 ] テクいことして読み難くなるなら多少遅くても分かりやすく書く
445 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 20:08:46 ] >>442 straceって、、Linuxかよw
446 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 23:57:40 ] >>443 必要な時に必要なことをやる。当たり前のこと。 後の話はマ板でやって。
447 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 01:32:47 ] cronで毎日回しているプログラムの処理時間が 16時間越えたらちょっと悩む
448 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 08:05:24 ] kshでユーザIDのリストを計表にして印刷したいんだけど こんなの作った人いますか? どこかにサンプルありませんかね。OSは、AIX5.3です。
449 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 08:27:34 ] >>448 計表の正確なところがわからんが、 while read user pass uid rest; do echo $uid $user ; done < /etc/passwd ってことか? あと、必要なら sort -n をかましてね。 kshじゃなくて純正シェルでできるよ。
450 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 08:29:48 ] >>448 あ、IFS設定抜けてた。 IFS=:; while read user pass uid rest; do echo $uid $user ; done < /etc/passwd
451 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 08:42:50 ] ksh -c lpr < /etc/passwd
452 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:13:09 ] FreeBSD 付属の wc は空白文字でパディングして結果を返すようです。 wc -l $file | sed "s/ /_/g" _____340_/usr/bin/g++ Linux では次のようにして 340 という値を得ていたのですが、 FreeBSD では空白文字が出力されてしまいます。 wc -l $file | cut -f1 -d" " FreeBSD 版 wc ではどうすればいいでしょう。 ltrim() みたいなものがありますかね。 それともいったん sh の変数に代入する? それとも wc や cut には未知のオプションがある? cut なんていう頑ななコマンドは使わないで、 sed 's/^ *\([0-9]*\) .*$/\1/' しろ? お前 awk '{ print $1 }' も書けないのか? bash をよく使うので、依存しているところがあったらごめんなさい。 awk はほとんど馴染みがありません。というか、 何かにつけて不遇の cut を使ってあげたい気持ちがあります…。
453 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:15:19 ] >>452 echo `wc -l < $file`
454 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:28:33 ] >>452 長文で cutを力説してるのに、 >>453 で cutすら必要ないというオチにワロタ wc で、引数じゃなくて標準入力の場合はもともとファイル名が出ないので cutとかで切る必要ないのと、スペースを取り除くにはシェルの ` ` を使うってことね。
455 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:33:53 ] > それともいったん sh の変数に代入する? 質問者が用意した選択肢を誇らしげに答える>>453-454 が憐れ。
456 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:38:03 ] 空白文字のパディング方式に、 暗黙の仮定を置いてまでcutにこだわる意味が全くわからん。 仕様の特殊化しても嬉しくない。
457 名前:452 mailto:sage [2008/07/04(金) 11:38:04 ] いやいや > wc で、引数じゃなくて標準入力の場合はもともとファイル名が出ないので 役に立ちました! 確かに笑った。
458 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:38:44 ] >>455 おまえ、シェルスクリプト書いたことないだろ? >>453 では一切「sh の変数に代入」は行なっていないがww
459 名前:452 mailto:sage [2008/07/04(金) 11:50:48 ] >>456 いやいや、そうなんですよ。 cut ってつまり結局 他のコマンドと組み合わせるには中途半端なツールなんですよ。 単純でそれなりに覚えやすく、見込みのあるヤツだと思ってたんですが… awk や bash は区切り文字を変えるだけでも結構タイプする印象が。 いや、変にこだわってごめんなさい。
460 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 12:06:44 ] つ awk -F:
461 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 15:50:34 ] cut はデリミタの連続を指定できれば使える君に化けるんだがな。
462 名前:名無しさん@お腹いっぱい。 [2008/07/08(火) 07:58:27 ] シェルスクリプトがCなどのプログラムより重い理由をうまく説明したいんですが
463 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 08:00:46 ] >>462 インタプリタ型言語だから。 (fork/execが遅いと言うだけが理由ではない。 内部コマンドだけを使ってもCよりも遅いから)
464 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 10:52:14 ] でも一番のボトルネックは fork, exec だと思うぞ
465 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 11:29:48 ] プロファイルしてみると分かるが、文字列処理も結構コストが高い。 stat(2)せずにls -lしてからパターンマッチなど。 shは文字列がグルーになっているから。
466 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 14:57:58 ] パイプとかバッククォートとかガンガン使うから、 それだけでシステムコール連発になっちゃうもんね。 文字列処理なのに write(2) とか使うわけだw
467 名前:名無しさん@お腹いっぱい。 [2008/07/08(火) 21:54:18 ] レスありがとう ちなみにパイプでコマンドつないだ場合って一つ一つ最後まで処理して次のコマンドに移るであってますかね?
468 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 21:56:21 ] >>467 全然合ってない。それは MS-DOSのニセパイプの動作。
469 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 22:14:44 ] >>468 詳しくおしえてください・・・
470 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 22:21:27 ] >>469 シェル pipe dup2 とかで検索してみ。
471 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 22:50:12 ] そんな検索語じゃわかるわけないだろ。 pipe(2)だって無限にバッファがあって、 入口が閉じるまで出口から出て来ない仕様になってる可能性だってあるわけで。
472 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 23:22:32 ] 無限の記憶装置は存在しないのでそんな可能性はゼロだな。
473 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 23:25:31 ] MS-DOSのパイプ仕様を実装することも不可能だな。
474 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 23:36:10 ] コマンド1 | コマンド2 本来のパイプだと、 コマンド1 の標準出力 = コマンド2の標準入力 になるような操作(dupとか)が裏で行われる。 コマンド1と2は同時に実行される。一時ファイルを介さない。 嘘パイプの場合は、 コマンド1 > 一時ファイル コマンド2 < 一時ファイル 削除 一時ファイル なだけ。
475 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 23:57:58 ] 例えば cat ばかでかいファイル | head -1 だとcatもheadも同時に起動してheadはcat の出力が1行分でたらそれを出力します そのときcatの処理が途中だったらどうなるんですか?
476 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/09(水) 00:11:11 ] やってみろよ
477 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/09(水) 00:50:57 ] >>475 バッファってしってるか?
478 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/09(水) 01:22:00 ] >>475 catがwrite(2)を呼び出したときにheadが終了している(パイプが閉じている)とSIGPIPEくらって終了。
479 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/09(水) 02:16:51 ] そのshigpipeを発行するのはパイプさん?