トップページunix
1001コメント285KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2005/04/17(日) 00:17:17
シェルスクリプトの総合スレです。スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-10くらい)をご覧ください。

□前スレや過去スレ:
シェルスクリプト総合 その1
http://pc8.2ch.net/test/read.cgi/unix/1101820646/
☆シェルスクリプトを勉強するにあたって☆
http://pc5.2ch.net/test/read.cgi/unix/989659936/
便利なシェルスクリプト見せろ
http://pc5.2ch.net/test/read.cgi/unix/996949546/
【貝】第1回シェル講座【殻】
http://fun.kz/test/read.cgi/unix/1016372780/

□関連スレ:
sed
http://pc8.2ch.net/test/read.cgi/unix/1085730992/
おまえら! shell は何を使っているんですか?
http://pc5.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc8.2ch.net/test/read.cgi/unix/1102921590/

□他板の関連スレ:
Macでシェルスクリプト総合 Part 1
http://pc7.2ch.net/test/read.cgi/mac/1105074933/
【Shell】どのシェル使ってる?【Script】
http://pc8.2ch.net/test/read.cgi/linux/1067330754/
0438名無しさん@お腹いっぱい。2005/07/08(金) 10:42:40
>>433
どの zsh よ?
0439名無しさん@お腹いっぱい。2005/07/08(金) 14:01:07
>>435
GNU者うざい。
0440名無しさん@お腹いっぱい。2005/07/08(金) 14:13:00
>>439
(゚Д゚)ハァ?
0441名無しさん@お腹いっぱい。2005/07/08(金) 15:55:26
>>437
その目的ならおれはこれでいいや。
perl -e 'print scalar localtime 1000000000'
0442名無しさん@お腹いっぱい。2005/07/09(土) 00:40:44
GNU の ls だったら --full-time が使える。
書式は --time-style で好きなように
0443名無しさん@お腹いっぱい。2005/07/09(土) 01:12:54
bash で質問です。

> cat hoge.txt
20050708 aaa AAA
20050709 bbb BBB
20050710 ccc CCC

っていうファイルがあったとして、感覚的には、

grep 20050709 hoge.txt | read STR1 STR2 STR3

みたいな感じで、
STR1 に 20050709
STR2 に bbb
STR3 に BBB

を入れたいです。

何かうまい手はないでしょうか?
よろしくお願いします。
0444名無しさん@お腹いっぱい。2005/07/09(土) 01:16:47
>>442
GNU者うざい。
0445名無しさん@お腹いっぱい。2005/07/09(土) 01:19:06
>>441
perlのワンライナーをシェルスクリプトに入れるのって
どうなんだろう

そのうちどうせなら全部perlで書いたほうが、はやいし
移植性も高いかも?
とかそんなようなことを思ったりして
0446名無しさん@お腹いっぱい。2005/07/09(土) 01:25:10
>>445
え、漏れは emacs のワンライナーをシェルスクリプトに入れているけど。。。
0447名無しさん@お腹いっぱい。2005/07/09(土) 01:28:25
やりたいことがわからない。
というか、その「感覚的には」のくだり
それそのものがやりたいわけじゃないのよね?

set -- `grep 20050709 hoge.txt` とかいう話でもないだろうし。
04484432005/07/09(土) 01:41:15
> 447
やりたいことは、
STR1 に 20050709
STR2 に bbb
STR3 に BBB を入れることです。

grep 20050709 hoge.txt | read STR1 STR2 STR3
↑で入ります?

自分の環境だと、STR1,2,3 とも空になってしまうのですが。
0449名無しさん@お腹いっぱい。2005/07/09(土) 01:44:48
ちゃんと ${STR1} で参照してるんだよね?
04504432005/07/09(土) 02:00:16
>449
はい。ソースを貼り付けられないのが悔しいのですが、
ちゃんと、${STR1} で参照しております。

普通は
grep 20050709 hoge.txt | read STR1 STR2 STR3
で、うまくいくものなのでしょうか?

ちなみに、
read STR1 STR2 STR3 < hoge.txt
だと、
STR1 に 20050708
STR2 に aaa
STR3 に AAA が入ってくれます。
0451名無しさん@お腹いっぱい。2005/07/09(土) 02:03:23
おれんとこもそれできない。
とりあえずファイル経由すれば?
0452名無しさん@お腹いっぱい。2005/07/09(土) 02:11:24
>>450
zsh だと上手くいったけど、bash はダメだった
0453名無しさん@お腹いっぱい。2005/07/09(土) 02:21:24
これは反則? ^^;;
bash-3.00$ read STR1 STR2 STR3 < <(grep 20050709 hoge.txt)
0454No Gnus is good news2005/07/09(土) 02:27:06
If I pipe the output of a command into `read variable', why doesn't
the output show up in $variable when the read command finishes?
http://www.unixguide.net/unix/bash/E4.shtml
0455名無しさん@お腹いっぱい。2005/07/09(土) 02:27:27
>>450
pipeの後に置かれたreadはsubshellで実行されるため、結果の変数は親からは見えません。
>>447のようにgrepをsubshellに回すか、
grep 20050709 hoge.txt | (read STR1 STR2 STR3; echo $STR1 $STR2 $STR3)
subshellの中で完結させるとよいでしょう。
04564432005/07/09(土) 02:44:28
皆様、アドバイスありがとうございました。
451さんの言う通り、ファイル経由にしようかと思います。

>455
なるほど、勉強になりました。
ありがとうございました。
0457名無しさん@お腹いっぱい。2005/07/09(土) 02:45:56
zsh で成功するのは zsh の拡張機能?
0458名無しさん@お腹いっぱい。2005/07/09(土) 02:56:02
むかしのreadはそもそも
read < file
もできないんじゃなかったっけか
0459名無しさん@お腹いっぱい。2005/07/09(土) 07:37:31
zsh is the shell
0460名無しさん@お腹いっぱい。2005/07/09(土) 07:48:29
grep 20050709 hoge.txt |while read STR1 STR2 STR3; do echo $STR3; done;
にしてみ。
0461名無しさん@お腹いっぱい。2005/07/09(土) 08:55:54
>>460
それ>>455と同じ。
0462名無しさん@お腹いっぱい。2005/07/09(土) 10:20:34
zshを対話的に使うなら分かるが、スクリプトに使う理由がわからん。
0463名無しさん@お腹いっぱい。2005/07/09(土) 14:05:00
よく考えてご覧なさい
0464名無しさん@お腹いっぱい。2005/07/09(土) 14:24:46
>>462
おや、思考停止ですか?
0465名無しさん@お腹いっぱい。2005/07/09(土) 15:22:40
俺もわかんない。
だってzshのスクリプトは、可搬性悪いし、保守性悪いじゃん。

可搬性悪=zshがどこにもインスコされてるわけじゃない
保守性悪=使える(よくわかってる)人の数は sh >>> zsh

これはzsh自体が悪いせいじゃない。でも上の状況を鑑みて、
shが存在するのにshを避けてzshでスクリプト書く理由わからん。
0466名無しさん@お腹いっぱい。2005/07/09(土) 15:41:11
>>465
sh スクリプトと見せかけて、bash スクリプトなんか腐るほどある。
Solaris 使ったことある?
0467名無しさん@お腹いっぱい。2005/07/09(土) 15:42:21
zshが入ってるマシンで自分用に書く場合は?なにも問題なかろう。
0468名無しさん@お腹いっぱい。2005/07/09(土) 15:45:41
>>465
俺の仕事のリーチでは十分可搬性有るし、
状況によって、使える物は何でも使う
0469名無しさん@お腹いっぱい。2005/07/09(土) 15:50:36
    ⊂_ヽ、
      .\\  /⌒\
         \ ( 冫、)  ウンチになぁれ
          > ` ⌒ヽ
         /    へ \
        /    /   \\
        レ  ノ     ヽ_つ
        /  /         ・*.・:
       /  /|          :。 *.・
       ( ( 、           ★。:’*
       |  |、 \        。・.*・; ・
       | / \ ⌒l      ;* ・。;*★ 人・
       | |   ) /      ・ ★・   (_ );; * 。・
      ノ  )   し'        ・ *   (__) * ・。・
     (_/          。*;>>465(●´ー`●)  ★.* ’★
0470名無しさん@お腹いっぱい。2005/07/09(土) 16:29:06
「可搬性」っつってんのに
「zshの入ってるPC」とか
「俺の仕事では」とか
「ウンチになぁれ」とか


バカなのかな?
0471名無しさん@お腹いっぱい。2005/07/09(土) 16:39:19
>>470
同意。

反論するなら
・zsh は可搬性が高いかどうか
・zsh は保守性が高いかどうか
にするべきだろう。

「可搬性や保守性は必要ない」っていう主張は、
「zsh は可搬性や保守性が低い」のは認めているんだよな。
0472名無しさん@お腹いっぱい。2005/07/09(土) 16:39:32
>>468
狭いリーチだな
0473名無しさん@お腹いっぱい。2005/07/09(土) 16:44:13
>>471
可搬性や保守性が高くないと使えないという前提がそもそも
おかしいという主張なんだよ

>>472
仕事柄、古くさい環境は触る必要無いんでね
0474名無しさん@お腹いっぱい。2005/07/09(土) 16:51:11
喧嘩に近い議論にならないようにね。。。
0475名無しさん@お腹いっぱい。2005/07/09(土) 16:51:33
一生 zsh しか使わないとか、
他の人間には触らせずに一生保守し続けるという覚悟があるんだったら
別にいいんじゃないの?

我々普通の人間がとやかく言うことじゃないよ。
0476名無しさん@お腹いっぱい。2005/07/09(土) 16:52:08
珍しく活気付いてると思ったら荒れてるだけかよ
0477名無しさん@お腹いっぱい。2005/07/09(土) 16:54:49
たかがシェルスクリプトで保守性が問題になるって
何万行のスクリプトなんだよ……
0478名無しさん@お腹いっぱい。2005/07/09(土) 16:54:52
結論が出ますた。

(結論1)
zsh は可搬性・保守性が低い

(結論2)
可搬性・保守性が必要ないなら使ってもいいんじゃね?
0479名無しさん@お腹いっぱい。2005/07/09(土) 17:00:19
sh ではできず zsh でしかできないことを実現するのに zsh でスクリプトを書くのは
わからんでもないが、そもそもそんなのが必要になったことがないなぁ。

>>466
Solaris は長いこと使ってるけど、sh スクリプトに見せかけた
bash スクリプトなんてものを見た記憶はない。
ksh スクリプトはたくさんあるけど、sh に見せかけてるわけじゃなく
ちゃんと ksh スクリプトだと名乗ってるし。
0480名無しさん@お腹いっぱい。2005/07/09(土) 17:03:27
Linux の間違いなんじゃないの
Solaris で bash が入ったのって 8 くらいからじゃなかったっけ?
0481名無しさん@お腹いっぱい。2005/07/09(土) 17:04:04
>>479
$(..) を使っているスクリプトや ^ をクォートせずに使っているスクリプトとか見たことない?
0482名無しさん@お腹いっぱい。2005/07/09(土) 17:21:17
^ はイマドキなら/bin/shでもクォートしなくていい。
$( ) とか、export VAR=var とかはやめて欲しいな。
$(( )) は論外。
0483名無しさん@お腹いっぱい。2005/07/09(土) 17:29:47
>>481
ksh や bash スクリプトだと名乗ってるものにそういうのは見たことあるけど。

sh と bash の実体が同じならば、sh に見せかけて
実は bash スクリプトというのはありうるし、それでちゃんと動くけど、
Solaris では sh と bash はまったく違うものなんだから
bash でしか使えない文法を #!/bin/sh のスクリプトで使ったら動かない。
0484名無しさん@お腹いっぱい。2005/07/09(土) 17:31:04
>>482
イマドキの Solaris 9 4/04 でもクォートする必要あるぜ。
0485名無しさん@お腹いっぱい。2005/07/09(土) 17:31:53
[クォート]
次の文字はシェルに対しては特別な意味を持ち、クォートしない (
後述の説明を参照 ) 限りワードの終わりを表します。

; & ( ) | ^ < > 復帰改行 空白文字 タブ
0486名無しさん@お腹いっぱい。2005/07/09(土) 17:45:06
$( も $(( もPOSIXが定義していなshall。
0487名無しさん@お腹いっぱい。2005/07/09(土) 17:47:03
>>485
^ は昔のパイプの意味なんだけど、
少なくともSolaris 2.5あたりの時代にすでにパイプの意味はなくなり、
^ はただの文字として扱われるようになっているはず。
マニュアルの記述が古いだけ。
0488名無しさん@お腹いっぱい。2005/07/09(土) 17:51:41
(゚Д゚)ハァ?
試してから言えよ。
% /bin/sh -c 'echo a^ls'
CHANGES Makefile.in config.guess config.status doc lib named.run
COPYRIGHT README config.h config.sub docutil libtool.m4 version
FAQ acconfig.h config.h.in configure install-sh ltmain.sh win32utils
LOG aclocal.m4 config.h.win32 configure.in isc-config.sh make
Makefile bin config.log contrib isc-config.sh.in mkinstalldirs
0489名無しさん@お腹いっぱい。2005/07/09(土) 17:52:26
>>487
は知ったか決定だな。
0490名無しさん@お腹いっぱい。2005/07/09(土) 17:53:37
>>488
ほほー、そーなるんですか。なるほど。
0491名無しさん@お腹いっぱい。2005/07/09(土) 18:02:56
イマドキ
The application shall quote the following characters if they are to represent themselves:
| & ; < > ( ) $ ` \ " ' <space> <tab> <newline>
0492名無しさん@お腹いっぱい。2005/07/09(土) 18:07:13
000 - 099 みたいな連番を生成する時には zsh 使う

for i in {000..099}; do touch ${i}; done
0493名無しさん@お腹いっぱい。2005/07/09(土) 18:10:44
シェルスクリプトで可搬性だとか保守性だとか言ってるヤツ、
正気かよ
毎回echo()とかいう関数作ってるのか

そういうの気にするぐらいならperlスクリプトでも書いてろよ
シェルスクリプトよりよっぽどポータブルだから
0494名無しさん@お腹いっぱい。2005/07/09(土) 18:11:46
また阿呆が湧いた…
0495名無しさん@お腹いっぱい。2005/07/09(土) 18:11:54
>>492
[連番のH画像を一気にダウンロードする]スレ的なネタだな
zshとwgetの組み合わせはもはや定番であろう
0496名無しさん@お腹いっぱい。2005/07/09(土) 18:13:47
いきなり、流れを絶つことになるけど、
kshで
set -x
としたときの出力を関数の中まで出力できるように(shやbashのように)すればどうすればいいの?
0497名無しさん@お腹いっぱい。2005/07/09(土) 18:14:01
>>492
その程度なら、seq jot printfあるいは頑張ってexprで書けるものを、
可搬性を犠牲にしてまでzshですか。
0498名無しさん@お腹いっぱい。2005/07/09(土) 18:14:37
>>492
 typeset -Z3 i=0
にしてカウントアップすればいいんじゃないか?
0499名無しさん@お腹いっぱい。2005/07/09(土) 18:15:07
可搬性ってなんすか
0500名無しさん@お腹いっぱい。2005/07/09(土) 18:17:09
>>499
PDP-11 上の AT&T UNIX でも正しく動作する事
0501名無しさん@お腹いっぱい。2005/07/09(土) 18:17:12
エロ画像のためにzshをインストールする気はないな。
0502名無しさん@お腹いっぱい。2005/07/09(土) 18:17:52
>>497
seqだのjotだののどこらへんがポータブルなんですか
awkで書けよ
0503名無しさん@お腹いっぱい。2005/07/09(土) 18:18:56
>>501
でもbashとかtcshとかkshとかは入れるんでしょ
0504名無しさん@お腹いっぱい。2005/07/09(土) 18:19:56
>>493はどこらへんが阿呆なの?
0505名無しさん@お腹いっぱい。2005/07/09(土) 18:21:30
>>498
typesetに可搬性はない。

可搬性なら、

for i in `yes '' | cat -n`
が最強かな。あと、ゼロ揃えだけ別処理すること。
0506名無しさん@お腹いっぱい。2005/07/09(土) 18:23:29

これ買いですか?
http://www.amazon.co.jp/exec/obidos/tg/detail/-/books/4756101623/contents/249-1104321-8243555
0507名無しさん@お腹いっぱい。2005/07/09(土) 18:25:45
zsh=エロ画像専用シェル=じいしぇる
0508名無しさん@お腹いっぱい。2005/07/09(土) 18:29:47
>>493
perlで書くと、起動スクリプトには使えない。
0509名無しさん@お腹いっぱい。2005/07/09(土) 18:32:15
>>504
教えない。
0510名無しさん@お腹いっぱい。2005/07/09(土) 18:32:27
>>508
そんだけかよ。

起動スクリプトなんぞ、ポータビリティが不要な最たるものだと思うが。
ポータブルな起動スクリプトって、何か意味あんのか?
0511名無しさん@お腹いっぱい。2005/07/09(土) 18:34:11
ほんとくだらない
0512名無しさん@お腹いっぱい。2005/07/09(土) 18:35:32
要するにzshを毛嫌いしてるだけなのに
可搬性だとか理論武装してるだけなんだろ?
笑っちゃうって

可搬性気にするぐらいならシェルスクリプトなんぞ書くなっての
0513名無しさん@お腹いっぱい。2005/07/09(土) 18:39:37
シェルスクリプトだからこそ可搬性を気にするなぁ。
可搬性がどーでもいいならCで書くなぁ。
0514名無しさん@お腹いっぱい。2005/07/09(土) 18:40:37
エロ画像に連番振るのも?
0515名無しさん@お腹いっぱい。2005/07/09(土) 18:42:34
>>513
だから、毎回あんたはecho()とかいう関数を定義するわけね

>>514
得ろ画像連番は一回こっきりのワンライナーだからいちいちスクリプトに
落とさんだろ
だからこそのzshなんだよ
0516名無しさん@お腹いっぱい。2005/07/09(土) 18:44:40
無理に会話に入ってこなくてよろしい。
0517名無しさん@お腹いっぱい。2005/07/09(土) 18:48:06
zsh はインタラクティブシェルとして使ってるけど
スクリプトは /bin/sh 互換で書くよ。
それ以上のことしたいときは perl とか使う。

っていう人が多いんじゃないの。
0518名無しさん@お腹いっぱい。2005/07/09(土) 18:49:23
>>513
Cよりシェルのほうがポータブルだと本当に言えるのだろうか。
Cのバイナリは確かにポータブルではないが、ソースレベルならどうか。
0519名無しさん@お腹いっぱい。2005/07/09(土) 18:51:17
>>517
シェルのシンタクス上は/bin/sh互換のスクリプトであるからと言って
使ってるコマンド群の仕様はシステムによっててんでまちまちなんだから、
そのスクリプトがポータブルであるということにはならない。

という話をしているのだが。
echo()とかいう関数、という例は無論そのことを言っている。
0520名無しさん@お腹いっぱい。2005/07/09(土) 18:51:19
>>515
echoの問題なら、関数定義までしなくても、
echo -nやバックスラッシュのエスケープを使わなければ問題ない。

問題になるケースは少ないが、問題な場合は
Solarisだけ場合分けすれば済むケースがほとんど。

あと、複雑なエスケープを使うなら、
echoじゃなく、printfを使う。
0521名無しさん@お腹いっぱい。2005/07/09(土) 18:52:05
>>520
> echo -nやバックスラッシュのエスケープを使わなければ
やだー使いたいー(ジタバタ
0522名無しさん@お腹いっぱい。2005/07/09(土) 18:54:44
>>518
Cのソースが本当にポータブルなら、
なぜ毎回./configureでMakefileを作り直す必要があるのか。
0523名無しさん@お腹いっぱい。2005/07/09(土) 18:56:31
>>522
MakefileはCのソースではないからです。

>>520
>>500によれば、printf(1)はPOSIX.2に含まれていようが含まれていまいが
ポータブルではないそうです。
0524名無しさん@お腹いっぱい。2005/07/09(土) 18:58:57
>>517
君は echo -n も使わないのかね?
0525名無しさん@お腹いっぱい。2005/07/09(土) 19:02:00
>>520
printf ハぽーたぶるなんですか?
0526名無しさん@お腹いっぱい。2005/07/09(土) 19:05:55
>>523
printfのすべての機能を使おうとするとポータブルでないだけであって、
echo -nやechoの\エスケープの代用の範囲のみなら
printfはポータブルと考えて良い。

>>524
そうだよ。
新人がecho -nとか平気で書くのでいつも叱ってるよ。
0527名無しさん@お腹いっぱい。2005/07/09(土) 19:07:49
>>526
むしろecho -nなシステムのほうが今時は少ない気がするんだが
元BSDユーザが新人君に多いの?
0528名無しさん@お腹いっぱい。2005/07/09(土) 19:09:02
>>526
printf(1)って4.3BSD-Reno以降でしょ
>>500的にはポータブルじゃないんだそうです
0529名無しさん@お腹いっぱい。2005/07/09(土) 19:09:31
BSDじゃなくて犬だろ。
bashだとecho -n使える。
0530名無しさん@お腹いっぱい。2005/07/09(土) 19:10:26
俺が新人ならそんなアホは相手にせんな。頭が前世紀で立ち腐れてるよ。
0531名無しさん@お腹いっぱい。2005/07/09(土) 19:13:16
>>530
どんなアホを指しとるんだ

無駄な努力はせずに素直にPerlを使え、と君も言いたいわけだね?
0532名無しさん@お腹いっぱい。2005/07/09(土) 19:13:51
>>529
なるほど
0533名無しさん@お腹いっぱい。2005/07/09(土) 19:14:11
>>523
./configure は config.hとかも作り直すわけだが、
config.hもC言語じゃないのかな?
0534名無しさん@お腹いっぱい。2005/07/09(土) 19:15:08
>>533
まあいいじゃないの、config.hのひとつやふたつ(w

……おれって、くるしい?
0535名無しさん@お腹いっぱい。2005/07/09(土) 19:18:48
結局何もコンパチではない
0536名無しさん@お腹いっぱい。2005/07/09(土) 19:30:37
自分で使う範囲でだけ可搬性があればいいんだよ。
一般論にしちゃうとジジイが時代遅れの話持ってくるから収拾がつかない。
0537名無しさん@お腹いっぱい。2005/07/09(土) 19:34:35
>自分で使う範囲でだけ可搬性
■ このスレッドは過去ログ倉庫に格納されています