シェルスクリプト総合 その5
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2006/01/21(土) 09:00:29スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はbourne shがデフォルトです。
bash/csh/tcsh/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
0618名無しさん@お腹いっぱい。
2006/03/14(火) 00:30:040619614
2006/03/14(火) 00:35:48そうかfor文かfunction使えばいいのか・・・
ありがとうございます。
0620名無しさん@お腹いっぱい。
2006/03/14(火) 07:34:29どこのrename ? そんなの本当にあるの?
0621名無しさん@お腹いっぱい。
2006/03/14(火) 07:37:170622名無しさん@お腹いっぱい。
2006/03/14(火) 08:49:45perlについてくるぞ。
0623名無しさん@お腹いっぱい。
2006/03/14(火) 08:57:46http://search.cpan.org/~rmbarker/File-Rename-0.02/lib/File/Rename.pm
0624名無しさん@お腹いっぱい。
2006/03/14(火) 09:05:150625名無しさん@お腹いっぱい。
2006/03/14(火) 11:59:17あると便利なんだが
0626名無しさん@お腹いっぱい。
2006/03/14(火) 12:12:45http://www.gnome.org/projects/gb/
は終わったか。
http://www.mono-project.com/VisualBasic.NET_support
とか?
0627名無しさん@お腹いっぱい。
2006/03/14(火) 12:49:29Linuxだと標準で /usr/bin/renameがある。
renameといえば普通これを指す。ちゃんとしたバイナリだし、
perlは無関係だよ。
0628名無しさん@お腹いっぱい。
2006/03/14(火) 13:01:34rename jpeg jpg *.jpeg
となるようだ。
全く別物の同名コマンドが出回っているようなので、
シェルスクリプトでは使えんな。
(もともと使ってなかったけど)
0629名無しさん@お腹いっぱい。
2006/03/14(火) 13:12:49一口に Linux って言ってもその辺はディストリによって違うだろ。
Debian の /usr/bin/rename は perl スクリプトだよ。
たぶん >>623 の古い版。
0630名無しさん@お腹いっぱい。
2006/03/14(火) 13:17:14「util-linux の rename」だろうな。
0631名無しさん@お腹いっぱい。
2006/03/14(火) 13:22:37perlではない。RH系とSlackware系が同じだから、他でも同じかと思ったら
Debianでは違うのか。
まあ、そもそもrenameなんて使わないし、どうでもいいけどね。
人に説明する時はどのrenameか断らないと誤解を受けるね。
0632名無しさん@お腹いっぱい。
2006/03/14(火) 14:03:01俺の環境だとperlパケージの/usr/bin/prenameへのシンボリックリンク
$ update-alternatives --display rename
rename - status is auto.
link currently points to /usr/bin/prename
/usr/bin/prename - priority 60
slave rename.1.gz: /usr/share/man/man1/prename.1.gz
Current `best' version is /usr/bin/prename.
要するにDebianの場合サイトごとに違う。
# ここんところがシェルスクリプトスレにちょいと関係あるのでレスしてみた。
といってもrenameの候補があるperl以外のパケージ見たことないが…
0633名無しさん@お腹いっぱい。
2006/03/14(火) 15:00:24そういうのあるの知らなかった。
0634名無しさん@お腹いっぱい。
2006/03/14(火) 17:20:250635名無しさん@お腹いっぱい。
2006/03/14(火) 21:03:04俺的には珠玉のperlスクリプト。
0636名無しさん@お腹いっぱい。
2006/03/14(火) 22:36:00$cat L1
aaa
bbb
ccc
1
ddd
eee
2
これを
$cat L1
aaa bbb ccc 1
ddd eee 2
に変換する方法教えてくれ〜
0637名無しさん@お腹いっぱい。
2006/03/14(火) 22:48:16if expr "$x" : '[0-9][0-9]*$' > /dev/null; then
echo "$x"
else
echo -n "$x "
fi
done
0638名無しさん@お腹いっぱい。
2006/03/14(火) 22:50:20変換後が2行になるための条件は?
数字が来たらってこと?
0639名無しさん@お腹いっぱい。
2006/03/14(火) 22:52:53while read word
do
echo -n "$word "
case $word in [1-9]*) echo;; esac
done < L1
0640名無しさん@お腹いっぱい。
2006/03/14(火) 23:02:21すうじがきたら改行
0641名無しさん@お腹いっぱい。
2006/03/14(火) 23:04:08for name in hoge hage
{
echo $name
}
↑みたいな書き方は bash依存ですか?
なんか、Solarisの/bin/shでも動いてしまうんですけど、
manには記述がありません。(do doneの記述のみ)
0642名無しさん@お腹いっぱい。
2006/03/14(火) 23:06:370643名無しさん@お腹いっぱい。
2006/03/14(火) 23:11:23お約束の突っ込み。「catが無駄です」
>>637 >>639 >>642 の中では、外部コマンドを使っていない
>>639 が一番エレガントだな。
あ、>>642って、数字以外のの入力がスペースなしでくっついてしまうんじゃないか?
0644名無しさん@お腹いっぱい。
2006/03/14(火) 23:20:08$cat L1
111
222
333
a
444
555
b
これを
$cat L1
111 444
222 555
333 b
a
に変換する方法教えて
0645名無しさん@お腹いっぱい。
2006/03/14(火) 23:20:10POSIXの仕様によれば、{}は()と同じくcompound-listを構成することができる。
で、for文は"The for loop requires that the reserved words do and done
be used to delimit the sequence of commands"と書いてあって、
「do/doneをつかわなければならない」のかはちょっとわからない。
0646名無しさん@お腹いっぱい。
2006/03/14(火) 23:20:29case内で処理した方がいい。
0647名無しさん@お腹いっぱい。
2006/03/14(火) 23:29:41do doneの代用としての { } と、
compound-list の { } は違うしなぁ。
すると、Solarisとかで forで { } が使えてしまうのって
一種の隠しコマンドみたいなもの?
0648名無しさん@お腹いっぱい。
2006/03/14(火) 23:34:12それはjoin一発じゃないか?
>>639
数字の後にスペースはいっちゃわね?
0649名無しさん@お腹いっぱい。
2006/03/14(火) 23:35:50while read word1; do read word2; echo $word1 $word2; done
1行で桶。
0650名無しさん@お腹いっぱい。
2006/03/14(火) 23:37:01問題欲嫁。
0651642
2006/03/14(火) 23:42:52sed 's/$/ /g' L1 | tr -d "\n" | sed 's/([0-9]+)[^0-9]/\1\n/g' とか。
>>644 はColumnとか使えそう。使ったこと無いので詳しくはまんまん。
0652名無しさん@お腹いっぱい。
2006/03/14(火) 23:44:28joinじゃ無理じゃない? フィールド一致を見てしまうから。
0655名無しさん@お腹いっぱい。
2006/03/15(水) 00:49:500656名無しさん@お腹いっぱい。
2006/03/15(水) 01:38:180657名無しさん@お腹いっぱい。
2006/03/15(水) 02:17:30馬鹿学生。
とりあえず何ができればレベルが上がったと
定義するのか説明してくれ。
0658名無しさん@お腹いっぱい。
2006/03/15(水) 02:19:580659名無しさん@お腹いっぱい。
2006/03/15(水) 04:17:58sed一つで済むところを3つもプロセス使うなんて馬鹿げたことはやめてくれよな。
0660名無しさん@お腹いっぱい。
2006/03/15(水) 09:28:26俺が決める
0661名無しさん@お腹いっぱい。
2006/03/15(水) 10:45:13お前、スライム一匹にイオナズン使うタイプだろ。
0662名無しさん@お腹いっぱい。
2006/03/15(水) 10:54:20アセンブラ? なに軟弱なことを言ってんの?
0663名無しさん@お腹いっぱい。
2006/03/15(水) 11:41:00ハッカーぽい響きがあるせいか?
0664名無しさん@お腹いっぱい。
2006/03/15(水) 11:49:32というわけで、レベルが低い、といっている人はどーぞ、そのレベルの高さを示してください。
そのレベルの低さを示すのが関の山だと思うけど(w
0665名無しさん@お腹いっぱい。
2006/03/15(水) 12:11:160666名無しさん@お腹いっぱい。
2006/03/15(水) 12:12:41レベルの意味が違いすぎ
0667名無しさん@お腹いっぱい。
2006/03/15(水) 14:00:210668名無しさん@お腹いっぱい。
2006/03/15(水) 14:09:23あとから外部コマンド(sed/tr)を複数使った解を出してきても
エレガントではない。
0669名無しさん@お腹いっぱい。
2006/03/15(水) 14:11:530670名無しさん@お腹いっぱい。
2006/03/15(水) 14:33:13いいんじゃないか。この程度なら。
0671名無しさん@お腹いっぱい。
2006/03/15(水) 15:10:370672名無しさん@お腹いっぱい。
2006/03/15(水) 16:19:54内部コマンドだけでできればどんなに複雑でもエレガントとか言いはじめるやつとは議論にならんな
0673名無しさん@お腹いっぱい。
2006/03/15(水) 17:11:310674名無しさん@お腹いっぱい。
2006/03/15(水) 17:13:14シェルって言うなクズ。
0675名無しさん@お腹いっぱい。
2006/03/15(水) 18:05:21>>651 って動かないわけよ。
sedの中で \( \) とすべきところを ( ) で書いてるから。
動作確認してから書き込むのは最低限の回答者のルールだよ。
確かに、こんなシェル書いてちゃ食えないよな。
(先に言っとくけど「シェルってゆーな」の突っ込みは禁止。そろそろ言葉に慣れろ)
0676名無しさん@お腹いっぱい。
2006/03/15(水) 18:06:00シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
0677名無しさん@お腹いっぱい。
2006/03/15(水) 18:07:550678名無しさん@お腹いっぱい。
2006/03/15(水) 18:13:52思うこともあるね。sed,awk,grep,findあたりを良く使いまわすんだけど、
重くてしょうがなくなる。まあ高速化は二の次になっちゃうんだけど、
RubyかPerlあたりのスクリプト言語を使うことを、最初に検討した方がいいかも
知れん。
0679名無しさん@お腹いっぱい。
2006/03/15(水) 18:58:310680名無しさん@お腹いっぱい。
2006/03/15(水) 19:02:06すべて小文字のファイル名に直したいのですが、
どういうUNIXを打てばいいでしょうか?
0681名無しさん@お腹いっぱい。
2006/03/15(水) 19:03:270682名無しさん@お腹いっぱい。
2006/03/15(水) 19:11:180683名無しさん@お腹いっぱい。
2006/03/15(水) 19:30:44宿題は自分で考えろ。
0684名無しさん@お腹いっぱい。
2006/03/15(水) 19:38:080685名無しさん@お腹いっぱい。
2006/03/15(水) 19:51:03OS名を書かないと、答えられる人は誰もいないと思います。
0686名無しさん@お腹いっぱい。
2006/03/15(水) 19:52:500687名無しさん@お腹いっぱい。
2006/03/15(水) 20:08:51で前スレでこの板公認の略称が決まらなかったっけ?
0688名無しさん@お腹いっぱい。
2006/03/15(水) 20:26:180689名無しさん@お腹いっぱい。
2006/03/15(水) 20:33:440690名無しさん@お腹いっぱい。
2006/03/15(水) 20:49:26…………とかくにシェルは書きにくい。」
0691642
2006/03/15(水) 21:35:03趣味でか触ってないのでいつまで経っても初級者から成長しないんですよね。
で、
sed 's/$/ /g' L1 | tr -d "\n" | sed 's/\([0-9]+\)[^0-9]/\1\n/g'
で★キマリッ★
0692名無しさん@お腹いっぱい。
2006/03/15(水) 22:43:250693名無しさん@お腹いっぱい。
2006/03/15(水) 23:04:30シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
0694名無しさん@お腹いっぱい。
2006/03/15(水) 23:27:450695名無しさん@お腹いっぱい。
2006/03/16(木) 03:04:28…… … …… ……………… … …… … … …シェ… …
0696名無しさん@お腹いっぱい。
2006/03/16(木) 03:15:05シェイシェイ
0697名無しさん@お腹いっぱい。
2006/03/16(木) 12:52:44馬鹿回答をしているのが馬鹿学生じゃなくて馬鹿社会人だからだろうな。
0698名無しさん@お腹いっぱい。
2006/03/16(木) 13:35:340699名無しさん@お腹いっぱい。
2006/03/16(木) 13:48:35どうやるのか判りません。
yyyymmddの8桁日付なら`date +%Y%m%d`で設定できるのですが、
yymmddで6桁日付だとどうやるのでしょうか?
awkのsubstrという関数を上手く使えればできそうなのですが、
awkの使い方をいまいち理解できてないので・・・・
申し訳ありませんがよろしくお願いします。
0700名無しさん@お腹いっぱい。
2006/03/16(木) 13:53:02man strftime
0701名無しさん@お腹いっぱい。
2006/03/16(木) 14:07:40date +%y%m%d でできるよ。yは小文字。
ただし、%yは2000年問題の関係で推奨されない。
>>700
質問欲嫁。この場合 man strftimeしても解決しないだろ。
0702699
2006/03/16(木) 15:08:28ありがとうございました。
できました。
すごく単純なコマンドで出来たんですね(汗)
0703名無しさん@お腹いっぱい。
2006/03/16(木) 15:50:11そんなの用途しだいでしょ。
昔のデータなんか扱わないようなところとか。
>質問欲嫁。この場合 man strftimeしても解決しないだろ。
man date するとたいてい strftime(3) を参照と書いてないか?
0704名無しさん@お腹いっぱい。
2006/03/16(木) 15:58:12man dateしたなら、すでに %y のことは書いてある。
strftime(3)のことは書かれていなかった。
0705名無しさん@お腹いっぱい。
2006/03/16(木) 15:58:44誰だよ,解決しないとか言ってる奴
0706名無しさん@お腹いっぱい。
2006/03/16(木) 16:02:45strftimeはC言語の関数。
そっちに載っていたとしても、回答としては不適切。
もっとそのものズバリのman dateがあるのだから。
なんでわざわざ遠い回答するの?
0707名無しさん@お腹いっぱい。
2006/03/16(木) 16:03:270708名無しさん@お腹いっぱい。
2006/03/16(木) 16:06:310709名無しさん@お腹いっぱい。
2006/03/16(木) 16:07:43そういうことがやりたいなら strftime() を使って、
C言語でプログラムを書け、と言いたかったんじゃないかな。
それが、実は date +%y で簡単にできてしまうことがわかり、
突っ込まれたので暴れているわけだ。
0710名無しさん@お腹いっぱい。
2006/03/16(木) 16:08:24FreeBSD で man date を確認すると
% を使った詳細の書式は載っていない。
man strftime ならたぶんどの OS でも載ってるっしょ。
0711名無しさん@お腹いっぱい。
2006/03/16(木) 16:09:06>>703
0713名無しさん@お腹いっぱい。
2006/03/16(木) 16:14:58いきなり man strftimeしても、質問者にとっては、
それがdateで使えるとはわからない。
載っているのはC言語なので、最初の数行読んで「違う」「ガセネタだ」と
思うだろう。
man strftimeとか言わずに、
>>701 みたいに date +%y%m%d と、直接回答するのが
もっとも価値が高い回答ではないだろうか。
0714名無しさん@お腹いっぱい。
2006/03/16(木) 16:21:42回答控えようかな。
0715名無しさん@お腹いっぱい。
2006/03/16(木) 16:47:32--------------------------------
yy 西暦の省略表現です。西暦の 10 の位と 1 の位です (1989 年なら 89、06 なら 2006)。
〜中略〜
使用例
以下のコマンド:
date "+DATE: %Y-%m-%d%nTIME: %H:%M:%S"
は、下のような表示を行ないます。
DATE: 1987-11-21
TIME: 13:36:16
0716名無しさん@お腹いっぱい。
2006/03/16(木) 16:52:510717名無しさん@お腹いっぱい。
2006/03/16(木) 16:59:42遠回しなman書いてるFreeBSDはクズ。
0718名無しさん@お腹いっぱい。
2006/03/16(木) 17:01:55■ このスレッドは過去ログ倉庫に格納されています