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

シェルスクリプト総合 その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 でトレースしましょう。
0357名無しさん@お腹いっぱい。2006/02/26(日) 19:21:28
>>356
質問をよく読みましょう。試験とかで早合点してケアレスミスするタイプかな?
ちなみに、findでは簡単な方法はないと思うよ。
0358名無しさん@お腹いっぱい。2006/02/26(日) 19:23:00
あ、ほんとだ。ごめんね。
0359名無しさん@お腹いっぱい。2006/02/26(日) 19:34:30
まあ、シェル書きたいってんだから、好きなようにかけばいいんちゃうん?
Cでもなんでも好きな言語使え。
0360名無しさん@お腹いっぱい。2006/02/26(日) 19:48:48
bash
0361名無しさん@お腹いっぱい。2006/02/26(日) 20:06:49
シェルってゆうな、クズ。
0362名無しさん@お腹いっぱい。2006/02/26(日) 20:11:51
>>361
今日も来たね。待ってたよ。
0363名無しさん@お腹いっぱい。2006/02/26(日) 20:15:01
特定の日付と、今日の日付が何日差あるかを求めるシェルを書いて、
それをfindに食わせればいいのかな?
GNU dateなら何とかなりそう。でもめんどくさそう。俺はパス。
0364名無しさん@お腹いっぱい。2006/02/26(日) 20:35:00
touch と組み合わせればできるでしょ。
touch -t 日付 /tmp/start
touch -t その翌日 /tmp/end
find . -newer /tmp/start \! -newer /tmp/end -print
0365名無しさん@お腹いっぱい。2006/02/26(日) 20:43:17
>>364
「その翌日」をどうやって求めるんだよ。
結局dateを使う方法の方が奇麗では? テンポラリファイルも要らないし。
0366名無しさん@お腹いっぱい。2006/02/26(日) 21:29:00
find & ls -dl して探せ。
03673322006/02/26(日) 21:34:32
#!/bin/bash

expect -c "
set timeout 20
spawn passwd testuser
expect "*password:"
send "test\r"
expect "*password:"
send "test\r"
"
何度もすみません。
これ実行してもパスワード変更されません。
なぜ教えていただけないのかもわかりません。
難しすぎてわからないから教えていただけない?
簡単すぎてバカらしいから教えていただけない?
どちらなのでしょうか?
よろしければ、expectの使い方おしえてください。
よろしくおねがいします。
0368名無しさん@お腹いっぱい。2006/02/26(日) 21:39:43
>>355

↓ほれ。こんなんでどう?

arg=2005-01-23 # 探したい日付

days=`expr \( \`date +%s\` - \`date +%s -d $arg\` \) / 60 / 60 / 24`
find . -daystart -mtime $days


↑ ` ` が2重にネスティングしてるので注意してね。
0369名無しさん@お腹いっぱい。2006/02/26(日) 22:04:38
> 簡単すぎてバカらしいから教えていただけない?
:-P

まずね、""(ダブルクオーテーション)の中で"(ダブルクオーテーション)を使うなら
\(バックスラッシュ)をその前につけろ。わかったら一度市ね。
エラーメッセージくらいかけ。わかったらもう一度詩ね。
0370名無しさん@お腹いっぱい。2006/02/26(日) 22:12:06
エラーメッセージが出ません、とか泣き言を書くなら最期に
expect eof
しとけ。馬鹿。氏ね。
0371名無しさん@お腹いっぱい。2006/02/26(日) 22:29:14
cシェルのaliasについてヘルプ
.cshrcに下の行を登録して

alias test1 'find \!:1 -name \"\!:2\*\" -print'

test1 dir1 file1 と打つと、
find dir1 -name "file*" -print というコマンドを実行させたいけど、
うまく動かない。どう修正すればいい?
0372名無しさん@お腹いっぱい。2006/02/26(日) 22:33:11
細かいけど、find dir1 -name "file1*" -print な
0373名無しさん@お腹いっぱい。2006/02/26(日) 23:09:12
>>362
代返してくれる親切な人も居る。

>>363
シェルって言うな、クズ。
0374名無しさん@お腹いっぱい。2006/02/26(日) 23:17:01
>>371
cshはスレ違い。
インタラクティブ系もスレ違い。
インタラクティブ系でしか使わないaliasの話もスレ違い。

わかったら帰れ!
0375名無しさん@お腹いっぱい。2006/02/26(日) 23:41:38
bash の厳密な構文規則(BNF とか)と評価規則の書かれた良い資料は
ありませんか?(英語でも構いません)

マニュアルページ
ttp://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html
も詳しいですが、何かスッキリしません。
もっと抽象的に整理された形で、かつ、厳密に書かれたものは無いでしょうか?
0376名無しさん@お腹いっぱい。2006/02/26(日) 23:41:48
>>374
黙れ。一人で勝手に仕切るな。
0377名無しさん@お腹いっぱい。2006/02/27(月) 00:00:17
あらあら
0378名無しさん@お腹いっぱい。2006/02/27(月) 00:24:49
まあまあ
0379名無しさん@お腹いっぱい。2006/02/27(月) 00:29:20
>>375

ソースを見ればいいのでは。
0380名無しさん@お腹いっぱい。2006/02/27(月) 00:52:13
>>379
ソースコードを1から読まずに済むならそれに越したことはありません
マニュアルページはある意味詳細に過ぎて見通しが悪いように思います
03813792006/02/27(月) 00:54:25
1から読まなくても構文解析している部分などすぐ見つかるだろう。
0382名無しさん@お腹いっぱい。2006/02/27(月) 01:10:33
文法なんてバージョン上がるたびに変わるんだから
そのたびに規則を書き出すやつなんていないだろ。
ソース読むしかないよ。
0383名無しさん@お腹いっぱい。2006/02/27(月) 01:48:36
>> 382
はあ、そういもんですか
言語なんだから仕様ぐらいキッチリ決まっているもんだと思っていたけど
そーいうのがシェルの文化なんかな
でもちょっとした仕様の誤認識とかで致命的な結果を招きかねないのは
困ると思うんだけど
嫌な人は他のスクリプト言語使えって事かな
0384名無しさん@お腹いっぱい。2006/02/27(月) 02:02:15
馬鹿はそろそろお引き取り願えませんかのう。
0385名無しさん@お腹いっぱい。2006/02/27(月) 02:20:59
>言語なんだから仕様ぐらいキッチリ決まっているもんだと思っていたけど

違うな。bashなり犬なりだけに見られる腐れた文化だ。
0386名無しさん@お腹いっぱい。2006/02/27(月) 03:35:19
てかソース読むのもBNF読むのもほとんどかわらんでしょ?
たぶん
0387名無しさん@お腹いっぱい。2006/02/27(月) 06:59:04
sh の仕様なら POSIX あたりで決まってたりしないのかな。
0388名無しさん@お腹いっぱい。2006/02/27(月) 08:04:45
決まってるが、彼が知りたいのはbashの仕様らしいからな。
やっぱソースしかないんじゃね?
0389名無しさん@お腹いっぱい。2006/02/27(月) 10:50:05
>>388
bash について知りたかったのは大抵の環境で対話型シェルの標準になっている
からですが、 sh として起動された場合は POSIX 互換に近くになるようなので
探してみた

ttp://www.opengroup.org/onlinepubs/009695399/

がそれらしい
0390名無しさん@お腹いっぱい。2006/02/27(月) 11:13:41
標準になってるのlinuxぐらいでは?
0391名無しさん@お腹いっぱい。2006/02/27(月) 11:16:45
拡張BNFになっとるがな。> bashのbisonソース
0392名無しさん@お腹いっぱい。2006/02/27(月) 11:33:16
>>390
そういうことにしたいのですね。
0393名無しさん@お腹いっぱい。2006/02/27(月) 11:46:48
>>389
そういう理由ならexplorer.exeについてでも調べた方がいいんじゃまいか。
おそらく最多のユーザ人口を抱える対話型シェルだよ。CUIじゃないけど。
0394名無しさん@お腹いっぱい。2006/02/27(月) 12:41:57
>>389
「sh として起動された場合は POSIX 互換に近くになる」と
マニュアル等には書いてあるが、これはかなり嘘。

実際にはshで起動してもbashとほとんど変わらない。
bashの独自拡張もほぼ全部使えてしまう。
目立った違いは、exportコマンドを引数なしで実行した時の表示が
bashだと declare -xなのが、shで起動すると exportの表示に
変わることくらい。
0395名無しさん@お腹いっぱい。2006/02/27(月) 12:48:02
>>390
Mac OS Xも今のバージョンはbashがデフォルトっぽいです。
2つ前くらいまではtcsh(sh)がデフォでした。

まぁ、私はtcshの方が良いと思うけど。
0396名無しさん@お腹いっぱい。2006/02/27(月) 12:52:49
>>394
やっぱashが漢?

>>395
tcshって少し昔しか知らないんだけど、シェルスクリプトに使うには重くない?
個人的にcsh構文ではまった記憶が多いので、偏見あるかもですが。
0397名無しさん@お腹いっぱい。2006/02/27(月) 13:37:21
cshは捨てってことで。別にこれは偏見でもないような。
0398名無しさん@お腹いっぱい。2006/02/27(月) 13:43:12
今までご苦労様でした! > csh系
0399名無しさん@お腹いっぱい。2006/02/27(月) 22:07:01
(ただし対話型シェルとしての使用を除く)
0400名無しさん@お腹いっぱい。2006/02/27(月) 22:51:53
教えてください。
Kシェルってファンクション(内部関数)作れるんだよね?
繰り返し処理をそこでやりたいんだけどどうやって記述するの?
0401名無しさん@お腹いっぱい。2006/02/27(月) 23:31:07
対話型としてもウンコ
0402名無しさん@お腹いっぱい。2006/02/27(月) 23:33:01
>>400
繰り返したい処理をC-c C-vで必要な回数コピペする。
0403名無しさん@お腹いっぱい。2006/02/27(月) 23:36:35
対話型ってお話が出来るの?
友達いないから俺もやってみたいな。
0404名無しさん@お腹いっぱい。2006/02/27(月) 23:41:40
スレ違いだが、cshが普及したのは
当時履歴が実装されていた唯一のシェルだったからというのが大きいな。

何でも最初からあったわけではないというお話。
0405名無しさん@お腹いっぱい。2006/02/27(月) 23:56:34
ファイル名補完も csh が最初。
csh でできると知らない人も多そうだけど。
0406名無しさん@お腹いっぱい。2006/02/28(火) 00:03:17
filecってかなりあとになってからついた機能じゃなかったっけ?
newcshの前にあった?
0407名無しさん@お腹いっぱい。2006/02/28(火) 00:23:17
>406
あったんじゃね?

俺的にcsh本が書かれた時代&そっから数年はcsh以外にfilecが使えるシェルなかったし。
しかしあの数年をなかったことにしてもいいとか思っちゃえるのがcshの魔力。

また、数年後にはbashがでてくるわけだけど、当時のUNIX、68000 8MHzとかだと
bashが糞遅いわけなんだ。cshは糞だけどbashはもっと糞というのが当時の認識だろ。

その後tcshやkshもでたが、同様に遅いshellで、俺はずっとcshをつかってた。移行しても
いいと初めて思えたシェルがzsh。それいらいずっとzshだ。
0408名無しさん@お腹いっぱい。2006/02/28(火) 00:24:23
あ、すまね。kshはcsh〜bashの当たりで既にでてた。

407でいってるkshはpdkshね。
0409名無しさん@お腹いっぱい。2006/02/28(火) 00:31:45
重さだけなら、zshはbashに一歩も引けを取ってないだろ。
0410名無しさん@お腹いっぱい。2006/02/28(火) 00:38:14
誰も zsh に触れてないのになぜ突然 zsh が?
0411名無しさん@お腹いっぱい。2006/02/28(火) 00:38:49
いや、最近だと zsh の方が遥かに重いんじゃないかな。便利だけど。
0412名無しさん@お腹いっぱい。2006/02/28(火) 00:52:55
俺もzshだけど、対話的な利用とスクリプティングじゃ要求も違ってくるし、
スレ違いなんで、対話的シェル総合スレでもたててそっちでやってくれ。
0413名無しさん@お腹いっぱい。2006/02/28(火) 00:56:21
そうかなあ。bash起動するだけで数秒かえってこねえって時期に、
zshがでてきて起動すると即帰ってきたからその感動も凄くてねえ。

>410
すまん。単なる俺の過去の経験の暴露だ。
無視してくれ。
0414名無しさん@お腹いっぱい。2006/02/28(火) 01:15:26
newcshナツカシス
0415名無しさん@お腹いっぱい。2006/02/28(火) 01:17:10
>>407
csh本って"UNIX C Shell Field Guide"のこと?
0416名無しさん@お腹いっぱい。2006/02/28(火) 01:18:42
>>413
そんなのprofileの違いだろ。馬鹿か。
0417名無しさん@お腹いっぱい。2006/02/28(火) 01:23:13
>>416
スレチガイだってば。
0418名無しさん@お腹いっぱい。2006/02/28(火) 09:02:57
>>391
> 拡張BNFになっとるがな。> bashのbisonソース
遅レスだけど教えてくれてありがとう。


シェルスクリプトの展開/置換と評価/実行の規則についてなんですが、
一つの入力単位(if などの複合文でなければ1行の「コマンドライン」)ごとに

字句構文解析→(展開/算術式評価/置換)
→(置換の結果生じた入力単位ごとに、字句構文解析→実行)

という流れで実行に移されると解釈していいのかな?
(あまりにも自明なことかもしれませんが…最後の () 内では
展開/置換が生じることはありえない?)
0419名無しさん@お腹いっぱい。2006/02/28(火) 09:44:27
だからソース読めよ。死ねや、ハゲ。
0420名無しさん@お腹いっぱい。2006/02/28(火) 10:19:16
アスキーからでているバイブル、「UNIXプログラミング環境」読みなさい。
bashと同じスタイル(yacc, lex使う)でshell作っているから。

# bison=GNU yacc
0421名無しさん@お腹いっぱい。2006/02/28(火) 10:22:55
あ、lexは使ってねーわ。bashは。
0422名無しさん@お腹いっぱい。2006/03/04(土) 23:22:22
ファイルに書かれた環境変数を展開するにはどうしたらいいでしょう

$ echo $PWD
/home/nanashi/
となりますが、では $PWD と書かれたファイルから同じような出力を得るには
どうしたらいいでしょうか
$ cat nanashi.txt
pwd = $PWD
path = $PATH
$ [なにかコマンド] nanashi.txt
pwd = /home/nanashi/
path = /sbin:/bin:/usr/bin...
0423名無しさん@お腹いっぱい。2006/03/04(土) 23:24:48
sed -e 's/\$PWD/'"$PWD/" -e 's/\$PATH/'"$PATH/" < nanashi.txt
0424名無しさん@お腹いっぱい。2006/03/05(日) 00:06:27
>>422
なんで = の間が開いているの?

PWD="$PWD"
PATH="$PATH"

なら、

$ . nanashi.txt

で終りなのに。
0425名無しさん@お腹いっぱい。2006/03/05(日) 00:08:18
>>422
完全に信頼できるソースから入手したファイルでないならば危険。
ナガタ君のように泣きを見ることになる。
04264252006/03/05(日) 00:14:59
書きかけで送信しちまった。危険なのでやり方だけ

そのファイルの前に
cat <<EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF
後ろに
EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF
を追加したファイルを作ってshに食わせる。
04274222006/03/05(日) 00:56:11
何がやりたいかというと、まー設定ファイルの雛形みたいのを
作りたいんですよ。例えば、httpd.conf であれば、
httpd.conf.in ってのを作って、中に
ServerRoot "$PWD/testroot"
とか書いておいて展開したいという。
やっぱ sed ですかねぇ
0428名無しさん@お腹いっぱい。2006/03/05(日) 00:58:20
なんで sed じゃだめなん?
04294222006/03/05(日) 01:10:43
いや、環境変数展開なんだからシェルスクリプトでやったほうが
簡単にできるのかな、と妄想してみただけです。
ちなみに >>423 さんのだと、$PWD を展開した結果に
スラッシュが含まれているからダメっぽいです。
sed -e 's#\$PWD#'"$PWD#" nanashi.txt
とりあえずこんな感じにしてみます
0430名無しさん@お腹いっぱい。2006/03/05(日) 01:12:53
cppやm4が古典的定番
0431名無しさん@お腹いっぱい。2006/03/05(日) 03:36:54
awkもわるれるなとアホが言ってます!><
0432名無しさん@お腹いっぱい。2006/03/05(日) 08:38:50
autoconf使えばいいのに…
0433名無しさん@お腹いっぱい。2006/03/05(日) 08:46:33
linuxでしかノートラブルで動かねえautoconfなんか意味ねえ。
autoツール使いたがる気違いは絶滅すればいいのに。
0434名無しさん@お腹いっぱい。2006/03/05(日) 12:08:57
autoconf を利用しているパッケージの問題を、autoconf 自身の
問題と混同しているのね。
シェルスクリプトのことをシェルと言ってるやつと同じレベルだな。
0435名無しさん@お腹いっぱい。2006/03/05(日) 12:31:46
autoツール
0436名無しさん@お腹いっぱい。2006/03/05(日) 13:22:06
>>434 あほー
互換性が無い事をチェックできないカタワなシステムと
それを有り難がって使ってる気違いの事だよ。
0437名無しさん@お腹いっぱい。2006/03/05(日) 21:54:00
436がその気違いの書くソフトウェアを使わずに生きていけばいいだけじゃん。
0438名無しさん@お腹いっぱい。2006/03/05(日) 22:21:01
>>436
autoconf はマジでなんでもチェックできるぞ。
互換性が無い事をチェックできなかったとしたら、それは autoconf じゃなくて
configure.in/configure.ac を書いた奴のせい。
おまいがやってるのは、シェルスクリプトのバグに対して、シェル自体に文句
を言ってるようなものだ。
0439名無しさん@お腹いっぱい。2006/03/05(日) 22:28:30
>>438
他スレで見つけたのだが、古いOSだと ./configureが動かないことがあるらしい。
(以前は動いたが、autoconfの新しいバージョンで動かなくなったらしい)
ソフト側が悪いんじゃなく、autoconf側が悪いようだよ。

http://pc8.2ch.net/test/read.cgi/unix/1139155618/311
0440名無しさん@お腹いっぱい。2006/03/06(月) 00:20:21
そんな黒塗りメールをよく信じる気になったな。
0441名無しさん@お腹いっぱい。2006/03/06(月) 07:14:29
>>436
configure.in/configure.acを正しく書かなければ、まともに動くconfigureを
生成できないautoconfというヘタレなシステムを批判しているのだ。
0442名無しさん@お腹いっぱい。2006/03/06(月) 09:56:56
Cコンパイラも否定されそうです
0443名無しさん@お腹いっぱい。2006/03/06(月) 10:28:38
これがFreeBSD厨というやつか
0444名無しさん@お腹いっぱい。2006/03/06(月) 11:23:56
FreeBSDをばかにするな!
2ちゃんねるもyahooもSonyJapanもlivedoorもFreeBSD
0445名無しさん@お腹いっぱい。2006/03/06(月) 12:55:05
>>442
Cコンパイラと比べるな。機械語と比べるのがふさわしい。
0446名無しさん@お腹いっぱい。2006/03/06(月) 22:44:08
>>441
筋道のとおった議論をしなければ話を聞いてくれない
掲示板というシステムも批判したらいかがですか?
0447名無しさん@お腹いっぱい。2006/03/06(月) 23:41:11
>>444
全部、ダメサイトばかりじゃないかよ。
0448名無しさん@お腹いっぱい。2006/03/07(火) 00:00:39
ねたにまじれすfreeかこわるい
0449名無しさん@お腹いっぱい。2006/03/07(火) 00:19:36
>>441
おまえ超面白い。
0450名無しさん@お腹いっぱい。2006/03/07(火) 14:58:09
重複する文字列を統合するやり方を教えてくだされ

@aaa.com
@hoge.net
@foo.bar
@aaa.com
@foo.bar



@aaa.com
@hoge.net
@foo.bar

と言うように、重複した文字をまとめたいんです。
0451名無しさん@お腹いっぱい。2006/03/07(火) 15:00:03
sort して uniq したら?
0452名無しさん@お腹いっぱい。2006/03/07(火) 15:20:16
sort -u
0453名無しさん@お腹いっぱい。2006/03/07(火) 15:44:42
>>451
>>452

シェルスクリプトではなく、普通のコマンドで出来たのね(^_^;

感謝!
0454名無しさん@お腹いっぱい。2006/03/07(火) 16:12:32
sort するから表示順序が変わるけど、そこは大丈夫?

$ cat << _EOF_ | sort -u
> @aaa.com
> @hoge.net
> @foo.bar
> @aaa.com
> @foo.bar
> _EOF_
@aaa.com
@foo.bar
@hoge.net
0455名無しさん@お腹いっぱい。2006/03/07(火) 16:38:26
順序が変わるのがいやなら

awk '{if (!seen[$0]++) print}'

とかな。
0456名無しさん@お腹いっぱい。2006/03/07(火) 22:36:41
一工夫すれば順番を維持する事も可能。

cat -n | sort -k 2 -u | sort -n | cut -f 2-
■ このスレッドは過去ログ倉庫に格納されています