シェルスクリプト総合 その8
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001名無しさん@お腹いっぱい。
2007/02/15(木) 14:28:44スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
前スレ
シェルスクリプト総合 その7
http://pc10.2ch.net/test/read.cgi/unix/1157601611/
0839名無しさん@お腹いっぱい。
2007/07/24(火) 03:17:550840名無しさん@お腹いっぱい。
2007/07/24(火) 07:39:360841名無しさん@お腹いっぱい。
2007/07/24(火) 21:43:20#!/bin/csh
echo 検索するファイル名を入力してください:
set filename = $<
(find /* -name $filename -type f -print > /dev/tty) > & /dev/null
「hoge.txt」を検索する場合はうまくいくのですが、
ワイルドカードを用いた「hoge\*」の検索をすると検索を行わずに一瞬で終了してしまいます。
setで変数に"\*"を入力するのは不可能なのでしょうか?
0842名無しさん@お腹いっぱい。
2007/07/24(火) 21:45:140843名無しさん@お腹いっぱい。
2007/07/24(火) 21:50:39>>1
0844名無しさん@お腹いっぱい。
2007/07/24(火) 21:52:21クオートすれば?
0845名無しさん@お腹いっぱい。
2007/07/24(火) 22:31:26csh捨てろ。クズ。
0846名無しさん@お腹いっぱい。
2007/07/24(火) 22:34:460847名無しさん@お腹いっぱい。
2007/07/24(火) 22:44:48すんまそん、会社でシェルシェル言ってるもんで癖がついてました。
クオート試してみることにします。
cshは会社の都合なんすよ
0848名無しさん@お腹いっぱい。
2007/07/25(水) 06:21:28最初の行に
sh
と書きゃいいじゃん。
0849名無しさん@お腹いっぱい。
2007/07/25(水) 12:34:58実社会で勉強してね
cshからshに変えるのは容易ではないのだよ
シェルスクリプトは1人で作るのではないし
1つの会社で作るものでもない
0850名無しさん@お腹いっぱい。
2007/07/25(水) 14:06:37いくつもの会社にまたがって何人もの人がよってたかって
>>841みたいなスクリプトを書いているわけだな。すげぇ。
つーか、csh を使うにしてもせめて #!/bin/csh -f にしろよ。
0851名無しさん@お腹いっぱい。
2007/07/25(水) 14:13:50の例は、わざわざcshの欠点が目立つような典型例だな。
ワイルドカードの展開の問題とか、
findのstderrを捨てるために苦労してるところとか。
そもそも、findをインタラクティブに実行させるようなスクリプトは、
システム管理用スクリプトじゃない。初心者ユーザー向けに作ったものだろ。
こんなの、/bin/shで書き直せば一発。
>>841 が抱えているcshでの問題も一気に解決する。
>>849 へ。
みんな実社会で「cshスクリプトは使わない」が常識だといってるんだよ。
>>849 は自分の会社名を公表しない方がいいよ。会社の不名誉になるからね。
0852名無しさん@お腹いっぱい。
2007/07/25(水) 14:15:450853849
2007/07/25(水) 14:57:09ま、会社名を挙げる気は無いけど、
おれんとこでは全部のスクリプトがcshだし
スクリプトの作成・保守を依頼している会社も
cshで作るようになっている。
OSが古いもの・新しいものが混在しているのも
理由ではあるが、
常識など、会社によって違うものだろ。
シェルがダメなのは分かるが、
シェルを変えろとか無理な話だ
0854名無しさん@お腹いっぱい。
2007/07/25(水) 14:59:19実行しても何も起きません。
どうすればよいのでしょうか?
また、linuxのbashみたいに↑↓キーで履歴表示をしたいのですが、
kshで実現可能でしょうか?
0855名無しさん@お腹いっぱい。
2007/07/25(水) 15:07:05> OSが古いもの・新しいものが混在しているのも理由ではあるが、
/bin/shが存在しないUnixなんて無いんじゃないのか
> シェルがダメなのは分かるが、シェルを変えろとか無理な話だ
へえ。cshがダメなのははるか前からの常識なのに、誰もその
やりかたを変えようとせず、変えるのは「無理」だと思ってるんだ。
しかも古いスクリプトだけでなく、新しいスクリプトもわざわざ
cshで書き、ゴミを製造し続けていると。
勿論、C++やJavaやPythonなんて誰も使わないんだろうな。
ソース管理は未だにCVSでさえない、いやソース管理なんて概念もないね?
お前さんがアホなのか、会社がアホなのかは知らないが、実に見事に
アホだな。
0856名無しさん@お腹いっぱい。
2007/07/25(水) 17:35:21そんなに必死に弁解しなくていいよ
0857名無しさん@お腹いっぱい。
2007/07/25(水) 20:55:10だってさ、起動スクリプトとかOSに元々内蔵されてるスクリプトはshだよね?
そういうスクリプトを修正する時も、cshで書き直してるの?
0858名無しさん@お腹いっぱい。
2007/07/25(水) 23:13:350859名無しさん@お腹いっぱい。
2007/07/25(水) 23:54:41おまけに最近スクリプトでsql実行してるのを、「COBOLで実装しろ」って指摘された…
SQLの使い方調査があって、スクリプトが調査範囲から漏れたからだと。
0860名無しさん@お腹いっぱい。
2007/07/26(木) 00:27:56つまりOSインストール時からあるスクリプトも全部cshで書き直してるって事か?
0861名無しさん@お腹いっぱい。
2007/07/26(木) 00:40:110862名無しさん@お腹いっぱい。
2007/07/26(木) 01:32:53なんでcsh使うことになったの?
0863名無しさん@お腹いっぱい。
2007/07/26(木) 04:05:17csh好きな勉強不足の若者の脳内会社なんだから許してやれよw
0864名無しさん@お腹いっぱい。
2007/07/26(木) 10:27:50皆さんがんばってね
0865名無しさん@お腹いっぱい。
2007/07/26(木) 14:51:51cshで書かれたシェルスクリプトがいっぱい付いてくるから
仕方が無い
0866名無しさん@お腹いっぱい。
2007/07/26(木) 14:57:19戻り値チェックするくらいのもんだからな。
0867名無しさん@お腹いっぱい。
2007/07/26(木) 17:05:580868名無しさん@お腹いっぱい。
2007/07/26(木) 18:40:090869名無しさん@お腹いっぱい。
2007/07/27(金) 00:19:380870名無しさん@お腹いっぱい。
2007/07/27(金) 01:30:36俺はシェルスクリプトがないと会社で生きて行けんが。
0871名無しさん@お腹いっぱい。
2007/07/27(金) 02:53:31つ ln /bin/sh /bin/csh
もっといいのは#!起動された時にスクリプトを調べて
昔からのcshスクリプトなら「しょうがなく」csh、じゃなきゃ
shにディスパッチするようにするとか。Linuxなら簡単だな。
0872名無しさん@お腹いっぱい。
2007/07/27(金) 04:33:23*.shのファイルを開いたらbashスクリプトだったなんて事を無くす為なら
cshしか使うなってのもありかも知れん。
0873名無しさん@お腹いっぱい。
2007/07/27(金) 07:10:120874名無しさん@お腹いっぱい。
2007/07/27(金) 08:49:35とかね
0875名無しさん@お腹いっぱい。
2007/07/27(金) 23:08:290876名無しさん@お腹いっぱい。
2007/07/27(金) 23:22:100877名無しさん@お腹いっぱい。
2007/07/27(金) 23:53:59ひ孫請の俺がルールを変えるなんて無理だった。
当然ソース管理なんて概念もない。ファイルはタイムスタンプ
(mtime)で管理してたよ。もー馬鹿かアフォかと。
とりあえず、自分のコードは SCCS で管理してた。
当然フリーソフトウェアなんて得たいの知れないものは
使用禁止。
まだあの会社あるかな…
0878名無しさん@お腹いっぱい。
2007/07/28(土) 00:03:54某システム系大手とか
0879名無しさん@お腹いっぱい。
2007/07/28(土) 01:05:38folder>------folder1---test
|
---folder2---test
folder1内にある実行ファイルtestを実行して、
その終了を待って、folder2内のtestを実行する
というスクリプトを作ったんですが、folder2の実行が行われません。
どこがいけなかったんでしょうか?ご教授ください。
#!/bin/sh
for i in 1 2
do
cd folder$i
nohup test
wait $!
cd ..
done
0880名無しさん@お腹いっぱい。
2007/07/28(土) 01:12:09ほっとけば、終わってからしか次が実行されんだろ?
あと、本当にtestって名前なのか?
/bin/testかビルトインのtestが動いてるだけでは?
0881879
2007/07/28(土) 01:24:56実際は、testっていうプログラムじゃないんですけど、
実行すると1日くらい走り続けるものです。
wait入れなくて実行したら、二重に実行されてしまったので。
二重に走らないようにしたいので、wait入れたのですが。
0882名無しさん@お腹いっぱい。
2007/07/28(土) 01:58:54それで満たせない要件は後だしでくるような気もするけど
0883名無しさん@お腹いっぱい。
2007/07/28(土) 02:20:46waitって子プロセスの終了待つだけなんだから
バックグラウンドで動かさん限り無意味
0884名無しさん@お腹いっぱい。
2007/07/28(土) 03:15:41echo "<tr><td></td></tr>" | awk '{print $1, $2, $3, $4}'
とすると、以下のように分解して代入されるようにしたいのですが、
awkのオプションをどのように指定すればよいでしょうか?
(同じことができるなら、awk以外でも構いません)
$1=<tr>
$2=<td>
$3=</td>
$4=</tr>
よろしくご教授お願いします。
0885名無しさん@お腹いっぱい。
2007/07/28(土) 07:42:410886名無しさん@お腹いっぱい。
2007/07/28(土) 08:52:38この部分は何だ?
0887名無しさん@お腹いっぱい。
2007/07/28(土) 09:32:29<tr><td>< というディレクトリの下に
td>< という子ディレクトリがあって、その下に
tr> というファイルがある。
その内容が
<tr><td></td></tr>
なのだ。
0888名無しさん@お腹いっぱい。
2007/07/28(土) 09:46:100889名無しさん@お腹いっぱい。
2007/07/28(土) 16:48:50なんで echo の中で FS 使っちゃいけないの?
0890名無しさん@お腹いっぱい。
2007/07/28(土) 16:52:400891名無しさん@お腹いっぱい。
2007/08/01(水) 00:31:16do
echo ${f}
done
とか
for s in 'cat hoge.txt'
do
echo ${s}
done
なんかは、基本だな
0892名無しさん@お腹いっぱい。
2007/08/01(水) 01:12:54何が言いたいのかさっぱりわからん。
0893名無しさん@お腹いっぱい。
2007/08/01(水) 02:11:41if [ $numbar = 10 -o $numbar = 11...]
と地道に書いていくしかだめですか?
0894名無しさん@お腹いっぱい。
2007/08/01(水) 02:24:090895名無しさん@お腹いっぱい。
2007/08/01(水) 02:38:29[1-9][0-9]|[1-9][0-9][0-9]|1000)
....
;;
esac
0896名無しさん@お腹いっぱい。
2007/08/01(水) 08:14:470点
0897numbar warota
2007/08/01(水) 21:58:49[ "$number" -ge 10 -a "$number" -le 1000 ]
0898名無しさん@お腹いっぱい。
2007/08/01(水) 22:58:41引っかけ問題に引っかかりましたねぇ。
>>893 の問題では、シェル変数名は number じゃなくて numbar
前任者から引き継いだスクリプトとかで変数名がミススペルで、
自分が正しいスペルで書き足すと動かなくて1日悩むこと、よくあるでしょ?
そのための練習問題でした。
0899名無しさん@お腹いっぱい。
2007/08/01(水) 23:03:02死ぬほどどうでも良いですね。
0900名無しさん@お腹いっぱい。
2007/08/02(木) 20:28:27おまい、100回くらい死ねよ
0901ウサチャソ
2007/08/02(木) 21:08:520902名無しさん@お腹いっぱい。
2007/08/02(木) 21:22:540903名無しさん@お腹いっぱい。
2007/08/02(木) 21:25:200904名無しさん@お腹いっぱい。
2007/08/02(木) 21:41:270905numbar warota
2007/08/02(木) 22:07:37シェルスクリプトごときで1日も迷うねーよ。
それと、From:見る癖つけたほうが良い。
0906名無しさん@お腹いっぱい。
2007/08/03(金) 00:34:20「対話的な利用についての話はスレ違い」ってあるけど、
どこに逝っていいのか教えて頂けないでしょうか〜
expect があることは知ってるけど、
インストールが必要だからダメだって。
とりあえず、どういう選択肢があるか知りたいです。
あと perl の話になるんだけど、
Expect.pm を Makefile.pl とか CPAN での
インストールをしないで(起動ディレクトリにモジュールを置くだけとかで)
起動する方法があれば、誘導をお願いしたいです。
0907名無しさん@お腹いっぱい。
2007/08/03(金) 00:37:46ポエムは確か別の板があったはずだぞ。
0908名無しさん@お腹いっぱい。
2007/08/03(金) 01:12:06ポエム?
なんかアフォ扱いみたいな感じだけど、
変なこと書いてるんかなー? よく分からん。
とりあえず反応ありがと。
0909名無しさん@お腹いっぱい。
2007/08/03(金) 02:14:060910名無しさん@お腹いっぱい。
2007/08/03(金) 02:17:29インストールがダメって言うなら、現行環境に入ってる使えそうな道具立てはなんなのよ?
それとは別に、「対話利用についての話題禁止」の意味をつかめてないに一票
0911名無しさん@お腹いっぱい。
2007/08/03(金) 08:19:15ぐぐってみた。↓に書いてある「対話」?
(例えばどんな話が禁止なのかは分からんが。。)
0からのbash 第1回:対話的シェルの使用法(1) 1.はじめに
http://www.stackasterisk.jp/tech/systemManagement/bash01_01.jsp
>>910
何を書けばいいんだろ。
telnet, ftp, rsh, perl
Expect.pm は上に書いたように
Windows での単体 exe みたいなイメージ
(インストールが必要ない)ならおkらしい
0912名無しさん@お腹いっぱい。
2007/08/03(金) 08:56:320913名無しさん@お腹いっぱい。
2007/08/03(金) 10:30:08やりたいことをできるだけ具体的に
0914名無しさん@お腹いっぱい。
2007/08/03(金) 17:58:16とりあえず初心者がシェルの方を始めるには、どのシェルの方から始めればいいでしょうか?
開発ツールの方とか、デバッガーの方はGUIの方であるんでしょうか?
できればフリーの方を希望します。
0915名無しさん@お腹いっぱい。
2007/08/03(金) 18:11:06> 可能性が発生する恐れがあるかも知れない状況になる兆しが出て来ました。
それぞれ20%と仮定すると、4段階あるから、0.16%だ。
悲観的すぎー
0916名無しさん@お腹いっぱい。
2007/08/03(金) 18:17:25GUI はないと思っていい。
0917名無しさん@お腹いっぱい。
2007/08/03(金) 18:18:590918名無しさん@お腹いっぱい。
2007/08/03(金) 22:35:37sh
0919名無しさん@お腹いっぱい。
2007/08/03(金) 23:10:590920名無しさん@お腹いっぱい。
2007/08/03(金) 23:39:16push(@INC, '/home/hiroyuki')
とかやればモヂュールのサーチパスに追加されるんじゃないの?
0921名無しさん@お腹いっぱい。
2007/08/03(金) 23:40:37お前の語彙が少ないのはどうでも良い。
0922名無しさん@お腹いっぱい。
2007/08/03(金) 23:48:38wishとかwkshとかPowerShellかもしれないじゃないか!
0923名無しさん@お腹いっぱい。
2007/08/04(土) 00:37:18悔しいのか? でもつまらんものはつまらん。
0924名無しさん@お腹いっぱい。
2007/08/04(土) 00:41:13「シェルってゆーな」の人が登場する可能性が発生する恐れがあるかも知れない状況になる兆しが出て来ませんねぇ
0925名無しさん@お腹いっぱい。
2007/08/04(土) 02:19:390926名無しさん@お腹いっぱい。
2007/08/04(土) 07:31:21X 恐れ
◯ 虞れ
0927名無しさん@お腹いっぱい。
2007/08/04(土) 09:22:51それを言うなら、送り仮名が違う
×虞れ
○虞
ただし、「虞」は常用漢字じゃなく、現在では「恐れ」と表記するのが標準。
ぐぐってみても、「○○する恐れ」は多数ヒットするが、「○○する虞」はごくわずか。
0928名無しさん@お腹いっぱい。
2007/08/04(土) 09:34:48お前、センスが皆無な上に致命的に頭悪いな。
> シェルスクリプトをシェルとゆうな。
なので、>>914は(呆れるほどつまらない釣りだが)誤用無し。
0929926
2007/08/04(土) 14:34:15うちのAnthyはそこまでバカじゃない。
送り仮名は「敢えて」俺が書き足した物。
>>ぐぐってみても、「○○する恐れ」は多数ヒットするが、
>>「○○する虞」はごくわずか。
世の中全体が、バカになって来たということですな。
(負の)probabilityをterribleと表記することの
とんでもなさに違和感を感じないとはねぇ・・・
0930名無しさん@お腹いっぱい。
2007/08/04(土) 14:39:54英語でも I'm afraid ... って言うじゃん。
単に可能性だけじゃなく、もしそうだったら困ると言うニュアンスがあるから
「恐れ」で的確。
いいことに対しては確率が低くても「恐れ」とは言わないし。
ちなみに、probabilityは 0 <= probability <= 1 でしか定義できない。
負のprobabilityなんて言ってる時点で、お前数学も苦手だっただろw
0931名無しさん@お腹いっぱい。
2007/08/04(土) 15:26:14930はprobability=(数学的)確率というバカの一つ憶えしかしてないから
早合点したんだろう。蓋然性って日本語知ってるか?
0932名無しさん@お腹いっぱい。
2007/08/04(土) 15:40:52確率を蓋然性と言い替えたところで本質は変わらない。
(数学以外でも)「負の確率」なんて存在しない。
「負の確率」という言葉が出てしまった時点で、アンタの負け。
0933931
2007/08/04(土) 16:15:22日本語も英語もダメな人みたいだね。
0934名無しさん@お腹いっぱい。
2007/08/04(土) 16:18:28それは数学だけじゃなく日本語としてもおかしい。
確率を理解していないことになる。
よって、>>931 のように弁護しても、やはり >>929 は間違い。
0935931
2007/08/04(土) 16:21:390936名無しさん@お腹いっぱい。
2007/08/04(土) 16:22:410937名無しさん@お腹いっぱい。
2007/08/04(土) 16:37:03負の遺産は本当に「負」だろうが。
借金はマイナスの遺産。マイナスだからこそ「負」と言って正しい。
ところが、確率は絶対に「負」にはならない。
負の確率なんて存在しない。
0938名無しさん@お腹いっぱい。
2007/08/04(土) 16:45:18>>936 は別の意味で「負」を理解してないなw
0939名無しさん@お腹いっぱい。
2007/08/04(土) 17:08:59レス数が900を超えています。1000を超えると表示できなくなるよ。