シェルスクリプト総合 その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 でトレースしましょう。
0391名無しさん@お腹いっぱい。
2006/02/27(月) 11:16:450392名無しさん@お腹いっぱい。
2006/02/27(月) 11:33:16そういうことにしたいのですね。
0393名無しさん@お腹いっぱい。
2006/02/27(月) 11:46:48そういう理由ならexplorer.exeについてでも調べた方がいいんじゃまいか。
おそらく最多のユーザ人口を抱える対話型シェルだよ。CUIじゃないけど。
0394名無しさん@お腹いっぱい。
2006/02/27(月) 12:41:57「sh として起動された場合は POSIX 互換に近くになる」と
マニュアル等には書いてあるが、これはかなり嘘。
実際にはshで起動してもbashとほとんど変わらない。
bashの独自拡張もほぼ全部使えてしまう。
目立った違いは、exportコマンドを引数なしで実行した時の表示が
bashだと declare -xなのが、shで起動すると exportの表示に
変わることくらい。
0395名無しさん@お腹いっぱい。
2006/02/27(月) 12:48:02Mac OS Xも今のバージョンはbashがデフォルトっぽいです。
2つ前くらいまではtcsh(sh)がデフォでした。
まぁ、私はtcshの方が良いと思うけど。
0396名無しさん@お腹いっぱい。
2006/02/27(月) 12:52:49やっぱashが漢?
>>395
tcshって少し昔しか知らないんだけど、シェルスクリプトに使うには重くない?
個人的にcsh構文ではまった記憶が多いので、偏見あるかもですが。
0397名無しさん@お腹いっぱい。
2006/02/27(月) 13:37:210398名無しさん@お腹いっぱい。
2006/02/27(月) 13:43:120399名無しさん@お腹いっぱい。
2006/02/27(月) 22:07:010400名無しさん@お腹いっぱい。
2006/02/27(月) 22:51:53Kシェルってファンクション(内部関数)作れるんだよね?
繰り返し処理をそこでやりたいんだけどどうやって記述するの?
0401名無しさん@お腹いっぱい。
2006/02/27(月) 23:31:070402名無しさん@お腹いっぱい。
2006/02/27(月) 23:33:01繰り返したい処理をC-c C-vで必要な回数コピペする。
0403名無しさん@お腹いっぱい。
2006/02/27(月) 23:36:35友達いないから俺もやってみたいな。
0404名無しさん@お腹いっぱい。
2006/02/27(月) 23:41:40当時履歴が実装されていた唯一のシェルだったからというのが大きいな。
何でも最初からあったわけではないというお話。
0405名無しさん@お腹いっぱい。
2006/02/27(月) 23:56:34csh でできると知らない人も多そうだけど。
0406名無しさん@お腹いっぱい。
2006/02/28(火) 00:03:17newcshの前にあった?
0407名無しさん@お腹いっぱい。
2006/02/28(火) 00:23:17あったんじゃね?
俺的にcsh本が書かれた時代&そっから数年はcsh以外にfilecが使えるシェルなかったし。
しかしあの数年をなかったことにしてもいいとか思っちゃえるのがcshの魔力。
また、数年後にはbashがでてくるわけだけど、当時のUNIX、68000 8MHzとかだと
bashが糞遅いわけなんだ。cshは糞だけどbashはもっと糞というのが当時の認識だろ。
その後tcshやkshもでたが、同様に遅いshellで、俺はずっとcshをつかってた。移行しても
いいと初めて思えたシェルがzsh。それいらいずっとzshだ。
0408名無しさん@お腹いっぱい。
2006/02/28(火) 00:24:23407でいってるkshはpdkshね。
0409名無しさん@お腹いっぱい。
2006/02/28(火) 00:31:450410名無しさん@お腹いっぱい。
2006/02/28(火) 00:38:140411名無しさん@お腹いっぱい。
2006/02/28(火) 00:38:490412名無しさん@お腹いっぱい。
2006/02/28(火) 00:52:55スレ違いなんで、対話的シェル総合スレでもたててそっちでやってくれ。
0413名無しさん@お腹いっぱい。
2006/02/28(火) 00:56:21zshがでてきて起動すると即帰ってきたからその感動も凄くてねえ。
>410
すまん。単なる俺の過去の経験の暴露だ。
無視してくれ。
0414名無しさん@お腹いっぱい。
2006/02/28(火) 01:15:260415名無しさん@お腹いっぱい。
2006/02/28(火) 01:17:10csh本って"UNIX C Shell Field Guide"のこと?
0416名無しさん@お腹いっぱい。
2006/02/28(火) 01:18:42そんなのprofileの違いだろ。馬鹿か。
0417名無しさん@お腹いっぱい。
2006/02/28(火) 01:23:13スレチガイだってば。
0418名無しさん@お腹いっぱい。
2006/02/28(火) 09:02:57> 拡張BNFになっとるがな。> bashのbisonソース
遅レスだけど教えてくれてありがとう。
シェルスクリプトの展開/置換と評価/実行の規則についてなんですが、
一つの入力単位(if などの複合文でなければ1行の「コマンドライン」)ごとに
字句構文解析→(展開/算術式評価/置換)
→(置換の結果生じた入力単位ごとに、字句構文解析→実行)
という流れで実行に移されると解釈していいのかな?
(あまりにも自明なことかもしれませんが…最後の () 内では
展開/置換が生じることはありえない?)
0419名無しさん@お腹いっぱい。
2006/02/28(火) 09:44:270420名無しさん@お腹いっぱい。
2006/02/28(火) 10:19:16bashと同じスタイル(yacc, lex使う)でshell作っているから。
# bison=GNU yacc
0421名無しさん@お腹いっぱい。
2006/02/28(火) 10:22:550422名無しさん@お腹いっぱい。
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:480424名無しさん@お腹いっぱい。
2006/03/05(日) 00:06:27なんで = の間が開いているの?
PWD="$PWD"
PATH="$PATH"
なら、
$ . nanashi.txt
で終りなのに。
0425名無しさん@お腹いっぱい。
2006/03/05(日) 00:08:18完全に信頼できるソースから入手したファイルでないならば危険。
ナガタ君のように泣きを見ることになる。
0426425
2006/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に食わせる。
0427422
2006/03/05(日) 00:56:11作りたいんですよ。例えば、httpd.conf であれば、
httpd.conf.in ってのを作って、中に
ServerRoot "$PWD/testroot"
とか書いておいて展開したいという。
やっぱ sed ですかねぇ
0428名無しさん@お腹いっぱい。
2006/03/05(日) 00:58:200429422
2006/03/05(日) 01:10:43簡単にできるのかな、と妄想してみただけです。
ちなみに >>423 さんのだと、$PWD を展開した結果に
スラッシュが含まれているからダメっぽいです。
sed -e 's#\$PWD#'"$PWD#" nanashi.txt
とりあえずこんな感じにしてみます
0430名無しさん@お腹いっぱい。
2006/03/05(日) 01:12:530431名無しさん@お腹いっぱい。
2006/03/05(日) 03:36:540432名無しさん@お腹いっぱい。
2006/03/05(日) 08:38:500433名無しさん@お腹いっぱい。
2006/03/05(日) 08:46:33autoツール使いたがる気違いは絶滅すればいいのに。
0434名無しさん@お腹いっぱい。
2006/03/05(日) 12:08:57問題と混同しているのね。
シェルスクリプトのことをシェルと言ってるやつと同じレベルだな。
0435名無しさん@お腹いっぱい。
2006/03/05(日) 12:31:460436名無しさん@お腹いっぱい。
2006/03/05(日) 13:22:06互換性が無い事をチェックできないカタワなシステムと
それを有り難がって使ってる気違いの事だよ。
0437名無しさん@お腹いっぱい。
2006/03/05(日) 21:54:000438名無しさん@お腹いっぱい。
2006/03/05(日) 22:21:01autoconf はマジでなんでもチェックできるぞ。
互換性が無い事をチェックできなかったとしたら、それは autoconf じゃなくて
configure.in/configure.ac を書いた奴のせい。
おまいがやってるのは、シェルスクリプトのバグに対して、シェル自体に文句
を言ってるようなものだ。
0439名無しさん@お腹いっぱい。
2006/03/05(日) 22:28:30他スレで見つけたのだが、古いOSだと ./configureが動かないことがあるらしい。
(以前は動いたが、autoconfの新しいバージョンで動かなくなったらしい)
ソフト側が悪いんじゃなく、autoconf側が悪いようだよ。
↓
http://pc8.2ch.net/test/read.cgi/unix/1139155618/311
0440名無しさん@お腹いっぱい。
2006/03/06(月) 00:20:210441名無しさん@お腹いっぱい。
2006/03/06(月) 07:14:29configure.in/configure.acを正しく書かなければ、まともに動くconfigureを
生成できないautoconfというヘタレなシステムを批判しているのだ。
0442名無しさん@お腹いっぱい。
2006/03/06(月) 09:56:560443名無しさん@お腹いっぱい。
2006/03/06(月) 10:28:380444名無しさん@お腹いっぱい。
2006/03/06(月) 11:23:562ちゃんねるもyahooもSonyJapanもlivedoorもFreeBSD
0445名無しさん@お腹いっぱい。
2006/03/06(月) 12:55:05Cコンパイラと比べるな。機械語と比べるのがふさわしい。
0446名無しさん@お腹いっぱい。
2006/03/06(月) 22:44:08筋道のとおった議論をしなければ話を聞いてくれない
掲示板というシステムも批判したらいかがですか?
0447名無しさん@お腹いっぱい。
2006/03/06(月) 23:41:11全部、ダメサイトばかりじゃないかよ。
0448名無しさん@お腹いっぱい。
2006/03/07(火) 00:00:390449名無しさん@お腹いっぱい。
2006/03/07(火) 00:19:36おまえ超面白い。
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:030452名無しさん@お腹いっぱい。
2006/03/07(火) 15:20:160454名無しさん@お腹いっぱい。
2006/03/07(火) 16:12:32$ 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:26awk '{if (!seen[$0]++) print}'
とかな。
0456名無しさん@お腹いっぱい。
2006/03/07(火) 22:36:41cat -n | sort -k 2 -u | sort -n | cut -f 2-
0457名無しさん@お腹いっぱい。
2006/03/07(火) 23:44:450458名無しさん@お腹いっぱい。
2006/03/07(火) 23:54:310459名無しさん@お腹いっぱい。
2006/03/07(火) 23:59:450460名無しさん@お腹いっぱい。
2006/03/08(水) 08:15:14そのアイデアはいいな。
前に同じような作業したときは、
perl で一度出てきた行を記憶しておくという
非常に馬鹿正直なやり方をしてた。
0461名無しさん@お腹いっぱい。
2006/03/08(水) 08:40:080462名無しさん@お腹いっぱい。
2006/03/08(水) 11:04:570463名無しさん@お腹いっぱい。
2006/03/08(水) 11:12:40>>455と>>460の方がメモリに抱える行は少ないわけだが…
0464名無しさん@お腹いっぱい。
2006/03/08(水) 11:13:440465名無しさん@お腹いっぱい。
2006/03/08(水) 11:16:55メモリとか気にするなら
シェルスクリプト使わないよ。
多少実行時のパフォーマンス悪くても
さくっと作れる方重視でいいじゃん。
0466名無しさん@お腹いっぱい。
2006/03/08(水) 12:24:040467名無しさん@お腹いっぱい。
2006/03/08(水) 12:25:350468名無しさん@お腹いっぱい。
2006/03/08(水) 12:27:310469名無しさん@お腹いっぱい。
2006/03/09(木) 00:56:08効率なんか気にするな。
0470名無しさん@お腹いっぱい。
2006/03/09(木) 01:02:26perl のモジュールのインストールをはじめるのであった。
0471名無しさん@お腹いっぱい。
2006/03/09(木) 01:18:58perlのモジュールならWinでもつかえるな、、、とか言ってミルク
0472名無しさん@お腹いっぱい。
2006/03/09(木) 01:35:23ボケ老人乙。
その5行で書けて、perlにモジュールが存在する具体例を
挙げてみようね。
口から出まかせはやめよう。お前のようなやつの年金を払っているかと
思うと反吐が出そうになる。
0473名無しさん@お腹いっぱい。
2006/03/09(木) 01:45:300474名無しさん@お腹いっぱい。
2006/03/09(木) 02:09:18while read url;do
if [ -z "$referer" ]; then referer="$(dirname $url)/index.html"; fi
test -f $(basename $url) || (while ! wget --user-agent='Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Win 9x 4.90; T312461)' --referer="$referer" --header='Accept-Encoding: gzip, deflate' --header='Accept-Language: en-us' "$1"; do sleep 1; done)
done
perlのモジュールというとLWPか。生活保護費もよろしくな。
0475名無しさん@お腹いっぱい。
2006/03/09(木) 02:56:35ダブルコーテーション使ったりシングルコーテション使ったりいろいろみたいなのですが、
どちらが正しいとかはありますか?
0476名無しさん@お腹いっぱい。
2006/03/09(木) 03:04:450477名無しさん@お腹いっぱい。
2006/03/09(木) 03:05:17シングルとダブルでは展開される要素の種類が全然違う。
正しいとかじゃなくて用途で使い分けるもの。
0478名無しさん@お腹いっぱい。
2006/03/09(木) 07:26:44あえて「どちらが正しい」というなら、
シングルクォートが正しい。
検索文字列などの中で、シェル変数の展開等が必要ないのに
ダブルクォートで囲ってあるのはバグの誘発になるのでやめた方がいい。
シングルクォートで囲っておけば、
シングルクォート自身以外はすべてシェルの解釈を避けられる。
0479名無しさん@お腹いっぱい。
2006/03/09(木) 08:38:11その手の話は専用スレがあるよ。
連番のH画像/動画を一気にダウンロードする2
http://pc8.2ch.net/test/read.cgi/unix/1135533382/
0480名無しさん@お腹いっぱい。
2006/03/09(木) 09:41:23おいおいwgetなんて使うなよ。無理してシェルスクリプト使って破綻してる例だな。
perl使った方がほぼ全ての点で優ってる。
0481名無しさん@お腹いっぱい。
2006/03/09(木) 18:17:37ちょっと添削。
「while ! コマンド」
という書き方は bashを含む一部のシェルでしか使えない。
「until コマンド」
と書いた方がいい。
あ、
$(basename $url)
も突っ込みたいが、またの機会に・・
>>480
shellで書いた方が頭がいい。>>474 は別に破綻していない。
何でもperlで書くのは良くない。
0482名無しさん@お腹いっぱい。
2006/03/09(木) 18:20:02なんで perl で書いちゃいかんの?
0483名無しさん@お腹いっぱい。
2006/03/09(木) 19:44:28【設問1】
>>481 が、なぜperlで書くと良くないと言っているか、
本文中の言葉を使って書き出せ。(5点)
0484名無しさん@お腹いっぱい。
2006/03/09(木) 19:48:54DNSルックアップとconnectを行ってしまうのはあまりよろしくないかも
知れない。
0485名無しさん@お腹いっぱい。
2006/03/09(木) 20:05:08DNSはcacheしてるから無問題。
0486名無しさん@お腹いっぱい。
2006/03/09(木) 22:52:59-------スクリプトA--------------
#!/bin/sh
echo 'NAME=$HOST' | egrep 'NAME=\$HOST'
-------ここまで--------------
↑のスクリプトを実行すると
NAME=$HOST
と表示されます。(期待する結果)
-------スクリプトB--------------
#!/bin/sh
aaa=`echo 'NAME=$HOST' | egrep 'NAME=\$HOST'`
echo $aaa
-------ここまで--------------
↑のように、変数に入れて、echoで出力すると、空行が1行表示されるだけなのです。
本当はスクリプトAのように出力させたいのです。
どうすればよいのか、よろしくご教授お願いします。
0487名無しさん@お腹いっぱい。
2006/03/09(木) 22:57:19` ` で囲まれた中の \ は要注意。
$ aaa=`echo 'NAME=$HOST' | egrep 'NAME=\\$HOST'`
$ echo "$aaa"
NAME=$HOST
期待される結果。
0488名無しさん@お腹いっぱい。
2006/03/09(木) 23:06:04紙さま!!
ありがとうございます!!!
0489名無しさん@お腹いっぱい。
2006/03/09(木) 23:10:07#! /bin/sh -x
を推奨。
0490名無しさん@お腹いっぱい。
2006/03/10(金) 06:04:26外部ファイルに
IP=111.222.333.444
と書いたファイルがあります。
これを読み込んで
#!/bin/sh
cat << EOF > /home/test.txt
ip='${IP}'
EOF
を実行すると、test.txtに
ip='111.222.333.444^M'
と、「^M」と言う文字が入ってしまいます。
「111.222.333.444」だけを書き込むにはどうしたらいいでしょうか?
よろしくお願いします。
■ このスレッドは過去ログ倉庫に格納されています