■掲示板に戻る■ 全部 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 :**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************bash :2001/06/24(日) 17:45
「bash Manual & Reference」

ISBN4-87966-865-6
定価 (本体 2400円+税)

秀和システム

ホントの初歩、簡単な例、マニュアル。
これで、bash ならほとんどOKと思われ。

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


続きを読む

掲示板に戻る 全部 次100 最新50
名前: E-mail (省略可) :

read.cgi ver5.26+ (01/10/21-)