トップページunix
1001コメント351KB

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

レス数が1000を超えています。これ以上書き込みはできません。
0001名無しさん@お腹いっぱい。2010/02/20(土) 14:10:05
シェルスクリプトの総合スレです。 
スクリプトのお勉強・自慢・腕試しなどにどうぞ。 
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。 

□お約束 
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 
 Linuxユーザは/bin/shの正体がbashなので特に注意。 
 FreeBSDユーザは/bin/shの正体がashなので注意。 
 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。 
  http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/ ;
  http://heirloom.sourceforge.net/sh.html ;
・csh/tcshのシェルスクリプトは推奨されません。 
 (理由は「csh-whynot」でググれ) 
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 
 manや参考リンクを見ましょう。 
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 
・シェルスクリプトのことをシェルってゆーな 
・シェルで使えるワイルドカード等は正規表現ではありません。 
 正規表現の話題はスレ違い(正規表現スレへ) 

□初心者へのアドバイス: 
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも 
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 
・知らないコマンドが出てきたらmanを引きましょう。 
・思い通りに動かないときは、まずは sh -x でトレースしましょう。 

前スレ 
シェルスクリプト総合 その15
http://pc12.2ch.net/test/read.cgi/unix/1246408968/l50
0951名無しさん@お腹いっぱい。2010/11/02(火) 02:11:06
以下のようなバックアップスクリプトを作ってみたんだが
圧縮したあとに展開したら元ファイルとファイルサイズが全然違う
どうしてかわかるエロイ人いませんか

#!/bin/sh

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin

KEEPDAY=90

BK_DIR=/home/hoge/www
PUT_DIR=/home/hoge/backup/www

MKFILE=www.`date +'%y%m%d'`
TGZFILE=$MKFILE.tar.gz
RMFILE=www.`date -v -"$KEEPDAY"d +'%y%m%d'`.tar.gz

cd $BK_DIR
echo "Packing to $MKFILE"
tar cvzf $TGZFILE ./

echo "Checking to $TGZFILE"
if [ -f $TGZFILE -a -f $RMFILE ]; then
rm -f $RMFILE
echo "Removed $RMFILE"
exit 0
fi
0952名無しさん@お腹いっぱい。2010/11/02(火) 08:27:22
バックアップしたいディレクトリの中にバックアップファイル作っちゃうの?
0953名無しさん@お腹いっぱい。2010/11/02(火) 08:48:16
>>950
nとr逆じゃね?
CRLF = ^M^J なので、少なくとも改行が CRLFかLF だと分かっていれば
grep "^M$" < hoge.txt
でいいんじゃ?
(^MはCtrl押しながらmを打鍵)
0954名無しさん@お腹いっぱい。2010/11/02(火) 08:59:21
環境(エディタ、端末)にもよるけど、普通 Ctrl+m = Enter じゃね?
Ctrl+v Ctrl+m で入れる環境が多いと思うけど。
0955名無しさん@お腹いっぱい。2010/11/02(火) 09:05:38
すまん、確かにCtrl-Vの前置を書き忘れていた。
09569352010/11/02(火) 17:55:13
>>936-942
レスありがとうございます。
勉強になりました。
0957名無しさん@お腹いっぱい。2010/11/03(水) 00:00:04
>>953-955
ありがとうございます。
出来ました。

nとr逆ですね。

cat -v hoge
で見える改行コードの入力の仕方がわからなかったので助かりました。

しかし、grepって複数行の検索出来ないんですね。
0958名無しさん@お腹いっぱい。2010/11/03(水) 00:02:35
>>952
バックアップしたいディレクトリをフルパスで指定すると
tarのエラーで/を先頭に付けるな
と、怒られてしまったので

cdでバックアップ元のディレクトリに移動

./でバックアップ元を指定して、バックアップ先へtar.gzで圧縮

という流れにしました

もっと良い書き方があるんだろうけどターミナル触るのが久々
過ぎてこんなぐらいしか思いつかなかった

もっと良い書き方はございますか
0959名無しさん@お腹いっぱい。2010/11/03(水) 00:11:01
ございます
0960名無しさん@お腹いっぱい。2010/11/03(水) 00:46:05
>>958
manぐらい読めよ。
0961名無しさん@お腹いっぱい。2010/11/03(水) 02:03:21
(cd /hoge/hoge; tar cf - *) はいろいろ応用が利く。
最近はcdできるtarもいろいろあるけど。
0962名無しさん@お腹いっぱい。2010/11/03(水) 09:21:44
-C ってSolarisにさえあるし、相当古いtarからなかったっけ
0963名無しさん@お腹いっぱい。2010/11/03(水) 12:08:56
じゃあかなりポータブルだと思っていいのか。

今更だが、 tar cf - -C /hoge/huga * とサブシェル内cdだと*の展開タイミング
が違うので、同じ投稿に並べて書いたのは不適切だったな。
0964名無しさん@お腹いっぱい。2010/11/03(水) 19:05:58
>(cd /hoge/hoge; tar cf - *) はいろいろ応用が利く。

; じゃなくて && にすべし。; だと間違えて権限のないディレクトリに
cd しようとして失敗しても、カレントディレクトリのまま tar が実行されてしまうので、
場合によっては意図しないファイルを上書きして消すなんて事故が起きることがある。

というか、そういう事故を起こさないためにも -C を使ったほうがいい。
09659512010/11/05(金) 00:11:31
>>964
確かにその方がいいですね
仕事でやってる時は事故を起こさないようにそうしてた気がします

ところでファイルサイズ違う件について心当たりある方いま(ry

その後もググって見たけど相変わらずわからずで
何回もスレ汚しスマソ
0966名無しさん@お腹いっぱい。2010/11/05(金) 00:59:32
もっと具体的に書けや
0967名無しさん@お腹いっぱい。2010/11/05(金) 08:36:34
複数のマシンを一度に再起動をかけたいのですが、どのような方法があるでしょうか?
0968名無しさん@お腹いっぱい。2010/11/05(金) 12:06:27
>>965
何のファイルサイズがどう違うの?
0969名無しさん@お腹いっぱい。2010/11/05(金) 12:07:10
>>967
for i in host1 host2 host3; do ssh $i /bin/shutdown; done
0970名無しさん@お腹いっぱい。2010/11/05(金) 12:11:33
>>969
それだと host1 が落ちてた時に host2 移行が再起動できません。
あと、shutdown で、再起動できるんですか?
0971名無しさん@お腹いっぱい。2010/11/05(金) 12:29:13
>>969
for i in host1 host2 host3; do ssh $i /bin/shutdown& done
0972名無しさん@お腹いっぱい。2010/11/05(金) 13:13:17
for i in host1 host2 host3; do ssh -f $i /sbin/reboot done
0973名無しさん@お腹いっぱい。2010/11/05(金) 13:21:57
ふぉーっ 愛 淫 ホスト1 ホスト2 ホスト3; どエスエスエッチ -ぇふ $愛 /エス便/り豚 ドーン
0974名無しさん@お腹いっぱい。2010/11/17(水) 02:00:10
kshで特定の日時を表示させたい場合、

date 20000101
のYMD形式は可能だけど

date 20000101000000
のYMDHMSになるとエラーになるので困っています。

なにかオプションが必要ですか?
0975名無しさん@お腹いっぱい。2010/11/17(水) 06:30:38
>>974
それ、ksh関係ない。dateコマンドの話。
で、そもそも指定が間違ってる。
date mmddHHMMYYYY.SS が正しい。

2000年01月01日00時00分00秒なら、
date 010100002000.00
0976名無しさん@お腹いっぱい。2010/11/17(水) 07:13:58
ありがとうございます。

まさか.SSとは…いらないよってオプションはないんですかね?
なんかスッキリしないなぁ…
0977名無しさん@お腹いっぱい。2010/11/17(水) 07:18:12
いまどきdateで時刻設定することなんてないし。ふつーntpだろ。
0978名無しさん@お腹いっぱい。2010/11/17(水) 07:30:10
表示させたいって書いてないか?
0979名無しさん@お腹いっぱい。2010/11/17(水) 07:42:24
>>978
質問のように「date 20000101」とか実行したら「設定」される。

「表示させたい」って書いてあるのは、設定した結果、以降OS時刻として
その時刻で表示させたいという意味だろ。
0980名無しさん@お腹いっぱい。2010/11/17(水) 08:13:22
自作プログラムに、コマンドラインから&を渡したのですが、
バックグランドと解釈されてしまいます。

\でエスケープしてもダメだったのですが、
どうすれば渡せるのでしょうか?
0981名無しさん@お腹いっぱい。2010/11/17(水) 10:46:17
>>980
自分の環境では出来るな。

$ cat hoge.sh
#!/bin/sh
echo $*
$ ./hoge.sh ¥&
&
$

09829742010/11/17(水) 10:46:18
何度もすいません

実際に行いたい動作は
引数として渡されたYMDHMS形式の文字列が日時として妥当であるかチェックする
です

実装として
date "+%Y%m%d%H%M%S" -d 引数文字列
の結果と引数文字列が一致するかチェックするロジックを組みました。

ですが肝心の
date -d 20000101000000
がエラーを吐いてしまうため上手く行かず…
(-dは記述が漏れてました。すいません)

何か方法はありませんかね?
0983名無しさん@お腹いっぱい。2010/11/17(水) 11:35:26
info coreutils すると Date input formats という項目に
date -d で食える書式が書いてある。
0984名無しさん@お腹いっぱい。2010/11/17(水) 11:37:16
>>982
perlか何かで書いた方がいいんじゃね。
0985名無しさん@お腹いっぱい。2010/11/17(水) 11:54:23
>>982
GNU dateってことは bash限定でいいよな。
ほらよ


TIME=20000101000000
date +%Y%m%d%H%M%S -d "${TIME:0:8} ${TIME:8:2}:${TIME:10:2}:${TIME:12:2}"
0986名無しさん@お腹いっぱい。2010/11/17(水) 12:03:37
BSDのdateならもっと楽できるのに
0987名無しさん@お腹いっぱい。2010/11/17(水) 12:31:22
coreutils確認しました
やはりロジック上でフォーマット変換をしないといけないようですね

フォーマット変換すれば実現可能なのはわかっていたのですが、直感的にdateの使い方で対処出来ると思っていました

ご提示頂いたスクリプトも参考に対処したいと思います
0988名無しさん@お腹いっぱい。2010/11/17(水) 18:47:42
man date

BSDのdateなら楽勝なのに
0989名無しさん@お腹いっぱい。2010/11/18(木) 07:53:37
小6の算数の応用問題を解けなかった奴が
「方程式を使えば解けたのに」
と負け惜しみを言ってるみたいだな
0990名無しさん@お腹いっぱい。2010/11/18(木) 09:28:13
しかし日付、時刻なんて結構シェルで扱いたいデータなんだけど
やりにくいよね。 低レベルでそれらを扱える便利なコマンドが無い。
0991名無しさん@お腹いっぱい。2010/11/18(木) 13:56:30
awk/sedの訓練をさせるため。
0992名無しさん@お腹いっぱい。2010/11/18(木) 14:24:41
>>990
どう扱うかってけっこう場面場面で違うから
「便利なコマンド」を作りにくいんじゃないかな。
LLでやっちゃった方がてっとり早いと思うよ。
0993名無しさん@お腹いっぱい。2010/11/18(木) 14:36:18
いまどきのユーザーはみんなLLに転向しちゃったし、
シェルの話題は出尽くしたので、
次スレはナシでいいよ。
0994名無しさん@お腹いっぱい。2010/11/18(木) 15:02:59
LLって何?
0995名無しさん@お腹いっぱい。2010/11/18(木) 15:07:45
>>994
http://ja.wikipedia.org/wiki/%E8%BB%BD%E9%87%8F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E
0996名無しさん@お腹いっぱい。2010/11/18(木) 20:35:23
シェルスクリプトもはいってんじゃん
0997名無しさん@お腹いっぱい。2010/11/18(木) 21:59:27
VBSとshしか書けないがVBSはコード長くなるしコーディング時間もshの倍以上かかる。
が、日時の扱いがめっちゃ楽。
0998名無しさん@お腹いっぱい。2010/11/19(金) 09:27:00
>>995
ありがとう。
0999名無しさん@お腹いっぱい。2010/11/20(土) 00:00:48
999!!
1000名無しさん@お腹いっぱい。2010/11/20(土) 00:01:34
プログラミング質問すれ Part1
http://hibari.2ch.net/test/read.cgi/unix/1127388574/
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。