1 名前:1様 [2009/04/03(金) 22:17:43 ID:0qFlvOW9] UNIX板のスレを見ている方も多数おられるかと思いますが、 まあそれはそれとして、BASHウゼーとか言われる心配なく 平和にLINUX的スクリプト談義しましょうよ。 初めての自作スクリプト、自信ないから見てください。な初心者から トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで いろいろな人に参加して頂けると嬉しいです。 perlやらPythonやらの話が混ざっても良いんでない? Part4 : pc11.2ch.net/test/read.cgi/linux/1210999497/ Part3 : pc11.2ch.net/test/read.cgi/linux/1184077033/ Part2 : pc11.2ch.net/test/read.cgi/linux/1154578200/ Part1 : pc8.2ch.net/test/read.cgi/linux/1121994321/ >>2-5 あたりに色々と。
162 名前:login:Penguin mailto:sage [2009/07/23(木) 18:06:19 ID:P+5ig7CA] くだ質池
163 名前:login:Penguin [2009/07/26(日) 07:44:48 ID:FW8uMlXc] ttaファイルを再生するスクリプトを作ってみました。 一応ちゃんと動くのですが、、、 バックグラウンドで動かしているttaencがエラーで死んだ場合に (単純な例では$1のファイルがない、とか) playコマンドが入力を待ち続けてしまうのです。 何かよい方法ないですか? #! /bin/sh -e WAV=`mktemp -t $$.wav` rm -f $WAV mknod $WAV p trap "rm -f $WAV" 0 ttaenc -o $WAV "$1" > /dev/null 2>&1 & play -q $WAV > /dev/null 2>&1
164 名前:login:Penguin mailto:sage [2009/07/26(日) 08:26:44 ID:BwoYtVgZ] >>163 ifで$?を判定すればいいんじゃないかな
165 名前:login:Penguin mailto:sage [2009/07/26(日) 09:00:23 ID:VmbGTICm] >>164 コア吐いたらダメっしょ。 trapしたほうがよくね?
166 名前:163 mailto:sage [2009/07/26(日) 09:07:33 ID:FW8uMlXc] >>163 自己レス playとttaencを両方ともバックグラウンドにし、 ttaencをwaitすることでエラーを捕捉、必要ならplayを停止。 これで解決しました。 #! /bin/sh -e WAV=`mktemp -t $$.wav` rm -f $WAV mknod $WAV p trap "rm -f $WAV" 0 ttaenc -o $WAV "$1" & DECODE_PID=$! play -q $WAV > /dev/null 2>&1 & PLAY_PID=$! exec 2> /dev/null wait $DECODE_PID || (kill -10 $PLAY_PID) >>164 $?について調べたのですが、バックグラウンドプロセスには効かないようです。 でも、調べる過程で解決の発想を得られました。ありがとう!
167 名前:login:Penguin [2009/07/30(木) 18:32:54 ID:8kF2jsLv] シェルスクリプト初めて数日ですが、ファイルの書き換えやなんかは検索すると出てくるんですが 選択肢形式の作り方がいまいちわかりません。 lokkitやsystem-config-networkみたいな選択形式を作りたいのですが 何かヒントをいただけないでしょうか?
168 名前:login:Penguin mailto:sage [2009/07/30(木) 18:37:48 ID:3Jkdy3aR] >>167 whiptail とか?
169 名前:login:Penguin mailto:sage [2009/07/30(木) 19:33:48 ID:1ZQVAEXh] dialog
170 名前:login:Penguin mailto:sage [2009/07/30(木) 19:43:13 ID:fH5JNdXj] $ lokkit bash: lokkit: command not found $ system-config-network bash: system-config-network: command not found $ whiptail bash: whiptail: command not found はう?? $ xmessage -button 'nipple,ass' 'which?'
171 名前:login:Penguin mailto:sage [2009/07/30(木) 20:01:21 ID:3Jkdy3aR] >>170 何が言いたいんだ?
172 名前:167 [2009/07/30(木) 20:08:32 ID:8kF2jsLv] >>168-169 ありがとうございます。 両方とも試してみましたがどちらもライブラリを追加しないと機能しないっぽいですね。 はじめて数日の私にはなかなか敷居が高いようです。 うーん・・・今さわってる環境でライブラリ追加させてもらえると大丈夫だと思いますが ダメって言われたらアウトっぽいですね・・・。
173 名前:login:Penguin mailto:sage [2009/07/30(木) 20:10:01 ID:3Jkdy3aR] 引き数で渡すとかじゃだめなん?
174 名前:167 [2009/07/30(木) 20:21:04 ID:8kF2jsLv] 引数で渡してもいいんですが 項目が少し多いので引数を渡すまでに選択肢で絞りたかったというのがあります。 関連ライブラリがいまいちまだ特定できないですが、道のりは遠そうです・・・
175 名前:login:Penguin mailto:sage [2009/07/30(木) 20:37:05 ID:w4YhvOQC] >>172 両方とも試してみたって、どうやって試したん?
176 名前:login:Penguin mailto:sage [2009/07/30(木) 21:09:43 ID:neY1QnOU] シェルスクリプトに詳しいみなさんに聞きたいのですが、 ユーザ追加して第三者に利用させるときに これ禁止させておけばよい、といったコマンドありますか? 例えば find などです。
177 名前:login:Penguin mailto:sage [2009/07/30(木) 21:17:05 ID:otd/7QOf] >>176 シェルの内部コマンドだけで相当できるから考えるだけ無駄。
178 名前:login:Penguin mailto:sage [2009/07/30(木) 21:17:21 ID:uCTsIRNg] なんでfindはだめなの? TOMOYO入れたら?
179 名前:login:Penguin mailto:sage [2009/07/30(木) 21:25:06 ID:wVBjHvC9] >>174 コマンドラインに収まらなくてもいいのなら、zenityは? echo -e "選択肢1\n選択肢2\n選択肢3" | zenity --list --column="項目"
180 名前:login:Penguin mailto:sage [2009/07/30(木) 23:35:05 ID:zSR6vlNV] >>174 bash 限定でいいなら、 select i in "Yes" "No" "Cancel"; do [ -n "$i" ] && break done case "$i" in Yes) echo "$i, we can.";; No) echo "$i, it's so hard.";; Cancel) echo "...";; esac
181 名前:login:Penguin mailto:sage [2009/07/31(金) 00:19:11 ID:eB5hWQQH] $(ls) と `ls` は同じと考えていいの?
182 名前:login:Penguin mailto:sage [2009/07/31(金) 01:07:21 ID:dqFrtp13] よくない
183 名前:login:Penguin mailto:sage [2009/07/31(金) 08:21:07 ID:Q0h6j6GB] 同じじゃないのか?
184 名前:174 [2009/07/31(金) 10:38:52 ID:unqMPfm1] >>179 zenityもcommand not foundって言われてしまったので入ってないようです。 ですが選択肢としていろいろと勉強になりました。 ありがとうございます。 >>180 サンプルありがとうございます。 大変勉強になりました。 bash限定ならこのあたりが限界っぽいですね。せめて項目の文字を色分け出来るくらいはしたかったですが モジュール追加出来ないからって事で先方にはあきらめてもらうようにします。
185 名前:login:Penguin mailto:sage [2009/07/31(金) 10:47:53 ID:dFOhVUdW] >>182 どう違うの?
186 名前:login:Penguin [2009/07/31(金) 11:03:30 ID:JVm6T/2T] Bashで設定を変更するものを作ってるんですがCtrl + C とかでプロンプトに抜けられないようにするにはどうすればいいんでしょうか?
187 名前:login:Penguin mailto:sage [2009/07/31(金) 11:08:16 ID:dFOhVUdW] >>186 trap
188 名前:186 [2009/07/31(金) 11:16:14 ID:JVm6T/2T] >>187 ありがと。 出来ました。
189 名前:login:Penguin [2009/07/31(金) 16:40:28 ID:YezVKpJb] コンフィグ情報から DEVICEとIPADDRだけを抜き出したいのですが下記だとDEVICEの行が5行表示され ます。 構文が間違っているからだと思いますがアドバイスもらえないでしょうか。 eth0=/etc/sysconfig/network-scripts/ifcfg-eth0 while read eth0 do echo $eth0 | sed -n '/DEVICE/p' /etc/sysconfig/network-scripts/ifcfg-eth0 done < /etc/sysconfig/network-scripts/ifcfg-eth0
190 名前:login:Penguin mailto:sage [2009/07/31(金) 16:49:00 ID:Q0h6j6GB] sed -n '/DEVICE/p;/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-eth0
191 名前:login:Penguin mailto:sage [2009/07/31(金) 16:51:37 ID:dFOhVUdW] なんで何度も /etc/sysconfig/network-scripts/ifcfg-eth0 を書いてんだろ。
192 名前:login:Penguin mailto:sage [2009/07/31(金) 16:52:11 ID:sKGfGulX] >>189 答え先に書かれちゃったか。 1行目のeth0はどこで使ってるの?とか、whileでループさせる意味は?とか ちょっと落ち着いて考えた方が良い
193 名前:login:Penguin mailto:sage [2009/07/31(金) 16:56:53 ID:IvZ7j8yJ] >>189 今後の為に基礎から勉強しなおしてきた方がいいよ
194 名前:login:Penguin mailto:sage [2009/07/31(金) 16:57:14 ID:6mUE4jrQ] > 1行目のeth0はどこで使ってるの?とか、whileでループさせる意味は?とか > ちょっと落ち着いて考えた方が良い 落ち着いて考えてもわかんねーよ 1行目のeth0がどこにも使われてないのはわかるけど
195 名前:189 [2009/07/31(金) 17:37:11 ID:YezVKpJb] みなさん回答ありがとうございます。 改めて見ると意味わからないことしてました。 下記のコードで意図する事ができました。 ありがとうございました。 while read do echo | sed -n '/DEVICE/p;/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-eth0 break done < /etc/sysconfig/network-scripts/ifcfg-eth0
196 名前:login:Penguin mailto:sage [2009/07/31(金) 17:45:29 ID:sKGfGulX] >>195 全力で釣られてやる。 >>190 さんが書いてるように、sed1行でいける sed -n '/DEVICE/p;/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-eth0 whileしたあげくに無条件でbreakとか意味わからん。 各行で何をしているのかもう少し考えよう
197 名前:login:Penguin mailto:sage [2009/07/31(金) 20:49:41 ID:M2gWEg8T] >>195 まずその「よく分からないけどとにかく丸写しでそれらしく作っとけばいいだろう」 という思想を改めるべきだな。
198 名前:login:Penguin [2009/07/31(金) 21:59:52 ID:JVm6T/2T] 何やら上でもsedの質問出てますが質問させてください。 sedでtet.txt内にあるhogeをhogehogeに書き換えるものをつくりました。 sed -i 's/hoge/hogehoge/g' /tmp/test.txt 次にhogeとhogehogeの部分を変数にしたのですが今度は書き換わってくれません。 $aにはhoge $bにはhogehoge sed -i 's/$a/$b/g' /tmp/test.txt test.txtを見ると更新はされているので何らかのアクションがあるみたいなんで すが何か指定方法間違ってますでしょうか?
199 名前:login:Penguin mailto:sage [2009/07/31(金) 22:03:23 ID:Y1b6fdMF] sed -i "s/$a/$b/g" /tmp/test.txt
200 名前:login:Penguin mailto:sage [2009/07/31(金) 22:06:26 ID:Gbr9waoH] >>199 ""だとシェル変数展開されないっすか?
201 名前:sage mailto:sage [2009/08/01(土) 01:27:09 ID:2gkCvOw5] シェルでリスタートとかかけると 活性化しますとか表示されるんですが、これ表示させないようにする方法ありますか? /dev/nullとかしても表示されたので表示させない方法あれば教えてください。
202 名前:login:Penguin mailto:sage [2009/08/01(土) 01:38:27 ID:MXySzGMG] >>201 使ってるディストリのスレへ。
203 名前:login:Penguin mailto:sage [2009/08/01(土) 02:29:31 ID:SZCdXM7k] >>198 $ a='hoge' $ b='hogehoge' $ cat >/tmp/test.txt hogepiyo$a$b$c $ sed -i 's/$a/$b/g' /tmp/test.txt $ cat /tmp/test.txt hogepiyo$b$b$c # hogeはそのまま、$aは$bに。 $ cat >/tmp/test.txt hogepiyo$a$b$c $ sed -i "s/$a/$b/g" /tmp/test.txt $ cat /tmp/test.txt hogehogepiyo$a$b$c # hogeがhogehogeに、$aはそのまま。
204 名前:login:Penguin mailto:sage [2009/08/01(土) 04:42:15 ID:SZCdXM7k] >>181 入れ子のとき注意がいる。 $ echo $(echo a:$(echo b:$(echo c:$(echo d)))) a:b:c:d $ echo `echo a:`echo b:`echo c:`echo d```` a:echo b:c:echo d $ echo `echo a:\`echo b:\\\`echo c:\\\\\\\`echo d\\\\\\\`\\\`\`` a:b:c:d
205 名前:login:Penguin mailto:sage [2009/08/02(日) 01:23:15 ID:tM/nSNrk] 画面を切り替えたりするとselect文が数行表示されない(実際には選択は出来る)ことが よくあるんですが、データの受信が表示までに間に合ってないような感じです。 これを避ける方法などはあるんでしょうか? 使用しているターミナルはPoderosaになります。
206 名前:login:Penguin [2009/08/03(月) 09:09:05 ID:J0mTyN5X] 今までbashでスクリプト組んで表示はExiteで翻訳とか適当にコピペってたのですが シェルスクリプトって日本語表示出来ますか? お偉いさんが英語じゃわからんとかぬかしやがったので・・・
207 名前:login:Penguin mailto:sage [2009/08/03(月) 09:14:24 ID:+8DYA08E] >>206 文字コード決めうちでよければ比較的簡単だな。 問題はそれで表示できるかどうかは実行する人が 使ってるターミナルに依存するということだ。一般的に やろうとするとロケール見て切り替えみたいなことを しなきゃならないが結構面倒だね。 ま、お偉いさんの環境に合わせておけばいいんじゃね?
208 名前:206 [2009/08/03(月) 09:29:50 ID:J0mTyN5X] >>207 やっぱりそうですよね。 アクセスしてきたターミナルの文字コードを判別してとか切り替えられればいいんですが さすがに無理ですよね。 お偉いさんだけじゃなくてユーザーも使うんで文字コードって混在してるんですよね。 標準的な文字コードってどんなの使われてるのかはよくわかりませんが まぁ無理って方向で進めていこうかと思います。 ありがとうございます。
209 名前:login:Penguin mailto:sage [2009/08/03(月) 09:57:12 ID:pu8sCNil] ローマ字でいいんじゃね。
210 名前:login:Penguin mailto:sage [2009/08/03(月) 10:31:49 ID:3RzsW8i/] exciteのわけわからん翻訳貼り付けるのは ユーザーが可哀想だろw 自分の英語に自信が持てないなら、いっそ日本語の方がいいんじゃね。 そのディストリビューションで日本語選んでインストールしたとき デフォルトになる文字コード選んどけば 誰も文句いわないんじゃね? 自分でLANGいじるようなやつは、文字化けのなおしかたぐらい知ってるだろ。
211 名前:login:Penguin mailto:sage [2009/08/03(月) 10:52:42 ID:3RzsW8i/] なんか変だ。 ユーザー作ったときデフォルトでなってる文字コードにしとけばいいんじゃね、だ。 LANGとかLANGUAGEとかいじるやつは文字化けの直し方ぐらい知ってるだろ。 デフォルトがCとかenとかなら…シラネ
212 名前:login:Penguin [2009/08/04(火) 12:15:50 ID:OyyR8ocQ] 動けばいいって程度で作ってたものをどうやら他にもリリースするとかで見栄えをよくしろと言われました。 bashで文字を寄せたり全体を中央寄せにしたりするコマンドとか関数ってありますか?
213 名前:login:Penguin mailto:sage [2009/08/04(火) 12:53:29 ID:h5jokg18] COLUMNS見て計算する。 いっそwhiptailやdialog使うとかな。
214 名前:login:Penguin mailto:sage [2009/08/04(火) 21:45:57 ID:1cLNSoFd] printf ? あとよく知らないけど fmt とか groff とか?
215 名前:212 [2009/08/04(火) 22:25:14 ID:OyyR8ocQ] >>213 文字数はじき出して何とか出来ました。 あとスクリプトの中で /etc/rc.d/network restart といれているんですが、手動で/etc/rc.d/network restartすると大丈夫なんですが #!/bin/bash /etc/rc.d/network restart とかで実行するとshould not be world writeable users cannnot control this device と表示されて実行されていないようです。 権限の問題かと思い色々と変えてみましたがダメでした。 なにか他に注意すべき点があればご教示いただければと思います。
216 名前:login:Penguin mailto:sage [2009/08/04(火) 22:32:07 ID:ACq2bWOB] > 色々と変えてみましたがダメでした。 そりゃダメだろうな。
217 名前:login:Penguin mailto:sage [2009/08/04(火) 22:49:56 ID:p9z/5JkD] もしかして: should not be world writable users cannot control this device
218 名前:212 [2009/08/05(水) 09:09:45 ID:Sso6+/38] >>217 すいません スペル間違えてました。 217で記述されている内容が表示されておりました。
219 名前:login:Penguin mailto:sage [2009/08/05(水) 09:38:19 ID:gztfuFMV] いろいろgrepしたけどうちのマシンには そのメッセージを吐くプログラムは入ってないようだ。 ディストリビューションと、どのプログラム/スクリプトが そのメッセージ出してるか書けば? ちなみにそのスクリプトはrootで実行してるんだよね?
220 名前:212 [2009/08/05(水) 10:47:05 ID:Sso6+/38] >>219 すいません。 CentOS5.3 です。スクリプト内容は膨大なのですがエラーが出る場所は /etc/rc.d/init.d/network restart の部分になります。 実行しているのは別のユーザーでてっきりrootで実行してるもんだと思ったら別ユーザーで実行していたようです。 ファイルは -rwxr-xr-x 1 root root 1234 7月 31 00:00 test.sh 実際に実行していたログインユーザーはtestというユーザーでした。 上記の事とエラー内容から権限がないために出ていると思います。 testユーザーでもrestartをかけれる権限を付与するか、testユーザーを rootのグループに入れるような事が出来れば出来そうな気もしますが自分には少しレベルが高そうですね。
221 名前:login:Penguin mailto:sage [2009/08/05(水) 13:12:18 ID:gztfuFMV] のりピーが心配で仕事が手に着かない。 init.dのスクリプトは一般ユーザーが使うようには出来てない。 仮にパーミッション緩めまくって実行できるようにしても、 インターフェースの設定はuid=0じゃないと出来ないので どこかで権限を昇格するかrootのプロセスに引き継ぐかしないと行けない。 具体的な実装方法の話に入ると、 そもそも一般ユーザーがインターフェースupdownする必要が 本当にあるのかという事から検討したくなって 長くなりそうなのでとりあえずがんばれと言っておく。
222 名前:219 [2009/08/05(水) 13:35:06 ID:Sso6+/38] >>221 ありがとうございます。 ネットワークの設定を一般ユーザー(といっても特定のユーザーのみですが) が出来るようにしたいと思っております。 そんなに頻繁にあるわけではないのですがroot権限を持ったものが常駐しているわけでは ないということもありましたのでネットワーク周りだけを触るスクリプトを組みました。 権限の昇格やrootのプロセスをシェルスクリプトで引き継げるようであれば行いたいと思います。 ご存じのかたおられましたらアドバイスいただけると助かります。
223 名前:login:Penguin mailto:sage [2009/08/05(水) 14:02:44 ID:gztfuFMV] そのぐらいならsudoでどぞ。
224 名前:login:Penguin mailto:sage [2009/08/05(水) 21:35:22 ID:dz5dEKuL] >>222 ifcfg-eth0とかに「USERCTL=yes」でroot以外でもできそう www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/ja/ref-guide/s1-networkscripts-interfaces.html
225 名前:login:Penguin [2009/08/08(土) 16:14:34 ID:Nnr+lme9] rebootやshutdownはrootでなくても使用できるんでしょうか? 試しにrootではないsampleユーザーで #!/bin/bash reboot を実行させたら再起動かかったんですが、てっきり弾かれるかパスワード聞かれると思ってました。 上のほうで権限がどうのこうのって質問があったんですが、OSとかによって違うってことですかね。
226 名前:login:Penguin mailto:sage [2009/08/09(日) 11:26:19 ID:1P+Q9AS+] そんなのあんの? rebootやshutdownは管理者権限だろ
227 名前:login:Penguin mailto:sage [2009/08/09(日) 11:34:22 ID:IkGSFCMm] sudoersに書いてたとしてもsudo rebootじゃないと駄目だろうし 何だろ
228 名前:login:Penguin mailto:sage [2009/08/09(日) 11:46:08 ID:0aZIEnpY] >>225 rebootはできてもshutdownはできないんじゃない?
229 名前:login:Penguin [2009/08/09(日) 12:55:17 ID:aaFRdfIZ] ディストリ次第じゃないんですか。Debian ではできないみたいだけど、Vine では 一般ユーザでも shutdown できる (Red Hat 系はみんなできるのかも)。Vine の場合、 /usr/bin/shutdown はシェルスクリプトで、中で halt や reboot を呼び出している。 そして、この halt や reboot はリンクで、実体は /usr/bin/consolehelper。 あとは、man consolehelper ですね。
230 名前: ◆Zsh/ladOX. mailto:sage [2009/08/09(日) 14:01:11 ID:/ZeBm1qf] んーできない。 % cat /etc/redhat-release CentOS release 5.3 (Final) % id uid=500(hage) gid=500(hage) 所属グループ=500(hoge) context=user_u:system_r:unconfined_t % /sbin/shutdown -r now shutdown: you must be root to do that! % /sbin/reboot reboot: must be superuser.
231 名前:229 mailto:sage [2009/08/09(日) 14:18:48 ID:PRPNML+y] >>230 CentOS の場合、/sbin/shutdown じゃなくて、/usr/bin/shutdown はないんですか。 だとしたら、Vine だけなのかな。たしか、「一般ユーザに電源をぶち切られるより、 shutdown を許した方がマシだ」という考えだったと思います。
232 名前: ◆Zsh/ladOX. mailto:sage [2009/08/09(日) 14:27:23 ID:/ZeBm1qf] % /usr/bin/shutdown -r now zsh: そのようなファイルやディレクトリはありません: /usr/bin/shutdown % locate shutdown|grep bin /sbin/shutdown /usr/bin/pm-shutdown なんで無いね。
233 名前:login:Penguin mailto:sage [2009/08/09(日) 16:35:29 ID:CB8fkMOP] # ながいこと Vine しか使ってないから他のディストリのことはわからない。 >>225 シェルスクリプトの "reboot" を /sbin/reboot とか /usr/bin/reboot とかに書き換えてみると動作に違いがでると思う。 > 権限 pam って仕組みで管理されてると思う。/etc/pam.d/ 以下のファイル。 >>225-232 Vine だと usermode っていうパッケージに /usr/bin/consolehelper /usr/bin/halt /usr/bin/poweroff /usr/bin/reboot /usr/bin/shutdown /usr/sbin/userhelper とかいったものが入ってる。usermode-gtk ってパッケージもある。 Description : usermode パッケージには、一般ユーザが設定されたプログラムをスーパーユー ザとして実行できるようにするユーザヘルパープログラムが含まれています。
234 名前:login:Penguin [2009/08/09(日) 22:04:40 ID:ivLlFzN/] シェルスクリプトでコマンド番号を選択したりIPを入力したりするツールつくったんですが、 ctrl+cやIP入力にコマンドを入れてみて実行されるかどうかといった確認はしてみましたが それ以外にセキュリティやテストしてみるといいことなどあれば教えてください。
235 名前:login:Penguin mailto:sage [2009/08/09(日) 22:52:55 ID:C0J3iJDt] スクリプト晒して!
236 名前:login:Penguin mailto:sage [2009/08/09(日) 23:03:57 ID:IVuBeWRI] 晒されても答えようがないような。 C-c が入れられたときの正しい処理とか本人でないと知らないし。
237 名前:234 [2009/08/09(日) 23:20:52 ID:ivLlFzN/] >>235 IP以外の文字が入れられたらといった時の処理はまだいれてませんが 下記のような事を繰り返してconfを書き換えて再起動するという感じです。 read newip $newip="IPADDR=""$newip" sed -i "s/$oldip/$newip/g" /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/rc.d/init.d/network restart menufunc
238 名前:login:Penguin mailto:sage [2009/08/10(月) 00:04:28 ID:CdStD5IJ] >>227 sidを知らんのか。
239 名前:login:Penguin mailto:sage [2009/08/10(月) 01:28:19 ID:qfqY90wM] a b c ... と一語ごとに改行された一つのテキストファイルを a b c d e f g h i j k l m n o ... と言うように10列ごとに改行するテキストにしたいと思い、 スクリプトを組んだのですが動作が遅く、重くなってしまって困惑しています どなたかお知恵をお貸しくださると助かります。 #/bin/bash FILE=$1 LINENUM=`expr 1` OFILE=/dev/shm/hoge while read line do if [ $LINENUM -lt 10 ];then echo -n "$line" >> $OFILE echo -n -e "\t" >> $OFILE LINENUM=`expr $LINENUM + 1` else echo "$line" >> $OFILE LINENUM=`expr 1` fi done <$FILE
240 名前:login:Penguin mailto:sage [2009/08/10(月) 01:50:52 ID:vmT7yJCz] #!/bin/sh FILE=$1 OFILE=/dev/shm/hoge LINENUM=1 while read line do if [ $LINENUM -lt 10 ] then echo -n "$line" echo -n -e "\t" LINENUM=$(( LINENUM + 1 )) else echo "$line" LINENUM=1 fi done <$FILE >$OFILE
241 名前:login:Penguin mailto:sage [2009/08/10(月) 02:00:08 ID:qfqY90wM] >>240 ありがとうございます! 処理が覿面に早くなりました! いちいち書き出さないで最後に一括して書けばよかったんですね…
242 名前:login:Penguin mailto:sage [2009/08/10(月) 02:10:30 ID:vmT7yJCz] >>241 たぶんexprの呼び出しのほうがコストが高いよ
243 名前:login:Penguin mailto:sage [2009/08/10(月) 12:26:13 ID:5IcilgjJ] 自分で動かすだけならこれでいいやと思ったら、そんだけで改善できたのか… ---- #!/bin/sh FILE=$1 OFILE=/dev/shm/hoge sed -e '$!N;$!N;$!N;$!N;$!N;$!N;$!N;$!N;$!N;s/\n/\t/g' <$FILE >$OFILE
244 名前:login:Penguin [2009/08/10(月) 15:31:57 ID:oeYkUDqx] 数字の判定は[0-9]と正規表現使って判定してるんですが IPアドレスかどうかの判定が出来るような正規表現ってあるんでしょうか。 無い脳みそひねってもいい案が出なかったのであれば教えてください。
245 名前:login:Penguin [2009/08/10(月) 15:41:18 ID:86RyWVEw] >>244 ググレばサンプルたくさんあるよ。
246 名前:login:Penguin mailto:sage [2009/08/10(月) 15:59:59 ID:BhLss4cE] お前ならどうするかを教えてやりゃーいいじゃん。
247 名前:login:Penguin mailto:sage [2009/08/10(月) 16:10:10 ID:sXOG+s90] PowerShell神すぎだろ。 このスレ見てると原始人が石斧振り回してるように見えてくるぜ。
248 名前:login:Penguin mailto:sage [2009/08/10(月) 17:33:20 ID:6xgY8KY4] 僕には端末エミュとシェルの違いもわかってないマヌケが見えます。
249 名前:login:Penguin mailto:sage [2009/08/11(火) 00:20:03 ID:GKnhcfe3] >>247 型の概念が邪魔。 コマンドが無駄に長い。 重い。
250 名前:login:Penguin [2009/08/11(火) 00:27:50 ID:4esITO9l] Macのbashもここでいいんでしょうか… OSは10.5.8です。 test.shを ---- #!/bin/sh echo $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12 ---- とします。 ./test.sh 1 2 3 4 5 6 7 8 9 10 11 12 と実行すると素直に 1,2,3,4,5,6,7,8,9,10,11,12 となるのに ./test.sh 1.0 2 3 4 5 6 7 8 9 10 11 12 と小数を入れて実行すると 1.0,2,3,4,5,6,7,8,9,1.00,1.01,1.02 となってしまうのはなぜでしょうか。
251 名前:login:Penguin mailto:sage [2009/08/11(火) 00:35:21 ID:XDXqx0+D] ./test.sh a 2 3 4 5 6 7 8 9 10 11 12 としてごらんなさい
252 名前:login:Penguin [2009/08/11(火) 01:01:07 ID:4esITO9l] >>251 な、な、な、なんでしかこりは! はっ!そうか!… $1,$2...って書いてあるサイトが多いからけっこうな個数使えるのかと思ってました。 ありがとうございました。
253 名前:login:Penguin mailto:sage [2009/08/11(火) 01:07:27 ID:e9ttEiKp] echo $1,$2,$3,$4,$5,$6,$7,$8,$9,${10},${11},${12}
254 名前:login:Penguin [2009/08/11(火) 02:19:40 ID:4esITO9l] >>253 $(10)は試したのに${10}は試してませんでした…orz ありがとうございます。 >>251 を受けてshiftを使う対処法を知りました。 10個以上の引数を扱いたいという目的においては、shiftと${10}の善し悪しはあるんでしょうか。
255 名前:login:Penguin mailto:sage [2009/08/11(火) 02:26:00 ID:MclIhwRq] こーいうトラップがあるからperlに逃げる人が多い
256 名前:login:Penguin mailto:sage [2009/08/11(火) 02:52:40 ID:e9ttEiKp] >>254 $ man bash /位置パラメータ 2 桁以上の数値を含む位置パラメータを展開するときには、ブレース ({}) で 囲まなければなりません。 よって${n}が正解だと思います
257 名前:login:Penguin [2009/08/11(火) 05:29:40 ID:4esITO9l] >>255 僕はこのツンデレな感じが好きです。 >>256 やっぱりそうですよねw 正式名称は位置パラメータかー"引数"という呼び方しか認識してませんでした。
258 名前:sage mailto:sage [2009/08/11(火) 16:31:12 ID:ggsX9yQb] topコマンドの内容をテキストに書き出したいんですが top >> /tmp/top.test とした場合に延々と書き込まれていきます。1度だけtopの内容を取得したいんですが どのように変更すればよいでしょうか?
259 名前:login:Penguin mailto:sage [2009/08/11(火) 16:36:53 ID:zgCywBrU] >>258 man top
260 名前:258 mailto:sage [2009/08/11(火) 17:33:42 ID:ggsX9yQb] >>259 すいません。 manにありました。 現在topの内容をテキストに書き出して、テキストをsedで切り出して表示してるんですが コマンドの戻り値を求めたいと思っておりますが hogera=$(top -i -n1) cpu=`sed -n '/Cpu(s)/p' "$hogera"` こうすると「読み込めません: ファイル名が長すぎます」と出ます。 本来ファイル名の指定なのでうまくいかないのはあたりまえなのですが、 ファイルに書き出す事無くスマートに切り出す方法がありましたら教えてください。
261 名前:login:Penguin mailto:sage [2009/08/11(火) 17:42:23 ID:zgCywBrU] >>260 いまいちやりたいことがわからんが cpu=`top -b -n1 | grep '^Cpu'` か?
262 名前:258 mailto:sage [2009/08/11(火) 17:54:30 ID:ggsX9yQb] >>261 ありがとうございます。 そうか、grepすればいいだけの事ですね。 どうやら無意味にテンパってしまってるようです。 すいません。最後に1つだけ疑問に思っていることがあるのですが シリアルコンソールで見る画面は横70文字にしとけって言われたんですが 何かそういった規格かなにかあるんでしょうか。検索してみてもそられしいものが 引っかからなかったんですが、70文字だとなかなか厳しいものがあるので 特に根拠のない文字数であるなら超えても構わないのではないかと思っております。 たびたびの質問で申し訳ありませんが、識者の方でご存じの人いたら教えてください。