[表示 : 全て 最新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/

284 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 16:59:32 ]
回答してる奴に茶々入れる奴はうざいですねw

285 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 17:10:01 ]
ろくな内容じゃないのにね。

286 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 17:36:34 ]
>>280
そんなの見りゃわかる。
どうせ、書くならもっと有意義なことを書いてもらいたい。

287 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 17:37:38 ]
否定以外書いたらそこの浅さがバレルじゃない

288 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:00:26 ]
>>286
見りゃわかるならお前が正解書けばいいじゃないか。
本当はわからなかったんだろ?

289 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:06:15 ]
と威勢だけは大変よろしいのでした

290 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:16:52 ]
hoge=$(cd "$(dirname "$0")" && pwd)
dirname $0にスペースが含まれていてもok。

291 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:23:46 ]
>>290
じゃあ、それを ` ` を使って書いた場合は?

292 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:25:01 ]
290ですが、なんか妙なタイミングで書いちゃったみたいねw
私は290が今日はじめてなので念のため。

Solarisということなので``でも書いときます。たぶんこれでいいはず。
hoge=`cd "\`dirname "$0"\`" && pwd`



293 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:26:46 ]
>>292
正解

294 名前:名無しさん@お腹いっぱい。 [2008/03/18(火) 18:32:07 ]
Bシェル教えてください。
次のようなシェルがあり、関数func1のコードは変更せず、かつ画面に"aaa"と表示させたいんです。

<Bシェル>
func1(){
exit 1
}
func1
echo "aaa"

perlのevalみたいな制御ができれば嬉しいんですが、
Bシェルでこれを実現させる法ありませんか?

<perl>
eval{
func1;
};
if($?){

}


295 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:36:37 ]
func1をサブシェルで実行。(func1)

296 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:36:59 ]
・シェルスクリプトのことをシェルってゆーな

return 1



297 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:38:16 ]
func1変更禁止かorz

298 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 19:34:19 ]
func1(){
exit 1
}
echo "aaa"
func1
これで良いんじゃね?w

299 名前:294 mailto:sage [2008/03/18(火) 20:11:07 ]
>>295
ありがとう。それでなんとかなりそう。

>>296
そうしたいのはやまやまなんですがね。

>>298
さすがにそれは無理。

300 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 20:17:01 ]
呼び方変えるくらいすぐできるでしょ。

301 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 20:35:30 ]
>>295 で解決済。それ以外の回答はハズレ。

302 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 21:50:16 ]
はいはい



303 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 22:07:59 ]
シェルの入門書を見て↓のようなシェルを書きましたが動きません。
原因は何ですか?

#!/bin/sh

echo Hoge World

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で






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

前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