- 1 名前:名無しさん@お腹いっぱい。 [2008/02/11(月) 19:21:07 ]
- シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。 前スレ シェルスクリプト総合 その9 pc11.2ch.net/test/read.cgi/unix/1187130302/
- 304 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 22:34:38 ]
- #!/bin/sh
echo Hoge World
- 305 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 22:36:29 ]
- >>303
滑ってるよ
- 306 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 22:40:00 ]
- >>304
ええ、ですからそう書いたのですが、動かないんです、、
- 307 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 22:43:37 ]
- それOS windowsだよ
- 308 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 22:49:50 ]
- >>303
コンパイラは何使いましたか? バージョンによって使えない命令があります。
- 309 名前:名無しさん@お腹いっぱい。 [2008/03/19(水) 02:06:49 ]
- >>303
えすぱーくますた chmod +x hoge.sh ./hoge.sh じっこーけんげんじゃね?
- 310 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 03:43:04 ]
- 全然違うなw
- 311 名前:名無しさん@お腹いっぱい。 [2008/03/19(水) 07:20:45 ]
- >>309
動きました ありがとうございました!
- 312 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 07:44:57 ]
- >>311 はにせもの。
>>309 それはすでにやってます。まだ動きません。
- 313 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 08:14:54 ]
- 「シェル」を書いてるんだから、それだけじゃ難しそうだな…
シェルスクリプトだとすると echo の e が全角なのが気になるが実際は違うよな?
- 314 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 08:20:19 ]
- またシェル開発者ですね、わかります
- 315 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 08:39:01 ]
- そうです。開発に配属されたら、シェルを書けることが必須だったんです。
ちょっと焦ってます、、
- 316 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 08:41:15 ]
- 天然だw
- 317 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 13:02:17 ]
- 仕事でシェル書くの?
- 318 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 13:18:46 ]
- シェルスクリプトで引っかかってるようだと
開発部門でやっていくの大変じゃない?
- 319 名前:初心者 [2008/03/19(水) 14:36:50 ]
- すいませんシェルスクリプトで0から9を
横に0123456789 と表示したいのですが、数字を縦にしか表示できなくて。 どなたか教えてください。
- 320 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 14:38:59 ]
- >>319
for((i=0;i<=9;i++)){ echo -n $i;};echo
- 321 名前:初心者 [2008/03/19(水) 14:46:18 ]
- >>320
ありがとうございます。 for 変数 in リスト do 処理 done の形で書くことは出来るのでしょうか? たびたびすいません。
- 322 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 14:47:41 ]
- >>321
for i in 0 1 2 3 4 5 6 7 8 9;do echo -n $i;done;echo
- 323 名前:初心者 [2008/03/19(水) 14:58:57 ]
- ありがとうございました。
処理の部分で使われている -n はどういった意味なのですか?
- 324 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 15:04:07 ]
- これは醜い
- 325 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 15:06:41 ]
- seq -s "" 0 9
- 326 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 15:10:11 ]
- これは酷い初心者です
- 327 名前:初心者 [2008/03/19(水) 15:11:07 ]
- すいません。酷いのはわかってますが、本当はじめたばかりで。
でも、ちゃんと意味も理解していかないとと思いましたので・・
- 328 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 15:21:49 ]
- >>325
seq: command not found
- 329 名前:名無しさん@お腹いっぱい。 [2008/03/19(水) 15:26:38 ]
- あのー(汗 どうしてこんなむずかしいことが出来るの? すごいよ。君たちは。感心してます^^。ガンバってくださいね。
- 330 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 15:57:41 ]
- >>323
man echo
- 331 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 16:10:09 ]
- >>322 の実行結果
-n 0 -n 1 -n 2 -n 3 -n 4 -n 5 -n 6 -n 7 -n 8 -n 9 ??? なぜ?
- 332 名前:初心者 [2008/03/19(水) 16:10:44 ]
- >>330
ありがとうございました。 man コマンドを見るのを忘れてました。助かりました。
- 333 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 16:12:15 ]
- 問題:
>>322 をOSに依存しないようにポータブルにせよ
- 334 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 16:15:05 ]
- printfを使えばよい
- 335 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 16:34:16 ]
- echo 0123456789
- 336 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 16:41:14 ]
- >>334 外部コマンドを使わずに
>>335 論外
- 337 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 16:50:16 ]
- >>334
printfがないOSもある
- 338 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 16:53:48 ]
- printfがだめならこれでどうだ
if [ "`echo -n`" = "-n" ]; then echon() { echo "$@\c"; } else echon() { echo -n "$@"; } fi for i in 0 1 2 3 4 5 6 7 8 9; do echon $i; done; echo
- 339 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 16:57:15 ]
- out=;for i in 0 1 2 3 4 5 6 7 8 9; do out=$out$i;done;echo $out
- 340 名前:名無しさん@お腹いっぱい。 [2008/03/19(水) 17:08:07 ]
- dateコマンドってミリ秒の取得できますか?
- 341 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 17:11:17 ]
- >>340
GNU dateなら +%N でできる。
- 342 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 17:11:22 ]
- 実装によるんじゃね
- 343 名前:名無しさん@お腹いっぱい。 [2008/03/19(水) 17:31:41 ]
- 当日の日付をミリ秒まで取得したいです。ミリ秒の精度としては
3桁でよいみたいです。
- 344 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 17:33:48 ]
- 人の話を聞かんやっちゃな。
- 345 名前:名無しさん@お腹いっぱい。 [2008/03/19(水) 17:35:27 ]
- 申し訳ないです。
date +%Nでできたので、実際にやりたいことを書いてみました。
- 346 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 17:40:06 ]
- m=`date +%N | head -c 3`
date +'%Y年%m月%d日 %H:%M:%S.'"$m"
- 347 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 17:43:52 ]
- >>346
一旦変数に入れる意味ないやん。 date +'%Y年%m月%d日 %H:%M:%S.'`date +%N | head -c 3`
- 348 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 17:52:53 ]
- >>346-347
dateを2回起動してるのが無駄。 date +'%Y年%m月%d日 %H:%M:%S.%N'|head -c 27;echo
- 349 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 17:58:13 ]
- sed 's/......$//'
- 350 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 17:58:42 ]
- >>348
27文字で決め打ちしてると、年月日などの文字数が変わった時困る。 ↓の方がエレガント expr "`date +'%Y年%m月%d日 %H:%M:%S.%N'`" : '\(.*\....\)'
- 351 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 18:17:21 ]
- date +'%Y年%m月%d日 %H:%M:%S.%3N'
- 352 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 18:47:39 ]
- 文字列処理の話はいいから、date +%Nが使えないOSではどうするんだよ?
- 353 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 18:48:36 ]
- 泣き寝入りです。
- 354 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 20:18:36 ]
- GNU dateをインストールする
- 355 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 21:12:16 ]
- 000でごまかす
- 356 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 22:16:36 ]
- >>317
周りにtclsh改造して自前のシェル作る奴いるからなきにしもあらず #半導体業界のtcl好きは異常だと思う…
- 357 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 22:25:23 ]
- こんなプログラムを持ち運ぶ(精度はマイクロ秒だけど)
#include <stdio.h> #include <sys/time.h> int main(int argc, char **argv) { struct timeval tv; if (gettimeofday(&tv, NULL)) perror("error!\n"); printf("%d\n", tv.tv_usec); return 0; }
- 358 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 22:32:57 ]
- >>356
そのためのツールだし。> TCL
- 359 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 22:35:19 ]
- >>357
持ち運ぶなら、持ち運びやすいようにショートコーディングに徹しなさい。 #include<sys/time.h> main(){struct timeval t;gettimeofday(&t,0);printf("%d\n",t.tv_usec);}
- 360 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 22:40:37 ]
- >>359
ショートコーディングというからには、#includeなんてしちゃ無駄だろ。 main(){int t[2];gettimeofday(t,0);printf("%0d\n",t[1]);} %dは%0dに直しておいた。桁揃えのため。
- 361 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 22:47:45 ]
- >>360
もっと短くなるよ。int宣言も無駄だね。 main(t){gettimeofday(&t,0);printf("%0d\n",1[&t]);}
- 362 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 22:50:27 ]
- >>360
桁揃えは %06d じゃないのか?
- 363 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 22:58:39 ]
- やべえ。こいつら正気じゃねえ。
- 364 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 23:04:37 ]
- 日頃古いshへの移植性で争ってるスレとは思えない
- 365 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 23:05:16 ]
- 改行はむしろ余計なのではないか?
- 366 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 23:05:36 ]
- じゃあ、まとめるとこんな感じ?
↓ gccコンパイル込みでシェル関数にしたよ #!/bin/sh micro_sec() { echo 'main(t){gettimeofday(&t,0);printf("%06d\n",1[&t]);}'|gcc -xc - ./a.out; rm a.out } hoge=`micro_sec` echo $hoge
- 367 名前:名無しさん@お腹いっぱい。 [2008/03/20(木) 00:56:56 ]
- >>363 UNIX板は、やぱスゲーひといるよね
まだまだすごいことができるのだと思いますが Cも知りたくなってきたw
- 368 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/20(木) 01:44:52 ]
- スゲーんじゃなくて悪乗りしてるだけだと思うが
>>366 echo はいらんだろ?
- 369 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/20(木) 02:49:33 ]
- #!/usr/bin/tcc -run
#include <sys/time.h> void main(void) { struct timeval tv; gettimeofday(&tv, NULL); printf("%.6d\n", tv.tv_usec); }
- 370 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/20(木) 04:21:02 ]
- >>321
$ for m in `jot 10 0`; do echo -n $m; done 0123456789 jotも知らんとは>>321よ、なさけない。
- 371 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/20(木) 07:23:13 ]
- >>370
$ jot jot: command not found
- 372 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/20(木) 07:27:07 ]
- >>368
欲嫁。言いたいのはmicro_sec()の部分だけ。 下のechoとかはmicro_secの使い方の1例を挙げてるだけだろ。 直接表示なら micro_secを直接実行でいいし、 変数に入れたなら、変数に入っているという確認のためにechoしてるだけ。
- 373 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/20(木) 07:29:18 ]
- >>369
/usr/bin/tcc: command not found
- 374 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/20(木) 07:32:25 ]
- >>372
いや、そこではねくて
- 375 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/20(木) 07:37:35 ]
- >>374
シェル関数の中のechoは必要だろ。gccの標準入力に食わせるために。 echoなしでヒアドキュメント( << )でやる方法は 一時ファイルができるから美しくない。 ヒアドキュメントを使わずに、echoも使わない方法ってある?
- 376 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/20(木) 12:09:43 ]
- >>373
sudo aptitude install tcc
- 377 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/20(木) 12:26:21 ]
- >>376
sudo: command not found
- 378 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/20(木) 12:27:52 ]
- $ su
Enter password: su: password incorecct. $
- 379 名前:名無しさん@お腹いっぱい。 [2008/03/20(木) 14:52:56 ]
- なんかbashでcを組んでしまう勢いだなww
- 380 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/20(木) 17:18:16 ]
- >>366
まあジョークだろうからどうでもいいが、 現在時刻をミリ秒単位の精度で得るために まずその場でコンパイルを始めるってどういう設計だwww
- 381 名前:名無しさん@お腹いっぱい。 [2008/03/20(木) 21:28:00 ]
- tcc ってARM?
- 382 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 00:06:22 ]
- Tiny C Compiler
fabrice.bellard.free.fr/tcc/ TinyCC mailing list mail.freesoftware.fsf.org/mailman/listinfo/tinycc-devel Ubuntu packages.ubuntu.com/gutsy/tcc Debian packages.debian.org/etch/tcc RPM fr2.rpmfind.net/linux/rpm2html/search.php?query=tcc TinyCC Changelog fabrice.bellard.free.fr/tcc/changelog.html version 0.9.21: - ARM target support
- 383 名前:あ [2008/03/21(金) 09:28:07 ]
- 文字列のaからzを
for 変数 in リスト の形で表すにはどうしたらよいのでしょうか?
- 384 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 10:12:32 ]
- $ for i in `seq 97 122`; do printf '\x'`echo "obase=16;$i" | bc`; done
seqなければwhile + exprで
- 385 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 10:42:58 ]
- >>383
for i in `perl -le 'print for a..z'`; do echo $i; done
- 386 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 10:49:30 ]
- >>384-385 という冗談はさておき、シェルスクリプトとしてやるにはどうしたらよいのでしょうか?
- 387 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 10:52:03 ]
- bashなら
for i in {a..z}; do echo $i; done
- 388 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 10:55:41 ]
- >>386
シェルスクリプトだろ。冗談はよせよ。
- 389 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 10:57:05 ]
- まあ、perl使うのは反則だわな
- 390 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 11:00:08 ]
- for i in a b c d e f g h i j k l m n o p q r s t u v w x y z
- 391 名前:名無しさん@お腹いっぱい。 [2008/03/21(金) 11:02:45 ]
- >>387
動くのか?
- 392 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 11:03:07 ]
- ボーンなら、
for i in `bash -c 'echo {a..z}'`; do echo $i; done
- 393 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 11:04:04 ]
- >>391
動くだろ。bash3以降だけどな。
- 394 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 11:07:09 ]
- つーか元の要求がよくわからん。
- 395 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 11:17:07 ]
- どれも>>390これとそれほどタイプ数がかわらないという
- 396 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 11:32:31 ]
- yes ''|cat -n|head -122|tail -26|while read i; do printf "%o¥n" $i;done|while read o;do printf "¥¥$o¥n";done
すごく無駄なことをやった気がする。
- 397 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 11:37:14 ]
- for i in \
`echo 'main(c){for(c=97;c<123;c++)printf("%c ",c);}'|gcc -xc -;./a.out;rm a.out` do echo $i done
- 398 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 11:44:50 ]
- IOCCCみたいになってきたな
- 399 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 12:25:20 ]
- IOSSC International Obfuscated Shell Script Contest
- 400 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/21(金) 14:19:42 ]
- むしろIntranational
- 401 名前:名無しさん@お腹いっぱい。 [2008/03/23(日) 04:35:19 ]
- すんまそ
date を使って 20080322123456 年月日時分秒の書式でファイルを作りたい cmd 1 10000 第1引数 +n秒 (-1なら引く) 第2引数 第1引数を行ってm回繰り返す。 while (n<$2) do touch `date '+ expr $a'` a=a+$1 done みたいなことをしたいですが、どうすれば良いですか?
- 402 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/23(日) 05:13:42 ]
- 誰か翻訳頼む
- 403 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/23(日) 08:39:07 ]
- >>401
できたよ ↓ #!/bin/sh n=$1 i=1 while [ "$i" -le "$2" ]; do date +%Y%m%d%H%M%S -d "$n second" n=`expr "$n" + "$1"` i=`expr "$i" + 1` done ただし、GNU date必須。 補足: >>402 わからないなら黙ってろ
- 404 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/23(日) 08:41:55 ]
- >>403 で動作(表示)確認してから、
date +%Y%m%d%H%M%S -d "$n second" を touch `date +%Y%m%d%H%M%S -d "$n second"` に直すとファイルが作れる。
|

|