シェルスクリプト総合 その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/
0472名無しさん@お腹いっぱい。
2005/07/09(土) 16:39:32狭いリーチだな
0473名無しさん@お腹いっぱい。
2005/07/09(土) 16:44:13可搬性や保守性が高くないと使えないという前提がそもそも
おかしいという主張なんだよ
>>472
仕事柄、古くさい環境は触る必要無いんでね
0474名無しさん@お腹いっぱい。
2005/07/09(土) 16:51:110475名無しさん@お腹いっぱい。
2005/07/09(土) 16:51:33他の人間には触らせずに一生保守し続けるという覚悟があるんだったら
別にいいんじゃないの?
我々普通の人間がとやかく言うことじゃないよ。
0476名無しさん@お腹いっぱい。
2005/07/09(土) 16:52:080477名無しさん@お腹いっぱい。
2005/07/09(土) 16:54:49何万行のスクリプトなんだよ……
0478名無しさん@お腹いっぱい。
2005/07/09(土) 16:54:52(結論1)
zsh は可搬性・保守性が低い
(結論2)
可搬性・保守性が必要ないなら使ってもいいんじゃね?
0479名無しさん@お腹いっぱい。
2005/07/09(土) 17:00:19わからんでもないが、そもそもそんなのが必要になったことがないなぁ。
>>466
Solaris は長いこと使ってるけど、sh スクリプトに見せかけた
bash スクリプトなんてものを見た記憶はない。
ksh スクリプトはたくさんあるけど、sh に見せかけてるわけじゃなく
ちゃんと ksh スクリプトだと名乗ってるし。
0480名無しさん@お腹いっぱい。
2005/07/09(土) 17:03:27Solaris で bash が入ったのって 8 くらいからじゃなかったっけ?
0481名無しさん@お腹いっぱい。
2005/07/09(土) 17:04:04$(..) を使っているスクリプトや ^ をクォートせずに使っているスクリプトとか見たことない?
0482名無しさん@お腹いっぱい。
2005/07/09(土) 17:21:17$( ) とか、export VAR=var とかはやめて欲しいな。
$(( )) は論外。
0483名無しさん@お腹いっぱい。
2005/07/09(土) 17:29:47ksh や bash スクリプトだと名乗ってるものにそういうのは見たことあるけど。
sh と bash の実体が同じならば、sh に見せかけて
実は bash スクリプトというのはありうるし、それでちゃんと動くけど、
Solaris では sh と bash はまったく違うものなんだから
bash でしか使えない文法を #!/bin/sh のスクリプトで使ったら動かない。
0484名無しさん@お腹いっぱい。
2005/07/09(土) 17:31:04イマドキの Solaris 9 4/04 でもクォートする必要あるぜ。
0485名無しさん@お腹いっぱい。
2005/07/09(土) 17:31:53次の文字はシェルに対しては特別な意味を持ち、クォートしない (
後述の説明を参照 ) 限りワードの終わりを表します。
; & ( ) | ^ < > 復帰改行 空白文字 タブ
0486名無しさん@お腹いっぱい。
2005/07/09(土) 17:45:060487名無しさん@お腹いっぱい。
2005/07/09(土) 17:47:03^ は昔のパイプの意味なんだけど、
少なくとも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は知ったか決定だな。
0490名無しさん@お腹いっぱい。
2005/07/09(土) 17:53:37ほほー、そーなるんですか。なるほど。
0491名無しさん@お腹いっぱい。
2005/07/09(土) 18:02:56The application shall quote the following characters if they are to represent themselves:
| & ; < > ( ) $ ` \ " ' <space> <tab> <newline>
0492名無しさん@お腹いっぱい。
2005/07/09(土) 18:07:13for i in {000..099}; do touch ${i}; done
0493名無しさん@お腹いっぱい。
2005/07/09(土) 18:10:44正気かよ
毎回echo()とかいう関数作ってるのか
そういうの気にするぐらいならperlスクリプトでも書いてろよ
シェルスクリプトよりよっぽどポータブルだから
0494名無しさん@お腹いっぱい。
2005/07/09(土) 18:11:460495名無しさん@お腹いっぱい。
2005/07/09(土) 18:11:54[連番のH画像を一気にダウンロードする]スレ的なネタだな
zshとwgetの組み合わせはもはや定番であろう
0496名無しさん@お腹いっぱい。
2005/07/09(土) 18:13:47kshで
set -x
としたときの出力を関数の中まで出力できるように(shやbashのように)すればどうすればいいの?
0497名無しさん@お腹いっぱい。
2005/07/09(土) 18:14:01その程度なら、seq jot printfあるいは頑張ってexprで書けるものを、
可搬性を犠牲にしてまでzshですか。
0498名無しさん@お腹いっぱい。
2005/07/09(土) 18:14:37typeset -Z3 i=0
にしてカウントアップすればいいんじゃないか?
0499名無しさん@お腹いっぱい。
2005/07/09(土) 18:15:070500名無しさん@お腹いっぱい。
2005/07/09(土) 18:17:09PDP-11 上の AT&T UNIX でも正しく動作する事
0501名無しさん@お腹いっぱい。
2005/07/09(土) 18:17:120502名無しさん@お腹いっぱい。
2005/07/09(土) 18:17:52seqだのjotだののどこらへんがポータブルなんですか
awkで書けよ
0503名無しさん@お腹いっぱい。
2005/07/09(土) 18:18:56でもbashとかtcshとかkshとかは入れるんでしょ
0504名無しさん@お腹いっぱい。
2005/07/09(土) 18:19:560505名無しさん@お腹いっぱい。
2005/07/09(土) 18:21:30typesetに可搬性はない。
可搬性なら、
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:450508名無しさん@お腹いっぱい。
2005/07/09(土) 18:29:47perlで書くと、起動スクリプトには使えない。
0509名無しさん@お腹いっぱい。
2005/07/09(土) 18:32:15教えない。
0510名無しさん@お腹いっぱい。
2005/07/09(土) 18:32:27そんだけかよ。
起動スクリプトなんぞ、ポータビリティが不要な最たるものだと思うが。
ポータブルな起動スクリプトって、何か意味あんのか?
0511名無しさん@お腹いっぱい。
2005/07/09(土) 18:34:110512名無しさん@お腹いっぱい。
2005/07/09(土) 18:35:32可搬性だとか理論武装してるだけなんだろ?
笑っちゃうって
可搬性気にするぐらいならシェルスクリプトなんぞ書くなっての
0513名無しさん@お腹いっぱい。
2005/07/09(土) 18:39:37可搬性がどーでもいいならCで書くなぁ。
0514名無しさん@お腹いっぱい。
2005/07/09(土) 18:40:370515名無しさん@お腹いっぱい。
2005/07/09(土) 18:42:34だから、毎回あんたはecho()とかいう関数を定義するわけね
>>514
得ろ画像連番は一回こっきりのワンライナーだからいちいちスクリプトに
落とさんだろ
だからこそのzshなんだよ
0516名無しさん@お腹いっぱい。
2005/07/09(土) 18:44:400517名無しさん@お腹いっぱい。
2005/07/09(土) 18:48:06スクリプトは /bin/sh 互換で書くよ。
それ以上のことしたいときは perl とか使う。
っていう人が多いんじゃないの。
0518名無しさん@お腹いっぱい。
2005/07/09(土) 18:49:23Cよりシェルのほうがポータブルだと本当に言えるのだろうか。
Cのバイナリは確かにポータブルではないが、ソースレベルならどうか。
0519名無しさん@お腹いっぱい。
2005/07/09(土) 18:51:17シェルのシンタクス上は/bin/sh互換のスクリプトであるからと言って
使ってるコマンド群の仕様はシステムによっててんでまちまちなんだから、
そのスクリプトがポータブルであるということにはならない。
という話をしているのだが。
echo()とかいう関数、という例は無論そのことを言っている。
0520名無しさん@お腹いっぱい。
2005/07/09(土) 18:51:19echoの問題なら、関数定義までしなくても、
echo -nやバックスラッシュのエスケープを使わなければ問題ない。
問題になるケースは少ないが、問題な場合は
Solarisだけ場合分けすれば済むケースがほとんど。
あと、複雑なエスケープを使うなら、
echoじゃなく、printfを使う。
0521名無しさん@お腹いっぱい。
2005/07/09(土) 18:52:05> echo -nやバックスラッシュのエスケープを使わなければ
やだー使いたいー(ジタバタ
0522名無しさん@お腹いっぱい。
2005/07/09(土) 18:54:44Cのソースが本当にポータブルなら、
なぜ毎回./configureでMakefileを作り直す必要があるのか。
0523名無しさん@お腹いっぱい。
2005/07/09(土) 18:56:31MakefileはCのソースではないからです。
>>520
>>500によれば、printf(1)はPOSIX.2に含まれていようが含まれていまいが
ポータブルではないそうです。
0524名無しさん@お腹いっぱい。
2005/07/09(土) 18:58:57君は echo -n も使わないのかね?
0525名無しさん@お腹いっぱい。
2005/07/09(土) 19:02:00printf ハぽーたぶるなんですか?
0526名無しさん@お腹いっぱい。
2005/07/09(土) 19:05:55printfのすべての機能を使おうとするとポータブルでないだけであって、
echo -nやechoの\エスケープの代用の範囲のみなら
printfはポータブルと考えて良い。
>>524
そうだよ。
新人がecho -nとか平気で書くのでいつも叱ってるよ。
0527名無しさん@お腹いっぱい。
2005/07/09(土) 19:07:49むしろecho -nなシステムのほうが今時は少ない気がするんだが
元BSDユーザが新人君に多いの?
0528名無しさん@お腹いっぱい。
2005/07/09(土) 19:09:02printf(1)って4.3BSD-Reno以降でしょ
>>500的にはポータブルじゃないんだそうです
0529名無しさん@お腹いっぱい。
2005/07/09(土) 19:09:31bashだとecho -n使える。
0530名無しさん@お腹いっぱい。
2005/07/09(土) 19:10:260531名無しさん@お腹いっぱい。
2005/07/09(土) 19:13:16どんなアホを指しとるんだ
無駄な努力はせずに素直にPerlを使え、と君も言いたいわけだね?
0532名無しさん@お腹いっぱい。
2005/07/09(土) 19:13:51なるほど
0533名無しさん@お腹いっぱい。
2005/07/09(土) 19:14:11./configure は config.hとかも作り直すわけだが、
config.hもC言語じゃないのかな?
0534名無しさん@お腹いっぱい。
2005/07/09(土) 19:15:08まあいいじゃないの、config.hのひとつやふたつ(w
……おれって、くるしい?
0535名無しさん@お腹いっぱい。
2005/07/09(土) 19:18:480536名無しさん@お腹いっぱい。
2005/07/09(土) 19:30:37一般論にしちゃうとジジイが時代遅れの話持ってくるから収拾がつかない。
0537名無しさん@お腹いっぱい。
2005/07/09(土) 19:34:350538名無しさん@お腹いっぱい。
2005/07/09(土) 19:37:230539名無しさん@お腹いっぱい。
2005/07/09(土) 19:39:31rshにしろよ
つか、いまどきrshとか使うなよ
とかそういう話?
0540名無しさん@お腹いっぱい。
2005/07/09(土) 19:54:14便利機能が存在するのに、使わないのは能率悪い。
もちろん特別な要件が有れば別だけど。
0541名無しさん@お腹いっぱい。
2005/07/09(土) 19:54:43"$@" を ${1+"$@"} で書かせるのヤメレ。
イマドキ意味ねー。
0542名無しさん@お腹いっぱい。
2005/07/09(土) 20:07:19djbってじじいなの?
0543名無しさん@お腹いっぱい。
2005/07/09(土) 20:09:18,. '":::::::::::::::::::::::::::::::ヽ
/:::::::::::::::::::::::::;:::ノi、:::::::ヽ
.,':::::::::::::::::::::;-ニ'/ ヽ:i::::::::ヽ
i:::n::;;:'::;;:-',,='"´ ヽi、::::::::l
!:::l.}、/ 、!:::::l
.l:::;;じ' '''''' '''''' ヽ;;!
、:;;! (●), 、(●)、.:::::il
l::、! ,,ノ(、_, )ヽ、,, .:::::/ヽ
.l;'^ヽ. -=ニ=- ' .::::::〈,' !
l::、 ゝ.、 `ニニ´ .:::::::;"ノ
!::::`ー-.、 .::::/:l:::l
.l:::::::;;;;;;i::;;l` - 、 ,..;;';;;l;;:::i::::l
i:::::::;;;;;;;':::;;l;;;;;;;;l ` ´l;;;;;;;;;l::::'::::i
0544名無しさん@お腹いっぱい。
2005/07/09(土) 20:32:070545名無しさん@お腹いっぱい。
2005/07/09(土) 21:10:240546名無しさん@お腹いっぱい。
2005/07/09(土) 21:17:46echo hoge
~$ ./hoge.sh
: bad interpreter:No such file or directory
hogeと表示したいだけなのにやってくれません!(><)
such fileって何のことですか?(><)
0547名無しさん@お腹いっぱい。
2005/07/09(土) 21:19:160548名無しさん@お腹いっぱい。
2005/07/09(土) 21:22:22Winでエディットしただろ。
#!/bin/sh の後ろに ^M が付いていて、
/bin/sh^M なんてコマンドは知らんと言ってる。
0549名無しさん@お腹いっぱい。
2005/07/09(土) 21:38:08ありがとうございましたm(><)m
0550名無しさん@お腹いっぱい。
2005/07/09(土) 22:33:480551名無しさん@お腹いっぱい。
2005/07/09(土) 23:04:180552名無しさん@お腹いっぱい。
2005/07/09(土) 23:08:430553名無しさん@お腹いっぱい。
2005/07/09(土) 23:14:270554名無しさん@お腹いっぱい。
2005/07/09(土) 23:23:160555名無しさん@お腹いっぱい。
2005/07/09(土) 23:24:410556名無しさん@お腹いっぱい。
2005/07/09(土) 23:26:24bash: ./jfoeiajosh: /bin/saofeaoijfeaoi: bad interpreter: そのようなファイルやディレクトリはありません
と言われたが、#!/bin/saofeaoijfeaoi^Mにしたら、
: bad interpreter: そのようなファイルやディレクトリはありません
になったので、エスパーではないと思われるが、よくすぐに分かったな。
0557名無しさん@お腹いっぱい。
2005/07/09(土) 23:42:15エスパー出現じゃ仕方が無いか。
0558名無しさん@お腹いっぱい。
2005/07/10(日) 00:11:270559名無しさん@お腹いっぱい。
2005/07/10(日) 00:26:010560名無しさん@お腹いっぱい。
2005/07/10(日) 02:32:18プ。FAQだよ、騒ぐな馬鹿ども。
0561名無しさん@お腹いっぱい。
2005/07/10(日) 02:34:050562名無しさん@お腹いっぱい。
2005/07/10(日) 02:42:330563名無しさん@お腹いっぱい。
2005/07/10(日) 04:28:380564名無しさん@お腹いっぱい。
2005/07/10(日) 12:08:06dir=(`pwd`);
if [ ! -d "$dir" ];then
echo "$dirは存在しないかディレクトリではありません";
exit 1;
fi
というスクリプトで今いるデレクトリが
"C:\Documents and Settings\user\My Documents"というように空白を含む
デレクトリだとうまくいきません. どうすればいいでしょうか?
0565名無しさん@お腹いっぱい。
2005/07/10(日) 12:24:260566名無しさん@お腹いっぱい。
2005/07/10(日) 12:27:590567564
2005/07/10(日) 12:38:520568名無しさん@お腹いっぱい。
2005/07/10(日) 12:41:270569名無しさん@お腹いっぱい。
2005/07/10(日) 16:07:32dir=`pwd`で、スペースもちゃんと保存される。
もちろん、値を使う時は"$dir"で" "が要る。
dir=(`pwd`)の場合は、配列への代入になってしまうので、
配列の要素解釈の際にスペースが解釈されてしまうため、
dir=("`pwd`")とする必要がある。
でも、>>564 は配列とは知らずに=( )を使ったのだろうから、
この書き方は忘れた方がいい。
なお、bashが$PWDをセットするからといって、
こういうのに頼ってはいけない。
0570名無しさん@お腹いっぱい。
2005/07/10(日) 16:17:54> なお、bashが$PWDをセットするからといって、
> こういうのに頼ってはいけない。
と老害が申しております。。。。
0571名無しさん@お腹いっぱい。
2005/07/10(日) 16:18:47■ このスレッドは過去ログ倉庫に格納されています