シェルスクリプト総合 その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/
0404名無しさん@お腹いっぱい。
2005/06/28(火) 17:16:53Linuxだけど stat -c %y <file> で last modified を取得してまつよ
でも、表示が冗長なので他にも方法があれば知りたいところ
0405名無しさん@お腹いっぱい。
2005/06/28(火) 17:44:570406名無しさん@お腹いっぱい。
2005/06/29(水) 14:28:09またお前か。
0407名無しさん@お腹いっぱい。
2005/06/29(水) 16:06:58まるち?
0408名無しさん@お腹いっぱい。
2005/07/06(水) 00:00:30dirA/hoge01_2.txt
dirA/hoge01_10.txt
dirA/hoge01_11.txt
があった時に、find . -name "*.txt" して、この順番で表示させたいのですが、
やってみると、FreeBSDのfindだと期待通り表示されますが、cygwin の find
だと
dirA/hoge01_1.txt
dirA/hoge01_10.txt
dirA/hoge01_11.txt
dirA/hoge01_2.txt
と表示されてしまいます。これを上のように表示させる良い方法はないでしょうか?
find の出力を sort -t "_" -k2 とかやってもうまくいきませんでした。
0409名無しさん@お腹いっぱい。
2005/07/06(水) 00:12:29でfindしたら上になった。
0410名無しさん@お腹いっぱい。
2005/07/06(水) 00:12:49_と.で区切れ。
0411名無しさん@お腹いっぱい。
2005/07/06(水) 00:20:48同じマシンであってさえ、ファイルの作成した時期とかによって
出力の順番が異なることがありうるぞ。
0412408
2005/07/06(水) 00:34:58どうもです。
とりあえず sort -n -t "_" に通したら、うまくいきますた。
>>411
ということは、>>408の上のように表示されてもそれはたまたま
なので、sort に通した方が良さそうですね。
0413名無しさん@お腹いっぱい。
2005/07/06(水) 00:45:35sort でセパレータを2つ指定できるの?
>>412
「-k」を指定しないなら「-t」は不要だと思う。
その例なら「-n」だけでうまくいくんだろう。
ただ、「-n」は数値以外のフィールドでソートする場合(今回の場合)、
動作は保証されないと思う。
0414名無しさん@お腹いっぱい。
2005/07/06(水) 10:37:350415名無しさん@お腹いっぱい。
2005/07/06(水) 13:10:33を取得する方法をおしえてくださいませ。
for i in `ls *txt`
do
cat $FILE.txt | 適当な処理 > $FILE.doc
done
みたいなことをしたい。
前もって、foo だけを取得して、$FILE=foo としたい。。。
0416名無しさん@お腹いっぱい。
2005/07/06(水) 13:13:550417名無しさん@お腹いっぱい。
2005/07/06(水) 13:15:53訂正。
for in `ls *txt`
do
ここで、$FILE にファイルのピリオドより前の部分を突っ込みたい。
cat $i | 適当な処理 > $FILE.doc
done
0418名無しさん@お腹いっぱい。
2005/07/06(水) 13:17:19> for i in `ls *txt`
for i in *txt じゃだめなん?
0419名無しさん@お腹いっぱい。
2005/07/06(水) 14:24:30http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html#lbAZ
sedなら sed 's/¥.[^¥.][^¥.][^¥.]$//'
0420名無しさん@お腹いっぱい。
2005/07/06(水) 14:53:56ふつー、basenameだろ。
FILE=`basename "$i" .txt`
cat "$i" | 適当な処理 > "$FILE".doc
さらにいうとcatも要らんな。
FILE=`basename "$i" .txt`
適当な処理 < "$i" > "$FILE".doc
で桶。
ファイルネームが含まれる場合、いつも" "で囲う癖を付けた方がいいよ。
0421417
2005/07/06(水) 15:54:41basename って初めてしったよ。。。
>>420
ファイルネームが含まれるときは、"" で囲った方がいいのは、
なんでかしらん? ようわからん。。。
0422名無しさん@お腹いっぱい。
2005/07/06(水) 16:19:180423名無しさん@お腹いっぱい。
2005/07/06(水) 21:49:30シェルスクリプトなら、/etc とか /bin の下にあるのを
参考にすると勉強になると思うよ。
0424名無しさん@お腹いっぱい。
2005/07/07(木) 23:45:15何か意味があってそうしてるんでしょうか?
0425名無しさん@お腹いっぱい。
2005/07/07(木) 23:53:100426名無しさん@お腹いっぱい。
2005/07/07(木) 23:54:09ちがうな。。。。
0427名無しさん@お腹いっぱい。
2005/07/07(木) 23:57:080428名無しさん@お腹いっぱい。
2005/07/08(金) 00:09:38ls -lだと分までしかでないんだけど。
0429名無しさん@お腹いっぱい。
2005/07/08(金) 00:11:540430名無しさん@お腹いっぱい。
2005/07/08(金) 00:35:50あんがと。
0431No Gnus is good news
2005/07/08(金) 00:41:35perl -e '@stat=stat("/"); print localtime($stat[9]) . "\n";'
0432No gnus is bad news
2005/07/08(金) 00:53:18emacs --batch --eval '(princ (format-time-string "%r\n" (nth 5 (file-attributes "'$foo'"))))'
冗談です^^;;
0433名無しさん@お腹いっぱい。
2005/07/08(金) 09:30:44と思ったら zsh は stat が builtin なのね orz
0434名無しさん@お腹いっぱい。
2005/07/08(金) 09:31:12でもお前らいろいろありがとうな。
0435名無しさん@お腹いっぱい。
2005/07/08(金) 10:13:57date: illegal option -- r
だせぇー。やっぱGNU date必須だな。
0436名無しさん@お腹いっぱい。
2005/07/08(金) 10:20:07usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
[-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]
0437名無しさん@お腹いっぱい。
2005/07/08(金) 10:39:16Sun Sep 9 10:46:40 JST 2001
個人的にはこれができる FreeBSD の date の方が GNU date より重宝する。
GNU date でもできなくはないんだけどさ。
% date -d "$(($(date +%s) - 1000000000)) seconds ago"
Sun Sep 9 10:46:40 JST 2001
0438名無しさん@お腹いっぱい。
2005/07/08(金) 10:42:40どの zsh よ?
0439名無しさん@お腹いっぱい。
2005/07/08(金) 14:01:07GNU者うざい。
0440名無しさん@お腹いっぱい。
2005/07/08(金) 14:13:00(゚Д゚)ハァ?
0441名無しさん@お腹いっぱい。
2005/07/08(金) 15:55:26その目的ならおれはこれでいいや。
perl -e 'print scalar localtime 1000000000'
0442名無しさん@お腹いっぱい。
2005/07/09(土) 00:40:44書式は --time-style で好きなように
0443名無しさん@お腹いっぱい。
2005/07/09(土) 01:12:54> 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:47GNU者うざい。
0445名無しさん@お腹いっぱい。
2005/07/09(土) 01:19:06perlのワンライナーをシェルスクリプトに入れるのって
どうなんだろう
そのうちどうせなら全部perlで書いたほうが、はやいし
移植性も高いかも?
とかそんなようなことを思ったりして
0446名無しさん@お腹いっぱい。
2005/07/09(土) 01:25:10え、漏れは emacs のワンライナーをシェルスクリプトに入れているけど。。。
0447名無しさん@お腹いっぱい。
2005/07/09(土) 01:28:25というか、その「感覚的には」のくだり
それそのものがやりたいわけじゃないのよね?
set -- `grep 20050709 hoge.txt` とかいう話でもないだろうし。
0448443
2005/07/09(土) 01:41:15やりたいことは、
STR1 に 20050709
STR2 に bbb
STR3 に BBB を入れることです。
grep 20050709 hoge.txt | read STR1 STR2 STR3
↑で入ります?
自分の環境だと、STR1,2,3 とも空になってしまうのですが。
0449名無しさん@お腹いっぱい。
2005/07/09(土) 01:44:480450443
2005/07/09(土) 02:00:16はい。ソースを貼り付けられないのが悔しいのですが、
ちゃんと、${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:24zsh だと上手くいったけど、bash はダメだった
0453名無しさん@お腹いっぱい。
2005/07/09(土) 02:21:24bash-3.00$ read STR1 STR2 STR3 < <(grep 20050709 hoge.txt)
0454No Gnus is good news
2005/07/09(土) 02:27:06the output show up in $variable when the read command finishes?
http://www.unixguide.net/unix/bash/E4.shtml
0455名無しさん@お腹いっぱい。
2005/07/09(土) 02:27:27pipeの後に置かれたreadはsubshellで実行されるため、結果の変数は親からは見えません。
>>447のようにgrepをsubshellに回すか、
grep 20050709 hoge.txt | (read STR1 STR2 STR3; echo $STR1 $STR2 $STR3)
subshellの中で完結させるとよいでしょう。
0456443
2005/07/09(土) 02:44:28451さんの言う通り、ファイル経由にしようかと思います。
>455
なるほど、勉強になりました。
ありがとうございました。
0457名無しさん@お腹いっぱい。
2005/07/09(土) 02:45:560458名無しさん@お腹いっぱい。
2005/07/09(土) 02:56:02read < file
もできないんじゃなかったっけか
0459名無しさん@お腹いっぱい。
2005/07/09(土) 07:37:310460名無しさん@お腹いっぱい。
2005/07/09(土) 07:48:29にしてみ。
0461名無しさん@お腹いっぱい。
2005/07/09(土) 08:55:54それ>>455と同じ。
0462名無しさん@お腹いっぱい。
2005/07/09(土) 10:20:340463名無しさん@お腹いっぱい。
2005/07/09(土) 14:05:000464名無しさん@お腹いっぱい。
2005/07/09(土) 14:24:46おや、思考停止ですか?
0465名無しさん@お腹いっぱい。
2005/07/09(土) 15:22:40だってzshのスクリプトは、可搬性悪いし、保守性悪いじゃん。
可搬性悪=zshがどこにもインスコされてるわけじゃない
保守性悪=使える(よくわかってる)人の数は sh >>> zsh
これはzsh自体が悪いせいじゃない。でも上の状況を鑑みて、
shが存在するのにshを避けてzshでスクリプト書く理由わからん。
0466名無しさん@お腹いっぱい。
2005/07/09(土) 15:41:11sh スクリプトと見せかけて、bash スクリプトなんか腐るほどある。
Solaris 使ったことある?
0467名無しさん@お腹いっぱい。
2005/07/09(土) 15:42:210468名無しさん@お腹いっぱい。
2005/07/09(土) 15:45:41俺の仕事のリーチでは十分可搬性有るし、
状況によって、使える物は何でも使う
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同意。
反論するなら
・zsh は可搬性が高いかどうか
・zsh は保守性が高いかどうか
にするべきだろう。
「可搬性や保守性は必要ない」っていう主張は、
「zsh は可搬性や保守性が低い」のは認めているんだよな。
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とかは入れるんでしょ
■ このスレッドは過去ログ倉庫に格納されています