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


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

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



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/

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"`
に直すとファイルが作れる。

405 名前:401 [2008/03/25(火) 01:16:11 ]
ありがと

あしたやってみる。
感謝です。

406 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/25(火) 23:05:33 ]
GNU date必須なんて答で、恥ずかしくないの?

407 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/25(火) 23:20:15 ]
>>406
じゃ、お前、GNU date使わないバージョンの回答しろよな。



408 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/25(火) 23:58:42 ]
恥ずかしいなら黙ってればいいのに。

409 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 09:43:59 ]
>>406
そんなコト言い出したらきりがない。
相手の環境が分かっていて、そこに GNU date が無いなら酷いが
質問者はそんな情報出した?

# なかったとしても「ぢゃGNU date 入れよ」ってなるかもシランがそれは知らん。

410 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 09:59:39 ]
>>406
not speak, write scripts.

411 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 11:00:39 ]
GNU date使わずにポータブルにやるなら、
awkあたり使った方がいい。

date +%Y%m%d%H%M%S -d "$n second"

を、

awk 'BEGIN{print strftime("%Y%m%d%H%M%S", systime()+'$n')}'

に書き直す。

>>406
答えられないなら黙ってろ。

412 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 11:37:03 ]
>>411
それ、GNU awk必須だろw

413 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 12:13:04 ]
2chで他人に黙ってろとかいう奴にろくな奴はいない。

414 名前:名無しさん@お腹いっぱい。 [2008/03/26(水) 12:36:48 ]
ひとつの解を出す分だけ、貴殿よりマシだと思う

415 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 12:51:58 ]
自分で設定した「ポータブルにやるなら」という問題に対して
出したものがポータブルじゃないのに解を出したことになるのだろうか。

416 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 14:23:46 ]
まぁ>>406よりは随分マシw

417 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 14:51:14 ]
これでどうだ。ポータブルだろw


#!/bin/sh

my_date()
{
echo 'main(t,b){t=time(0)+'$1';strftime(&b,16,"%Y%m%d%H%M%S\n",localtime(&t));printf(&b);}' | gcc -xc - 2>/dev/null
./a.out; rm a.out
}


n=$1
i=1
while [ "$i" -le "$2" ];
do
my_date "$n"
n=`expr "$n" + "$1"`
i=`expr "$i" + 1`
done




418 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 14:56:56 ]
おしいな。
gccのところがccなら。

419 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 15:01:06 ]
>>418
ccにすると、「language optional software package not installed」って出て
動かないOSがあるから、gccの方がポータブル。
~







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

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

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