■掲示板に戻る■ 全部 1- 最新50

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

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

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 最新50
名前: E-mail (省略可) :

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