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 で。
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だとできるよ。
403 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/27(月) 23:31:57.84 ] echo "hoge hage" | { read hoge hage echo hoge=$hoge hage=$hage }
404 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/27(月) 23:36:20.13 ] >>403 おおー入った! \(@o@)/ どういう仕様になってるんだろう サブシェル的な問題?
405 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/28(火) 08:06:57.00 ] >>404 その通りだが、そうならないシェルもある。自分なら read hoge hage <<<"hoge hage" って書く
406 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/28(火) 10:45:26.99 ] ヒアストリングってbash/zsh以外でも使えんの?
407 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/28(火) 11:12:25.51 ] 古典ヒアストリングならな。
408 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/28(火) 18:54:44.50 ] ソラリスのkshは冷やすとリング使えないのに、 リナックスのkshは冷やすとリング使える不思議
409 名前:400 mailto:sage [2012/02/28(火) 22:39:16.48 ] ヒアストリングってスレの初めの方で出てたやつですか オイラの読んだ入門書には載ってなかったんだよなぁ と思いながら試してみたら Syntax error: redirection unexpected sh -> dash なうちのDebianじゃダメみたい (・ω・` ) ステキな機能だけに残念 やっぱこういう場合はset使うべきなんですかね…
410 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/28(火) 22:52:20.02 ] >>403 じゃまずいの? 一行で書きたいならセミコロン echo hoge hage | { read hoge hage; echo hoge=$hoge hage=$hage; }
411 名前:名無しさん@お腹いっぱい。 [2012/02/29(水) 02:06:19.12 ] getoptsにて「-yx」のように複数文字のオプションを判定することは可能なのでしょうか? xxx.sh -a test -yx #!/bin/ksh while getopts a:yx opt do case ${opt} in a) YY=${OPTARG} echo "オプション[-a]の引数は${YY}だよ。" ;; yx) echo "オプション[-yx]があるよ。" ;; esac done
412 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/29(水) 08:15:39.53 ] >>411 getoptsでは、-yx は -y -x と指定したのと同じに解釈されるから無理。
413 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/29(水) 10:48:10.11 ] 代わりに --xy を使うとよろし。
414 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/29(水) 10:50:38.33 ] >>413 すみませんが詳しい方のみ回答をお願いします
415 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/29(水) 10:54:40.48 ] ああ --yx か。とにかく>>412 のいう通りってこった。
416 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/29(水) 11:34:25.80 ] getopts y: として $OPTARG が x かどうか判定すればいいんじゃね? -y x も受けつけちゃうけど。
417 名前:名無しさん@お腹いっぱい。 [2012/02/29(水) 14:08:24.59 ] どうもこんにちは〜 list=`cat ./file | grep aaa` って感じでlistにaaaを持つ行を全部放り込んでるのですが、 これらを別々の1行ずつに分割して なおかつlistを配列にして格納する事はできますか。 具体的には、fileの中にはaaaの文字列を持つ行が5つあるのですが それをlist[0]〜list[4]に格納したいのです。 よろしくご指導お願いしますm(_ _)m
418 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/29(水) 14:10:31.36 ] なんで cat 通すんだろ。 grep aaa file でよくね?
419 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/29(水) 15:35:13.71 ] >>417 IFSに改行コードのみを代入した状態で、list配列に一括代入する文法を使う。 #!/bin/bash IFS=' ' list=(`grep aaa file`)
420 名前:名無しさん@お腹いっぱい。 [2012/02/29(水) 16:42:01.73 ] >>419 ありがとうございます! できました!
421 名前:400 mailto:sage [2012/02/29(水) 23:33:48.87 ] ロングオプションは getopt でいけるけど何か問題もあったんだっけ >>410 パイプ通すとブレースもサブシェルで動作してるのか 外からは参照できないみたいなんですよね いやもちろん最初の例もサブシェル作ってるんですが (;´Д`) 処理の内容にもよるけど、やっぱりグローバルで使いたいってなると 関数に括り出してバッククォートで呼んだりして結局同じようなことなのかなぁと そんな感じの意味です でも勉強になりましたみなさんありがとう
422 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/01(木) 06:47:03.28 ] >>421 getopt(外部コマンド)はスペース入りファイル名などの引数を正常に扱えない などの仕様バグの固まり。getoptsを使うべし。
423 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/05(月) 08:04:37.31 ] とあるソースから #define HOGE MAGE HOGE の定義値を抽出したい。 grep HOGE header.h |grep define |awk print $NF みたいな書き方(うろ覚え)すると キャリッジリターンも拾うわ、 タブ(スペース)数でフィールド変わるわなんですが うまい方法ないですか?
424 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/05(月) 08:12:54.29 ] >>423 $ cat header.h #define HOGE MAGE $ (cat header.h; echo HOGE) | gcc -E -P - MAGE
425 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/05(月) 08:25:52.14 ] プリプロセッサに置き換えられるからプリプロセッサに置き換えさせるとかワロタw
426 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/05(月) 09:38:08.86 ] でもうまい方法でしょ?
427 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/05(月) 10:17:08.26 ] #ifとか考え出したらそれ一択。
428 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/05(月) 12:00:16.07 ] 複数行に渡るマクロもあるしな。 けどお題はもっと単純な話なんじゃないのかな。 マクロの展開を止めたいなら、 (#define MAGE 〜があってもMAGEを出力したい場合) awkスクリプトになってしまったが、こんな感じ。 awk '$0 ~ /^#define[ ]+HOGE/ { $1=""; $2=""; print $0 }' []の中はスペースとタブ