■掲示板に戻る■ 全部 1- 最新50☆シェルスクリプトを勉強するにあたって☆
- 1 :あらん :2001/05/12(土) 18:32
- シェルスクリプトを勉強しようと、思い様々な検索をかけてみて、
Windowsでいう、バッチファイルの高級バージョンという、事と、
主に、3種類のバージョンがあることは、わかりました。
しかし、肝心の勉強する本が見つかりません。みなさんは、
どのようにして、学ばれたのでしょうか。
オススメの、HP、本等ありましたら、お願いします。
- 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
- 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
- 保守
新着レスの表示
掲示板に戻る 全部 前100 次100 最新50read.cgi ver5.26+ (01/10/21-)