1 名前:シェルスクリプトライター mailto:sage [2011/12/10(土) 20:06:40.38 ] シェルスクリプトの総合スレです。 スクリプトのお勉強・自慢・腕試しなどにどうぞ。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashなので特に注意。 FreeBSDユーザは/bin/shの正体がashなので注意。 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。 src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/ heirloom.sourceforge.net/sh.html ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルスクリプトのことをシェルってゆーな ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 前スレ シェルスクリプト総合 その18 hibari.2ch.net/test/read.cgi/unix/1308195527/ 次スレは >>970 で。
302 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/09(木) 07:27:17.71 ] 遅レスだけど、PowerShellは.Netのライブラリも呼べるしWin32APIも呼べるから、Windowsのシェルとしては強力だわ それを参考にシステムコールや動的ライブラリをロード・実行する機能を持ったシェルが作られたとしても 自分はあんまり使いたいと思わんな。そういう機能の需要と言うか必要性はあるのかどうか
303 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/09(木) 14:49:30.97 ] PowerShellはいい加減スレ違いな気がするけれども…… その手の機能が欲しいときはぶっちゃけLL使えばよくね、と俺は思ってしまう それよりもシェルとしては以下の点がネックで、cmd.exeに比べてすら劣る ・デフォルトでスクリプトの実行が禁止されているので配布物でのスクリプト利用は 事実上不可能 ・入力リダイレクトが使えない ・オブジェクトパイプラインという一見高機能なものを備えているが、代償として バイナリデータをパイプやリダイレクトで扱えない 最後の問題が困る。外部コマンドをパイプでチェインする場合もPowerShellが 間に割って入って無駄にテキストに変換するので、データを壊すだけでなく 多分無駄に非効率でもある XPではそれに加えて我慢がならないほど起動が遅かった(ngen使っても)ので 遊んでみようという気にすらならなかったけど Windows7では起動時間は我慢できる範疇になったな
304 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/09(木) 16:28:39.02 ] >PowerShellはいい加減スレ違いな気がするけれども…… だったらgdgd書かなきゃいい
305 名前: 忍法帖【Lv=3,xxxP】 mailto:sage [2012/02/09(木) 16:51:38.01 ] >>303 >・デフォルトでスクリプトの実行が禁止されているので配布物でのスクリプト利用は > 事実上不可能 うんこやん
306 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/09(木) 22:51:58.68 ] 質問です。 $ cat hoge $GLOBALS['hoge']['huga'] $GLOBALShogehuga とします。 $ grep $GLOBALS\[\'hoge\'\]\[\'huga\'\] hoge とすると、どちらの行も引っかかってしまいます。 $GLOBALS['hoge']['huga'] だけ引っかけたいのですが、どうすればよいでしょうか、ご教示ください。
307 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/09(木) 23:03:56.62 ] $ grep "\$GLOBALS\['hoge'\]\['huga'\]" hoge
308 名前:名無しさん@お腹いっぱい。 [2012/02/09(木) 23:05:25.02 ] grepに食わせるべきパターンが $ [ ] をエスケープした ¥$GLOBALS¥['hoge'¥]¥['huga'¥] なので、これをシェル的にクォートする必要がある。 シングルクォートでがんばるなら '¥$GLOBALS¥['¥''hoge'¥''¥]¥['¥''huga'¥''¥]' 正規表現として解釈されることを意図していないならfgrep使えば? とか思ったりもする。
309 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/09(木) 23:42:52.43 ] >>306 $ grep -F "\$GLOBALS['hoge']['huga']" hoge
310 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/10(金) 08:45:25.71 ] >303 すれ違いかもしれんが参考になった (unix shell 人視点の評価として)
311 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/10(金) 12:45:56.45 ] >>310 すれ違いかもしれんが > (unix shell 人視点の評価として) こゆとき俺はこーかく ( unix shell 人視点の評価として )
312 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/10(金) 13:15:55.88 ] >>311 そう書くとunixから定義しないといけない
313 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/10(金) 13:41:46.96 ] ここはunix shell人のいるスレですね。
314 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/10(金) 13:46:55.14 ] ()は空白開けなくても大丈夫だろ。{}は必要だけど。
315 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/10(金) 13:47:22.31 ] >>307-309 grep の件、man もロクに読まない私にお力添えいただき、ありがとうございました。 m(__)m
316 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/13(月) 21:53:21.26 ] 質問です。 あるスクリプトをホームディレクトリに作ったのですが、以下の条件があります。 ・他の人もそのスクリプトを実行できるようにしたい ・でもファイルの中身は他の人は見れないようにしたい。 このような場合、一般的にはどのような手法がとられるのでしょうか?
317 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/13(月) 22:07:38.54 ] そういう無茶なことは考えない方がいい。
318 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/13(月) 22:09:09.60 ] (chmod 0711じゃ)いかんのか?
319 名前:名無しさん@お腹いっぱい。 [2012/02/13(月) 22:20:32.11 ] うちにあるsudoのパーミッションが -r-s--x--x で、実際実行はできるけど 中身はみられない。適当なシェルスクリプトを作って同じパーミッションにして みたけど、実行したらPermission deniedsetuidになってしまった。 (OSXにて)
320 名前:名無しさん@お腹いっぱい。 [2012/02/13(月) 22:21:22.41 ] setuidというフレーズを消しわすれてしまった。
321 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/14(火) 00:05:14.25 ] スクリプトはインタープリターに読んでもらわないと実行できない。 そして、インタープリターは実行する人の権限で動作する。 したがって、スクリプトは実行する人が読むことができる。できなければ実行できない。
322 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/14(火) 00:21:01.04 ] つBATCOM
323 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/14(火) 01:25:34.75 ] なるほどぉー
324 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/14(火) 06:10:33.21 ] じゃあコンパイルできる言語で書き直すとか
325 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/14(火) 06:50:57.33 ] UNIXサーバーの管理をしています。 ユーザーはスクリプトの実行は禁止ですが、 最近、ユーザーでも自分のホームフォルダーにスクリプトをコピーし、 X権限をすることによってスクリプトが実行できてしまうことが判明しました。 これはOSのセキュリティーボールではないのでしょうか? ユーザーのフォルダーではたとえX権限がされていても 実行できないようにする方法はありますか? 必要ならカーネルにバッチを当てる方法も、やもうえません。
326 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/14(火) 08:28:25.69 ] >>325 > ユーザーはスクリプトの実行は禁止ですが、 なんか御幣のある言い方をしているようにも思えるが、つまりのところ特定コマンド 以外は実行させたくないんだろ? であればログインスクリプトを制限がきつい奴にすれば出来る。 bash の rbash の項目の man page かググって調べろ。 .bashrc や .bash_profile などを個人で書き換えられないようにしておかないと意味が無かったりと 環境整備には手間がかかるとは思うが。 > ユーザーのフォルダーではたとえX権限がされていても > 実行できないようにする方法はありますか? 以下を実行して↑に何の意味も無いことを学べ。 chmod 644 sample.sh /bin/sh ./sample.sh これ以上はスレチなのでここでの質問をクローズした上で、以上の情報を元に自分で調べるか 適切なスレに行って再質問されたし。
327 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/14(火) 08:30:28.16 ] ネタだろ。 かまっちゃいかんよ。
328 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/14(火) 08:34:56.59 ] ここからのコピペ toro.2ch.net/test/read.cgi/unix/1000022300/775-
329 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/16(木) 01:53:58.03 ] mountにnoexecってなかったっけ?nodevはあったよな。
330 名前:名無しさん@お腹いっぱい。 [2012/02/16(木) 02:11:23.48 ] コンパイルできるシェルはありませんか?
331 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/16(木) 03:11:31.80 ] つ ttp://ftpmirror.gnu.org/bash/
332 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/16(木) 15:25:59.88 ] だから、コンパイルできるシェルはありませんか?
333 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/16(木) 15:26:22.53 ] ありません。
334 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/16(木) 15:38:01.31 ] >>330 int main(){return system("シェルスクリプト本文");} って書けばコンパイルできるよ。 C言語上での文字列改行を行なえば複数行も記述できる。
335 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/16(木) 19:45:29.07 ] shcの事か?
336 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/19(日) 20:05:22.42 ] 初心者なんですけど、16進数のテキストデータをシェルスクリプトでバイナリ化する事はできますかね?
337 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/19(日) 20:23:44.75 ] printf '¥x68¥x6f¥x67¥x65?n'
338 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/19(日) 21:15:12.00 ] >>337 これがヒントなんですか?? 全然理解できへん(~_~;)
339 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/19(日) 21:46:07.41 ] echo 686f 6765 0a | xxd -r -p
340 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/20(月) 02:10:00.67 ] /etc/rcファイルを読んでるんですけど、 全く理解できません。 しょっぱなにこれが有るんですが、 stty status '^T' なんのためにあるのでしょうか? rcファイルが読まれ始めるときは、^Cや^Hが設定されていないという事? ですか? さらに、 if [ -f /etc/rc.first ] then . /etc/rc.first fi という一文は /etc/rc.firstが存在するならば、/etc/rc.firstを実行するという意味だと思うんですが、 -fオプションはググると 「file が普通のファイルならば真となる。」 とありましたが、普通ではないファイルって有るんでしょうか?
341 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/20(月) 06:22:24.92 ] 普通ファイルをそういう意味で捕らえるのはフレッシュ過ぎて噴いたw懐かしさがこみ上げてくるレベル
342 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/20(月) 07:02:39.19 ] CP/Mあたりだと、普通ではないファイルを使った階層化ができなかったなw
343 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/20(月) 09:07:07.89 ] >>340 UNIXではデータを書いたり読んだりするいわゆるファイルの他にも OSが管理している資源やその他の物に名前をつけてファイルとして 扱うことができる。 デバイスファイルやディレクトリ、ソケット、シンボリックリンク、その他。
344 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/20(月) 19:39:24.99 ] 「普通のファイル」って訳は最近では一般的なのかね? 「レギュラーファイル」でいいんじゃないかと思うが。
345 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/20(月) 19:41:36.51 ] >>336 「16進数のテキストデータ」はどこにあって、どういう形式なのか? 「バイナリ化」するとは具体的にどういうことか? 元の「16進数のテキストデータ」はバイナリではないのか? Unicode文字のエスケープ表現か何かなのか?
346 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/20(月) 20:17:11.46 ] >>344 regular fileに対する確立された訳語は「通常ファイル」じゃないか。
347 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/20(月) 20:39:01.78 ] test -f FILE 「FILEが通常、ファイルなら真になる」 通常はファイルならば真なんですね。通常じゃない時は真にならないんですか?
348 名前:名無しさん@お腹いっぱい。 [2012/02/20(月) 21:50:38.98 ] ディレクトリにテストしてみれば一発やん。 test -f /etc/passwd && echo file || echo 'not file' test -f /etc && echo file || echo 'not file'
349 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/20(月) 22:05:43.26 ] >>347 see man test
350 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/20(月) 22:38:49.99 ] >>347 つまんねー。矢吹先生の方が数段上。
351 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/22(水) 17:59:45.94 ] -fのfは普通のf
352 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/22(水) 18:15:44.90 ] testコマンド(というかそれを内蔵しているシェル)のバージョンによっては、 デバイスファイルやソケット、FIFO等でも test -f は真になる。 よって、test -fをレギュラーファイルかどうかのテストに用いてはならない。 豆な。
353 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/22(水) 18:24:10.83 ] そんなシェルあるんだ…
354 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/22(水) 20:22:31.07 ] なんだそれ。-e の存在意義は。
355 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/22(水) 21:02:05.15 ] >>352 たとえばどのシェル?
356 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/22(水) 21:09:08.26 ] ほら、ツメキリとか。
357 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/22(水) 21:16:49.10 ] >>354 -e が追加されたのは割と最近。純正/bin/shのtestには-eがない。
358 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/22(水) 22:36:40.15 ] ねーねー,「純正/bin/shのtest」ってナニ? /bin/testとは別に /bin/sh の built-in コマンドがあるという主張?
359 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/22(水) 22:41:11.67 ] 何か馬鹿が湧いてきたな。反応しちゃいかんよ。
360 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/22(水) 23:01:26.59 ] >>358 釣られてあげよう (ba|z)sh 辺りを /bin/sh として symlink/hardlink して使ってれば built-in だわな ash ベースでもコンパイルの仕方によっては built-in になるし
361 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/22(水) 23:40:20.00 ] >>358-360 実は自演
362 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/23(木) 00:25:07.78 ] 純正なのに bash/zsh なの?
363 名前:340 mailto:sage [2012/02/23(木) 00:58:08.13 ] 普通のファイルの意味はわかりました。 ところで /etc/rcの先頭に >stty status '^T' が有るというのは、 rcスクリプトが読まれ始めるときは、sttyの設定がされてないので rcスクリプトから実行されるプログラムの ステータス情報をキーボードから^Tと入力すれば表示できるようにするため に設定していると言う理解で良いでしょうか?
364 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/23(木) 01:22:49.78 ] $ (ba|z)sh
365 名前:名無しさん@お腹いっぱい。 [2012/02/23(木) 01:37:03.64 ] うちのsttyにはstatusって指定できないから意味自体分からんのよな。
366 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/23(木) 08:28:33.61 ] >>363 デフォルトの設定がユーザを混乱させるからなんじゃないかな。 > ステータス情報をキーボードから^Tと入力すれば表示できるようにするため 多分違う、^Tを入力するとカーネルに対して、「何か」をしろという指令が非同期に飛んでいく。 カーネルはユーザーの端末に対してメッセージを出すことはしない。 「何か」が何なのかは、statusなんて機能は使ったことないから知らない。
367 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/23(木) 10:49:16.92 ] "stty status" でググるといろいろ出てくるね。
368 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/23(木) 11:56:49.03 ] screenコマンドのstatus lineみたいな奴。 表示する方法、される内容はカーネル、端末依存。
369 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/23(木) 12:09:58.01 ] >>367 ああ、なるほど。googleでトップに来てる freebsd.g.hatena.ne.jp/minus_zero/20070903 で実験して納得した。 rcの中でハングったりした時に、すかさずC-tするとどのプロセスが刺さってるかわかるんだな。 これはいい事を憶えた。
370 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/24(金) 23:41:20.22 ] 大量のメールアドレスの一部分をマスクしたい。例えば foo.bar@example.com → foo****@example.com ドメイン部分はそのままで、先頭3文字程度残して、残りの部分はメールアドレスの文字数が変わらないように 任意の文字で埋めたい。今は下のように変数にメールアドレスを入れて処理しているけど、ちょっと不恰好 MADR=foo.bar@example.com MASK='*' RC=3 DOM="${MADR##*@}" let MC="${#MADR}"-"$RC"-"${#DOM}"-1 echo "$MADR" echo "${MADR:0:$RC}`yes "$MASK" |tr -d '\n' |head -c"$MC"`@$DOM" もう少し楽に処理できないでしょうか?
371 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/25(土) 03:53:15.28 ] 素直にrubyで echo foo.bar@example.com | ruby -pe '$_.sub!(/(?<=[^@]{3})[^@]*(?=@\w+)/){|s|"*"*s.size}' perlならもっと短くできるんじゃないかなぁ。
372 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/25(土) 04:08:45.24 ] >>370 sedを使うのはいかが? echo "user@example.com" | sed -e 's/\(...\).*@\(.*\)/\1...@\2/g' ユーザ名が必ず3文字以上ならこれで良いはず。 ユーザ名が2文字以下だとそのまま出力される。 (元のスクリプトでも2文字以下ならそのままっぽいが。)
373 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/25(土) 05:22:15.23 ] 長さ保存してないじゃんそれ
374 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/25(土) 06:52:42.61 ] >>373 あ、長さが変わらないように、か。 「長さが分からないように」と読み違えてた。すまん。
375 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/25(土) 08:28:46.14 ] >>370 をもとに、おもにyes|trの部分を改良してみた。 不要なクォートや不要な変数も削除した。 ↓ MADR=foo.bar@example.com MASK=* RC=3 DOM=${MADR##*@} echo "$MADR" echo "${MADR:0:$RC}"`echo "${MADR:$RC:${#MADR}-RC-${#DOM}-1}" | sed "s/./$MASK/g"`@"$DOM"
376 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/25(土) 09:18:35.26 ] つーか、見るからに遅そう。 > 大量のメールアドレスの一部分をマスクしたい。例えば 千通突っ込む気にならない。
377 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/25(土) 09:27:28.61 ] awkでやってみたよ。 RC=3 MASK='*' echo "$MADR" | awk -F@ -vn="$RC" -vm="$MASK" '{t=substr($1,n+1,length($1));gsub(".",m,t);print(substr($1,1,n) t "@" $2);}'
378 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/25(土) 09:37:42.09 ] 速度優先ならC言語一択だろ。 標準入力から1行ずつ複数のメールアドレスを読む仕様。 gets()使うなとか、エラーチェックなしとかの突っ込みはなしな #include <stdio.h> #define RC 3 #define MASK '*' int main() { int i; char buf[1024]; while (gets(buf) != NULL) { for (i = RC; buf[i] != '@'; i++) { buf[i] = MASK; } puts(buf); } return 0; }
379 名前:名無しさん@お腹いっぱい。 [2012/02/25(土) 11:10:48.60 ] シェルスクリプトスレでなんという暴論
380 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/25(土) 11:17:36.53 ] 速度がそんなに重要じゃないからここで聞いてんのにな。
381 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/25(土) 11:19:51.26 ] >>380 >>370 >大量のメールアドレスの一部分をマスクしたい。 速度が重要という質問ですが・・
382 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/25(土) 11:20:58.69 ] だが正論。これをシェルスクリプトでというのはコスト高くないかな
383 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/25(土) 11:21:00.66 ] 「大量」としか言ってないじゃん。 量は多いけど時間は多少かかってもかまわないんでしょ。
384 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/25(土) 11:22:45.37 ] たとえば退社前に処理を開始して 次の日の出社までに終わってればいい、なんてケースだと 7時間が4時間に短縮されてもあんまり意味ない。
385 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/25(土) 11:52:15.99 ] 皆さん、レスありがとう御座います 初めは>>372 のように考え、どうしても長さが保存できないので何かやり方は無いかと質問しました >>371 ,377 もっとさくっと書けるコマンドがあるかなと思っていたけど、やはりスクリプト言語使うしかないですか それにしてもrubyは短く書けるんですね。今のシステムには入れていませんが勉強になります >>375 なるほど。任意の長さの文字列を作るのにsedで置換を使う方法は思いつかなかった それを元にすると最終的にこんな感じでしょうか? MADR=foo.bar@example.com MASK=* RC=3 DOM=${MADR##*@} MINV=${MADR:$RC:${#MADR}-RC-${#DOM}-1} echo "$MADR" echo "${MADR:0:$RC}${MINV//?/*}@$DOM" これなら、外部のプログラムを呼び出さないのでそこそこ速そう ただ、bashで動くことは確認したけど、汎用性を考えるとawkを使う>>377 ? 速度についてですが、何度も変換するものではないし、 寝ている間に終わればいいなと思っていたのでシェルスクリプトで十分でした
386 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/25(土) 11:54:23.14 ] 訂正:echo "${MADR:0:$RC}${MINV//?/*}@$DOM" → echo "${MADR:0:$RC}${MINV//?/$MASK}@$DOM"
387 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/26(日) 01:55:24.94 ] Å ヽ('A`)ノ、スーパーちんぽマン参上!! / ( ) \ んヘヽヽ〜'
388 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/26(日) 10:43:00.23 ] # Set shell to ignore SIGINT (signal 2), but not children; shell catches # SIGQUIT (signal 3) and returns to single user after fsck. trap : 2 trap : 3 # shouldn't be needed という一文が有るのですが、 SIGINITとSIGQUITを無視(ignore)するならば trap ' ' 2 trap ' ' 3 と言う書き方になるような気がするんですが、 :はどういう意味が有るのでしょうか?
389 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/26(日) 10:55:51.64 ] >>388 trap '' 2 は、 親(シェル自身)も子プロセス(外部コマンド)もSIGINTを無視する。 trap : 2 は、 親(シェル自身)はSIGINTを無視するが、子プロセス(外部コマンド)はデフォルト動作に戻 る。 あと、' ' じゃなくて '' (空文字列)な。
390 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/26(日) 11:23:35.81 ] 半二重なら trap : 2、全二重なら trap : 2と trap : 3が要るんじゃねーのー
391 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/26(日) 22:34:59.64 ] >>389 >>390 :ってヌルコマンドって奴ですか? そうすると、 親(シェル自身)はSIGINTを無視するが、子プロセス(外部コマンド)はデフォルト動作に戻る という解釈どうして出てくるかさっぱりなので、教えてください お願いします
392 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/27(月) 01:17:55.06 ] trapがそういう仕様だから。man読め。
393 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/27(月) 07:26:12.43 ] シェルのマニュアルのtrap項目だと、指定コマンドが空文字列だと そのシグナルを無視し、子プロセスも無視するとは書かれているけど、 これだけだとわかりにくいかも。 trapで何らかのコマンドを指定すると、それはシグナルハンドラが設定されるので、 シグナルの一般仕様により、シグナルハンドラが設定されている場合の子プロセスでは シグナル設定はデフォルトに戻る。 よって、ダミーのシグナルハンドラを設定するために、: コマンドを指定している。
394 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/27(月) 13:56:39.45 ] awkで複数のファイルに対して一括処理するときに変数xを初期化したいのですがうまくいきません。 何が間違っているのでしょうか? BEGIN{x = 0} printf("%d\n",x++) END{x=0 }
395 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/27(月) 14:04:05.23 ] awkがそういう仕様だから。man読め。
396 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/27(月) 14:11:30.36 ] >>394 BEGIN{}等は使わない ↓ #!/bin/awk -f FNR==1{x=0} {printf("%d?n",x++)}
397 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/27(月) 15:17:34.24 ] >>391 ":"がnull commandなのは先頭語に出てきた場合だけ。 trapが第一引数の":"をどう解釈しようと自由。 ただnull commandからの類推で「無視するが〜」としただけ。
398 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/27(月) 15:22:42.53 ] >>397 ちがうよ。 trapは、第1引数を改めてコマンドとして解釈する(2回解釈する)ので、 結局 : は先頭に出てきたのと同じで、null command として解釈される。 (eval : の場合と似てる) trapが:を特別に解釈しているわけではない。 たとえば、trap true 2 って書いても trap : 2 と同じ。
399 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/27(月) 15:54:02.25 ] むしろ特別に扱っているのは""の方。 これでSIG_IGNにすることになってる。
400 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/27(月) 23:12:06.60 ] awkのフィールド分割的なことやるのに while read hoge hage ; do : done <file とかよくやるけど、1行の文字列を分割しようとして echo "hoge hage" | read hoge hage ってやってみても、$hoge にも $hage にも何も入らない なんで?
401 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/27(月) 23:28:41.94 ] そういう仕様じゃないから
402 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/27(月) 23:29:53.91 ] kshだとできるよ。