[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/25 03:18 / Filesize : 212 KB / Number-of Response : 865
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

シェルスクリプト総合 その19



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 で。

289 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/02(木) 01:32:54.28 ]
シェルスクリプトの勉強をしたいのですが、
何シェルがいいですか。

290 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/02(木) 01:40:36.62 ]
これの事だな。
www.freebsd.org/cgi/man.cgi?query=test&apropos=0&sektion=0&manpath=FreeBSD+9.0-RELEASE&arch=default&format=html

-n string True if the length of string is nonzero.
string True if string is not the null string.

違い
test -n $nonexistent; $? <= バグ? test -z $nonexistent; $?と矛盾する
test $nonexistent; $?


291 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/02(木) 03:44:03.15 ]
>>289
>>1
特記ない限り bourne shell ということは、それを選択すれば無難ということ。
Linux オンリーなら bash だろうけど。

292 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/02(木) 06:26:43.33 ]
>>289
そんな貴方に、Windows Power Shell。

293 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/02(木) 08:40:58.52 ]
>>290
なんだよ、矛盾するって。

294 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/02(木) 08:59:55.63 ]
自分が何調べてるかを理解してないだけに見える

295 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/02(木) 09:17:20.91 ]
オペレータだけ与えるとstringと解釈するのか。エラーにしろよお。

296 名前: 忍法帖【Lv=4,xxxP】 mailto:sage [2012/02/02(木) 23:56:58.70 ]
>>292
なんかUNIXのシェルより強力って書いてあるのが多いけどマジ?

297 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/03(金) 10:31:06.58 ]
「協力」の基準をどう考えるか次第でどうとでも



298 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/03(金) 20:58:42.50 ]
いま流行のステマとか

299 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/04(土) 08:30:04.97 ]
>>296
シェルそのものの機能は確かに強力だけど
肝心のコマンド資産がなさ過ぎて実用シェルとしてはなあ…

300 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/04(土) 08:42:10.79 ]
パワシェルはインタラクティブに使うとしょぼい。

301 名前:265 mailto:sage [2012/02/04(土) 22:16:58.57 ]
>>284
最終的にこれで出来ました!
みなさんありがとうお(^ω^)

cl.ly/152U342e2o212b2B1q3j

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を無視するが、子プロセス(外部コマンド)はデフォルト動作に戻
る。

あと、' ' じゃなくて '' (空文字列)な。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<212KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef