シェルスクリプト総合 その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 でトレースしましょう。
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:550719名無しさん@お腹いっぱい。
2006/03/16(木) 17:06:55て書いてあるけど。strftime(3)は遠回りでもなんでも
なく、直球だと思う。まぁ、date(1)にstrftime(3)を
見ろと載っていると一言あってもいいけど。
An operand with a leading plus (`+') sign signals a user-defined format
string which specifies the format in which to display the date and time.
The format string may contain any of the conversion specifications
described in the strftime(3) manual page, as well as any arbitrary text.
つーか、質問者以外が難癖つけすぎ。
0720名無しさん@お腹いっぱい。
2006/03/16(木) 17:08:10Solarisスレでは二言めには docs.sun.com読め、なので、manは標準じゃないのだろう。
0721名無しさん@お腹いっぱい。
2006/03/16(木) 17:10:52だからぁ、それはFreeBSDの場合なんだって。
そもそも、dateコマンドで行けるかどうかの情報すらない段階で、
man strftimeでは意味が通じないよ。
元が「dateの書式が知りたい」という質問なら
man strftimeでもわかるけど。
実際にはそうじゃない。
0722名無しさん@お腹いっぱい。
2006/03/16(木) 17:21:47これを、6桁にしようと、awkのsubstr関数を使うことを考えていた。
この段階で、質問者は「dateコマンドだけではできない」と
考えていたと推定できる。
すると回答としては、まず、「dateだけでできるんだよ」ということを
教えてやらないといけない。
ところが、ここで「man strftime」などと回答すると、
「dateの出力をstrftimeというコマンド(←実際にはない)で加工する」
あるいはawkを考えているため「awkにstrftimeという関数がある?」
などと、誤った方向に誘導してしまう。
だから、manなどで回答するのではなく、
`date +%y%m%d`
と一言いえば済むことだったのだ。
0723名無しさん@お腹いっぱい。
2006/03/16(木) 17:33:12直接、答えを教えるのは良くないよ。
0724名無しさん@お腹いっぱい。
2006/03/16(木) 17:38:09オレはその点が気になる。
シェルスクリプトとして動作確認してるなら、
回答は直接のコマンドラインになるはず。
直接答を書くというか、動作確認のためにそれは必要なこと。
0725名無しさん@お腹いっぱい。
2006/03/16(木) 17:38:450726名無しさん@お腹いっぱい。
2006/03/16(木) 17:43:37元々モマエは役に立ってないから
イエローで首括って良いよ
0727名無しさん@お腹いっぱい。
2006/03/16(木) 17:52:51仮に動作確認のために動かしても、マニュアルに載ってることは答えを
直接書くべきじゃない。回答者の学ぶ機会を奪うのか?
0728名無しさん@お腹いっぱい。
2006/03/16(木) 17:54:15>などと、誤った方向に誘導してしまう。
GNU awk にはあるよ。その man でもちゃんと strftime(3) に誘導してる。
■ このスレッドは過去ログ倉庫に格納されています