トップページ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/
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
>自分で使う範囲でだけ可搬性
0538名無しさん@お腹いっぱい。2005/07/09(土) 19:37:23
>自分で使う女に可搬性
0539名無しさん@お腹いっぱい。2005/07/09(土) 19:39:31
remshってなんだよこの変態
rshにしろよ

つか、いまどきrshとか使うなよ

とかそういう話?
0540名無しさん@お腹いっぱい。2005/07/09(土) 19:54:14
俺も会社と家のマシンで可搬なら、割りかし気にならないな。
便利機能が存在するのに、使わないのは能率悪い。

もちろん特別な要件が有れば別だけど。
0541名無しさん@お腹いっぱい。2005/07/09(土) 19:54:43
ジジイで思い出した。
"$@" を ${1+"$@"} で書かせるのヤメレ。
イマドキ意味ねー。
0542名無しさん@お腹いっぱい。2005/07/09(土) 20:07:19
>>541
djbってじじいなの?
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:07
美人が出てきたところで、フレームも終わりだな。
0545名無しさん@お腹いっぱい。2005/07/09(土) 21:10:24
これはフレームが収まるAA?
0546名無しさん@お腹いっぱい。2005/07/09(土) 21:17:46
#!/bin/sh

echo hoge


~$ ./hoge.sh
: bad interpreter:No such file or directory

hogeと表示したいだけなのにやってくれません!(><)
such fileって何のことですか?(><)
0547名無しさん@お腹いっぱい。2005/07/09(土) 21:19:16
サッチというファイル
0548名無しさん@お腹いっぱい。2005/07/09(土) 21:22:22
>>546
Winでエディットしただろ。
#!/bin/sh の後ろに ^M が付いていて、
/bin/sh^M なんてコマンドは知らんと言ってる。
0549名無しさん@お腹いっぱい。2005/07/09(土) 21:38:08
改行コードをlfにしたらできました!(><)
ありがとうございましたm(><)m
0550名無しさん@お腹いっぱい。2005/07/09(土) 22:33:48
(゚Д゚)ハァ?
0551名無しさん@お腹いっぱい。2005/07/09(土) 23:04:18
見えない ^M が見える漢がこのスレに居ると言われている。
0552名無しさん@お腹いっぱい。2005/07/09(土) 23:08:43
^M能力者
0553名無しさん@お腹いっぱい。2005/07/09(土) 23:14:27
^M 能力者、映画化決定
0554名無しさん@お腹いっぱい。2005/07/09(土) 23:23:16
エスパーは本当にいたんだ!
0555名無しさん@お腹いっぱい。2005/07/09(土) 23:24:41
っ[potion of see invisible]
0556名無しさん@お腹いっぱい。2005/07/09(土) 23:26:24
Linuxのbash ja_JP-UTF8環境で、先頭を#!/bin/saofeaoijfeaoiとしたら、
bash: ./jfoeiajosh: /bin/saofeaoijfeaoi: bad interpreter: そのようなファイルやディレクトリはありません
と言われたが、#!/bin/saofeaoijfeaoi^Mにしたら、
: bad interpreter: そのようなファイルやディレクトリはありません
になったので、エスパーではないと思われるが、よくすぐに分かったな。

0557名無しさん@お腹いっぱい。2005/07/09(土) 23:42:15
しかし、こうなってくると >>547 が可哀相だな。
エスパー出現じゃ仕方が無いか。
0558名無しさん@お腹いっぱい。2005/07/10(日) 00:11:27
まあFAQですね。
0559名無しさん@お腹いっぱい。2005/07/10(日) 00:26:01
一瞬天国かと思った、この流れ
0560名無しさん@お腹いっぱい。2005/07/10(日) 02:32:18
>>551-557
プ。FAQだよ、騒ぐな馬鹿ども。
0561名無しさん@お腹いっぱい。2005/07/10(日) 02:34:05
空気読めない馬鹿が一匹
0562名無しさん@お腹いっぱい。2005/07/10(日) 02:42:33
行末の^Mも見えないのに空気が見えるわけがない
0563名無しさん@お腹いっぱい。2005/07/10(日) 04:28:38
つ [ざぶとん]
0564名無しさん@お腹いっぱい。2005/07/10(日) 12:08:06
windowsのcygwinでbashなのですが

dir=(`pwd`);
if [ ! -d "$dir" ];then
  echo "$dirは存在しないかディレクトリではありません";
  exit 1;
fi

というスクリプトで今いるデレクトリが
"C:\Documents and Settings\user\My Documents"というように空白を含む
デレクトリだとうまくいきません. どうすればいいでしょうか?
0565名無しさん@お腹いっぱい。2005/07/10(日) 12:24:26
dir=`pwd` にすれば?
0566名無しさん@お腹いっぱい。2005/07/10(日) 12:27:59
dir="`pwd`"じゃないのか?
05675642005/07/10(日) 12:38:52
できました. ありがとうございます.
0568名無しさん@お腹いっぱい。2005/07/10(日) 12:41:27
bash ならば何もしなくても $PWD にカレントディレクトリが入ってるはず。
0569名無しさん@お腹いっぱい。2005/07/10(日) 16:07:32
`pwd`を直接代入する場合は" "を付けなくていい。
dir=`pwd`で、スペースもちゃんと保存される。
もちろん、値を使う時は"$dir"で" "が要る。

dir=(`pwd`)の場合は、配列への代入になってしまうので、
配列の要素解釈の際にスペースが解釈されてしまうため、
dir=("`pwd`")とする必要がある。
でも、>>564 は配列とは知らずに=( )を使ったのだろうから、
この書き方は忘れた方がいい。

なお、bashが$PWDをセットするからといって、
こういうのに頼ってはいけない。
0570名無しさん@お腹いっぱい。2005/07/10(日) 16:17:54
>>569
> なお、bashが$PWDをセットするからといって、
> こういうのに頼ってはいけない。

と老害が申しております。。。。
0571名無しさん@お腹いっぱい。2005/07/10(日) 16:18:47
と、知能の発達の遅れた方が申しております。
0572名無しさん@お腹いっぱい。2005/07/10(日) 18:43:22
互換性を考えるなら使わん方がいいけどね。
cygwin なんて互換性を無視していい環境の最たるものだと思うが。
0573名無しさん@お腹いっぱい。2005/07/10(日) 18:51:00
またこいつか。
05741232005/07/12(火) 02:22:06
誰かリムーバブルディスク(USBストレージ)を自動マウントするスクリプト教えてくれませんか?
0575名無しさん@お腹いっぱい。2005/07/12(火) 02:25:54
OSによって違うだろ。
ここじゃなくて自分が使ってるOSのスレで聞くべし。
0576名無しさん@お腹いっぱい。2005/07/12(火) 02:42:56
#/bin/sh
#自動マウントスクリプト
while true
mount usbストレージ
done
05771232005/07/12(火) 04:03:07
なんとつかいにくいsolarisです。
大学なんでsuもrootの権限もないんですよね・・・

あのそこのusbストレージ
と二音後で書いてあるところはどうすれば・・・・
0578名無しさん@お腹いっぱい。2005/07/12(火) 04:33:19
素直にそこの管理者にすがるのが吉
0579名無しさん@お腹いっぱい。2005/07/12(火) 07:03:04
>>577
二音語って、
‐・・・ ・‐ ‐・‐ ・‐
みたいに「・」と「‐」の二音で会話する言語のことですか?
0580名無しさん@お腹いっぱい。2005/07/12(火) 07:43:32
>>576
whileループでマウントするのは重杉で非効率。
やむを得ずそれでやるとしても、ループ中に
sleep 1 とか入れれ。

Solarisならvoldとかautomountとかでやるのが
正攻法だろな。いずれにしても、その設定をするために
root権限は要る。設定完了後はrootじゃなくても
自動的にマウントできるようになる。
0581名無しさん@お腹いっぱい。2005/07/12(火) 14:28:26
何かと話題のzshみたいですが、
以前、zshのmanを見ていた時、zshにsocketの機能があるのに
ビックラこきました。
shellでsocketって、何に使うねん。と思ったのですが、
shellでsocketって、メジャーなんでしょうか?
0582名無しさん@お腹いっぱい。2005/07/12(火) 14:34:31
>>581
zftp
0583名無しさん@お腹いっぱい。2005/07/12(火) 19:13:06
zshは使わないけど、netcatはたまに使うな。
0584名無しさん@お腹いっぱい。2005/07/13(水) 14:01:50
俺だったらこう書くぞ!とかあったらお願いします。

***********************************
#!/bin/sh

old_name=$1
num=1
new_name=$old_name$num
while [ -e $new_name ]
do
num=`expr $num + 1`
new_name=$old_name$num
done
****************************
num=
new_name=
を2回も書いてる所とかが気にくわないんですが、どうにかできるものですか?
0585名無しさん@お腹いっぱい。2005/07/13(水) 14:12:22
num=1
while [ -e $1$num ]
do
num=`expr $num + 1`
done
new_name=$1$num
0586名無しさん@お腹いっぱい。2005/07/13(水) 14:16:15
>>584

#!/bin/sh

old_name=$1
num=1
while [ -f "$old_name$num" ]
do
num=`expr $num + 1`
done
new_name=$old_name$num

だな。
new_nameの代入をループ外に出して1行減らした。
Solarisではtest -eが使えないので
test -fに変えた。
あと、引数として使う時は" "で囲む。(直接代入なら囲まなくていい)
0587名無しさん@お腹いっぱい。2005/07/13(水) 14:19:36
linux人でbashですって書き忘れてたーと思ったらもう返信が
>585,586
ありがとうございます。
むー。なんか俺、無駄な事しまくってますね。
■ このスレッドは過去ログ倉庫に格納されています