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

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

☆シェルスクリプトを勉強するにあたって☆

1 :あらん:2001/05/12(土) 18:32
シェルスクリプトを勉強しようと、思い様々な検索をかけてみて、
Windowsでいう、バッチファイルの高級バージョンという、事と、
主に、3種類のバージョンがあることは、わかりました。
しかし、肝心の勉強する本が見つかりません。みなさんは、
どのようにして、学ばれたのでしょうか。
オススメの、HP、本等ありましたら、お願いします。

2 :名無しさん@お腹いっぱい。:2001/05/12(土) 18:51
google で検索する。

3 :1:2001/05/12(土) 19:27
googleで検索したんですが、肝心の参考書はみつかりませんでした。
2さんが、ご存知でしたら是非おしえてください。m(._.)m 

4 :名無しさん@お腹いっぱい。:2001/05/12(土) 19:42
>>3
http://www.amazon.co.jp/exec/obidos/ASIN/4900900788/qid=989664151/sr=1-1/249-4777330-0673155

5 :名無しさん@お腹いっぱい。:2001/05/12(土) 19:50
>>1
なんこう、他力本願なんだ?
manみれ。
例は、自分のホストのinitでも覗け。

6 :障害明け名無しさん:2001/05/12(土) 20:12
せめて何shを使うのかくらい言えばいいのに。
そもそもOSは?

7 :名無しさん@お腹いっぱい。:2001/05/12(土) 20:14
『プロフェショナルシェルプログラミング』
(砂原秀樹他著 アスキー出版局 1996年発行)
が、入門〜中級向けくらいにいいんじゃないのかな。
魂的には、『UNIX プログラミング環境』が好きだけど。

8 :名無しさん@お腹いっぱい。:2001/05/12(土) 20:30
まず「Bourne Shell 自習テキスト」だろ。
漏れも昔お世話になった。

http://flex.ee.uec.ac.jp/texi/sh/sh.html

>>1
csh script だけはやめとけ(w


9 :名無し産:2001/05/12(土) 20:50
入門UNIXシェルプログラミング
ソフトバンク
ISBN4-7973-0828-1

とりあえず、立ち読みな

10 :名無しさん@お腹いっぱい。:2001/05/12(土) 22:02
cshの $file:r とか便利で使いたくなるんですけど。
まあ、basenameとか expr使えばいいんだけど。
コマンド起動するぶん遅くなるし。
[ よりも caseを使え。


11 :名無しさん@お腹いっぱい。:2001/05/12(土) 22:18
man sh


12 :名無しさん@お腹いっぱい。:2001/05/12(土) 23:34
man ページだけでは shell プログラミングはできない。
せいぜい DOS のバッチと同じレベルで終ってしまう。
とりあえず、ここにあがっているような書籍を読んで、
/etc/rc とか shutdown スクリプトなどを手始めに手当り次第解析しろ。

あと、リダイレクトや echo * の意味を完全に理解しておけ。
# 特に DOS 出身者じゃなくても周りに DOS 出身者がいたら、
# 混乱させられるから注意しろ。
# あ、ここでの DOS 出身者とは「DOS と同じジャン」っていうヤツを示す。


13 :名無しさん@お腹いっぱい。:2001/05/12(土) 23:59
オレはAIXなのでオライリーの「入門Kornシェル」です。
かなりいいです。

14 :名無しさん@お腹いっぱい。:2001/05/13(日) 00:11


          || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||
          ||  BSD馬鹿は     Λ_Λ  いいですね。
          ||   放置!  \ (゚ー゚*)
          ||________⊂⊂ |
  ∧ ∧    ∧ ∧    ∧ ∧    | ̄ ̄ ̄ ̄|
  (  ∧ ∧ (   ∧ ∧ (  ∧ ∧ |      |
〜(_(  ∧ ∧ __(  ∧ ∧__(   ∧ ∧ ̄ ̄ ̄
  〜(_(  ∧ ∧_(  ∧ ∧_(   ∧ ∧  は〜い、先生。
    〜(_(   ,,)〜(_(   ,,)〜(_(   ,,)
      〜(___ノ  〜(___ノ   〜(___ノ




15 :名無しさん@お腹いっぱい。:2001/05/13(日) 00:34
*BSD を使いこなせない厨房発見!

16 :名無しさん@お腹いっぱい。:2001/05/17(木) 16:30
solarisでjavaの複数のプロセスを一気に消したい。

% ps
PIT TT S TIME COMMAND
ってでてきます。
で、
% ps | awk ' $5 ~ /java/ { print $1; }'
とやると、COMMANDにjavaを含むプロセスのPIDを表示しますよね?
で、そいつらを消したいのですが。

17 :名無しさん@お腹いっぱい。:2001/05/17(木) 16:38
# kill -KILL 1
で全部消えますよ

18 :名無しさん@お腹いっぱい。:2001/05/17(木) 17:25
Solaris はしらんけど、
% kill `ps | awk ' $5 ~ /java/ { print $1; }'`
でどうよ。


19 :名無しさん@お腹いっぱい。:2001/05/17(木) 17:31
Solaris に pkill って便利なのあるよ。
あ。pgrep ってのも。


20 :16:2001/05/17(木) 22:08
>>18
ありがとうございます。
その方法で無事消えました。

>>19
http://www.cs.vu.nl/das/prun/pkill.1.html
% man pkill
でマニュアルが読めなかったので検索しました。
いまいちのみこめませんが、
% pkill java
だけでやりたいことが出来ました。
便利です。

21 :名無しさん@お腹いっぱい。:2001/05/17(木) 22:36
オレも>>7をお薦めするよ。インタラクティブな用法と、
プログラミング、それぞれを分けた上でキッチリと攻めて
いるので判りやすいし、お得感もある。

シェルプログラミングって、空白や改行が不自由だったり
文法にきつい制約があったりするから、perlなんかを
自由に扱える人でも頭を抱えてしまうことが多し。
けっこう奥が深い世界なんだよね。

22 :名無し産:2001/05/20(日) 10:49
ねうねう、
ユーザー大量追加のスクリプトって組めなくは無いですよね
どなたか見本を教えてくださらない?

つーか、たとえばhoge.csvファイルで
中身はhoge,xkfo07034のようにID,Passに記述されているとしたら・・・

すんません厨房で・・・

23 :名無し侍:2001/05/20(日) 12:38
あげとけ

24 :名無しさん@お腹いっぱい。:2001/05/20(日) 13:33
>>12
いろんなツール類を組み合わせれば、DOSのバッチでもかなりのことが出来ますね。
バッチっていっても、単なる起動バッチの類から、Cマガに昔載ってたプラグラム(だっけ?)みたいな割と複雑なものまで色々ありますね。
ECHOを使って、バッチからバッチを自動生成したりとか。
環境変数やリダイレクトもよく使うし、findやforeach、awk,sortf,sedなども良く使います。

多分「DOSと一緒」という発言は↑のような使い方を前提としていると思うんですが、「決定的な違い」というのが良く分からないんです。
シェルスクリプトの方がもっと高機能だと思うんだけど、まだ手習いなもので。
素人目だと、プロセス管理とか、分岐処理とかがやり易いのかなあっていうぐらいしか分からないです。
あ、例えばパイプ処理が並列で行われているとか、それに伴う途中経過の違いとかいうのは分かるんですけど、実用上、
具体的にこんな違いがあるっていうのが、どうもピンと来ないんです。

バッチとシェルスクリプトの決定的な(ツール程度では埋めようの無い)、実用上の相違点を、具体的に幾つか挙げていただけると嬉しいです。

もちろん煽りじゃないです。


25 :Win厨房:2001/05/20(日) 13:37
command.com氏ね
Winにもshを標準搭載して欲しい

26 :名無しさん@お腹いっぱい。:2001/05/20(日) 14:48
>>24
awk と、perlとの違いみたいなモンでしょ。
短いときはそんなにかわらんし、長くてもその気になりゃ
どうにかなるけど、同じことをするのに必要な労力が違う。
あ、スクリプトじゃないけど、一つだけ。
DOSを書き込み保護したフロッピーで起動して、
CD-ROMかなんかのファイルをパイプして加工して表
示させようとしたとき、
「ディスクに書き込めませんだぁ?なめんなぁ!!!」
それまで、command.comが一時ファイルつくるのしらんかった。
HDDがトラブってリカバリ中だったから、えらい困った
同じ理由で、マルチタスクじゃないってのはイタイな。
そういや、コマンドが戻り値を返さないのもダメ。
なんだ、結構あるか。

>>23
for i in `cat csvファイル`
do
awkできりわけ
ユーザー登録コマンド
done

27 :名無しさん@お腹いっぱい。:2001/05/20(日) 16:35
>>26

おお!ありがとうございです!!
ちょっとやってみます

さすが2chはえー

28 :名無しさん@お腹いっぱい。:2001/05/20(日) 17:13
>>26
書込み保護FDからDOS起動すると
A:\>type hoge.txt | more
すら使えなくてナ。
# command.com sage


29 :名無しさん@お腹いっぱい。:2001/05/20(日) 19:38
hoge.ext | more ができるのに、
hoge.bat | more ができない、そんな DOS を愛してます。

30 :名無しさん@お腹いっぱい。:2001/05/20(日) 22:20
そうそう、いちいち直交性がないんだよな..>>DOS
c:\windows> cd d:
ってやっても、カレントディレクトリが変わってなくて
びっくりするし。


31 :名無しさん@お腹いっぱい。:2001/05/20(日) 23:02

                 / ̄ ̄ ̄ ̄ ̄
                 | はやくこの板が
                 |  あらし厨房だらけになって
     ,__     |    逝ってくれますように
    /  ./\    \_____
  /  ./( ・ ).\       o〇       ヾ!;;;::iii|//"
/_____/ .(´ー`) ,\   ∧∧         |;;;;::iii|/゙
 ̄|| || || ||. |っ¢..|| ̄   (,,  ) ナムナム   |;;;;::iii|
  || || || ||./,,, |ゝ iii~   ⊂  ヾwwwjjrjww!;;;;::iii|jwjjrjww〃
  | ̄ ̄ ̄|~~凸( ̄)凸 .(  ,,)〜 wjwjjrj从jwwjwjjrj从jr



32 :12:2001/05/21(月) 19:18
12 です。
>>24 さんはわかっておられるようですが、
DOS と sh との echo * の違いなども開発時のチョイツールを作ったときに
いらいらします。
自作の sed -e 'hogehoe' なんて処理は
#!/bin/sh
cat $* | sed -e 'hogehoge'
としておくだけでも使い道は広がります。
ps | filter とか filter data/* のどちらも OK でしょ。

標準エラー出力ないのも DOS の弱点です。(WinNT 系はあるようですが)
hoge.exe > test1 としたとき、
Usage: hoge.exe [-options]
なんてファイルが作られるとかなり萎えます。
sh では hoge > test1 としてもエラーは tty(画面)に出力されるし、
同様に安心して hoge | mail foo@bar も出来る。

だから、
echo "Usage: hoge [-options] [file ...]" はダメ。
echo "Usage: hoge [-options] [file ...]" >&2 とすべし。
C でも printf(...) でなく、fprintf(stderr, ...) と書くべし。
となるのです。


33 :名無しさん@お腹いっぱい。:2001/05/21(月) 20:40
csh系でスクリプト作るやつはヴァカという
おなじみの煽りがまだないな。

34 :名無しさん@お腹いっぱい。:2001/05/21(月) 22:39
>>33
言うまでも無いことでしょ
別に煽る必要は無いもの

35 :名無しさん@お腹いっぱい。:2001/05/22(火) 00:09
ほんとにそうかなぁ。
高々数10ステップのスクリプトだったら、csh でもいいじゃん。
ただの都市伝説じゃないの?

36 :22(偽):2001/05/22(火) 00:17
>>26
つーか具体的なソースを教えてくださいよー
今度50人追加しろっていわれてるんだよー
なぜかおいらなんだよー
すみません
できれば真珠で…
ぁぅぁぅ〜


37 :名無しさん@お腹いっぱい。:2001/05/22(火) 00:21
>>35 同意。csh のマズいところをちゃんと理解して、
csh でも問題ない局面で使うんならおっけーだろ。
なんでもかんでも No! っていうアホがいて困るんだよね。
つーか、csh 使いはふつー .xsession を csh で書かないか?

38 :名無しさん@お腹いっぱい。:2001/05/22(火) 00:35
>37
同意。すぐに右へならえで真似して言い出すんだよな。
自分で判断することが出来ないっていうか。
んでシェルスクリプトだけど,
そんなに今時シェルスクリプトが多用される局面ってあるの?
俺はシェルスクリプトはそんなに詳しくない。
ちょっとした事ならrubyで書くし。


39 :名無しさん@お腹いっぽい。:2001/05/22(火) 01:20
>>33
>>8参照。。。

けど、なぜ?<cshはヴァカ
tcshはどうなん?


40 :名無しさん@お腹いっぽい。:2001/05/22(火) 01:29
>>26
>そういや、コマンドが戻り値を返さないのもダメ。

たしか戻り値あったと思うけど?
じゃないと if errorlevel の意味が無い…


41 :名無しさん@お腹いっぱい。:2001/05/22(火) 01:43
csh系でスクリプト作るやつはヴァカ

42 :名無しさん@お腹いっぱい。:2001/05/22(火) 02:01
コマンドの羅列だったら別にcsh scriptでもなんでもいいけど。
csh scriptって関数も使えないし。

43 :名無しさん@お腹いっぱい。:2001/05/22(火) 07:40
>>37
俺login shellはtcshだけど、.xsessionその他スクリプトのたぐいは
全部bourne shellだし、コマンドラインで難しいことするときはsh -c
から始めるけど…

44 :名無しさん@お腹いっぱい。:2001/05/22(火) 10:45
cd /
file /bin/* /sbin/* /usr/bin/* /usr/sbin/* | grep Bourne | wc
FreeBSD4.3では
Bourne shell 43
perl script 30
全部 747
でした。perlよりshell scriptのほうが多いとは知らなかった。


45 :35:2001/05/22(火) 13:53
35 です。(じつは >>12 だったりもする)
| 高々数10ステップのスクリプトだったら、csh でもいいじゃん。
なのですよ。「関数がない」とか、「標準エラー出力へのリダイレクトが出来ん」とかは
そのとおりなのだが、shell プログラムへの登竜門という意味でもよいと思う。
使い捨てのスクリプトなら csh でもよいかと。

% echo "私も他人に参照されるのは sh で書いてます(逃)" | sh -c 'cat 1>&2'

46 :37:2001/05/22(火) 15:03
そういえばまだ出てないね。なぜ csh で書くのがよくないか。↓
http://www.klab.ee.utsunomiya-u.ac.jp/~hiroki/csh-whynot.euc
逆に言えば、スクリプト中でここで挙げられているようなことを
しないのであれば、csh でも特に問題なし。

>>43
#!/bin/csh で .xsesssion を書くと(#!/bin/csh -f にあらず)、
いちいち指定しなくても .xsession から起動されるいくつものアプリが
すべて .cshrc に記述されたパスや環境変数を引き継いでくれるので、
これに限っては #!/bin/sh で書くよりメリットが大きいと思う。

まあ、かく言う俺も、.xsession と .cshrc 以外はすべて sh で書くけどな(藁
csh の欠点に気を使いながらスクリプトを書くぐらいなら、はじめから
sh で書いた方がマシ。

47 :名無しさん@お腹いっぱい。:2001/05/22(火) 16:54
cshの文法忘れちゃった。

48 :名無しさん@胸いっぱい。:2001/05/23(水) 00:09
 君の調査能力に問題があるからだ、などと言われるのは痛いね。
MLで見ている方も辛いよ。

シェルスクリプト
http://cocoa.2ch.net/test/read.cgi?bbs=unix&key=986399328&ls=50

 リンク張っとくよ。

49 :名無しさん@お腹いっぱい。:2001/05/23(水) 14:56
$ file /bin/* /sbin/* /usr/bin/* /usr/sbin/* | grep 'c shell'
/usr/bin/vgrind: C shell script text

僅かに存在。


50 :名無しさん@お腹いっぱい。:2001/05/23(水) 16:34
>>40
そうっすよね。わざわざreturn()しないことに意味があるかなー。


51 :q:2001/05/28(月) 15:01
bshを使っているのですが
数値を格納してある変数の内容をいつも5桁に、
たとえば
n = 10 → 00010
n = 111 → 000111

という風に保持、または出力時にだけ
そのような形にして出力できるようにしたいのですが
どうすれば良いでしょう?

桁数を調べるコマンドとかありますか?


52 :37:2001/05/28(月) 15:21
000111 は6桁に見えるが気のせいか?

$ n=10
$ echo $n
10
$ printf '%05d\n' $n
00010
$ echo 00000$n | sed 's/.*\(.....\)$/\1/'
00010


53 :名無しさん@お腹いっぱい。:2001/05/28(月) 21:27
古いつっこみだが、
>>25
もしWin2000使ってたら一度
>if /?
>for /?
>exit /?
>call /?
とかやってそれぞれのヘルプ見てごらん。DOSの頃からすると死ぬほど
拡張されていて目が点になるから。

# でも行き当たりばったりな拡張で文法滅茶苦茶だし、かゆい所に手が
# 届かないダサい仕様で「素直にsh使わせろゴルァ!」と思うけど(w

54 :名無しさん@お腹いっぱい。:2001/05/28(月) 23:40
>>53
あくまで推測ですが、そりわcmd.exeでわ亡いかと。
いや、MS-DOS6.2/V以来使ったことないんで、ホントに推測ですが。
と、上をみながら逝ってみる

 「 ・_ D |
 | ・   /



55 :名無しさん@お腹いっぱい。:2001/05/29(火) 12:52
|:-D;

56 :[ここ壊れてます](2):[ここ壊れてます]
[ここ壊れてます]
57 :七資産:2001/06/24(日) 22:29
cshも関数が使えるといいんだけど。。。
標準エラーを、ファイルに落とすときは、bsh系よりも、csh系の方が
楽なんだけどね。。。
ファイルディスクリプタの制御をとるか、簡便さをとるか。。。
TPOにあわせてってとこか。。。

58 :名無しさん@お腹いっぱい。:2001/06/24(日) 22:47
古い話だが
>>53
Win32 なら WSH 使うでしょ。言語も JScript ならかなりまともだし、
ActiveX コントロールを呼び出せるから Cygwin なんかの sh より
も使い勝手が良いよ。

59 :名無しさん@お腹いっぱい。:2001/07/08(日) 14:37
bashにtcshのコンプリートみたいなのありますか?

たとえば、javacには、*.javaしか反応しないとか。

60 :名無しさん@お腹いっぱい。:2001/07/08(日) 15:18
completionはあるけど、tcshみたいに強力じゃない。

61 :名無しさん@お腹いっぱい。:2001/07/08(日) 22:28
ありがとうございます。

zshスレもあるので、zshでも使おうかと思います。

62 :名無しさん@お腹いっぱい。:2001/07/10(火) 09:49
最近来るようになったので化石レス

>>1
sharの出力とか、comp.unix.shellとかが結構いいかと。
僕はそういうのとman shで自習しました。

>>5
Linuxのinitとかbashでゴリゴリ書いてあって最悪なので、
今一汎用的な題材にはならないかなと。もちろん題材に
適したinitもあるのは分かってますけど。

>>24
evalと`がないのが辛いです。後、shのifなんかはその後のコマンドを
実行した結果で動作を変えるので、if [ $i = 10 ]; thenとか
if grep $pat $data; thenとか、if perl -e $script $data; thenとか
なんでも組み合わせれる、その自由度が好きです。

>>45
cshは括弧や改行を強制されるのが嫌っす。

>>52
exprももっと使ってあげましょう。
$ expr 00000$n : '.*\(.....\)'
00010

63 :名無しさん@お腹いっぱい。:01/09/01 15:19 ID:Kh4c3TBg
ログインシェルがtcshだから、最低限bashを起動するまでの
処理くらいはcshで書けるようになりたいんだけど、
man cshを読むのはつらすぎるし、かといってパクるべき
スクリプトも少ない・・・
とりあえずコピペで単純にbashを起動するだけのものは
出来たけど、それ以上のことをやるために、わざわざ
shのスクリプトを書いて、環境変数を設定するcshスクリプトを
生成させて、.cshrcからsourceしたりと、相当バカ臭いこと
やる羽目になっている。
どこかにいいサイト無いかな。

64 :名無しさん@Emacs:01/09/02 03:14 ID:ok8jFRRg
>>63
> ログインシェルがtcshだから、最低限bashを起動するまでの
> 処理くらいはcshで書けるようになりたいんだけど、

~/.login に
exec /usr/local/bin/bash -c "exec -l /usr/local/bin/bash"
じゃだめか?

65 :名無しさん@お腹いっぱい。:01/09/02 11:00 ID:BFF6eeAs
>>63
素直に chsh しとけ。

66 :名無しさん@お腹いっぱい。:01/09/02 11:36 ID:c/03xBX6
chsh不可なので、
if ( $?prompt == 1) then
exec bash
endif
とするしかない(のだそうだ)。
で、その前にいろいろ環境変数がらみで小細工するべく、
(TERMを見るとかXのフォワーディングの有無を調べるとか)
login.sh
source environ.csh
(environ.cshはlogin.shで生成)
という暴挙に出ているわけ。

67 :名無しさん@お腹いっぱい。:01/09/02 12:40 ID:YcKhn1C2
#! /bin/sh
/usr/local/bin/giko2mona `ls /var/sage/`

自作のPerlスクリプトgiko2monaに、/var/sage/配下の*.txtを
引数として渡したいんですが、あってますか?
って言うか、うまく動かないのよ(/var/sage/のファイル一個しか渡せない)

68 :名無しさん@お腹いっぱい。:01/09/02 12:47 ID:6pXzN7wU
>>67 その自作スクリプトの方で複数パラメータにちゃんと対応してるの?

69 :名無しさん@お腹いっぱい。:01/09/02 12:56 ID:YcKhn1C2
>>68
>複数パラメータ
これの意味すらワカランので逝って良しですな・・・・

70 :名無しさん@Emacs:01/09/02 13:10 ID:3kI.a/rI
>>69
@ARGV

71 :名無しさん@お腹いっぱい。:01/09/02 16:06 ID:c/03xBX6
そもそも複数パラメータに対応していたらシェルスクリプト
要らないだろ。aliasで十分。しかもlsも要らない。
ワイルドカードがどうやって展開されるのか勉強した方が
いいだろう。
ファイル1個しか渡せないと言うなら、giko2monaの方では
最初に与えられたパラメータしか解釈しないで、他は無視する
仕様になっているようだから、シェルスクリプト側で対応するなら
#!/bin/sh
for file in /var/sage/*; do
test -f "$file" && /usr/local/bin/giko2mona
done
giko2monaの方をいじってもいいけど。

72 :名無しさん@お腹いっぱい。:01/09/02 16:07 ID:c/03xBX6
おっと、/usr/local/bin/giko2mona "$file"だった。

73 :名無しさん@お腹いっぱい。:01/09/03 04:57 ID:NF.CDf1M
「df」や「vmstat」のコマンドで表示されるモノを、
echoで表示させるにはどうすればいいのでしょうか。

74 :73:01/09/03 05:51 ID:NF.CDf1M
ここで書き込んだ後、書き込みが反映されてなかった
ようなんでLinux板で同じ書き込みしちゃいました。
73番は無視しちゃってください。。。
この板は書き込んだ後ラグがあるのかな?

75 :名無しさん@お腹いっぱい。:01/09/03 17:03 ID:AMWgM1Ug
日付(文字列)から年齢を求めるのに一番スマートな方法ってなんですかね?

76 :名無しさん@Emacs:01/09/03 19:12 ID:Gdo.plg.
% expr `date +%s` - `date --date 1970/1/23 +%s` | awk '{print strftime("%Y", $0)-1970}'
31

うーん、スマートじゃないなぁ。別解求む。
これだと1969年以前の生まれは計算できないかと思いきや、
1934年までは大丈夫だった。けっこういい加減らしい。> GNU date

77 :名無しさん@お腹いっぱい。:01/09/05 10:18 ID:ati0G6T2
echo で番号つきのメニューを表示し,
数字の入力をうながして,
入力された数字に応じた処理をシェルスクリプトで
実現するにはどのようにしたらいいのでしょうか?

78 :名無しさん@お腹いっぱい。:01/09/05 11:04 ID:afdg/tE2
>>77
#!/bin/sh
echo "input 1 or 2"
read n
case "$n" in
1)
  echo "selected 1"
  ;;
2)
  echo "selected 2"
  ;;
*)
  echo "error"
esac
return 0

79 :名無しさん@お腹いっぱい。:01/09/05 11:07 ID:afdg/tE2
最後のreturn 0 はいらんかった。うちゅ。

80 :77:01/09/05 13:09 ID:ati0G6T2
>>78
ありがとうございます
勉強になりました

81 :マターリ:01/09/11 20:47
保守あげ

82 :名無しさん@お腹いっぱい。:01/09/14 17:15
指定したディレクトリ以下にある,
指定した(複数の)拡張子のファイルのみを
できればディレクトリ構造を保ったまま
圧縮したいのですけど,
そのようなシェルスクリプトはどのように書けばいいのでしょう?

83 :名無しさん@お腹へった。:01/09/14 17:41
# usage: command <tar_filename> <dir> <suffix1> [<suffix2> ..]
TARF=$1
shift
DIR=$1
shift

rm $TARF ${TARF}.gz
for i in $*
do
tar rvf $TARF `find . -name "*.$i"`
done
gzip $TARF

84 :名無しさん@お腹へった。:01/09/14 17:43
# cd 忘れた。
# usage: command <tar_filename> <dir> <suffix1> [<suffix2> ..]
TARF=$1
shift
DIR=$1
shift

rm $TARF ${TARF}.gz
cd $DIR
for i in $*
do
tar rvf $TARF `find . -name "*.$i"`
done
gzip $TARF

85 :名無しさん@お腹いっぱい。:01/09/14 20:59
>>84 も悪くはないケド
find . \( -name \*.txt -o -name \*.doc -o -name \*.html \) -print | xargs tar cf - | gzip -v9 > hoge.tgz
で、コマンドライン一行で済むYO!
(でもちょっと長いか…)

86 :名無しさん@お腹いっぱい。:01/09/15 02:35
>85 ファイル数が多くてxargsがtarを分割しちゃったら終わる……

87 :名無しさん@お腹いっぱい。:01/09/16 00:31
>>75
うつくしくないかな・・・

#!/bin/sh
if [ $# -eq 1 ]
then
currentdate=`date`
birthdate=$1
elif [ $# -eq 2 ]
then
currentdate=$1
birthdate=$2
else
echo "usage: countage [curennt] birthday"
exit 1
fi
currentyear=`date -d $currentdate +%Y`
currentmonth=`date -d $currentdate +%m`
currentday=`date -d $currentdate +%d`
birthyear=`date -d $birthdate +%Y`
birthmonth=`date -d $birthdate +%m`
birthday=`date -d $birthdate +%d`
if [ $currentmonth -gt $birthmonth ]
then
age=`expr $currentyear - $birthyear`
elif [ $currentmonth -eq $birthmonth ]
then
if [ $currentday -ge $birthday ]
then
age=`expr $currentyear - $birthyear`
else
age=`expr $currentyear - $birthyear - 1`
fi
else
age=`expr $currentyear - $birthyear - 1`
fi
echo $age

88 :名無しさん@お腹いっぱい。:01/09/16 00:40
訂正。
4c4
< currentdate=`date`
---
> currentdate=`date +%Y/%m/%d`

89 :operator:01/09/16 02:40
>>86
find . \( -name \*.txt -o -name \*.doc -o -name \*.html \) -print | tar -cT - -f hoge.tar.gz
-T使えない人はゴメン

90 :マターリ:01/09/27 11:50
保守

91 :名無しさん@お腹いっぱい。:01/12/12 23:37
age

92 :名無しさん@お腹いっぱい。:01/12/12 23:52
one linerだと、空白の含まれたファイル名が面倒だね。

93 :名無しさん@お腹いっぱい。:01/12/13 00:27
>>92
find . \( -name '*.txt' -o '*.doc' -o '*.html' \) -print0 | xargs -0 tar cf - | gzip -cv9 > hoge.tgz

94 :名無しさん@お腹いっぱい。:01/12/13 12:36
シェルスクリプトで,.やsourceを使わずに環境変数を変えられますか?
また,tcshでインタラクティヴなスクリプトを書きたいんですけど,sh系のreadに当たるものはないんでしょうか.

95 :名無しさん@お腹いっぱい。:01/12/13 12:58
>>94
> シェルスクリプトで,.やsourceを使わずに環境変数を変えられますか?
何がしたいんですか?

96 :スクリプト初心者:01/12/13 19:41
#!/bin/sh
PATH="/usr/bin:/usr/ucb"
export PATH

ME=`basename $0` # my name.
FING_OPT="-s" # default option for finger (short format).

for i in "$@"; do # parse option.
case $i in
-l) # output finger with long format.
FING_OPT="-l"
;;
-s)
FING_OPT="-s" # output finger with short format.
;;
-h|*) # output usage.
echo "usage: $ME [-l|s] [-h]" >&2
exit 1;
;;
esac
done

for i in `ls /home2/a54`; do
finger $FING_OPT $i
done

でbasenameを利用している理由がわかる人はいますか??

97 :名無しさん@お腹いっぱい。:01/12/13 21:02
>>96
man basename

98 :名無しさん@お腹いっぱい。:01/12/13 23:49
basenameを初めて知って、試しに既存のスクリプトに
適用してみたとか?

99 :94>95:01/12/14 20:01
CLASSPATHを変えるとともに,shellの初期化ファイル(.tcshrcなど)を書き換えるスクリプトを書いたんです. Shellの初期化ファイルは.ってやらなくても変えられますが,今いるshellは変わってくれないので・・. .とかやらずに済むほうがいいなあと思ったんですが.

100 :94>:01/12/14 20:02
ああ,それから,tcshでreadにあたるものは自己解決しました.

101 :名無しさん@お腹いっぱい。:01/12/14 20:11
>>99
日本語で書いてください

102 :モエ:01/12/26 22:33
UNIXシェルについて教えてください。

/home/log というディレクトリに
test.logというログファイルがあるとします。

そのファイルをシェルスクリプトのループ文内で
1行ずつprintさせるには、どのようなコマンドを書けば
1行ずつ表示されますか?

教えてください。
お願いします。

103 :モエ:01/12/26 22:37
すいません。

1行ずつprintさせるというよりも
1行ずつ変数に入れる間違いです。


for hensu in (XXX)
do
print $hensu
done


XXXに入るコマンドを教えてください。
foreachを使うんでしょうか?

104 :名無しさん@お腹いっぱい。:01/12/26 22:44
for hensu in `cat filename`
do
print $hensu
done
` はバックスラッシュ

105 :モエ:01/12/26 22:48
返答ありがとうございます。

filenameの1行目が例えば・・・。
「aaa bbb ccc ddd」とスペース区切りでも
hensuの中身を表示させると・・・。

print $hensu
→aaa bbb ccc ddd


・・・となるんですよね?あ

106 :104:01/12/26 22:52
あ。まちがい。

#!/bin/sh

IFS="
"

for i in `cat kyo.log`
do
echo $i
done
に訂正。

107 : ◆W2FsDB0Y :01/12/27 00:06
#!/bin/ksh
exec 3< /home/log/test.log
while read -u3 i
do
echo $i
done
exit 0

108 :名無しさん@お腹いっぱい。:01/12/27 00:18
sh, csh, ksh, tcsh, bash, zsh の機能比較をしているサイトないでしょうか。

MacOS X の tcsh はコマンドをタイプミスすると正しいコマンドを推測して候補を
挙げてくれるんだけど、これって何ていう機能でどうやって実現してるのですか?
ksh, bash, zsh 辺りで同様の機能を実現する事は可能ですか?
可能ならポインタだけでも教えてください。

先生、お願いします。

109 :名無しさん@お腹いっぱい。:01/12/27 00:22
zsh 最強。

とか言ってみるテスト。

110 :100:01/12/27 00:26
>>101
zsh は拡張多すぎて訳分からんですよ。
zsh 使って >>100 の答えをお願いしますですだ。
正しいコマンドの候補を挙げさせる方法でござるよ。

111 :110:01/12/27 00:34
間違った。

>>109
zsh は拡張多すぎて訳分からんですよ。
zsh 使って >>108 の答えをお願いしますですだ。
正しいコマンドの候補を挙げさせる方法でござるよ。

>>100 さん、忝い。

112 :名無しさん@お腹いっぱい。:01/12/27 00:38
他は知らんがzshだと
% rop [~]
zsh: correct 'rop' to 'top' [nyae]? y

んでyを選べば正しいのになる

113 :112:01/12/27 00:39
ってか、これシェルスクリプトとはあんまり関係ないよな。

114 :名無しさん@お腹いっぱい。:01/12/27 00:43
tar xzvf [TAB]
の時、選択肢に*.gzを選んでくれるのはzshの機能なのかな。
ちゃんと
atr xjvf [TAB]
と時は*.bz2を選んでくれる。

シェルスクリプトとは関係無いのでsage

115 :名無しさん@お腹いっぱい。:01/12/27 01:38
>>112
ならないけど、初期設定ファイルに何か書く必要ある?
やり方教えて

116 :勉強厨房:02/01/09 23:08
ageましょう

117 :名無しさん@お腹いっぱい。:02/01/11 17:56
csh はなぜ「使うな」と言われているんでしょうか?
失敗談キボーン

118 :うひひ:02/01/11 18:03
>>117
便利な生活の為にチョコ書きすんなら
こまけーこと気にしないでダイジョブ
ただ実害の要点をふまえて書けば良いんじゃないの。

鬼の要にスクリプト職人になるならボンシェルの方がいいのかもな
まぁ過去ログくらい全部読みなさいってこった。

119 :いひひ:02/01/11 18:51
>>117
http://faqs.jmas.co.jp/FAQs/csh-whynot-jp

まあ、cshの仕様的に駄目だ、という事らしい。

120 :117:02/01/11 21:41
仕事の前例が csh なのでそのまま逝くしかない。

121 :名無しさん@お腹いっぱい。:02/01/15 10:49
cshがなぜ悪いのか理解して、cshでも問題ない用途に使うならまったく問題なし。
頭ごなしにcsh使うなshで書けと言う方がアホ。
もちろん、cshで面倒なことでもcshでやろうとするのはアホ以下。

122 :名無しさん@お腹いっぱい。:02/02/13 00:23
初めて書いたスクリプト(プログラム)です。とりあえず期待どおり動くのですが
どうもスマートじゃないみたい。先輩がた添削お願いします。

#!/bin/sh
#
# aptのsource変更を簡潔に行うスクリプト。
# aptctrl (woody | testing) => aptのsourceをtestingへ
# aptctrl (sid | unstable) => aptのsourceをunstableへ

# backup
cp /etc/apt/sources.list /etc/apt/sources.bak
# temp作成
cp /etc/apt/sources.list /etc/apt/sources.tmp

# 引数の数チェック
if [ $# -eq 0 -o $# -gt 1 ]; then
# 0個もしくは2個以上ならエラー。usage表示して終了
echo 'aptctrl is script to easy-setting /etc/apt/sources.list'
echo 'usage: aptctrl ( (woody | testing) | (sid | unstable) )'
exit 1
# 引数の内容チェック
elif [ $1 = woody -o $1 = testing -o $1 = sid -o $1 = unstable ]; then
# 変数sssへ引数を代入。(woody|testing)若しくは(sid|unstable)か判定
# sss="#"を除く 、aaa="#"を付加する
sss=$1
if [ $1 = "woody" -o $1 = "testing" ]; then
sss="testing"
aaa="unstable"
elif [ $1 = "sid" -o $1 = "unstable" ]; then
sss="unstable"
aaa="testing"
fi
# どちらへ変更するか表示
echo ${sss}
# sedによりdebian.org + (testing | unstable)を含む行の先頭の"#"を置き換え
sed -e "s/^#\(.*debian\.org.*\) ${sss}\(.*\)/\1 ${sss}\2/g" /etc/apt/sources.tmp > /etc/apt/sources.tmp2
sed -e "s/\(^deb.*debian\.org.*\) ${aaa}\(.*\)/#\1 ${aaa}\2/g" /etc/apt/sources.tmp2 > /etc/apt/sources.list
# tempファイル削除
rm -f /etc/apt/sources.tmp*
else
# 引数が(woody|testing)若しくは(sid|unstable)以外の場合はエラー表示。
echo "argment error: woody or sid please."
fi


123 :リックトム:02/02/13 01:34
教えてください。
例↓

aaa="test /home/test/log/*.log xxx yyy"
cnt=1

for bbb in `print $aaa`
do
print $bbb
(( cnt=$cnt+1 ))
done

exit 0


上記のスクリプトで、$aaaをスペース区切りで
>test
>/home/test/log/*.log
>xxx
>yyy

とprint出力したいのですが
cnt=2の時の$bbbの出力の際に
変数bbbを単なる文字列の"/home/test/log/*.log"とせずに
/home/test/logのディレクトリの中にある*.logにマッチする
全てのファイル名を出力してしまうんです。

文字列として、/home/test/log/*.log"と出力するには
どうしたら良いのでしょうか?

乱文申し訳ありません。

124 :名無しさん@お腹いっぱい。:02/02/13 01:38
まずシェルに関係ない部分から。
・引数処理に一貫性がなく分かりにくい。
 $1の中身のチェックが外側のelifと内側のif...elif
 で二重に行われているのは見通しが悪い。
・変数名がaaa,sssじゃ何なのかすぐに分からない。
・usageの表記が一般的でない。(括弧の使い方とか)
 woody|testing|sid|unstableみたいに書くとか、
 ただversionと書いて2行目に候補を書くとかにする。
・最初のsss=$1は何のため?
・sources.tmp2だけでいいのでは?sources.tmpは
 書き換えられていないようだが。
次にシェルスクリプトとして。
・testで-oをわざわざ並べなくとも、case文でwoody|testing)
 みたいに書ける。
・$1がきちんと""で囲まれていない。
・sedで相当トリッキーなことをやっているが、分かりにくいし、
 GNU版以外のsedでも動くとは限らない。awk使え。
・細かいことだが、バックアップはcpよりmvのほうが
 タイムスタンプが変わらなくてgood。

125 :124:02/02/13 01:41
124は>122ね。
>123
aaa="test '/home/test/log/*.log' xxx yyy"
では駄目?つーかなぜprint?

126 :122:02/02/13 01:49
>>124
先輩指摘ありがとう!
とりあえず今日は寝ます。
明日書き直して書き込みます。
よろしこ。

127 :リックトム:02/02/13 01:56
>つーかなぜprint?

やりたい処理は、ちょっと違うんですが
変数に代入する時に、printコマンドを使っているので・・・。

test /home/test/log/*.log xxx yyy
この各フィールドを変数に代入したいのです。



128 :名無しさん@お腹いっぱい。:02/02/13 02:34
>>124
タイムスタンプ変わらないんだったらcp -pでもいーじゃん

129 :名無しさん@お腹いっぱい。:02/02/13 07:32
128さんに一票

130 :名無しさん@お腹いっぱい。:02/02/13 08:32
>>128
cp -p だと、
i-nodeが変わってしまう。
ハードリンクが切れてしまう。
本題からそれるが、ファイルのバックアップなら、
mvしてからcp -pで戻すのが最良。


131 :名無しさん@お腹いっぱい。:02/02/13 09:19
>>130
それだと一瞬ファイルが存在しなくなる。
inode number の保存までこだわるなら
ln file bakup
cp -p file tmp
mv tmp file
かな。

132 :名無しさん@お腹いっぱい。:02/02/13 19:43
まあsources.lst程度にそこまでの安全性を
求めなくても・・・

133 :122:02/02/14 00:57
書き直してみました。
>>124さんの指摘の内、sedでなくてawk使え、は納得いきませんです。
なるべくシステムへの負担を最小限に抑えるという観点からはsedでいいのでは?
Ruby > Perl >>> awk >>>>> sed (負荷の大きさ) と勝手に認識しているのですが。。。
あとバックアップの件は勉強不足なのでとりあえずcp -pで。

#!/bin/sh
# aptctrl -- aptのsources.list変更を簡潔にコントロールするスクリプト。
# DATE:2002/02/12 AUTHOR:shinmai
# aptctrl (woody | testing) => aptのsourceをtestingへ
# aptctrl (sid | unstable) => aptのsourceをunstableへ

# backup
cp -p /etc/apt/sources.list /etc/apt/sources.bak
# temp作成
cp -p /etc/apt/sources.list /etc/apt/sources.tmp

# 引数の数チェック
if [ "$#" -eq 0 -o "$#" -ge 2 ]; then
# 0個もしくは2個以上ならエラー。usage表示して終了
echo '$ID: aptctrl v0.01 2002/02/13 by shinmai'
echo 'Usage: aptctrl woody|testing|sid|unstable'
echo 'aptctrl is a script to easy-configure /etc/apt/sources.list'
exit 1
fi

# 引数の内容チェック
case "$1" in
# (woody|testing)の場合
woody|testing )
echo "set to testing(woody)."
comment="unstable"
uncomment="testing"
;;
# (sid|unstable)の場合
sid|unstable )
echo "set to unstable(sid)."
comment="testing"
uncomment="unstable"
;;
# 上記以外の場合はエラー。引数の説明を表示して終了
*)
echo 'argment error: "woody" or "sid" please.'
exit 1
;;
esac

# sedによりdebian.org + (testing | unstable)を含む行の先頭の"#"を置き換え
sed -e "s/^#\(.*debian\.org.*\) \(${uncomment}.*\)/\1 \2/g" /etc/apt/sources.tmp | sed -e "s/\(^deb.*debian\.org.*\) \(${comment}.*\)/#\1 \2/g" > /etc/apt/sources.list
# tempファイル削除
rm -f /etc/apt/sources.tmp


134 :名無しさん@お腹いっぱい。:02/02/14 12:00
>>>124さんの指摘の内、sedでなくてawk使え、は納得いきませんです。
>なるべくシステムへの負担を最小限に抑えるという観点からはsedでいいのでは?

この程度の負荷なんてクソみたいなものだから、
そんなことよりもメンテナンスのしやすさを重視すべき。

もっとも、awk では正規表現でマッチした部分文字列を \1 \2 で参照できず、
ほかの手段を用いる必要があるので、awk を使うとなるとかえってわかりにくくなる。
awk を使えという指摘が的外れであるのは間違いない。
# gawk 3.0 以上のみに存在する gensub() を使えば可能

135 :名無しさん@お腹いっぱい。:02/02/14 12:19
と思ったけど、ごめん。この場合は sed でも awk でもどっちでもいいや。
\1 なんて使う必要ないやんけ。

sed -e "/^#.*debian\.org.* ${sss}/s/^#//" -e "/^deb.*debian\.org.* ${aaa}/s/^/#/" /etc/apt/sources.tmp > /etc/apt/sources.list

awk '/^#.*debian\.org.* '${sss}'/{print substr($0,2)} /^deb.*debian\.org.* '${aaa}'/{print "#" $0}' /etc/apt/sources.tmp > /etc/apt/sources.list

動作未確認。ダサ。

136 :124:02/02/14 15:59
awk使えってのは単に\1とか使えないsedでも
大丈夫なようにってつもりだったんだが、>135
のやり方で良かったんだよな。
一回sedでとんでもないの書いて以来ちょっと
複雑になると条件反射でawkを持ち出してしまう・・・
逝ってきます。
>133
嘘のようにきれいになったね。
一ヵ所だけ。引数チェックは[ "$#" = 1 ]だけでOK。

137 :XP反対!:02/02/19 21:27
よろしくお願いします。

ppp="abc xyz"
abc=123
xyz=789

for bbb in $aaa
do
echo $bbb
#↑このechoコマンドで、123、789と出力するには、どうしたら?
done

exit 0

変数で入ってきた値を変数として、見られますか?


138 :XP反対!:02/02/19 22:20
age


139 :名無しさん@お腹いっぱい。:02/02/19 23:52
wakarimasen

140 :名無しさん@お腹いっぱい。:02/02/20 00:49
eval echo \$$bbb


141 :名無しさん@お腹いっぱい。:02/02/20 01:34
>>140 よくわかったね... そういうことをやりたかったのか。
echo "123、789"
とか書いちゃうところだった予。


142 :Win2K大好き:02/02/20 08:00
140さん

ありがとうございます。

やってみます。

143 :Win2K大好き:02/02/20 23:33
eval echo '$'$bbb

これでできました。

144 :名無しさん@お腹いっぱい。:02/02/23 01:24
> #!/bin/sh
> echo "aaa" | hoge | read VAL trash
> echo "${VAL}"
とやっても$VAL には何も入ってくれません。
これって
> VAL=`echo "aaa" | hoge | gawk '{ORS="";print $1;exit}'`
とかするしかないんでしょうか?


145 :名無しさん@お腹いっぱい。:02/02/23 01:26
>144 hogeの出力を見せてん。

146 :144:02/02/23 01:36
hoge ってゆーかぢつは md5sum なんだけど
> 5c9597f3c8245907ea71a89d9d39d08e -
こんなかんじ
で、うしろの - はすてたいのである。




147 :145:02/02/23 02:12
>146 うーむ、あまし関係なかった。shell variableの寿命の問題。
$ echo aaa -
aaa -
$ echo aaa -|read VAL trash; echo ${VAL}

$ echo aaa -|(read VAL trash; echo ${VAL})
aaa
$


148 :144:02/02/23 13:03
>> 145 thx.
しかし、その変数使っていろいろやりたいから
そこで () でくくってしまうと面倒だな・・・


149 :145:02/02/23 13:16
>148 while-do-doneでくくる手もあるYO。
$ echo aaa -|while read VAL trash; do echo $VAL; done
aaa
嫌ならexportすれ。

150 :145:02/02/23 13:35
>148 元はといえばGNU md5sumがものすごくださいのが原因なので、どこかから
別の実装のmd5(1)をもってきて使うとか、opensslを使うとか(openssl md5 < foo)、
してしまうのもいいかな。


151 :144:02/02/23 15:01
オリジナルの MD5 ftp://ftp.cerias.purdue.edu//pub/tools/unix/crypto/md5/
を持ってくることも考えたんだけど、それ必須になるとせっかくの shell のポータビリティが
なくなってしまう。自分で使うだけならいいんだけどね。
export しても () から出ると消える?
なんて面倒だな・・・と。


152 :145:02/02/23 15:12
>151 exportするのは一番最初に。環境変数は親shellには伝わらないよ。
#!/bin/sh
export VAL


153 :145:02/02/23 15:14
あ……忘れて……(w

154 :144:02/02/23 22:47
とりあえず動くからチューニングきぼんぬ
gdipc.plのshell版でdjbのtcpclient利用バージョン
djbマンセーならenvdirで前半省略可

#!/bin/sh
export DIP_SERVER=${DIP_SERVER:=example.com}
export DIP_PORT=${DIP_PORT:=3495}
export DIP_USER=${DIP_USER:=mydomain}
export DIP_PASS=${DIP_PASS:=_md5_encoded_password_}
export DIP_DOMAIN=${DIP_DOMAIN:=example.com}
#
export TCPCLIENT=${TCPCLIENT:=/usr/local/bin/tcpclient}
export MD5SUM=${MD5SUM:=/usr/bin/md5sum}
export AWK=${AWK:=/usr/local/bin/mawk}
#
case "$1" in
0|start|"") export ACTION=0 ;;
1|-r|stop) export ACTION=1 ;;
*) echo "Usage: $0 start|stop"
exit ;;
esac
#
${TCPCLIENT} -RHl0 -- "${DIP_SERVER}" "${DIP_PORT}" sh -c '
read SECRET <&6
echo "${SECRET}"
DIGEST=`echo -n "${DIP_PASS}.${SECRET}" | ${MD5SUM} | ${AWK} "{ORS=\"\";print \\$1;exit}"`
echo "${DIP_USER}:${DIGEST}:${DIP_DOMAIN}:${ACTION}" >&7
read RES <&6
case "${RES}" in
0) echo "Successfully";;
1) echo "Invalid login";;
2) echo "Offline request successful";;
*) echo "Server did not respond:${RES}";;
esac
'


155 :774:02/02/24 01:13
awkで環境変数を参照する方法ってありますか?


156 :名無しさん@お腹いっぱい。:02/02/24 02:13
>155 はい。

157 :名無しさん@お腹いっぱい。:02/04/01 17:00
再利用

158 :名無しさん@お腹いっぱい。:02/04/04 23:04
シェルスクリプトで拾って、
#!/bin/sh

awk -v PARA=$boke -f garuuu.awk


とかじゃだめ?

159 :名無しさん@Emacs:02/04/05 00:42
awk 'BEGIN{print ENVIRON["HOME"]}'

160 :名無しさん@お腹いっぱい。:02/04/07 13:41
あれはあこがれるだけで十分。
乗ってみるとがっくりなスキーだったよ。オレンジ3S。


161 :158:02/04/07 13:43
ごめん。誤爆した>160

ENVIRON[] は知らなかった。勉強になったよ。

メーカ製のWSとかに入っているgawkじゃないのでも使えるの?






162 :名無しさん@Emacs:02/04/07 21:27
>>161
gawkのドキュメントによるとPOSIX互換なら使えるらしい。
Solaris の場合、 /usr/bin/nawk, /usr/xpg4/bin/awk は使えたが、
/usr/bin/awk ではダメだった。

163 :名無しさん@お腹いっぱい。:02/05/01 23:30
質問を投げますので、答えを知ってる方名乗りあげろ。分かる方
は耳猫の女の子達との合コンにつれて行きます。

例えば1234567890という10個の数字が並んでいて、これを2と3の間、6と7の間、
9と0の間にコンマを付けたいとする場合(i.e. 12,3456,78,90)何かシェルスクリプト
とかで自動的に出来る?結果的には縦一列に10桁の数字を沢山並べて、そのスクリプト
を実行すると、全て左から同じ間隔でコンマが挿入されるような物。

DQNな俺に愛の手助けをプリーズ。

164 :名無しさん@Emacs:02/05/01 23:42
左から同じ間隔で、ってことは、2と3の間に挿入するんじゃなくて、
2桁目と3桁目の間ってことね。んじゃ、これでどうだ。

% sed 's/\(..\)\(....\)\(..\)\(..\)/\1,\2,\3,\4/'

で、耳猫の女の子はどこ?

165 :名無しさん@お腹いっぱい。:02/05/02 00:03
すまん。これ、どーやって使うのだろうか・・・。
例えば
$ cat /home/hoge/data
1234567890
2345678901
3456789012
みたいなファイルがあって、これをどーやって使えば
12,3456,78,90
23,4567,89,01
34,5678,90,12
みたいに変換出来るの?って質問だったんです。おせーて神様。

166 :名無しさん@Emacs:02/05/02 00:04
sed '長いので略' /home/hoge/data

167 :名無しさん@お腹いっぱい。:02/05/02 00:17
うおっ!!!!出来たyo。マジで出来ちゃった。うけけけ。
ありがとう!いやー、さすが数々のエキスパートが在中sしている2chは
すごい。

今度新宿のコスプレバーで呑みましょう。そこに猫耳がいます。既に
合コンじゃないか。(w

168 :117:02/05/08 16:32
遅くなったがようやくわかったぞ。
csh は COBOL-Shell ってことだな。


169 :名無しさん@お腹いっぱい。:02/05/08 17:48
>>168 ちがう。

170 :最近perlを使わなくなった男:02/06/17 19:21
ほっしゅ、ほしゅ

171 :名無しさん@お腹いっぱい。:02/06/18 23:25
HP-UX 11.2 を使用しています。

下記の条件にあうようなシェルはどう書けばよいのでしょうか?

(1) hoge というディレクトリ下にあるファイルで、タイムスタンプが
  1998-2000年 の物を削除するシェル(ディレクトリにはいくつかの
  階層がある)。

(2) 上記に加えて、「ディレクトリ名に .x が付くものは削除する」。

よろしく〜。



172 :名無しさん@お腹いっぱい。:02/06/18 23:30
>>171
わざわざスクリプトエンジンとしてのシェルを新規に設計するの?
/bin/shでは力不足ってこと?

173 :名無しさん@お腹いっぱい。:02/06/18 23:30
>>171
すこしは自分で考えたら?

174 :名無しさん@お腹いっぱい。:02/06/18 23:33
シェルスクリプト>172

175 :名無しさん@お腹いっぱい。:02/06/18 23:35
>>172
find内蔵シェルとか?

176 :名無しさん@お腹いっぱい。:02/06/18 23:38
>>171
nxt というツールが高機能だと聞くから、簡単にできるかも。


177 :名無しさん@お腹いっぱい。:02/06/19 00:05



178 :名無しさん@カラアゲうまうま:02/06/19 01:11
>>171
man find
くらいしか言うことないのよ、ほんとに
まさかエディタの使い方とか、マニュアルの見方まで分からないとはいわんよね?

179 :del:02/06/19 19:17
今CSHをいじくっているのですが
$2に何も入っていないかどうかを条件式で評価したいのですが
変数に何も入っていないときには、
記号か何かで表すと何が入っているのでしょうか?
$2 = NULLとか$2 = " "等
やってみましたがまるでダメなのよね。



180 :del:02/06/19 20:14
ありました。
$2 == ""

181 :del:02/06/19 21:53
$2 == ""
ありました

182 :名無しさん@お腹いっぱい。:02/06/24 21:07
よその板でも書いたのですが、shの質問です。

$ echo "abc`echo def`" は
abcdef となるのですが、  何故
$ str=`echo "abc \`echo def\`"`
としなければ、同じ結果($str)が出ないのでしょうか?
\ ← これってエスケープ文字で「`」がそのまま出てくるんじゃないですか?
最初に echo defが評価されるのはなんとなく理解出来るのですが、「`」が終息してないから?
基本的な事で申し訳ありませんが、宜しくお願いします

183 :名無しさん@お腹いっぱい。:02/06/24 21:17
>>182
この場合、引用符の評価が二回行なわれるから、
二回目に評価して欲しいものは
\` みたいに書く必要がある。

var=`basename \`pwd\``
というのが典型例。

184 :名無しさん@お腹いっぱい。:02/06/24 21:23
おお! さすが2ちゃんねる。 
勉強させていただきました。 本当に有難う御座いました。

185 :名無しさん@カラアゲうまうま:02/06/24 21:51
最近のシェルはネストできるように$()というのが使えるものも多い。
var=$(basename $(pwd))


186 :名無しさん@お腹いっぱい。:02/06/24 23:16
>>185
$()が最初あって``が後からだと思うが。

187 :名無しさん@お腹いっぱい。:02/06/24 23:24
>>186
Huh??
おぃ、誰かぁ〜突っ込んでやれ。

188 :名無しさん@お腹いっぱい。:02/06/24 23:27
>>186
よーし、パパつこんちゃうぞ〜。
`` はもともとの sh (bourne shell) の機能。
$() は POSIX shell standard で `` よりあとから定義された機能。



189 :名無しさん@お腹いっぱい。:02/06/25 00:02
>>186が何と勘違いしていたのかの方が気になるな。

190 :名無しさん@カラアゲうまうま:02/06/25 10:32
気になるな。

191 :名無しさん@お腹いっぱい。:02/06/25 16:59
bashについて質問です。
チルダ展開をしたいのだけれども、hoge.datに
u1001
u1002
u1003
ってな感じでユーザ名が入っているときに、
#!/usr/local/bin/bash -f
for i in `cat hoge.dat`
do
echo ~$i
done

ってかいたら、チルダ展開してくれないんだけれども、
ものすごく勘違いしている?
チルダ展開するようにするにはどうすればいい?

192 :名無しさん@お腹いっぱい。:02/06/25 18:10
eval echo ~$i

193 :191:02/06/26 10:17
>>192
thx.

194 :名無しさん@お腹いっぱい。:02/06/27 18:51
リダイレクトの質問です。

$ ls -l
合計 0
-rw-rw-r-- 1 hoge hoge 0 Jun 27 18:37 aaa.txt
$ ls -l aaa.txt bbb.txt > tmp 2>&1

2>&1 の所なんですけど、標準出力が tmp に入ってるのは理解できるのですが、
どういうカンジでエラーが tmp まで入ってるのですか? イメージ的には 出力が tmp
まで入った後に、再度 2>&1 が評価されるってコト?? (最初の > tmpの部分で)
Unix板の神様の皆様。 教えて下さい。

195 :名無しさん@お腹いっぱい。:02/06/27 18:58
>>194
このリダイレクトの文法、直観的には反対のように思いがちだけど、
コマンドラインはちゃんと左から右の順に1回だけ評価されてる。

> tmp のところで、ファイルディスクリプタ1に、
tmp というファイルが割り当てられ、
次に、2>&1 で、
ファイルディスクリプタ2に、
ファイルディスクリプタ1(tmpに割り当て済み)
が代入されるという感じ。

196 :194:02/06/27 19:07
>>195
うーん。。ナルホド
有難うございます。


197 :194:02/06/28 23:14
質問です。
$ cat filename
abc
cde
efg
$ while read ; do echo $REPLY ; done < filename

ってした時に、どういう動きですか?
1, while がシェルを作る
2, read が変数入力待ち
3, done まで逝って、filename から読む
4, read が改行入るトコまで読み込み テキトーな変数に入力
5, しょーがねーから(出すものないから) echo する

でアッテますか?


198 :名無しさん@お腹いっぱい。:02/06/28 23:39
>>197
ちがうね。

1.(親)シェルがfilenameをオープンして、それを標準入力としてサブシェル(に相当するもの)を作る
2.サブシェルが whileループを実行する
3.ループ内の read では、標準入力から各ループごとに1行ずつ変数に読み込む

以上

あ、それから >>197 のreadの引数が落ちてるね。
read REPLY と書きたかったのかな?

199 :194:02/06/28 23:48
ありがとうございます >>198
REPLY は抜けじゃないんです。何も書かなくても echo されるんです。
これってバグですか?

200 :名無しさん@お腹いっぱい。:02/06/28 23:52
>>199
ほんとに cat 使ってる?
手で入力してない?

201 :名無しさん@お腹いっぱい。:02/06/29 00:02
>>199
ふつう、read の引数がないとエラーになるはずだけど、
実装によってはOKの場合もあるのかな?
その場合でも、 filenameの行数分だけループするはずだから、
その回数だけ echo が実行されるはず。

202 :名無しさん@お腹いっぱい。:02/06/29 00:02
ksh/bashではREPLYという特殊変数がある模様.
readの引数がないとREPLYに代入される.

203 :194:02/06/29 00:27
>>202
ありがとうございます。これで今日は良く寝れそうです。

204 :名無しさん@お腹いっぱい。:02/06/30 18:17
まずは UNIX & bourne shell だけで逝こう.と思いましたが,
bash と sh の違いがわからず困っております.

[ , ] が test の別名であることや,ヒアドキュメント等,
「自習テキスト」に載っていないものは bourne shell のものではないのですか?

ぐぐってみても見つからず,
% man sh
しても bash のがでてくる始末.
どう探せばよいかだけでも教えていただきたいのです.

# 起動スクリプトも [ , ] ばっかり...Linux だから?
# それとも個人の好み?


205 :名無しさん@お腹いっぱい。:02/06/30 18:34
>>204
test = [ はもともと外部コマンドだったんだよ。
だから、シェル本体とは次元が違う問題になる。

とりあえず、
export name=var
や、
$(command)
は、
bash では使えるが、素のbourne shell では使えないので避けた方がよい。

206 :名無しさん@お腹いっぱい。:02/06/30 19:26
>>204
ディストリに ash のパッケージない?


207 :名無しさん@お腹いっぱい。:02/06/30 19:37
>>206
ash でも、
export name=var
や、
$(command)
が使えてしまうから困る。

208 :名無しさん@カラアゲうまうま:02/06/30 20:00
>>205,>>207
もともとKorn shell の機能だったような記憶が…

209 :204:02/06/30 22:30
>>205
> test = [ はもともと外部コマンドだったんだよ。
なんと.確かに /usr/bin に3つとも入っていますね.

> bash では使えるが、素のbourne shell では使えないので避けた方がよい。
これらも個人の好みだなんて思っていました...

>>207
> ash でも、
> export name=var
> や、
> $(command)
> が使えてしまうから困る。

うぅ,まとまったドキュメントが欲しいですね.
私は debian を使っておりますので,
bourne のみしか使えない環境になることはありませんが,
書くときにはこの辺のことを頭に入れておきたいものです.

210 :名無しさん@お腹いっぱい。:02/07/01 00:32
>>209
$() は POSIX で定められた機能だから、最近の UNIX なら
まず使えると思うけどね(商用 OS なら)。

ただ古い system でも動くようにしようと思うと、いろいろ
と使えなくなるから、SunOS4 の sh のマニュアルみて書い
たりしてるよ。


211 :名無しさん@お腹いっぱい。:02/07/01 00:38
http://freehome.kakiko.com/tuk/ii.html

212 :名無しさん@お腹いっぱい。:02/07/01 06:56
>210
autoconfのマニュアルとか。
しかし最近のashは凄いね。set -o {emacs,vi}って何よ。

213 :名無しさん@お腹いっぱい。:02/07/01 07:13
>>212
最近って。。。10年くらい前から使えたはず。

214 :204:02/07/04 22:33
訂正.ヒアドキュメントは「自習テキスト」に載っています.ゴメソ.

215 :名無しさん@お腹いっぱい。:02/09/29 09:40
初心者です。ご存知の方いましたら、教えてください。
リモートシェルで環境変数を読み込んでからコマンドを実行したいっす!
(例).profileを読み込んでからlsコマンドを実行します。
   rsh -l usr ". .profile|ls"
こんなのでいいでしょうか?


216 :名無しさん@お腹いっぱい。:02/09/29 09:54
>>215
(・∀・)カエレ!

217 :名無しさん@お腹いっぱい。:02/09/29 17:52
>>215
パイプ・・・?
;とか&&でできると思う。でも.profileなんか読み込んだらTERMが
設定されてないとか怒られるとおもうから.bashrcなんかに環境変数を書いとけば?
.bashrcはrshでも読み込まれるから。漏れはbashじゃないからよくわからんが。

218 :名無しさん@お腹いっぱい。:02/09/29 22:12
ホットドックがいいですな。

219 :名無しさん@お腹いっぱい。:02/09/30 23:59
>>217
ありがとです。
;でできました。

220 :名無しさん@お腹いっぱい。:02/10/01 19:19
forでループしてると、前回のコマンドが終了しないうちに
次のループに入ってしまい同じコマンドが実行されるようです。
これを防ぐ方法ありますか?
または、ループの中で10秒くらいウエイトをかける方法ないでしょうか?
シェルはkshでAIX5.1です

221 :名無しさん@お腹いっぱい。:02/10/01 19:20
sleep 10

222 :名無しさん@お腹いっぱい。:02/10/01 19:36
wait

223 :名無しさん@お腹いっぱい。:02/10/01 22:13
ありがとうございました
waitでなぜかだめでしたので、
sleepでうまくいきました

224 :名無しさん@お腹いっぱい。:02/10/01 22:29
>>212

Autoconf のマニュアルいいよね。Shellology ってやつ。あれ大好き。


225 :名無しさん@お腹いっぱい。:02/10/01 22:31
>>210
> >>209
> $() は POSIX で定められた機能だから、最近の UNIX なら
> まず使えると思うけどね(商用 OS なら)。

% /usr/bin/sh
$ echo $(ls)
構文エラー: `(' unexpected
$ uname -a
SunOS void 5.9 Generic_112233-01 sun4u sparc SUNW,Ultra-5_10


226 :名無しさん@お腹いっぱい。:02/10/01 22:40
% /bin/sh
$ echo $(ls)
1.png 2.png 3.png
$ uname -sr
FreeBSD 4.7-RC

227 :名無しさん@お腹いっぱい。:02/10/02 00:06
>>223
そ、それでいいのかよ。コマンドの実行が10秒以上かかったときはどうしてくれるのんだよ。

228 :名無しさん@お腹いっぱい。:02/10/02 04:26
>>225 POSIX shは"/usr/xpg4/bin/sh"です.

229 :名無しさん@お腹いっぱい。:02/10/04 22:10
標準出力に絶えず連続して、でてくる内容をファイルに保存したいんですけど(hoge > log)、
長時間出力させる必要があるので、1分ごとにファイルを分割させながら保存したいのです。


ですが、これでは最初のコピー先に書き込まれて分割できません。
hogeのプロセスは止めることができません。
どう書けばいいか教えて下さい。

#! /bin/csh
set working_dir="/var/tmp"    
set run_time=720 #720min==12 hour
cd $working_dir
( hoge > log )&

while ($run_time)
sleep 60
set dt=`date +%y_%m\-%d_%H:%M`
set endfile = "$dt"
cp log $endfile
cp /dev/null log
@ run_time--
end

230 :名無しさん@お腹いっぱい。:02/10/05 01:43
>>229
logrotateとかnewsyslogのソースを探検してみるってのはどうよ。
しかしなぜに今時cshのシェルスクリプト。

231 :名無しさん@お腹いっぱい。:02/10/05 23:23
cshのスクリプトか・・・
BSDだからじゃないの?

232 :名無しさん@お腹いっぱい。:02/10/06 00:14
>>231
BSD には sh がないのか?

233 :名無しさん@お腹いっぱい。:02/10/06 01:38
ビーエスディーにはPOSIX準拠のシェルがハイッとります。

234 :名無しさん@お腹いっぱい。:02/10/06 02:43
うむ、awkなり、perlなりrubyなり通さないとダメかな?
シグナル受けるとファイルclose&openするようなインターフェース
になるかな? 外部フィルタを使うとすると。
案外、hogeがその機能持ってたりしてって、リダイレクトしてるのか。

235 :名無しさん@お腹いっぱい。:02/10/06 12:04
>>229
cp /dev/null log

じゃなくって、

echo -n > log

とかだとどうなる?


236 :名無しさん@お腹いっぱい。:02/10/06 14:12
>>234
そういうことしてくれるフィルタプログラムがあると便利そうだね。
hoge | foo /var/log/bar -t 60 とかすると、
自力で /var/log/bar.YYYYMMDDhhmm で rotate しつつ open&close して出力、
みたいな。
ていうか、実は既にあったりする?

237 :名無しさん@Emacs:02/10/06 14:59
>>229
daemontools つかえや

238 :名無しさん@お腹いっぱい。:02/10/06 15:21
>>237
daemontools にはそういうのをうまくやってくれる機能があるの?

239 :名無しさん@お腹いっぱい。:02/10/06 16:10
>>238
>1分ごとにファイルを分割させながら保存したいのです
こんな機能ないよ。

240 :名無しさん@お腹いっぱい。:02/10/06 17:42
>>239
loggerでsyslogに出力してnewsyslogする。

241 :名無しさん@お腹いっぱい。:02/10/07 20:36
229です。
皆様レスありがとうございます。
logrotateで試して(kill -HUP使えるそうです)、
だめだったらperlでがんがってみます。


242 :名無しさん@お腹いっぱい。:02/10/08 04:01
>>241
あれ、そうなの? >>240 の方法でバッチリだと思うけど、おれは。

243 :名無しさん@お腹いっぱい。:02/10/08 05:19
確か、newsyslogの設定ファイルに、pidファイル と、シグナル番号 を指定
すれば、newsyslogが宜しくやってくれたと思ったけど。
だから、syslog 経由しなくても、いいんじゃない。


244 :名無しさん@お腹いっぱい。:02/10/08 09:34
>>236
Apache に付属している lotagelogs がそんな感じ。ちょっと仕様がダサいけど。


245 :名無しさん@お腹いっぱい。:02/10/08 13:00
>>243
hogeがkill -HUPでログをクローズ・オープンし直してくれるのが確実ならね。

246 :名無しさん@お腹いっぱい。:02/10/12 22:46
シェルスクリプト程、とっつきやすくて究めにくいスクリプト言語も
無いだろうなあ。IFSとかエスケープの微妙な評価順とか、
いまだにうろ覚えだったり。そういう部分を使わないから、というのも
大きいが。

247 :名無しさん@お腹いっぱい。:02/10/13 01:06
>>239
0.75以降だとALRMを送ると即ローテートするので、
1分ごとに svc -a すればいいんでないの?


248 :名無しさん@お腹いっぱい。:02/10/13 12:20
>>246
libtoolとかautoconfのスクリプト、./configure がうまくいかないときに見るんだけど、いつもめげる。

249 :名無しさん@お腹いっぱい。:02/10/31 00:13
さげてみよう。

250 :名無しさん@お腹いっぱい。:02/11/03 22:45
初めてシェルスクリプトを書いたあんぽんたんですが教えてほしいことがあります。
pppの接続が勝手に切れた時に、自動で接続し直す(ついでにダイナミックDNSの更新もする)スクリプトのつもりで作りました。
hnup.plはDDNS更新用のスクリプトなので今回は無関係。

#!/bin/sh
nowip=`ifconfig tun0 | grep inet | sed -e 's/.*inet //' | sed -e 's/ .*//'`

if test "${nowip}" = ""
then
killall -TERM ppp
sleep 5
ppp -ddial hoge
sleep 2
nowip=`ifconfig tun0 | grep inet | sed -e 's/.*inet //' | sed -e 's/ .*//'`
fi

oldip=`cat /root/scripts/flets.ip`

if test "${nowip}" != "${oldip}"
then
echo ${nowip} > /root/scripts/flets.ip
/root/scripts/hnup.pl ${nowip}
fi

これでうまく行くと思ったんですが、どうもpppがシェルスクリプトの終了と同時に終了しているような気がするんですが、それを避けるにはどうしたらいいですか?
これが気のせいだった場合は、もうひとつ疑問があります。
pppを起動してから実際に認証が成功してIPアドレスが割り当てられるまでに、瞬時〜3分程度のタイムラグがあるようなのです。
つまり起動してすぐにifconfig...とやっても当然アドレスが得られないのですがこれの回避策は、ipが表示されるまでループするぐらいしかないですか?

251 :名無しさん@お腹いっぱい。:02/11/04 01:35
>>250
シェル、オークの質問コーナー
http://pc.2ch.net/test/read.cgi/unix/1000303370/l50


252 :名無しさん@お腹いっぱい。:02/11/04 15:37
>>250
なぜppp.linkupとかppp.linkdownを使わないのでしょか。

253 :山崎渉:03/01/15 13:23
(^^)

254 :れっき:03/02/07 12:23
すいません。
おしえてください。

ある西暦年月日を変数に入れて・・・。
それを今日の西暦年月日と比較して
何日後?とかって、調べたりすることって
できないですよね?


255 :名無しさん@お腹いっぱい。:03/02/07 12:28
>>254
四則演算でできそうだが。

256 :名無しさん@お腹いっぱい。:03/02/07 12:29
>>254
できない理由があるか?

257 :名無しさん@お腹いっぱい。:03/02/16 02:49
254ではないが、簡単に日付のカウントをするって言うのはちょっと難しいな。
俺も悩んだ事はあるけど、月ごとに日付が変わるし閏年の問題も関わるので
暦に詳しくないとちょっと大変だ。俺はその点はあるコンピュータ言語を使って
いたので解決できた。というのは言語に日付型というのがあったのでそれを利用
してインクリメントすれば良いだけだった。全ての処理を一から書く事と
比べれば簡単だ。

258 :名無しさん@お腹いっぱい。:03/02/16 02:53
>251
スレ落ちしてるじゃん。

259 :名無しさん@お腹いっぱい。:03/02/16 03:09
質問

コマンドのマニュアルがあってこれはmanのように一つのコマンドに対して
ファイルとしてhelpみたいなのが書かれているのだけれど、これをHTMLに
したい。ここで問題が発生しました。なんとファイル中にはシンボリックリンク
が含まれているのです。シンボリックリンクさえなければsed,awkで簡単に
ファイル名リストからhtmlに変換してテキストにhtmlのリンクを貼る事が出来ま
す。でもシンボリックリンクがあるせいで上手くいきません。
どうしたら良いですか。

260 :名無しさん@お腹いっぱい。:03/02/16 06:25
意味不明
例示求む

261 :名無しさん@お腹いっぱい。:03/02/16 10:29
>>259
ファイル中にシンボリックリンクは作れません

262 :名無しさん@お腹いっぱい。:03/02/16 10:47
> なんとファイル中にはシンボリックリンクが
なんとその「ファイル」はディレクトリである
> ファイル名リストからhtmlに変換して
勿論この「ファイル名リスト」もディレクトリである

だったりして:-P
# sedで「簡単に」ディレクトリを読むことが出来るかどうかはしらんが
# ls -l dir | awk ... かな?


263 :名無しさん@お腹いっぱい。:03/02/16 10:57
>>257
月ごとの日にちは31,30,28が基本で、
閏年は/4の年に一度、100年に一度は無くて、400年に一度はあって…

ってDOSのTurboCでよくやってたなぁ

264 :名無しさん@お腹いっぱい。:03/02/16 11:25
>>257
Epoch からの秒数に変換しちゃえばいいだけでは?

265 :名無しさん@お腹いっぱい。:03/02/16 13:04
>>254,>>257
最近のdateならごにょごにょ書けばできるんでないの?

266 :名無しさん@お腹いっぱい。:03/02/16 14:53
>>264
閏秒でずれる罠。
秒までせずともJulian dayでいいと思う。

267 :259:03/02/17 01:48
cat
awk
gawk@

というヘルプの書かれたテキストファイル(manのようなもの)があるとして、この
gawkはawkへのシンボリックリンクになっているんです。ここで問題なのは、
例えばsambaを通したりするとgawk@が見えなくなってしまう事や、全てのファイルの操作、
例えばファイル内容を一部変えるとか他のフォーマットに変えるという事が
シンボリックリンクがあると単純ではないなと。
ヘルプサイズを小さくするのにはシンボリックリンクは意味あると思いますが
保守しづらいなというのが感想なんですが、そこで私はtext->htmlに変換する所
でまずどうしようかと迷いました。perl/rubyを使っても良いのですが、シェル
スクリプトか便利なコマンドがあるのかなと思って質問してみました。


268 :名無しさん@お腹いっぱい。:03/02/17 02:01
>>267
まだわからん。
テキストファイルの中にシンボリックリンクは埋め込めないわけで、
ということはファイルをパースするラッパか何かがあるの?
そこら辺を説明してくれないとどうにも。

269 :名無しさん@お腹いっぱい。:03/02/17 02:06
>>267
いろんなことがごっちゃに書いてあってなんだかわからん。
問題点を明確にせよ。


270 :名無しさん@お腹いっぱい。:03/02/17 02:21
まさかと思うが html の href タグとシンボリックリンクを
同じものと思ってネーか?

271 :名無しさん@お腹いっぱい。:03/02/17 02:25
フォーマット変えるのなんてsymlinkかどうかなんて無視すればいいでしょ?
symlinkであることを保存したい特別な理由があるならtestすればいいけど。
内容変更にしても2重に適用されてもへくらないようにしとけばsymlinkも無視できる。

ところで
> sambaを通したりするとgawk@が見えなくなってしまう
ってなに?

272 :名無しさん@お腹いっぱい。:03/02/17 03:37
>>271
> > sambaを通したりするとgawk@が見えなくなってしまう
> ってなに?

ls -Fだとsymlinkが@でマークされるけど、SMBはsymlinkをサポートしないの
でマークされなくなるってことかなぁ。

だとすると、テキストファイルの中身云々とは完璧に無関係な話になってしま
うんだが。


273 :名無しさん@お腹いっぱい。:03/02/17 04:33
>>267
説明能力が無い(というか良く理解してないからなんだろうけど)んだから、
人に分かってもらうには具体的に話すしかない。具体的に話せない事情は
あるのだろうが、そういう状態で
> があるとして
なんて勝手に要約したり例を捏造するから分からなくなる。

それはともかく、まあ以下のような解決策で済む話であろうと想像される
が違うか?
・個々のマニュアルページをhtml化する。他のマニュアルページへの
symlinkになっているものは不要。symlinkさえ作成する必要は無い。
>>267の例で云えば、ハイパーリンクの部分は単に以下のようにする。
<a href="cat.html">cat</a>
<a href="awk.html">awk</a>
<a href="awk.html">gawk</a>


274 :259:03/02/17 06:55
>268
いやだから、テキストファイル内にはシンボリックリンクはないのは分かっているん
ですけども。
要するに $ ls とした時に表示されるファイルリストを参照してこれを元に
htmlのインデクス作ろうかなと思ったんですよ。
そんだら、まったくこれがシンボリックリンク混ざってるもんだからイヤン
なわけです。

> があるとして
>なんて勝手に要約したり例を捏造するから分からなくなる。
要約してないでそのままなんでつが。

ブラウザでテキストファイル表示できますよね。それで
>・>>267の例で云えば、ハイパーリンクの部分は単に以下のようにする。
><a href="awk.html">gawk</a>
そうなんですけど、この時のファイルがシンボリックリンクだった場合の
処理がわからんのです。リンク元と先のリストはもしかしてls -l して
grepかなんかして、そのあと適当に行を抜き出してシンボリックリンクの
親を見つけて名前を置換する、ということになりますかね?
シンボリックリンクに対する操作が、lnという作るコマンドだけで他の操作
が無いので苦労してます。

275 :名無しさん@お腹いっぱい。:03/02/17 06:59
>>274
> シンボリックリンクに対する操作が、lnという作るコマンドだけで他の操作
> が無いので苦労してます。

symlinkかどうかなんて区別しないでやっちゃまずいのか?

<a href="cat.html">cat</a>
<a href="awk.html">awk</a>
<a href="gawk.html">gawk</a>
がだめな理由は?


276 :名無しさん@お腹いっぱい。:03/02/17 07:34
>275
><a href="gawk.html">gawk</a>
>がだめな理由は?
それだと、gawk@というテキストファイルへのリンクはUNIX内でなら可能だと
思うんですが、インターネットやWindowsなど他のファイルシステムに持っていく
と問題が発生するようです。Perlなどのヘルプでmanみたいなものがあって、
printとprintf見たいな命令があったとして、これが一つのファイルに書かれてある。
printはシンボリックリンクでprintfは普通のファイルとなっているんですが、
このままでは他のコンピュータで扱う場合に問題が発生するので重複してても
よいので普通のファイルとしてシンボリックリンクを変換しようかと。
数も/usr/binのファイル数くらいあるので手作業では出来ない。便利なコマンドが
あるならそれを使えば良いかなと思っていたんですが。
仕事ではなくて趣味でやってるんですが、ああ、疲れた。もう寝ます。

277 :名無しさん@お腹いっぱい。:03/02/17 07:39
>>274
>要するに $ ls とした時に表示されるファイルリストを参照してこれを元に
>htmlのインデクス作ろうかなと思ったんですよ。
そんなことだろうと思ったが、そういう重要なことは最初に云え。

> リンク元と先のリストはもしかしてls -l してgrepかなんかして
別にそれでもよいが、
$ perl -e 'for (<*>) { printf("$_\t%s\n", readlink($_)); }'
でも試してみ。これはファイル名と(もしsymlinkなら)リンク先の名前を
タブ区切りのリストで出力するので、awkに喰わせて処理するには手頃だろう。
↑の*の部分はcshと同じglob(ワイルドカード)が使えるので、絞り込みたい
ファイル名に合わせて適当に。


278 :名無しさん@お腹いっぱい。:03/02/17 08:29
>>259
おいおい、疲れた寝ますぅ?「お前らありがとう」は?
キミよー。文面からアレコレ勉強してそーつーのは分かるんだけど、
(すまんけどそれでベテランだったら目も当てられんのだけど)、
な〜んか用語の使い方っつーか、論理っつーかがズレてんだよね。
友達、同僚にもワカランとかクドイとか言われネーか?
素直に育てよ!

279 :名無しさん@お腹いっぱい。:03/02/17 10:00
きっと
% w3mman intro
で済む話であろう。

280 :名無しさん@お腹いっぱい。:03/02/17 10:03
>>276
> printはシンボリックリンクでprintfは普通のファイルとなっているんですが、
> このままでは他のコンピュータで扱う場合に問題が発生するので
どんな問題?

> 仕事ではなくて趣味でやってるんですが、
なんか関係あるの?

281 :名無しさん@お腹いっぱい。:03/02/17 15:40
>>274
シェルスクリプトでやりたいなら test -L file とか test -h file で調べら
れる。

readlink(2)したいならreadlinkとかstatというコマンドがあるシステムもあ
るし、findのオプションで得られる場合もある。



282 :名無しさん@お腹いっぱい。:03/02/23 16:35
>276

>gawk@というテキストファイルへのリンクはUNIX内でなら可能だと
>思うんですが、インターネットやWindowsなど他のファイルシステムに持っていく
>と問題が発生するようです。

全然分からん。「インターネットやWindowsにもってく」ってどーいう意味よ?
仮に「Webサーバ」だとして、サーバのOSは何よ?

大体、シェルスクリプト書いてるんでしょ?
だとして、どうしてWindowsに持っていけるのか説明キボン

1.「HTMLファイルを出力する、シェルスクリプトを作ってる」
2.「lsで出力されたファイルへのリンク(Aタグ)を書くようなシェルスクリプトである」
3.「問題はシンボリックリンクされたファイルである(他のファイルは問題ない)」
4.「自分のUNIX内では動くが、Windows上やWebサーバ上では上手く動かない」

こーいう事か?

283 :名無しさん@お腹いっぱい。:03/02/23 16:38
シンボリックリンクのファイルを除いてしまっていいのなら、
findで済む話だよな、、

284 :名無しさん@お腹いっぱい。:03/02/23 16:57
>>282
> 4.「自分のUNIX内では動くが、Windows上やWebサーバ上では上手く動かない」
5.「だからリンクをsymlinkから実体のファイル名へ書き換えたい」
ということだと思われ。

285 :名無しさん@お腹いっぱい。:03/03/17 16:05
最近巷で人気の CodeRedII のログを grep してみたのですが、
IPアドレスの桁が不ぞろいで見づらいので以下のようにしてみました。
fgrep '" 400 ' /var/log/httpd-access.log| sed 's/ - -/>/g' | tr '>' '\t' | expand | cut -c -80
とりあえず見やすくはなったのですが、やり方がすごく馬鹿らしい気がします。
手馴れた人ならどうやるかぜひお聞かせください。

286 :名無しさん@お腹いっぱい。:03/03/17 16:50
少なくともgrepとtrでできることはsedでできる。\tはTABを直接いれる。

sed '/" 400 /!d;s/ - -/\t/' /var/log/httpd-access.log | expand | cut -c -80

287 :名無しさん@お腹いっぱい。:03/03/17 17:03
>>286
すいません、タブを直接入力ってどうやるんですか?

288 :名無しさん@お腹いっぱい。:03/03/17 17:07
awk '$9==400{a=$1;$1="";print a "\t" substr($0,6,64)}' /var/log/httpd-access.log

かなーりムリヤリ感が漂ってますが。


289 :名無しさん@お腹いっぱい。:03/03/17 19:51
>>287
ttyやシェルの設定によるが、^V ^Iで入ることが多い。


290 :名無しさん@お腹いっぱい。:03/03/30 01:00
意外に簡単なようでかなりつまってしまいました・・・・・・お知恵拝借

dfコマンドにより
/dev/hda3 14017872 1165268 12140524 9% /
/dev/hda1 101089 18991 76879 20% /boot
/dev/hda2 25197252 3353060 20564216 15% /home

と出力されるのですが 15% /homeが90%になったときに警告を出したいことをしたいのですが
(警告方法はecho "disk full"とか簡単にするつもり(cron等で動かすとして))

なにかいいヒントはございませんか?(´д`;)

291 :名無しさん@お腹いっぱい。:03/03/30 01:06
"/home" で grep して cut したのを変数に代入して条件分岐でだめなの?

292 :名無しさん@お腹いっぱい。:03/03/30 13:21
290でつ…
まさにそれです!dfにこだわる必要ないのね(w)ありがとうございました、やはり頭は柔らかくしておかないとダメポですね
で、分岐はifでいいんすよね(ヲ

293 :名無しさん@お腹いっぱい。:03/03/30 13:23
>>292
> で、分岐はifでいいんすよね(ヲ
んなことはやってみりゃすぐわかると思うが。

294 :名無しさん@お腹いっぱい。:03/03/30 13:38
いや、df の結果を | で grep に渡して… ってつもりだったんだが、まあなんでもいいけど

295 :名無しさん@お腹いっぱい。:03/03/30 17:06
lsでもいいのでは?

296 :名無しさん@お腹いっぱい。:03/03/30 17:22
??

297 :名無しさん@お腹いっぱい。:03/03/30 17:30
http://www.pink-angel.jp/betu/linkvp2/linkvp.html
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
★みんなの情報局★みんなのリンク集★ココ最高★

298 :名無しさん@お腹いっぱい。:03/03/31 05:20
>>290
ちょっと本題とは違うけど、90% は一般ユーザにとっては
手後れでマズーだったような。

299 :名無しさん@お腹いっぱい。:03/03/31 09:19
「dfで」90%と見えるうちはまだ大丈夫だったかと。

300 :山崎渉:03/04/17 12:06
(^^)

301 :山崎渉:03/04/20 06:16
   ∧_∧
  (  ^^ )< ぬるぽ(^^)

302 :名無しさん@お腹いっぱい。:03/04/21 21:44
シェルスクリプトって
perlやruby,pythonもはいるのそれならこんなスレ無用だな

303 :名無しさん@お腹いっぱい。:03/04/21 21:59
>シェルスクリプトって
>perlやruby,pythonもはいるのそれならこんなスレ無用だな

マ板の頭が悪そうな発言スレに貼って来ていいですか?

304 :名無しさん@お腹いっぱい。:03/04/21 22:14
コマンド特有のスレ作れよ雑魚ども

あと、sh,csh,bashとか固有のスレ作れよ、
zshはスレッドあるけどな。

305 :名無しさん@お腹いっぱい。:03/04/21 22:45
>コマンド特有のスレ作れよ雑魚ども
「cutを使い倒すスレ」とか?

マ板に「putsを使い倒すスレ」が立って、
「板違い。fprintfスレに逝け」とかレスが
付くようなもんだと思うが。

でも、それはそれで笑えるな。

306 :名無しさん@お腹いっぱい。:03/04/21 23:07
揚げ足はほんと人類の敵だな
fprintfはプロブラム板に移動を御願いするがな


307 :名無しさん@お腹いっぱい。:03/04/21 23:08
printfならここだな。

308 :名無しさん@お腹いっぱい。:03/04/21 23:13
もうUNIXにはうんざりだ学歴主義に毒された連中はUNIX使ってりゃイイよ
真の技術者は今を憂いの目で眺めている。


309 :九龍旅:03/04/26 16:28
教えてください。

GWに停電があるんでサーバを止めないといけなくなりました。
会社行くのいやなんでshutdownをスケジュールにしたいんですが
どういうスクリプトにすればよいんでしょうか?



310 :うひひ:03/04/26 16:53
>>309
スクリプトで時間稼がしてプチもいいのだが
Shutdown -h 時間とかあるんだが
長い時間に対応しなかったらナンだから
cronとかもあるし
古典的にリモート入ってでプチっと切るとか

つかさぁ
サーバって位だからUPSで勝手に切れると思うんだがどーよ?
むしろその辺の対策がないと本当の停電で困るよ

モレのは電源切れると勝手に落ちて電気くると勝手にあがる
というツワモノ
fsckはだいぶかかるようだがな(うひひ


311 :九龍旅:03/04/26 17:51
>>310
UPSあるけど、その前に動作中のシステムを停止させる必要があります。
できればシステム終了が正常に済んでから電源断としたい。
システム終了のコマンドを投入し、「正常終了」のメッセージが出たら
shutdownのコマンドを発行したいのですが…。
ちなみにOSは、SYSTEM-Vです。
初心者な質問で申し訳ないが、cronでshutdownってできます?
roo権限ないと出来ないんでどうしようかと…。


312 :名無しさん@お腹いっぱい。:03/04/26 18:26
>>311
UPS が shutdown してくんないの?

313 :名無しさん@お腹いっぱい。:03/04/26 18:27
>>311
> ちなみにOSは、SYSTEM-Vです。
なんだ、ネタか。

314 :九龍旅:03/04/27 20:03
system-vだとネタなの?
現役なのに…。

315 :名無しさん@お腹いっぱい。:03/04/27 21:31
今時純粋なSysVなんてネタ以外には考えられんよなぁ。

>>311
crontabにはユーザを指定するフィールドがあるわけだが。


316 :名無しさん@お腹いっぱい。:03/04/28 17:51
質問なんですが…
tcshのシェルスクリプトで、例えば「変数の内容について、最初の部分とパターンがマッチしたら、
最も短く一致する部分を取り除いた残りの部分を返す」のは、
${var#pattern}
では出来ないようなのですが、どういった方法で実現できるのでしょうか?
いくらググっても出てきません…bashのはいっぱい出て来るのですが。

317 :名無しさん@お腹いっぱい。:03/04/28 18:54
それは tcsh でシェルスクリプト書くなっていう先人のアドバイスです。

318 :名無しさん@お腹いっぱい。:03/04/29 12:47
afo_$1=hoge

こんな感じに$1を変数afoの名前にくっつけて、値を代入したいんですが、
./mona.sh: afo_引数=hoge: command not found
となります。
どうすればできますか?

319 :名無しさん@お腹いっぱい。:03/04/29 13:00
     ||            ||
     ∧||∧          ||
    ( / ⌒ヽ       ∧||∧          ||
    ( / ⌒ヽ
     | |   |        
     ∪ / ノ
      | ||
      ∪∪
日本ロジテムの子会社せいも素で過労による自殺者が出た。
http://www.samos.co.jp
http://society.2ch.net/test/read.cgi/traf/1046749189/l50
http://tmp.2ch.net/test/read.cgi/company/1046775680/l50

320 :名無しさん@お腹いっぱい。:03/04/29 13:30
>>318
eval

321 :名無しさん@お腹いっぱい。:03/04/29 13:52
>>320
できました。ありがとう

322 :名無しさん@お腹いっぱい。:03/05/08 18:46
/devをつかわずにサイズ0のファイルを作るにはどうすればよいですか?

323 :名無しさん@お腹いっぱい。:03/05/08 19:04
:>


324 :名無しさん@お腹いっぱい。:03/05/08 22:46
おねがい touch touch
  そこに touch
    あなたから touch

325 :名無しさん@お腹いっぱい。:03/05/08 23:14
>>324
>>322への回答のつもりなら出直していらっしゃい。


326 :名無しさん@お腹いっぱい。:03/05/08 23:36
>325
うぅ、ただ歌いたかっただけじゃ!

つーのはさておき「/devをつかわずに」って正確にはどういうことよ?
ファイル作るッつーことは、絶対にディスクデバイスにアクセスする
じゃんよ?脳内か?脳内なのか?!言うてみぃ!

と言ってみるテスト

327 :名無しさん@お腹いっぱい。:03/05/09 12:23
股間にtouch

328 :名無しさん@お腹いっぱい。:03/05/12 09:05
>>326
アフォかお前。
マウントしてあるファイルシステムを通して利用するのに
いちいちデバイスのスペシャルファイルが要るとでも言うのかよ。


329 :名無しさん@お腹いっぱい。:03/05/12 10:49
デバイスのスペシャルファイルがなくて
どうやってファイルシステムをマウントするのだという話だと思うのだが。


330 :名無しさん@お腹いっぱい。:03/05/12 16:34
問題からしてファイルシステムのマウントまで考えることを求めてないし
>>326がそこまで考えているとも思えんが。


331 :名無しさん@お腹いっぱい。:03/05/21 14:04
shで、 行数をカウントするにはどうすればよいのでしょうか?
とりあえずwhile read 〜 expr でやっていますが、他にはどんな方法があるのでしょうか?

332 :名無しさん@お腹いっぱい。:03/05/21 14:32
>>331
普通は外部コマンド (wc とか) におまかせするのでは?
というのでは答えになってない?

333 :名無しさん@お腹いっぱい。:03/05/21 17:50
>>332
wcでできました。ありがとう御座いました。
こういう用途に使える外部コマンドが知りたかっただけなので

334 :名無しさん@お腹いっぱい。:03/05/21 18:21
>>333
何かポケットリファレンスみたいなもの買ったら。


335 :山崎渉:03/05/22 02:03
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―

336 :名無しさん@お腹いっぱい。:03/05/23 16:36
/dev/randomから乱数を数字(文字列)として取り出す方法を教えてくれ。

337 :名無しさん@お腹いっぱい。:03/05/23 16:59
od -N4 -td4 /dev/random | sed 's/.* //;q'

338 :名無しさん@お腹いっぱい。:03/05/26 00:25
set output=`command` && echo "success" みたいに コマンドの出力を
変数に入れてかつ、そのコマンド終了コードを調べる事はできますか?
上のコードでは && が setに掛かるので、command が失敗した場合も
次の命令が実行されてしまいます。

339 :名無しさん@お腹いっぱい。:03/05/26 09:08
>>338
cshを使わない。

340 :名無しさん@お腹いっぱい。:03/05/26 11:07
FreeBSDではtcshになってしまっているのでcshとは違うかも知れないが、

%set hoge=`which ls` && echo "success ($?): $hoge"
success (0): /bin/ls
%set hoge=`which lss` && echo "success ($?): $hoge"
%echo $?
1

となるわけだが。


341 :338:03/05/26 16:08
ごめんなさい。csh では >340 のようになりました。
ただ、bash では、以下のようにうまく動かないんです(使いたいのは bash)。
~$ hoge=`which ljs` && echo "success ($?): $hoge"
ljs: Command not found.
success (0):

342 :名無しさん@お腹いっぱい。:03/05/26 17:55
bashのバージョンは?
2.05bはちゃんと動くぞ。

343 :名無しさん@お腹いっぱい。:03/05/26 18:30
?

344 :名無しさん@お腹いっぱい。:03/05/28 11:33
% sh
$ hoge=`which ls` && echo "success ($?): $hoge"
success (0): /bin/ls
$ hoge=`which lss` && echo "success ($?): $hoge"
$ echo $?
1

% bash
bash-2.04$ hoge=`which ls` && echo "success ($?): $hoge"
success (0): /bin/ls
bash-2.04$ hoge=`which lss` && echo "success ($?): $hoge"
bash-2.04$ echo $?
1

さすがに>>338の脳内bashの仕様はわからんな。


345 :名無しさん@お腹いっぱい。:03/05/28 20:36
$ hoge=`which lss` && echo "success ($?): $hoge"
lss: Command not found.
success (0):
$ echo $?
0

$ hoge=`cat lss` && echo "success ($?): $hoge"
cat: lss: No such file or directory
$ echo $?
1

346 :名無しさん@お腹いっぱい。:03/05/29 11:32
>>345
そりゃbashじゃなくてwhichの方の問題だな。
type which

347 :山崎 渉:03/07/15 11:37

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄

348 :名無しさん@お腹いっぱい。:03/07/19 14:45
1年前に買った入門UNIXシェルプログラミングをぜんぜん読んでない。

349 :_:03/07/19 14:45
http://homepage.mac.com/hiroyuki44/

350 :名無しさん@お腹いっぱい。:03/08/02 00:52
おしえてください
以下のファイルがカレントディレクトリにある場合,
@$ call_hoge.sh
A$ hoge.sh `cat hogehoge`
では出力が違ってしまいます.@でAと同じ出力を得るには
call_hoge.shをどう変更すればよいですか?

---------hogehoge-------------
hoge "" "ho ge"
------------------------------

-----------call_hoge.sh-------
#!/bin/sh
hoge.sh `cat hogehoge`
------------------------------

-----------hoge.sh------------
#!/bin/sh
for i in "$@"
do
echo $i
done
------------------------------



351 :名無しさん@お腹いっぱい。:03/08/02 02:39
>>350
> call_hoge.shをどう変更すればよいですか?
どっちの出力にするんだって?
たぶんログインシェルが/bin/shと違うってことだろうが。

352 :名無しさん@お腹いっぱい。:03/08/02 04:02
>>350
展開の順番と仕組みを勉強すると解るよ。
俺の O.S だと、man sh に詳しく書いてあったよ。


353 :352:03/08/02 04:08
上の記事、忘れて。(^^;

354 :あぼーん:あぼーん
あぼーん

355 :名無しさん@お腹いっぱい。:03/08/02 07:29
>>351
ログインシェルはkshです.
出力は@だと
-------------
hoge
""
"ho
ge"
-------------
に,Aだと
-------------
hoge

ho ge
-------------
になります.hoge.shへの引数が空白で区切られるのを
回避したいのですが.


356 :((≡ ̄♀ ̄≡)):03/08/02 07:45
キキキタタタタ━━━((゜(゜∀゜)゜))━━━!!!!
http://link.iclub.to/adalt/

357 :名無しさん@お腹いっぱい。:03/08/02 08:14
>>355
未定義文字コードを使うな。どっちがどっちか分からん。
call_hoge.shの方を変えたいんなら、evalつけてみろ。

#!/bin/sh
eval ./hoge.sh `cat hogehoge`


358 :名無しさん@お腹いっぱい。:03/08/02 19:31
>>357
ありがとうございました.

359 :_:03/08/02 19:41
http://homepage.mac.com/hiroyuki44/

360 :安全地帯:03/08/02 21:24
http://elife.fam.cx/a009/


361 :hoge:03/08/09 11:09
あまりにあんまりな質問なんですけど…

#!/bin/sh
cd /path/to/dir

としてもスクリプトは新しいシェルで
実行されてしまうようで /path/to/dirに
移動してくれません。

このような場合どうしたら良いのでしょうか?


362 :名無しさん@お腹いっぱい。:03/08/09 11:13
どうにもなりません。
かのnxtですら実装できなかった機能です。

363 :hoge:03/08/09 11:19
え、そうなんですか?

なにか大体手段はないでしょうか?
他のスクリプト言語ならできるとか…


364 :hoge:03/08/09 11:19
あ、エイリアス以外で…

365 :無料動画直リン:03/08/09 11:24
http://homepage.mac.com/miku24/

366 :名無しさん@お腹いっぱい。:03/08/09 11:49
command.com か cmd.exe なら可能です。

367 :名無しさん@お腹いっぱい。:03/08/09 11:51
エイリアス以外という事ならshell function

368 :hoge:03/08/09 12:21
うまく行きました。ありがとう!

369 :名無しさん@お腹いっぱい。:03/08/09 14:36
>>361
sourceか.で。


370 :名無しさん@お腹いっぱい。:03/08/09 15:28
cshで、新窓開いてリモートマシンのファイルをtailした結果中の"*"が含まれた行を出力したいのですが、
↓では何も出力されなくて困ってます(つД`)
/usr/dt/bin/dtterm -e remsh XXX.XXX.XXX.XXX "tail -f /a/b/c.txt | grep \*" &

初歩的で申し訳ありませんが、ご教授御願いしまふ。。。


371 :名無しさん@お腹いっぱい。:03/08/09 15:46
grep \* は grep "*" と同じ。ということは?

372 :370:03/08/09 16:02
と、いう事はgrepまでで終わってしまっているという事ですか・・・。
"tail -f /a/b/c.txt | `grep *`"
とすればいいのでしょうか?

373 :名無しさん@お腹いっぱい。:03/08/09 16:21
echo "*"
echo '*'

374 :370:03/08/09 18:01
なるほど
"tail -f /a/b/c.txt | grep '*'"
ですか。
試してみます。どもです。

375 :名無しさん@お腹いっぱい。:03/08/09 21:34
'tail|grep \\*'かな?


376 :370:03/08/10 04:22
>>375
ありがとうございます。
試してみます!

377 :名無しさん@お腹いっぱい。:03/08/11 16:27
>>370
試してみます、じゃなくて試した結果を書いた方がいいと思うが。

378 :370:03/08/11 17:27
>>377
質問し、アドバイスを頂いておきながら結果報告が遅れて申し訳ありません。
<(_ _)>
明日、必ず結果を書きます。

379 :370:03/08/12 18:05
'tail -f /a/b/c.txt | grep \\*'
ダメでした。
dttermで窓が生成され、grepも生成されますが、何も表示されません。
リモート側でpsを見ると
sh -c tail -f /a/b/c.txt | grep \\*
となっているのですが・・・


380 :名無しさん@お腹いっぱい。:03/08/12 18:33
> grepも生成されますが、何も表示されません。
grep \\* の結果としては実に順当だと思いまつが。

381 :名無しさん@お腹いっぱい。:03/08/12 18:46
>>379
dtterm -e remsh XXX.XXX.XXX.XXX
のあとに、dttermで
tail -f /a/b/c.txt|grep \\\*
これでできますが、ひとつのコマンドでやる方法はわかりません。

382 :名無しさん@お腹いっぱい。:03/08/13 11:14
fgrep使え。

383 :あぼーん:あぼーん
あぼーん

384 :あぼーん:あぼーん
あぼーん

385 :名無しさん@お腹いっぱい。:03/08/15 22:33
mailコマンドで/home/manco/chinko.txt
を添付して、afo@host.domainに送信する方法は有りますか?

386 :370:03/08/20 14:44
>>380
報告が遅くなってすみません<(_ _)>
出力されない原因がわかりました。
tail -f | grep
としている為、パイプのストリームバッファの問題らしいです。
tail +0f | grep としたところ、先頭からある程度出力されて止まりました。
「tail結果の一部はパイプのせいでバッファ内に取り残されて出力されない」
という結果でした。
アドバイスありがとうございました。
パイプのバッファ(?)を0にする方法を調べてみます。

387 :名無しさん@お腹いっぱい。:03/08/20 15:01
>>370

grepのバッファの問題なら、
grep 'RE'
の代わりに
sed -n '/RE/w /dev/fd/1'
って、してみれば。試してないから動くか分からんけど。

388 :名無しさん@お腹いっぱい。:03/09/15 16:24
あげ!

389 :名無しさん@お腹いっぱい。:03/09/24 17:30
bak2ファイルの内容
-----------------------------
#!/bin/sh

TIME='date +%y%m%d'
cp -r $1 $1.$TIME
-----------------------------

# ./bak2 test.txt
cp: copying multiple files, but last argument `+%y%m%d' is not a directory
詳しくは `cp --help' を実行して下さい.

なぜ怒られるの?

390 :名無しさん@お腹いっぱい。:03/09/24 17:36
TIME='date +%y%m%d'
echo $1 $1.$TIME

にして試してみ。

391 :389:03/09/24 20:18
bak2ファイルの内容
--------------------------
#!/bin/sh

TIME= 'date +%y%m%d'
echo $1 $1.$TIME
--------------------------

# ./bak2 test.txt
./bak2: date +%y%m%d: command not found
test.txt test.txt.


392 :390:03/09/24 20:24
やっぱネタだったか……

393 :389:03/09/24 20:35
失礼

bak2ファイルの内容
--------------------------
#!/bin/sh

TIME='date +%y%m%d'
echo $1 $1.$TIME
--------------------------

# ./bak2 test.txt
test.txt test.txt.date +%y%m%d



394 :名無しさん@お腹いっぱい。:03/09/24 20:36
>>393
それでわかったことは?

395 :389:03/09/24 20:36
TIME= 'date +%y%m%d' が間違ってるの?

396 :389:03/09/24 20:39
date +%y%m%d の結果をTIME変数に入れるにはどうすれば?

397 :名無しさん@お腹いっぱい。:03/09/24 20:40
>>396
>>8

398 :ヽ(´ー`)ノ:03/09/25 18:36
シングルクオートじゃなくてバッククオートじゃないのか?


399 :名無しさん@お腹いっぱい。:03/09/25 22:57
>>385
> mailコマンドで/home/manco/chinko.txt
> を添付して、afo@host.domainに送信する方法は有りますか?

あります。

400 :名無しさん@お腹いっぱい。:03/10/01 20:44
400!

401 :名無しさん@お腹いっぱい。:03/10/04 03:49
perlのchopに相当するbuiltinって
ありますか?


402 :名無しさん@お腹いっぱい。:03/10/04 03:49
age忘れ



403 :名無しさん@お腹いっぱい。:03/10/04 12:32
>>401
builtin なんて大量にあるわけじゃないんだから
man で調べたらよかろう。

404 :名無しさん@お腹いっぱい。:03/10/04 20:44
chomp相当が欲しいなら、そもそも要らないハズだが

405 :名無しさん@お腹いっぱい。:03/10/04 22:16


  UNIX何でも相談室(無料)


  OI2O-69-OI96



406 :名無しさん@お腹いっぱい。:03/10/08 20:52
質問です。

testコマンドの返り値を取得する事はできるのでしょうか?
expr は $(expr 3 + 4)でできますよね?
こんな具合にtestコマンドの返り値を取得したいのです。

もう一つ質問です。bashにはbool値があるのでしょうか?

アドバイスよろしくお願いします。

407 :名無しさん@お腹いっぱい。:03/10/08 21:33
$?

408 :名無しさん@お腹いっぱい。:03/10/10 20:19
shで
直接
command
と起動するのと

exec command
と起動するのはどう違うのでしょうか?

またビルトインコマンドを
pwd
と起動するのと
builtin pwd
と起動する場合の違いはなんでしょうか?

409 :名無しさん@お腹いっぱい。:03/10/10 20:21
(var=VARIABLE)
とサブシェルで実行しているのに

echo $var
とすると
VARIABLE
と参照できてしまいます。何故でしょう?



410 :名無しさん@お腹いっぱい。:03/10/10 20:32
既に定義されてたからじゃねーの? どのシェルの話よ。


411 :名無しさん@お腹いっぱい。:03/10/11 15:07
>>408
シェルは親で,そこから起動されるコマンドは子供,という概念は良い?
親が待機していて,ユーザがコマンドを入力する度に子供プロセスを産んで
子供が終了したら再び親の待機 (シェルのプロンプト) に戻る.
もちろん親と各子供のプロセス番号は異なる.

exec つけたら,シェルの自分のプロセスをそのまま子供に渡す.
シェル上で (1) 普通に ls する場合 と (2) exec ls する場合とを比べる.

シェルの pid=100, ls の pid=101 として,表に見えるプロセスは
(1)
100
↓ (ls と打つ)
101 (100 は待機,ls の実行中)
↓ (ls 終了,プロンプトに戻る)
100

(2)
100
↓ (exec ls と打つ)
100 (シェルは自分のプロセス番号を ls に渡す.ls は pid 100 として実行される)
↓ (ls 終了,しかし戻るべきシェルはもういない)
死 (そのため,おそらくシェルを起動していた端末も閉じられる)

412 :411:03/10/11 15:08
>>411 の続き.
ls の代わりに,自分のログインシェルと違うシェルで試してみるといいかも.
漏れの場合は,こんな感じ.
tcsh% echo $$
996
tcsh% bash
bash$ echo $$
1008
bash$ exit
exit
tcsh% echo $$
996
tcsh% exec bash
bash$ echo $$
996
bash$ exit
(端末が閉じる)

識者の皆様,
補足,訂正などよろしくお願いします.

413 :名無しさん@お腹いっぱい。:03/10/11 16:32
>>408
execは自分自身が別のプログラムに置き換わるもの。

builtinの方は、組み込みコマンドを実行する場合は、差はない
組み込みと外部コマンドで同名があるときに、あえて組み込みを
実行させるためのもの。

>>409
ならない

414 :名無しさん@お腹いっぱい。:03/11/17 23:08
よっしゃ、UNIXとシェルを平行して勉強するぞと力んだのはいいものの、
何を作っていいかがサッパリ。で、適当なunixコマンドをシェル関数で作ろう
と思ったんだがなかなか難しいものでして。
manとかは頭が痛くなるので先の楽しみにとっておこ〜と思っても
whoamiやwcを作る時点でもう悩む俺にアドバイス下さい。

オプションを抜きにすると、とりあえずどんな感じになるんでしょうか?

415 :名無しさん@お腹いっぱい。:03/11/17 23:32
なんで whoami や wc なんだろう。

416 :名無しさん@お腹いっぱい。:03/11/18 01:41
% cat wc.sh
#!/bin/sh
wc $*

417 :名無しさん@お腹いっぱい。:03/11/18 06:35
414は「UNIXシェルプログラミング徹底解説」を読め。
http://store.nikkeibp.co.jp/item/contents/m_4822280489.html

#!/bin/sh
whoami() {
echo $USER
}
wc-l_1 () {
i=0
while read l; do
i=`expr $i + 1`
done
echo $i
}
wc-l () {
t=0
nf=0
fmt='% 8d %s\n'
while [ $# -gt 0 ]; do
f="$1"
shift
nf=`expr $nf + 1`
n=`wc-l_1 < "$f"`
if [ $? = 0 ]; then
printf "$fmt" $n $f
t=`expr $t + $n`
fi
done
[ $nf -gt 1 ] && printf "$fmt" $t total
}
wc-l "$@"


418 :名無しさん@お腹いっぱい。:03/11/18 19:16
>>415
いきなり複雑なのは難儀&思い浮かばなかったからです。良い例ありますか?

>>416
コマンドを模して作るのにその対象を使うのはご法度どす。

>>417
やっと行数(やや常識)とサイズ(かなりインチキ)が50行ほどでできたと
喜んでいたらそんなにシンプルに収まるのですか。
といっても動作の分からない部分が少々見受けられるので動かしつつ調べてみますね。

みなさんどうもッス。書店いってきます。

419 :名無しさん@お腹いっぱい。:03/11/19 09:56
シェルでwcを書くなら>>416になるだろう。
Cで書くならともかく。

420 :名無しさん@お腹いっぱい。:03/11/19 20:18
>>419=>>416
プッ初心者に否定されてやんの。

421 :名無しさん@お腹いっぱい。:03/11/19 23:38
俺もリハビリに作ってみたが結構忘れてるな。
単語が数えられん・・・
普通に標準コマンド盛り込めって話だがな。

422 :名無しさん@お腹いっぱい。:03/11/19 23:53
while read l; do
lines=`expr $l + 1`
set -- $l
words=`expr $words + $#`
c=`expr "$line" : ".*"`
chars=`expr $chars + $c`
done

キモの部分はこんな感じで。

BUGS
・行頭に空白文字があると read が無視しちゃって文字数がうまくカウントされない。
・バックスラッシュが混じってるとやっぱりカウントがズレる。

423 :名無しさん@お腹いっぱい。:03/11/19 23:54
× lines=`expr $l + 1`
○ lines=`expr $lines + 1`


424 :名無しさん@お腹いっぱい。:03/11/20 22:44
できたました。多分えらい冗長な処理してるけどそれは初心者ということでご勘弁を。
さぁ次はナニをしたらいいのかしら。適当なお題くださいですの。(他力本願)

425 :名無しさん@お腹いっぱい。:03/11/20 23:43
>>424 とりあえず、お題2つ。お好きなものからどうぞ。
1)sort の反対で、行単位でバラバラに並び替えるもの。
実行するたびに異なる出力結果になるものがほしいけど。
#C で書かれたbogosort ってのがある。

2)seq みたいに、連続したアルファベットを出力するもの。
$hoge f j
f
g
h
i
j
みたいなもの。a から fz まで とかみたいに、2桁とか 3桁でも出来ると便利。
できたら、大文字小文字を切替えるオプションとかも。

426 :名無しさん@お腹いっぱい。:03/11/21 09:51
>>425
そんなのシェルスクリプトで書くことでもないだろう。
>>417の第1章を読め。


427 :名無しさん@お腹いっぱい。:03/11/21 23:15
リダイレクションした処理の中の変数を外でも使いたい場合はどうしたら良いのでしょうか?
while read line
do

done < $i

つまり略の中で処理した変数を使いたいんです。
この前の処理でファイルの引数として
$i使ってるので、この処理でexec使うと
$iの内容が変わっちゃうんですよ…

428 :名無しさん@お腹いっぱい。:03/11/21 23:34
>>472export

429 :名無しさん@お腹いっぱい。:03/11/22 00:12
zshを、オンラインで解説したページでお薦めのがあれば教えてくれ。
英語でも構わんぞ。


430 :名無しさん@お腹いっぱい。:03/11/22 00:36
>>427
> この前の処理でファイルの引数として
> $i使ってるので、この処理でexec使うと
> $iの内容が変わっちゃうんですよ…
この部分が意味不明。
exec < $i
で何で駄目なの?

431 :名無しさん@お腹いっぱい。:03/11/22 02:00
問題

Aに1〜9の乱数を1つ代入し
Aが5以下であればage
Aが6以上であればsage
を表示するスクリプトを作りなさい


432 :名無しさん@お腹いっぱい。:03/11/22 03:11
A=$[RANDOM % 9 + 1]

if [ $A -lt 6 ]; then
echo "age"
else
echo "sage"
fi

433 :名無しさん@お腹いっぱい。:03/11/22 03:22
>>432
失格。

434 :名無しさん@お腹いっぱい。:03/11/22 03:59
>>433
模範解答か、
判定基準をください。

435 :名無しさん@お腹いっぱい。:03/11/22 06:43
% sh
$ A=$[RANDOM % 9 + 1]
%: not found
$ exit

判定基準その1: 明示されてなければふつーsh。


436 :名無しさん@お腹いっぱい。:03/11/22 07:28
「ふつー」ってのは「基準」なのか?

恥ずかしながら $RANDOM って知らなかった。勉強になりました。

437 :名無しさん@お腹いっぱい。:03/11/22 08:10
判定基準その2: 明示されてなければスクリプトとして評価不能。

438 :名無しさん@お腹いっぱい。:03/11/22 09:04
A=`date '+%S' | sed 's/[0-9]//'`


439 :名無しさん@お腹いっぱい。:03/11/22 10:27
jotとかは禁じ手だよね、やっぱり?

440 :名無しさん@お腹いっぱい。:03/11/22 13:09
>>438
1秒以内に何度も実行されたら同じ値になる。

A=`awk 'BEGIN{srand();print int(rand()*10)}'`
↑awk の srand() も同じ問題がある。

A=`expr $$ : ".*\(.\)"`
↑同一スクリプト中では実行するたびに同じ値になる。

A=`sh -c 'expr $$ : ".*\(.\)"'`
↑連続して実行すると連続した値になってしまう

A=`(head -1 /dev/random | od; echo + 10 % p) | dc`
↑/dev/random がない OS もある。

つーか宿題は自分でやれ、と。


441 :名無しさん@お腹いっぱい。:03/11/22 13:51
>>426
その本読めば >>425 とか簡単にできますか?
それとも、シェルスクリプトではなくて、
ちゃんとした言語で作れってことですか?

近くの書店にはその本無くて立ち読みも出来なかったんですけど。

442 :名無しさん@お腹いっぱい。:03/11/22 14:08
>>441
適した道具を判断するのも頭の重要な使い方だと思うが。


443 :名無しさん@お腹いっぱい。:03/11/22 15:04
A=`bash -c 'echo $[RANDOM % 9 + 1]'`

444 :名無しさん@お腹いっぱい。:03/11/22 18:34
せっかくなので>>432さんのスクリプトに追記してみた

#!/bin/sh
A=$[RANDOM % 9 + 1]
if [ $A -lt 6 ]; then
echo "age":$A
else
echo "sage":$A
fi

変数Aが表示されるだけなんだけどけっこう重要かも

445 :名無しさん@お腹いっぱい。:03/11/22 18:51
>>436 -lt の使い方の方が勉強になった…はじかちぃ〜

てっきり A<とかにするかと・・・・

446 :名無しさん@お腹いっぱい。:03/11/22 21:16
自分とこの/bin/shの実体がbashなことも知らない犬ウザは犬板へカエレ!!

しかもそれまでのレスを読むことすら満足にできない知障らしいし。
UNIX板へ来ずに犬板にスレ立ててそっちでやってくれよ。


447 :名無しさん@お腹いっぱい。:03/11/22 23:22
>>427
これのことでしょ?
http://www.nurs.or.jp/~asada/FAQ/UNIX/section3.8.html

サブシェルの問題が出てくるようなら、シェルスクリプトでなく
別の言語(Perlとか)に変えたいところ

448 :名無しさん@お腹いっぱい。:03/11/22 23:27
>>445
< はリダイレクトを意味しちゃうからね

449 :名無しさん@お腹いっぱい。:03/11/23 07:29
>>446
どうも話が変だと思ってたら、linuxしか使ったことのない人間が複数
混じってたというわけか。納得。

そういうのはlinux板でやってくださいね

450 :名無しさん@お腹いっぱい。:03/11/23 10:07
>>446
Mac OS X でも /bin/sh は bash だったりして。

>>427
パイプでつないだらダメなの?

451 :名無しさん@お腹いっぱい。:03/11/23 11:53
Cシェル使いはおらんのけ?

452 :名無しさん@お腹いっぱい。:03/11/23 13:19
対話的には使ってもスクリプト書くのには使わない。


453 :名無しさん@お腹いっぱい。:03/11/23 13:26
>>46

454 :名無しさん@お腹いっぱい。 :03/11/23 13:45
シェルスクリプトとはちょっと違う話かもしれませんが
引数をそのまんまsystem()ってやってるCのプログラムhogeに
「*」渡したら
シェルスクリプトみたくファイル一覧に展開しやがりました。
system()もシェルと同じようにワイルドカードを展開するんですか?
シェルはcshです。

455 :名無しさん@お腹いっぱい。:03/11/23 13:48
シェルスクリプトは基本的にどこでも動くshで書いて、
(bourne) shで簡単に実現出来ないようなものならおとなしく
perlなりrubyなり使うな。

その意味、>>442の言ってることは正しい。
シェルスクリプトに向かないことをアクロバティックにshでやる必要なんて
どこにもないからね。

456 :名無しさん@お腹いっぱい。:03/11/23 13:50
>>454
もし
% hoge *
とやってそうなったのなら、それはCでなくcshが展開したもの。

% hoge \*
とやれば望みの動作になるはず。

457 :名無しさん@お腹いっぱい。:03/11/23 14:16
>>456
お返事Thxです。
ちと説明が足りなかったのですが、「"*"」を渡した時も同じですか?



458 :名無しさん@お腹いっぱい。:03/11/23 15:58
>>457
man 3 systemk

459 :名無しさん@お腹いっぱい。:03/11/24 13:26
>>458
Thx
ps見てたら/bin/sh -c ・・・ って出てたからなんだろなと思っていたけどこれか・・。

460 :名無しさん@お腹いっぱい。:04/01/09 13:49
>>435
超遅レスだが
A=`expr $RANDOM % 9`
でイインジャネーノ?`

461 :名無しさん@お腹いっぱい。:04/01/09 13:58
RANDOM: Undefined variable.

何度も出てるけど、ここはUNIX板。
標準のシェルがbashなのはlinuxだけの慣行なので。(>>446)

462 :460:04/01/09 18:20
>>461
Linuxじゃなかったけど,良く見たら ksh だった。
/bin/sh だと $RANDOM なんてなかった。
逝ってきます...

463 :名無しさん@お腹いっぱい。:04/01/28 15:35
/bin/shで、スクリプトを作ってます。スクリプトの実行中、ユーザにファイル名の入力を求めるような部分が有るのですが。ここでファイル名補完をできるようにしたいです。どのような方法があるでしょうか? アドバイス願います。

464 :名無しさん@お腹いっぱい。:04/01/28 17:33
質問するより、ファイル名を補完付きで一個入力させてそのまま返すコマンドを
さくっと書いた方が早そうだが。どうせ補完自体はreadlineにさせるんだし。

そう思ってreadlineのサンプルを見ると、なにやらそれっぽいのがあるぞ。


465 :名無しさん@お腹いっぱい。:04/01/28 21:16

 一つおしえてください。

# ls |grep a1
01a1
02a1
#

これらの表示を変数にしたいのですがどうしたら一番簡単でしょうか。

よろしくおねがいします。

466 :名無しさん@お腹いっぱい。:04/01/28 22:34
>>464

そうですね。おぱかでした。
ありがとうございました。


467 :名無しさん@お腹いっぱい。:04/01/28 23:49
>>465
> これらの表示を変数にしたいのですがどうしたら一番簡単でしょうか。
意味不明。

a1を変数で与えられるようにしたいのか、出力を変数に取り込みたいのか。

468 :465:04/01/29 17:16
>>467

 言葉が足りませんでした。出力を変数に取り込みたいのです。

ls |grep a1
01a1
02a1

A1-1=01a1
A1-2=02a1

 こういう風に代入して、

cat $A1-1>>$A1-2;rm $A1-1

みたいな処理をしたいのです。

469 :名無しさん@お腹いっぱい。:04/01/29 18:50
まともなシェルスクリプトの本なり web なり読めば
必ず載ってるはずだけどな。

470 :名無しさん@お腹いっぱい。:04/01/29 22:48
シェル変数って-入れちゃだめだよな。
>>468
これじゃだめか?
set -- `ls|grep a1`
$1 -> 01a1
$2 -> 02a1

471 :465:04/01/30 01:33
>>470


#!/bin/sh
set -- `ls|grep a1`
echo $1
echo $2


をつくって実行してみたところ、成功しました。この場合、シェル変数名に
こちらで好きな名前をつけるにはどうしたらいいのでしょうか。

「set シェルスクリプト」などでググっても見つからなかったので、
よろしかったら教えてください。

472 :名無しさん@お腹いっぱい。:04/01/30 01:46
できまへん。適宜代入汁

473 :名無しさん@お腹いっぱい。:04/01/30 01:49
またもや何をしたいのかわからんな。

474 :名無しさん@お腹いっぱい。:04/01/30 06:58
UNIX板ってこんな雰囲気なの?

なんかこわい。


475 :名無しさん@お腹いっぱい。:04/01/30 12:08
>>474
はいはい。もう書き込まないでね♪

476 :名無しさん@お腹いっぱい。:04/01/30 12:17
>>474
まともな質問にはまともな答えが、
そうでなければそれなりの反応が返ってくるよ。

477 :465:04/01/30 14:47
>>472

#!/bin/sh
set -- `ls|grep a1`
A1=$1
A2=$2

こういう風にすれば一応の目的は達成できました。

>>473

これをできる限り短く書きたかったのです。説明が下手でごめんなさい。

478 :誰かこの問題といて:04/01/30 15:52
1)Write a script that asks for a file name.
a)makes a backup of that file which is called file.back
b)moves the original file to another directory.
c)Prints the filename, owner, and size of the file.

479 :名無しさん@お腹いっぱい。:04/01/30 15:57
宿題は宿題スレへ。

#!/bin/sh
echo -n "enter file name: "
read file
cp -p "$file" "$file".back
mkdir -p another
mv "$file" another
cd another
ls -l "$file"


480 :名無しさん@お腹いっぱい。:04/01/30 16:13
>>478 こっちの方がエレガント。

#!/bin/sh
another=${1:-/dev/null}
read -p "enter file name: " file; echo \
cp "$file" "$file".back
list=`ls -l "$file"`
if [ -d $another]; then mkdir $another; fi
mv "$file" $another
echo "$list"

481 :名無しさん@お腹いっぱい。:04/01/30 16:15
> if [ -d $another]; then mkdir $another; fi
訂正。正しくはこっち。
if [ ! -d another ]; then mkdir another; fi

482 :名無しさん@お腹いっぱい。:04/01/30 16:19
>>480
> read -p "enter file name: " file; echo \
> cp "$file" "$file".back
コピーせずにコマンドを表示するだけのような気がするが。

483 :教えて君:04/01/30 22:38
ログインシェルと起動シェルの違いは何ですか?

484 :誰かこの問題といて:04/02/01 06:20
宿題スレが見つからなかったのでまたここに書き込みさせて下さい。
UNIX初心者です。ついでにPCも初心者です。
Write a script that prints out how many bytes are available on the disk
(use df commands) and the % of the disk used.

479さん480サン ありがとうございました。助かりました。

485 :名無しさん@お腹いっぱい。:04/02/01 08:51
>>484
df

486 :名無しさん@お腹いっぱい。:04/02/01 12:30
>>484
仏の顔も三度までだぞ。

#!/bin/sh
echo "a script that prints out how many bytes are available on the disk
(use df commands) and the % of the disk used."


487 :名無しさん@お腹いっぱい。:04/02/01 12:43
○○サンとカタカナで書かれると
なぜだか「和田サン」を連想してしまう

488 :名無しさん@お腹いっぱい。:04/02/08 15:24
sed -n '1,$p' file.txt 
1を変数にして値を変えていきたいんですけどエラーになってしまう。
’ ’の中で変数は使えないのでしょうか?


489 :名無しさん@お腹いっぱい。:04/02/08 15:53
使えません。

490 :名無しさん@お腹いっぱい。:04/02/08 17:10
"$n",'$p'

491 :名無しさん@お腹いっぱい。:04/02/08 22:14
この場合ならば tail +$num file.txt でいいけどな。

492 :名無しさん@お腹いっぱい。:04/02/09 01:15
>>488
’ ’ってなんですか?

493 :名無しさん@お腹いっぱい。:04/02/09 20:45
>488
ふつー
sed -n "$x,\$p" file.txt

マニアは
p='$p'
sed -n "$x,$p" file.txt

>492
変数展開の抑制


494 :名無しさん@お腹いっぱい。:04/02/09 21:52
> 変数展開の抑制
それは''と思われ

495 :名無しさん@お腹いっぱい。:04/02/09 23:19
sed で改行って入れられるんだっけ?正規表現スレで聞いた方が早いかな?


496 :名無しさん@お腹いっぱい。:04/02/09 23:46
>>495
man sedすれば書いてある

497 :名無しさん@お腹いっぱい。:04/02/17 22:31
シェルスクリプトからユーザーをログアウトさせることは可能でしょうか?
シェルスクリプトにexitとか書いても実行されません。

498 :名無しさん@お腹いっぱい。:04/02/18 00:06
killall -t `tty` -KILL

OS 依存の上、ログアウトじゃねーし(w
つーか無理。

499 :誰かこの問題といて:04/02/18 00:24
Write a script that asks the user if you would like to create a file.
If the user answers “yes”, then create a 0 byte file called fileone.
If the user answers “no” then ask the user if you would like to print a file.
If yes, ask for the name of the file to print and print the contents of the file.
If no, exit the script.

500 :名無しさん@お腹いっぱい。:04/02/18 06:50
echo a script that asks the user if you would like to create a file.\
If the user answers “yes”, then create a 0 byte file called fileone.\
If the user answers “no” then ask the user if you would like to print a file.\
If yes, ask for the name of the file to print and print the contents of the file.\
If no, exit the script.


501 :名無しさん@お腹いっぱい。:04/02/21 17:55
宿題はクズカゴヘ

502 :名無しさん@お腹いっぱい。:04/03/03 23:13
shとcshで
% false | true

$ false | true
で$?の値が違うんですがそーゆーもんですか?
shの方でもcshと同じようになって欲しいんですが、どうしたらいいんでしょうか?


503 :名無しさん@お腹いっぱい。:04/03/03 23:32
$ csh -c 'false | true'


504 :名無しさん@お腹いっぱい。:04/03/03 23:42
目から鱗落ちまくり。


505 :名無しさん@お腹いっぱい。:04/03/10 00:17
bashでディレクトリ中のjpgファイルをひろってHTMLでカタログを書き出すスクリプトを作っています.
出力イメージのサイズを引数で
hoge.sh -1024x768
と指定出来るようにしました.

このスクリプトで,与えられた引数が
-[0-9]+x[0-9]+
になってるかどうか確かめたいのですが,何か方法がありますか?

if [ $1 = -[0-9]+x[0-9]+ ]
then
・・・
fi

だと正規表現として判別してくれないので困ってます.ふぐぅ.


多分スゴイ厨な質問だとは思いますが,よろしくお願いします.

506 :名無しさん@お腹いっぱい。:04/03/10 00:20
いきなり代入かよ。

507 :名無しさん@お腹いっぱい。:04/03/10 00:55
if expr "x$1" : 'x\(-[0-9][0-9]*x[0-9][0-9]*$\)' > /dev/null
then
...
fi



508 :505:04/03/10 02:38
>>507
出来ました.ありがとうございます.
出来たのですが,何をやってるのかわかりません.
良かったら参考になるページとか教えてもらえませんか?

509 :名無しさん@お腹いっぱい。:04/03/10 03:21
ttp://www.linux.or.jp/JM/html/gnumaniak/man1/expr.1.html

510 :505:04/03/10 04:23
>509
ありがとうございます.何となくわかった気がします.


お礼に出来たスクリプトをさらしてみる試み.
http://up.isp.2ch.net/up/df33951c65eb.gz

511 :名無しさん@お腹いっぱい。:04/03/10 07:52
まともな正規表現が使えて、無駄な出力をしないexprみたいなコマ
ンドがあればいいのに、といつも思う。

512 :名無しさん@お腹いっぱい。:04/03/10 21:38
まとも?なREと、むだな出力をしないとなると、
`echo $1 | perl -ne 'exit 1 unless /^-\d+x\d+$/'`
むりくりこんなかんじ。


513 :名無しさん@お腹いっぱい。:04/03/10 23:10
echo | egrep -s
じゃダメかい。実装によっては egrep -q だったりするが。

514 :名無しさん@お腹いっぱい。:04/03/11 03:31
急に仕事に必要になったので、
これからシェルスクリプトを勉強しようと思っています。

そこで、質問なのですが
シェルスクリプトは、無限ループで
永続的に動かしたり(具体的には、HTTPDや
FTPDをずっと監視して、それらの挙動によって
スクリプトのifやcaseでFTPやHTTPに介入する等)
永続的に動かさないまでもなんらかのコマンドを
利用して定期的にスクリプトを起動したり、
シェルスクリプトを起動しながら、起動中に
その都度、任意の他のアプリケーションや
コマンドを手動で動かしたり出来るのでしょうか?

Googleで「シェルスクリプト Redhat」で検索して、
シェルスクリプト解説サイトをいろいろ
見てみたのですが、そのところがどうしても載ってなくて…。
変な質問ですみませんが、よろしくお願いします。

515 :名無しさん@お腹いっぱい。:04/03/11 03:34
>>514


516 :名無しさん@お腹いっぱい。:04/03/11 04:19
>>515
即レスありがとうございます。
がんばってシェルスクリプト憶えます。

517 :名無しさん@お腹いっぱい。:04/03/11 04:46
>>516
>コマンドを手動で
warota

518 :名無しさん@お腹いっぱい。:04/03/11 18:23
>>510 うう、見損ねた

519 :505=510:04/03/11 20:44
>>518
http://www.geocities.jp/okhotska/ShellScript/MakeWebAlbum/index.html
使い方とかサンプルも添えてホームページにしてみました.

520 :名無しさん@お腹いっぱい。:04/03/11 21:07
こりゃ(・∀・)イイ!!
おもしろいですね


521 :名無しさん@お腹いっぱい。:04/03/12 16:46
もしかしてできるわけねーだろ的な質問かも知れないけど、
手元でログインしているSolaris(A)から、
別室にあるSolaris(B)についてるモニタにdttermウィンドウを開く事って可能ですか?

-help見ると-display displayname 接続するXサーバ

とかいう一文があって、ここで指定するのかなと思って色々やっているんだけど...


ちなみにやりたい事はSolaris(A)+Solaris(B)+Solaris(C)それぞれのディスク容量とかプロセスとかを
離れた所にあるSolaris(B)のモニタ上にgeometry指定で監視ツールの窓を並べてやるという感じなのだけど
全然うまくいかない


...俺ってもしかして実現不可能なことに必死に取り組んでる?(;´д⊂ヽ

522 :名無しさん@お腹いっぱい。:04/03/12 16:49
>>521
スレ違い。

523 :名無しさん@お腹いっぱい。:04/03/12 17:02
ありゃ、スレ違いっすか..
一応csh経由で

#!/bin/csh
(色々処理)

dtterm〜〜
dtterm〜〜
dtterm〜〜

exit 0

とやるんでこっちに書いてみたんだけど

524 :521:04/03/12 17:44
スレ違いスマソ
とりあえずSolarisスレ(↓)に逝ってきます

Solaris教えてスレッド sono-銃3
http://pc.2ch.net/test/read.cgi/unix/1070948622/

525 :名無しさん@お腹いっぱい。:04/03/15 23:48
初めて作ったシェルスクリプトです。
分単位で指定するラーメンタイマーなんですがこのままだと表示が
180
179
.
.
といった具合にカウントダウンします。
それを180と出たら1秒後にそこが179、178と変わっていくタイプにしたくて
echo $time の前に clear 入れてみたりしたんですけどターミナルの
$PS1とかまで消えてしまうのです。こういった場合には何を使うのでしょうか?

#!/bin/sh
if [ $# -eq 0 ]
then
time=180
else
time=`expr $1 \* 60`
fi

while [ $time -gt 0 ]
do
echo $time
time=`expr $time - 1`
sleep 1
done
echo "完成!"

526 :名無しさん@お腹いっぱい。:04/03/16 07:55
echo -n $time '\r'

527 :名無しさん@お腹いっぱい。:04/03/17 00:52
>>526
ありがとうございました。
echoで対処できるとは思いもしませんでした。

ちなみに完成品はこんな感じです。
無駄が多いので改行多すぎになるためBASE64で。

----BEGIN BASE64----(timer)
IyEvYmluL3NoCgprYW89IiiOpaLPjqUpIMS0zf3D5iEhIgpnYXVnZV9tYXg9MjAK
Z2F1Z2VfemFuPSRnYXVnZV9tYXgKZ2F1Z2Vfa2FuPTAKbG9vcF9jb3VudD0wCgpj
YXNlICQjIGluCiAgICAwICkgdGltZV9tPTMKCXRpbWVfcz0wOzsKICAgIDEgKSB0
aW1lX209JDEKCXRpbWVfcz0wOzsKICAgIDIgKSB0aW1lX209JDEKCXRpbWVfcz0k
Mjs7ICAgIAplc2FjCgpnYXVnZV9zcGVlZD1gZXhwciBcKCAkdGltZV9tIFwqIDYw
ICsgJHRpbWVfcyBcKSAvICRnYXVnZV9tYXhgCgppZiBbICR0aW1lX20gLWx0IDEw
IF07CnRoZW4KICAgIHRpbWVfbT0wJHRpbWVfbQpmaQppZiBbICR0aW1lX3MgLWx0
IDEwIF07CnRoZW4KICAgIHRpbWVfcz0wJHRpbWVfcwpmaQoKI3doaWxlIFsgJHRp
bWVfbSAtZ3QgMCAmJiAkdGltZV9zIC1ndCAwIF0Kd2hpbGUgWyBgZXhwciAkdGlt
ZV9tICsgJHRpbWVfc2AgLW5lIDAgXQpkbwogIGVjaG8gLWUgIiR0aW1lX206JHRp
bWVfcyBbYCBmb3IgaSBpbiBcYHNlcSAxICRnYXVnZV9rYW5cYCA7IGRvIGVjaG8g
XCMgOyBkb25lIHwgdHIgLWQgIlxuIiBgYCBmb3IgaSBpbiBcYHNlcSAxICRnYXVn
ZV96YW5cYCA7IGRvIGVjaG8gLSA7IGRvbmUgfCB0ciAtZCAiXG4iIGBdICRrYW8g
XHJcYyIKCiAgbG9vcF9jb3VudD1gZXhwciAkbG9vcF9jb3VudCArIDFgCiAgaWYg
WyAkbG9vcF9jb3VudCAtZXEgJGdhdWdlX3NwZWVkIF0KICAgIHRoZW4KICAgICAg
bG9vcF9jb3VudD0wCiAgICAgIGdhdWdlX3phbj1gZXhwciAkZ2F1Z2VfemFuIC0g
MWAKICBmaQogIGdhdWdlX2thbj1gZXhwciAkZ2F1Z2VfbWF4IC0gJGdhdWdlX3ph
bmAKCiAgdGltZV9zPWBleHByICR0aW1lX3MgLSAxYAogIGNhc2UgJHRpbWVfcyBp


528 :名無しさん@お腹いっぱい。:04/03/17 00:52
bgogICAgICAtMSApCiAgICAgIHRpbWVfcz01OQogICAgICB0aW1lX209YGV4cHIg
JHRpbWVfbSAtIDFgCiAgICAgIGlmIFsgJHRpbWVfbSAtbHQgMTAgXQoJICB0aGVu
CgkgIHRpbWVfbT0wJHRpbWVfbQogICAgICBmaSA7OwogICAgICBbMC05XSApIHRp
bWVfcz0wJHRpbWVfcyA7OwogIGVzYWMKCiAgY2FzZSAka2FvIGluCiAgICAgICIo
os+OpSApIMS0zf3D5iEhIiApIGthbz0iKI6los+OpSkgxLTN/cPmISEiOzsKICAg
ICAgIiiOpaLPjqUpIMS0zf3D5iEhIiApIGthbz0iKCCOpaLPKSDEtM39w+YhISI7
OwogICAgICAiKCCOpaLPKSDEtM39w+YhISIgKSBrYW89IiggICCOpSkgxLTN/cPm
ISEiOzsKICAgICAgIiggICCOpSkgxLTN/cPmISEiICkga2FvPSIoICAgICkgxLTN
/cPmISEiOzsKICAgICAgIiggICAgKSDEtM39w+YhISIgKSBrYW89IiiOpSAgICkg
xLTN/cPmISEiOzsKICAgICAgIiiOpSAgICkgxLTN/cPmISEiICkga2FvPSIoos+O
pSApIMS0zf3D5iEhIjs7CiAgZXNhYwoKICBzbGVlcCAxCmRvbmUKCmVjaG8gIiR0
aW1lX206JHRpbWVfcyBbYCBmb3IgaSBpbiBcYHNlcSAxICRnYXVnZV9tYXhcYCA7
IGRvIGVjaG8gXCMgOyBkb25lIHwgdHIgLWQgIlxuIiBgXSAojt+iz47fKSClx6Wt
pb8hISIKYmVlcCAtZiAzMDAuNyAtciAyIC1kIDEwMCAtbCA0MDAKCg==
----END BASE64----


529 :名無しさん@お腹いっぱい。:04/03/17 15:33
質問です
Cシェルスクリプト上でrshを使用して他サーバでの処理をする部分で悩んでいます

自分ではいくつかのサーバを巡回して各サーバの/devel/bataにある古い
バックアップファイル(*.bak)を削除してまわるスクリプト(のつもり)なのですが、

実際に走らせてみたところ、最初のalfaにrshした後、
ローカルコンソールにターミナルが開いて入力待ちという状態になってしまいます。
しかもログアウトでrshを抜けたら今度はローカルの/devel/bataを見に行っちゃうし…
(その動作自体はちょっと考えてみれば至極当然の動作なのだけど…)

こういう場合に、rshで停止せず、rsh接続のままで以降の処理に進ませたい場合には
どんな風にスクリプトを組んでいけばいいのでしょうか?
スクリプトに詳しい方よろしくお願いします。
環境は全マシンともSolaris8です

#!/bin/csh
#処理サーバ名:alfa bravo charlie delta 
set Tgt_Server="alfa bravo charlie delta"
#
foreach SV (${Tgt_Server})
rsh ${SV}
cd /devel/bata
foreach file ( `find . -mtime +5 -type f -print` )
echo $file | grep ".bak" >& /dev/null
if ( $status == 0 ) then
echo "exist" $file >& /dev/null
rm $file
endif
end
end
exit 0

530 :名無しさん@お腹いっぱい。:04/03/17 15:44
>>529
#!/bin/csh
cd /devel/bata
foreach file ( `find . -mtime +5 -type f -print` )
  echo $file | grep ".bak" >& /dev/null
  if ( $status == 0 ) then
    echo "exist" $file >& /dev/null
    rm $file
  endif
end
この部分を別のファイルにする。

#!/bin/csh
#処理サーバ名:alfa bravo charlie delta 
set Tgt_Server="alfa bravo charlie delta"
#
foreach SV (${Tgt_Server})
  rsh ${SV} 上のファイル
end
exit 0
rshの引数に分けたファイルを指定すればいい。

531 :名無しさん@お腹いっぱい。:04/03/17 16:10
>>530
レスどうもです。
別ファイルにできればいいのですが、
業務用に納入まで実環境を保持するとか何とかいうサーバもあって、
そういうサーバだとこんな細かいファイルでさえ「入れたい」と言うと非常にイヤ〜な顔されるのです…
しかもそれに関してのグチが自分にじゃなく、自分の上の者にいって、上からこっちに来るのが精神的にキツイというか(´д`υ

なのでローカルサーバからリモートで出来るようなら
それにこしたことがないのです。

rshやrloginでは実現不能なのでしょうか?

532 :名無しさん@お腹いっぱい。:04/03/17 16:47
いまどきsshじゃなくてrshつかうの?
ま、どちらにしても、
rsh remotehost /bin/sh -c 'あとはずらずらshスクリプト'
ってやれば?

533 :名無しさん@お腹いっぱい。:04/03/19 00:39
>>527
くるくるしてるのが(・∀・)イイ!! ↓コレ
02:47 [#-------------------] ( ・∀) 調理中!!

534 :名無しさん@お腹いっぱい。:04/03/19 19:06
>>533

% uudecode timer.b64  
% No `begin' line  Σ(´Д`lll) エエエエー

コピペで解凍でけたの?

535 :名無しさん@お腹いっぱい。:04/03/19 20:00
>>534
コピペしてない、navi2chユーザーだから
M-x navi2ch-base64-write-region
でしますた。ちなみに今uudecodeしたら
uudecode: txt: No `begin' line
と同じメッセージがでました。


536 :名無しさん@お腹いっぱい。:04/03/19 23:42
>>527 で M-d

537 :名無しさん@お腹いっぱい。:04/03/20 00:14
uuencodeはbase64とちがうだろ
b64decodeってのものある場合があるが

538 :名無しさん@お腹いっぱい。:04/04/01 17:17
シェルスクリプトから、ファイルのタイプスタンプを取得するのって、
みなさんどうやってるのでしょうか?
set `ls -al`
とか使おうとしても、AIXだと古いファイルは日時部が
年号になってたりして、うまくいきません。(時分秒まで欲しいのです)
タイプスタンプを取れるコマンドとかあるのでしょうか?


539 :名無しさん@お腹いっぱい。:04/04/01 17:23
tcsh -cf 'filetest -M: filename'

540 :538:04/04/01 17:32
tcsh入ってないみたいなんです、ごめんなさい。。

541 :名無しさん@お腹いっぱい。:04/04/01 17:55
sh系ならこんな感じ。perlぐらいいれとけよ。
a=/kernel; b=`perl -e "@s=stat('$a');print \\$s[9];"`; echo $b



542 :名無しさん@お腹いっぱい。:04/04/01 18:09
>>538 Linux で bash だけど。
find コマンド使えば、-printf で書式指定できる。
find . -maxdepth 1 -printf "%p %CY%Am%Ad%AH%AM%AS\n" とか。

543 :名無しさん@お腹いっぱい。:04/04/01 18:10
>>538
statは入ってないか。

544 :名無しさん@お腹いっぱい。:04/04/01 21:28
/dev/nullとdiff -acなりdiff -auしてhead -1する。
空のファイルが相手なら何か適当に別のファイルとdiff

545 :538:04/04/07 00:56
>>541
>>543
perlは入ってるんですが、statが入っていませんでした。ごめんなさい。

>>542
AIXのfindでは-printfオプションが存在しないみたいです。ごめんなさい。

>>544
この方法だと取得できました。ありがとうございます。


546 :538:04/04/07 00:58
diffの入ってないマシンは考えにくいので、↓こんな感じでやることにしました。

#!/usr/bin/ksh

set -- `diff -c $1 /dev/null | head -1 | sed 's/^\*\*\* //'`

fstmp=$6 # yyyy取得
case $3 in # mm 取得
Jan) fstmp=${fstmp}01;;
Feb) fstmp=${fstmp}02;;
Mar) fstmp=${fstmp}03;;
Apr) fstmp=${fstmp}04;;
May) fstmp=${fstmp}05;;
Jun) fstmp=${fstmp}06;;
Jul) fstmp=${fstmp}07;;
Aug) fstmp=${fstmp}08;;
Sep) fstmp=${fstmp}09;;
Oct) fstmp=${fstmp}10;;
Nov) fstmp=${fstmp}11;;
Dec) fstmp=${fstmp}12;;
esac

if [ $4 -lt 10 ]; then # dd 取得 ただし1桁なら0補完
fstmp=${fstmp}0
fi
fstmp=$fstmp$4`expr substr $5 1 2``expr substr $5 4 2``expr substr $5 7 2`

echo $fstmp


547 :名無しさん@お腹いっぱい。:04/04/07 01:47
head -1 | sed '...' は sed -e '...' -e 2q とひとつにまとめてしまいたい。


548 :名無しさん@お腹いっぱい。:04/04/07 07:39
>>546
Cで書いたら?

549 :名無しさん@お腹いっぱい。:04/04/07 08:52
01.mp3 から 10.mp3までのファイルがあるとして
for i in *.mp3
do
echo $i
done
というスクリプトを走らせると1から10まで表示されるのですが
for i in $1
do
echo $i
done
にして引数に*.mp3をつけて実行しても01.mp3としか表示されません。
なぜこのようになるのでしょうか?
for文に引数の値を持ってくることはできないのでしょうか?

550 :名無しさん@お腹いっぱい。:04/04/07 09:00
*.mp3 は一つの引数じゃなくて、展開されてから渡される。
$1の代わりに、for i in "$@" 使え。

551 :名無しさん@お腹いっぱい。:04/04/07 09:41
>>550
ありがとうございました。ちなみに作ったものはこんな感じです。
持っているmp3プレーヤーがid3tagを英字でしか表示できないのでローマ字に変換するスクリプトです。
id3infoの情報をgrepやsedを使って削るという非常に汚い処理ですが。

#!/bin/sh
if [ $# -eq 0 ]
then
file=*.mp3
else
file=$@
fi

for i in $file
do
id3ed -s `id3info $i |grep TIT2 |sed s/'=== TIT2 (Title\/songname\/content description): '//g |kakasi -Ha -Ka -Ja -Ea -ka |sed s/' '/^/g` -S $i
done

552 :名無しさん@お腹いっぱい。:04/04/07 11:07
>>550
それって、for i と等価じゃなかった?

553 :名無しさん@お腹いっぱい。:04/04/07 11:39
>>551
ファイル名に空白とか入ってる可能性があるから、"$@" にしろと言ったのに、
わざわざ別の変数に入れたりしたら台無し。

>>552
そうかもしれんが、ここで省略法を教えても教育的でない。

554 :名無しさん@お腹いっぱい。:04/04/07 12:11
>>550 だって教育的とは言えんだろ。説明してないこと大杉。



555 :名無しさん@お腹いっぱい。:04/04/07 12:47
>>554
引数の使い方に関するチュートリアル全部書けってか

556 :名無しさん@お腹いっぱい。:04/04/07 13:07
>>553
それなら$@を他の変数に入れずに引数がなにもない場合に
*.mp3を指定したことにするにはどうしたらよいのでしょうか?



557 :名無しさん@お腹いっぱい。:04/04/07 13:41
こうかな

#!/bin/sh
case $# in
0) set *.mp3 ;;
esac
# if [ $# -eq 0 ]; then set *.mp3; fi でも可だが。

for i in "$@"; do
ごにょごにょ "$i" # $i じゃなく "$i"
done

558 :名無しさん@お腹いっぱい。:04/04/07 13:55
>>557
なるほど。ありがとうございました。

559 :名無しさん@お腹いっぱい。:04/04/07 15:21
>>555
全部書けというより、>>550では話が繋がってないだろ。

シェルではワイルドカードは展開してあとのものがプログラムに渡される

$1では最初の一つしかとれない

すべての引数を舐める必要がある

「全部書」きたくなけりゃ、なおさらここで
すべての引数を舐めるには
for i
do
...
done
を使う、とするのが一つの落としどころだろ。

"$@"まで持っていこうとするとさらに $*, $@, quoteと変数展開, "$@" を順に説明することになる。
"$@"自体は一目で疑問なく理解できにくいと思うし。


560 :名無しさん@お腹いっぱい。:04/05/06 20:54
初心者なんですけど、
nkfとplatexを続けて実行するシェルスクリプトを作ってみたのですが、
次のようなエラーが出てうまく実行できません。
./nkfplatex: line 5: syntax error near unexpected token `then'
./nkfplatex: line 5: `if[ $1 = $bname ]; then'

すみませんが、どこが間違っているのか教えて頂きたいのですけど…よろしくお願いします。

#!/bin/bash

bname=`basename $1 .tex`

if[ $1 = $bname ]; then
echo "texファイルではありません"
else
nkf -w $1 > tmp.tex
platex tmp.tex
mv tmp.dvi $bname.dvi
rm tmp.*
fi


561 :名無しさん@お腹いっぱい。:04/05/06 21:05
>>560
if[ -> if [

562 :560:04/05/06 21:11
>>561
お〜、なんと馬鹿な事を聞いてしまいましたね。
ありがとうございました。


563 :名無しさん@お腹いっぱい。:04/05/07 10:11
>>560
if [ "$1" = "$bname" ]; then
みたいに"でくくる習慣をつけた方がいいよ.
こういうののデバッグははまるから.

564 :名無しさん@お腹いっぱい。:04/05/07 15:50
もっというと、-で始まっても大丈夫なように、x"$1" とかにする。

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

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)