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

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

レス数が1000を超えています。これ以上書き込みはできません。
0001ミスターシェル2006/09/07(木) 13:00:11
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。
09129022007/02/09(金) 16:30:53
>>911
orz ありがとうございます、うまくいきました。
クオートが入れ子になってて鬱入ってました。
発想の転換ですね、さすがみなさん視点がすごいです!!

本当にありがとうございました!!!
0913名無しさん@お腹いっぱい。2007/02/11(日) 17:22:09

「ls -l」形式のファイル一覧が入っているテキストファイル(引数)
を1行ずつ読み込み、ファイル名に「.bak」が含まれるファイルを
消去するシェルスクリプトを作成したいのですが、頭の「#!/bin/sh」
を書いた時点で力尽きました。

「while read」を使う、というところまでは理解出来たのですが、
文法等がさっぱりで…どなたかご教授願えないでしょうか?
0914名無しさん@お腹いっぱい。2007/02/11(日) 17:33:05
>>913
read 使うと逆に難しそう。
grep .bak したのを sed か awk かなんかで加工して rm、がいいと思う。

> 「ls -l」形式のファイル一覧が入っているテキストファイル(引数)
この前提は変えられない?
ls -l 形式は扱いづらそうだから
find とか使った方がいいと思うんだが。
0915名無しさん@お腹いっぱい。2007/02/11(日) 17:37:27
>>913
超簡単。1行で書ける。

while read line; do case $line in *.bak);; *) echo "$line";; esac; done < file

>>914
おまえには難しかったようだね。
0916名無しさん@お腹いっぱい。2007/02/11(日) 17:48:12
>>915
それって >>913 の要求満たしてるの?
0917名無しさん@お腹いっぱい。2007/02/11(日) 17:50:39
「ls -l出力が書かれたファイルの中から、ファイル名 *.bakの行だけ消去する」のか、
「ls -l出力が書かれたファイルの中から、ファイル名 *.bakのファイルを消去する」 のか?
0918名無しさん@お腹いっぱい。2007/02/11(日) 17:53:13
>>917
わかりにくい質問でどうも済みませんでした。
前者の意味です。>>915 でできました。Thanksです。
0919名無しさん@お腹いっぱい。2007/02/11(日) 17:54:48
rm したいんじゃなかったのか。
なら grep -v '\.bak$' でいいじゃん。
シンボリックリンクに対応してないけど。
09209132007/02/11(日) 18:02:01

申し訳ありません。説明不足でした。
「ls -l出力が書かれたファイルの中から、ファイル名 *.bakのファイルを消去する」
が目的です。

ファイルリストをgrepして*.bakを含む行だけ取り出した後、awkを使用してls -lの
リストからファイル名を抜き出して…とか色々と考えていたのですが、それらを
シェルスクリプトで作成するだけの知識とか度胸とかが足りなくて困っております。

>915
回答ありがとうございます。「esacって何?」とか調べていたら返事が遅れて
しまいました。
0921名無しさん@お腹いっぱい。2007/02/11(日) 18:03:46
これ宿題だよなって言ったら
0922名無しさん@お腹いっぱい。2007/02/11(日) 18:04:52
けっきょくどっちなんだ・・・
0923名無しさん@お腹いっぱい。2007/02/11(日) 18:06:10
>>920
だったら、↓で行ける。(ls -l であって、ls -lR ではないんだから)

while read perm link usr grp size mon day year file other
do
case $file in
*.bak) rm "$file";;
esac
done < ls-l-file.txt
0924名無しさん@お腹いっぱい。2007/02/11(日) 19:34:21
hoge.bakなんつーディレクトリがある可能性があるならtestも入れる。
0925名無しさん@お腹いっぱい。2007/02/11(日) 19:50:26
まずは
cat file |sed -e
09269132007/02/11(日) 19:56:38
>923
回答ありがとうございます。色々いじくり回して実験してみます。
0927名無しさん@お腹いっぱい。2007/02/11(日) 23:23:51
file の更新時間が今の何日前かを表示したいのですが、良い案はないでしょうか?
アバウトに日付情報だけで判断できれば十分なので
find file -printf "%Ad" でやろうと思ったのですが
月をまたぐとどうにもこうにもいきません。
0928名無しさん@お腹いっぱい。2007/02/11(日) 23:39:08
>>927
OSによってはdateとかを駆使してもできるとは思うが、perlが適材適所
0929名無しさん@お腹いっぱい。2007/02/11(日) 23:41:54
%コマンド XXX ./AAA/

とやって、
ファイルXXX をディレクトリAAA にコピー(cp) して
なおかつ、AAA に移動(cd) する

というコマンドを作りたいんだけど、どうすればいい?
0930名無しさん@お腹いっぱい。2007/02/11(日) 23:48:39
aliasかfunctionを使う
0931名無しさん@お腹いっぱい。2007/02/12(月) 00:14:22
>>929
.bashrc あたりにこんな感じの function を書くのがお手軽かな

hoge(){
 cp "$1" "$2"
builtin cd "$2"
}

引数のチェックとかの拡張はお好みで。
0932名無しさん@お腹いっぱい。2007/02/12(月) 00:27:49
>>929は%だからcsh系じゃないのか?と勝手に予想
0933名無しさん@お腹いっぱい。2007/02/12(月) 01:36:07
どっちかというとBourneシェル系であるzshのデフォルトも%だったりして。
0934名無しさん@お腹いっぱい。2007/02/12(月) 02:10:57
っていうか tcsh ならデフォルトは > なので。
0935名無しさん@お腹いっぱい。2007/02/12(月) 11:09:31
>>933
>>934
そうだったのかー
0936名無しさん@お腹いっぱい。2007/02/12(月) 11:46:56
で、>>929が使ってるシェルは何なの?
0937名無しさん@お腹いっぱい。2007/02/12(月) 12:00:01
tcshをargv[0]がcshで起動するとプロンプトは%
0938名無しさん@お腹いっぱい。2007/02/12(月) 12:33:37
>>929
bashだろ、どうせ。
09399292007/02/12(月) 22:02:42
返事が遅くなりました
tcsh です
0940名無しさん@お腹いっぱい。2007/02/13(火) 00:32:06
>>929
cshスクリプトを書いておいて、
それをsourceするaliasを設定するとか。

もっとスマートな方法、教えてエロい人。
0941名無しさん@お腹いっぱい。2007/02/13(火) 03:40:49
蟹飯先生謹製のawkを落としてみたが、UTF-8で日本語が通る。
シンボリックリンクをgawkから変更しようかしら。
最近のgawkはインターネットアクセスが出来るらしいけど使いかたが分からない。
0942名無しさん@お腹いっぱい。2007/02/13(火) 06:38:22
>>941
日本語が「通る」の意味がよくわからないが、
.がちゃんと一文字に適合したり
文字クラスとして[あ-ん]のようなものが書けたり
\u3120のようにユニコードリテラルを記述できたりするの?
0943名無しさん@お腹いっぱい。2007/02/13(火) 07:18:58
>>942
そのへんは検証してもらえないかなと思いまして。w
とりあえず.は駄目でした。w
[あ-ん]はたぶん大丈夫そうな気が。
4行目の機能ってgawkにあるんですか?
0944名無しさん@お腹いっぱい。2007/02/13(火) 07:45:46
>>943
いや別にgawkは関係ない。
せっかくUnicodeに対応しているなら、出来たほうが便利なのは
確実だが。
"Tibetan"とか"Greek"とか"CJKCompatibility"みたいに、
Unicodeのブロック/カテゴリ名が使えるとさらによい。

逆にその辺が出来ないなら、今時のUnicode対応としては
大したこと無いレベルじゃまいか?
まー今更awkにそんなに多くを求めてもしゃーない気はするが。
0945名無しさん@お腹いっぱい。2007/02/13(火) 07:48:10
.が一文字に適合しないのなら、文字クラス指定も駄目っぽそうだな。
単に8bitクリーンなだけじゃないの?
0946名無しさん@お腹いっぱい。2007/02/13(火) 08:25:37
どうやらそのようですね。
...(.が3回)で一文字に適合しました。w
0947名無しさん@お腹いっぱい。2007/02/13(火) 14:47:36
dir="aaa bbb"
for f in $dir;do
echo "$f"
done
とすると
aaa
bbb
と表示されますが、この dir に空白を含む文字列を含ませるにはどうすればいいのでしょうか?
イメージとしては
dir='aaa bbb "ccc ddd"' とすると
aaa
bbb
ccc ddd
と表示できたらいいなと
0948名無しさん@お腹いっぱい。2007/02/13(火) 18:30:35
>>947
できないはず
だからperlにしろと
0949名無しさん@お腹いっぱい。2007/02/13(火) 19:00:25
>>947
そういう場合は位置パラメータを使う。

set aaa bbb 'ccc ddd'

for f in "$@"; do
echo "$f"
done

これで、
aaa
bbb
ccc ddd
と表示される。
0950名無しさん@お腹いっぱい。2007/02/13(火) 20:24:33
「できないはず」と答えてしまった >>948 が不憫。
09519292007/02/13(火) 21:04:24
>>940

alias 使えばいいというのはわかるんですが、
そのcsh スクリプトがかけないんです
0952名無しさん@お腹いっぱい。2007/02/13(火) 21:06:59
>>951
cshの話は厳禁。よそ行け。
b-shでの答えはすでに出てる。
0953名無しさん@お腹いっぱい。2007/02/13(火) 21:38:37
for aa in aaa bbb ccc\ ddd; do echo $aa; done;
0954名無しさん@お腹いっぱい。2007/02/13(火) 21:38:56
いつもの人キタ━(゚∀゚)━!!
0955名無しさん@お腹いっぱい。2007/02/13(火) 21:43:14
>>953 は元の質問の意味がわかってない。
0956名無しさん@お腹いっぱい。2007/02/13(火) 22:58:21
>>951
$HOME/tmp/cpcd.shとかを作って中身を
#!/bin/tcsh
cp "$1" "$2"
cd "$2"
として、
chmod +x $HOME/tmp/cpcd.sh
alias cpcd "source $HOME/tmp/cpcd.sh"
0957名無しさん@お腹いっぱい。2007/02/13(火) 23:25:57
単体で起動しても意味ないしsourceするんだから
sh-bangも+xもいらないんじゃないか?
0958名無しさん@お腹いっぱい。2007/02/14(水) 01:24:40
ファイル名を"abc.txt"から日付+d.txtにリネームしたいのですがうまくいきません。
対処法を伝授して下さい

mv abc.txt %Y%m%dd.txt
0959名無しさん@お腹いっぱい。2007/02/14(水) 01:44:50
>>943
>4行目の機能ってgawkにあるんですか?

ない。

gawkは内部的にwchar_tを使っているだけで、スクリプトの記述は
そのときの locale設定が使われ、表にはUnicode(やwchar_t)はでてこない。

一応 [あ-お]はできるけどね。

0960名無しさん@お腹いっぱい。2007/02/14(水) 01:48:59
>>958
mv abc.txt `date +%%Y%m%d`d.txt
0961名無しさん@お腹いっぱい。2007/02/14(水) 01:50:00
%一つ余計だ。察して。
09629582007/02/14(水) 01:52:02
>>960
ありがとうございます。うまくいきました
0963名無しさん@お腹いっぱい。2007/02/14(水) 03:16:18
jawk
09649472007/02/14(水) 03:20:49
>>949

ありがとう
0965名無しさん@お腹いっぱい。2007/02/14(水) 08:07:50
ttp://www.postfix-jp.info/trans-2.2/jhtml/FILTER_README.html
の上のほうにあるスクリプトのtrapって何を拾っているんでしょうか?
0 は分かるんですが、1, 2, 3, 15が分かりません。
0966名無しさん@お腹いっぱい。2007/02/14(水) 09:19:02
>>965
man 7 signal参照。
1:SIGHUP 2:SIGINT 3:SIGQUIT 15:SIGTERM
0967名無しさん@お腹いっぱい。2007/02/14(水) 10:12:04
>>966
$ man 7 signal
No entry for signal in section 7 of the manual

ここはLinux板じゃない。
0968名無しさん@お腹いっぱい。2007/02/14(水) 13:32:31
cron?
0969名無しさん@お腹いっぱい。2007/02/14(水) 13:33:04
みす
0970名無しさん@お腹いっぱい。2007/02/14(水) 13:54:30
>>966-967
man -a signalと言っておけばよかったね。

BSD(つーかMacだが)だとセクション3のライブラリ関数のとこに
一緒に載ってるようだな。
0971名無しさん@お腹いっぱい。2007/02/14(水) 15:13:05
bash起動してtrap -lはどうか。
0972名無しさん@お腹いっぱい。2007/02/14(水) 22:52:51
ls で ディレクトリのみ表示させるのは可能でしょうか?
0973名無しさん@お腹いっぱい。2007/02/14(水) 23:01:02
>>972

ls -FA | grep /

ちょっと意味が違うか?
0974名無しさん@お腹いっぱい。2007/02/14(水) 23:13:07
>>972
俺は
ls -l | grep 4096
でなんとかなっている
0975名無しさん@お腹いっぱい。2007/02/14(水) 23:15:18
>>974
ls -l | grep ^d
どちらかといえばこれか。
0976名無しさん@お腹いっぱい。2007/02/14(水) 23:16:20
findを使うのは反則ですか?そうですか。
0977名無しさん@お腹いっぱい。2007/02/14(水) 23:26:49
ls の質問に便乗です。

大文字も小文字も区別なく表示させたいのですが、可能ですか?

ls *.dat
に何か工夫して、aaa.dat とbbb.DAT などを表示させたいです。

0978名無しさん@お腹いっぱい。2007/02/14(水) 23:36:16
>>974

4096って!
Bite じゃなくて bit 単位ですか?
家だと、 grep 512 で、例外を除き期待どおりの結果になるが・・
0979名無しさん@お腹いっぱい。2007/02/14(水) 23:44:26
>>977

ls | grep -i
0980名無しさん@お腹いっぱい。2007/02/14(水) 23:46:19
ls | grep -i "\.dat$"
0981名無しさん@お腹いっぱい。2007/02/14(水) 23:47:39
findを使うのは反則ですか?そうですか。
0982名無しさん@お腹いっぱい。2007/02/14(水) 23:50:41
>>980

それだと、質問子の例示した拡張子にしか一致しないよ。

>>大文字も小文字も区別なく表示させたいのですが、可能ですか?

というテーゼには合致しない。
09839772007/02/14(水) 23:51:14
>>979 980
ありがとうございます
そっか、grep を使うという技があったか!
09849722007/02/14(水) 23:56:08
できれば、
-l オプションを使わずにおながいします、
余計な出力が多いので・・・。orz
0985名無しさん@お腹いっぱい。2007/02/14(水) 23:59:23
>>984

find . -depth 1 -type d

ってどのぐらいの範囲でつかえるんだろう?
0986名無しさん@お腹いっぱい。2007/02/15(木) 00:00:52
>>984

ならば

>>973 で、問題無かろう?
0987名無しさん@お腹いっぱい。2007/02/15(木) 00:02:30
>>986
なるほど
0988名無しさん@お腹いっぱい。2007/02/15(木) 00:03:54
tcshのjmanどこかにある?
0989名無しさん@お腹いっぱい。2007/02/15(木) 00:08:32
>>988
http://www.jp.freebsd.org/man-jp/search.html
ここでアレとか
0990名無しさん@お腹いっぱい。2007/02/15(木) 00:10:06
あるいは
http://www.linux.or.jp/JM/html/tcsh/man1/tcsh.1.html
09919722007/02/15(木) 00:35:14
サンクスです、みなさん、
>>973でいっきま〜〜す!!
0992名無しさん@お腹いっぱい。2007/02/15(木) 00:39:29
>>989
早速のおひかえ、ありあとうござんす
0993名無しさん@お腹いっぱい。2007/02/15(木) 00:44:56
>>990
ここは
シェルが参照するエイリアスがいくつ
って文章で終わってるね。ちょんぎれているのではないであろうかと愚考するものでありますが…
0994名無しさん@お腹いっぱい。2007/02/15(木) 00:55:10
おそらく
エイリアス置換
の章だな
しょぼいブラウザをつかっているのかな?
そこはページ全体の1/5ぐらいの場所
0995名無しさん@お腹いっぱい。2007/02/15(木) 01:05:26
ieやoperaみたいなしょぼいブラウザしかないんだけどな
0996名無しさん@お腹いっぱい。2007/02/15(木) 01:19:13
http://www.jp.freebsd.org/man-jp/get.html
0997名無しさん@お腹いっぱい。2007/02/15(木) 13:59:58
>990をxpのie6026…で見るとちょんぎれていて、しかも今日は切れるところがちがう…
りぬサイトのせいなのかブラウザのせいなのかわからんけど。

りぬ使いは無問題か?
0998名無しさん@お腹いっぱい。2007/02/15(木) 14:24:53
998
0999名無しさん@お腹いっぱい。2007/02/15(木) 14:30:29
>>997
firefoxでも windows でも FreeBSDでも無問題

つぎ
シェルスクリプト総合 その8
http://pc10.2ch.net/test/read.cgi/unix/1171517324/
1000名無しさん@お腹いっぱい。2007/02/15(木) 14:33:05
   |
   |
   |∧∧
   (-_-) 1000
   (∩∩)―――
  /
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。