シェルスクリプト総合 その2
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2005/04/17(日) 00:17:17まずは注意点、リンク、地鎮祭など(>>1-10くらい)をご覧ください。
□前スレや過去スレ:
シェルスクリプト総合 その1
http://pc8.2ch.net/test/read.cgi/unix/1101820646/
☆シェルスクリプトを勉強するにあたって☆
http://pc5.2ch.net/test/read.cgi/unix/989659936/
便利なシェルスクリプト見せろ
http://pc5.2ch.net/test/read.cgi/unix/996949546/
【貝】第1回シェル講座【殻】
http://fun.kz/test/read.cgi/unix/1016372780/
□関連スレ:
sed
http://pc8.2ch.net/test/read.cgi/unix/1085730992/
おまえら! shell は何を使っているんですか?
http://pc5.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc8.2ch.net/test/read.cgi/unix/1102921590/
□他板の関連スレ:
Macでシェルスクリプト総合 Part 1
http://pc7.2ch.net/test/read.cgi/mac/1105074933/
【Shell】どのシェル使ってる?【Script】
http://pc8.2ch.net/test/read.cgi/linux/1067330754/
0588名無しさん@お腹いっぱい。
2005/07/13(水) 14:33:23old_name=$1
for ((num=1; ; num++)) {
[ ! -e "$old_name$num" ] && break
}
new_name=$old_name$num
と書ける。
0589名無しさん@お腹いっぱい。
2005/07/13(水) 14:57:22++ってシェルスクリプトでも使えるんですね。
やってみたいお年ごろなので一行にまとめてみました。
for ((num=1; ; num++)) { [ ! -e "$1$num" ] && { new_name=$1$num ; break ;} }
0590名無しさん@お腹いっぱい。
2005/07/13(水) 15:04:180591名無しさん@お腹いっぱい。
2005/07/13(水) 20:28:520592名無しさん@お腹いっぱい。
2005/07/13(水) 20:33:06何なんだろうか
0593名無しさん@お腹いっぱい。
2005/07/13(水) 20:41:530594名無しさん@お腹いっぱい。
2005/07/13(水) 21:01:55ちったぁぐぐったうえで聞けや、この腐れぼんくら
ttp://www.google.com/search?hl=ja&q=posix&btnG=Google+検索&lr=lang_ja
0595名無しさん@お腹いっぱい。
2005/07/13(水) 21:04:23posixってどこで読めの?
0596名無しさん@お腹いっぱい。
2005/07/13(水) 21:22:25dejure standard ではなく defact standard を使うのは当然でしょ。
ちゃんと象牙の塔に引き篭もっててください。
0597名無しさん@お腹いっぱい。
2005/07/13(水) 21:24:31現存の環境で動かなきゃ意味がない。
となると、必然的にBourne互換スクリプトになる。
0598名無しさん@お腹いっぱい。
2005/07/13(水) 21:31:07いや、書くか?
それとも、ansi2knr.c?
0599名無しさん@お腹いっぱい。
2005/07/13(水) 21:32:16dejure standardはなんですか
0600名無しさん@お腹いっぱい。
2005/07/13(水) 21:34:19毎回定義するんだな?
0601名無しさん@お腹いっぱい。
2005/07/13(水) 21:37:10またお前か。引っ込んでろ。
0602名無しさん@お腹いっぱい。
2005/07/13(水) 21:37:12何回も書くほど面白いネタじゃないぞ。
0603名無しさん@お腹いっぱい。
2005/07/13(水) 21:42:22>Posixなんて机上の空論。
ええ?そうなんですか?
少なくともHP-UXの/bin/shはPOSIX準拠だと謳っているから
そう信じてたんですが私は騙されてたんでしょうか?
0604名無しさん@お腹いっぱい。
2005/07/13(水) 21:54:41今だと/bin/sh-->/usr/bin/sh(shell-posix)なのかな?
昔はそうじゃなかった気がする
http://www.bookshelf.jp/texi/autoconf/autoconf-ja_10.html
あたりが答えなのかねえ
0605名無しさん@お腹いっぱい。
2005/07/13(水) 21:57:220606603
2005/07/13(水) 22:10:28>今だと/bin/sh-->/usr/bin/sh(shell-posix)なのかな?
今、現物を確認できませんが、
たしか/bin/shと/usr/bin/shは両方実体ファイルで、
中身はdiffで比べると同一だったと思います。
それと/sbin/shは違うシェルだったような・・・
0607名無しさん@お腹いっぱい。
2005/07/13(水) 22:13:13lrwxrwxrwx 1 root root 9 Aug 23 2004 /bin -> ./usr/bin
0608603
2005/07/13(水) 22:22:36それはHP-UXの話ですか?
だとしたら盲点ですた・・・
じゃあやっぱりHP-UXの/bin/shはPOSIX準拠なのだと信じて
生きていきます・・・
0609名無しさん@お腹いっぱい。
2005/07/13(水) 22:29:17いや、Solarisです。
ちなみに、/sbin/sh はスタティックリンク
0611名無しさん@お腹いっぱい。
2005/07/13(水) 22:41:11そういうシェルを/binに置くのって、どうなのよ
0612名無しさん@お腹いっぱい。
2005/07/13(水) 22:41:5510では/sbin/sh --> /bin/sh
0613名無しさん@お腹いっぱい。
2005/07/13(水) 22:45:41Solarisには、/usr/bin/cdとか/usr/bin/umaskとか、
外部コマンド版が存在しますが、
これって意味あるんですか?
実際、実行しても当然期待通り動作しませんが・・
0614名無しさん@お腹いっぱい。
2005/07/13(水) 22:46:16ってことでOK?
/bin/shが何者だかわかりゃしねえ
0615名無しさん@お腹いっぱい。
2005/07/13(水) 22:47:44rootは/sbin/shを使うから問題ない。んじゃね?
0616名無しさん@お腹いっぱい。
2005/07/13(水) 22:52:10そこまでいくと、もう…
0617名無しさん@お腹いっぱい。
2005/07/13(水) 22:54:49に色々なシステム環境の説明があるな
1)HP-UXでも/bin-->/usr/bin
2)/sbin/shは/usr/bin/sh(sh-posix)のstatic link版
3)昔あったbourne互換シェルは消えた
ってことだ
>>615
てことだから、/sbin/shもterminfo見てるんじゃないかな
0618名無しさん@お腹いっぱい。
2005/07/13(水) 23:01:5610では、/bin は /usr/bin とは別物なの?
0619名無しさん@お腹いっぱい。
2005/07/14(木) 16:55:32変数に取り込もうと、
err_message=`hoge 2>&1`
とすると、メッセージが変数に取り込めずに直接表示されてしまいます。
仕方なく、
err_message=`hoge 2>&1 | cat`
と、catをかますとうまくいきます。
これってknown Bugですか?
なお、hoge自体がファイル記述子2に出力していることは確認済みです。
0620名無しさん@お腹いっぱい。
2005/07/14(木) 18:03:44-current だと以下のように期待通りの動作をしていますけど,
バージョンは?
$ msg=`ls -z 2>&1`
$ echo $msg
ls: illegal option -- z usage: ls [-ABCFGHLPRSTWZabcdfghiklmnopqrstuwx1] [file ...]
$
0621名無しさん@お腹いっぱい。
2005/07/14(木) 18:33:50hoge='ENV_HOGE'
の状態で
環境変数ENV_HOGEにアクセスしたいんだけど
${$hoge} では怒られるんだけど、どう書けばいいのかな、
それともこういうポインタ的なのは_?
0622名無しさん@お腹いっぱい。
2005/07/14(木) 18:37:31eval でがんばれ。
0623名無しさん@お腹いっぱい。
2005/07/14(木) 19:34:29$ uname -sr
FreeBSD 5.4-RELEASE
$ err_message=`umask 999 2>&1`
umask: Illegal number: 999$
$ echo "$err_message"
$ err_message=`umask 999 2>&1 | cat`
$ echo "$err_message"
umask: Illegal number: 999
$
つーことで、5.4でもバグってます。
currentでは直ってるんですね?
0624名無しさん@お腹いっぱい。
2005/07/14(木) 19:38:29eval echo \$$hoge
0625620
2005/07/14(木) 22:00:34commitlog 漁ってみたけど, それらしき patch はあたっていない.
cvs diff -r RELENG_5_4_0_RELEASE やってみたけど, それらしき差分は見当たらない.
なんで, そんな現象になるんだろ?
0626名無しさん@お腹いっぱい。
2005/07/15(金) 00:28:32外部コマンドでそうなる例はある?
0627名無しさん@お腹いっぱい。
2005/07/15(金) 00:49:01超致命的バグが発見できないとは。
0628名無しさん@お腹いっぱい。
2005/07/15(金) 01:17:53いくつか試したところ
ok: cd eval alias
ng: umask pwd dot set
ちなみに"AAA=`(umask 999) 2>&1`"は大丈夫だ
0629621
2005/07/15(金) 01:35:08どうもっす。
evalでいいのかな``で囲むやつでがんばってみた。
`env $hoge` でなんとかうまくいきますた。
でもなんつか、ちと格好悪いね。
${${hoge}} の方がポインタちっくでいい感じだと
思うんだけど… (´・ω・`)
0630名無しさん@お腹いっぱい。
2005/07/15(金) 01:37:51(umaskの場合) ashはsubstitution commandがbuiltinだとsubshellをforkせずに
済ませようとするようです。
bashとpdkshは普通にforkし、ksh93はforkしませんがbash/pdkshと同じ結果を返します。
最適化しようとしてenbugしたっぽいですね。
0632名無しさん@お腹いっぱい。
2005/07/15(金) 01:47:11要するにPerlのシンボリックリファレンスみたいな機能が欲しかった、と
0633名無しさん@お腹いっぱい。
2005/07/15(金) 09:38:24> ${${hoge}} の方がポインタちっくでいい感じだと
それって \$$hoge じゃん。
0634名無しさん@お腹いっぱい。
2005/07/15(金) 12:04:21そう書きたきゃ、
eval echo \${${hoge}}
でできるよ。
あと、 `env $hoge` じゃなくて、
echo `printenv $hoge`
だよね。
0635名無しさん@お腹いっぱい。
2005/07/15(金) 12:21:15シェルスクリプトにかっこよさを期待されてもな。
0636名無しさん@お腹いっぱい。
2005/07/15(金) 13:13:53(1)バックアップ作成、ログ取得
# cd /backup (←作ったDIR)
# tar cvfz backup`date +%Y%m%d`.tar.gz --atime-preserve /home >bulog`date +%Y%m%d`.txt
(2)現在のファイルを取得
# ls -1 | grep backup[0-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9] > now_data.txt
(3)7世代までのファイルを取得
# tail -7 now_data.txt >days_data.txt
(4)2つのファイルを比較、削除ファイル抽出
# diff now_data.txt days_data.txt > differ_data.txt
(5)差分を消す ←今ここ
# ??? differ_data.txt
な感じで考えてみましたが、行き詰ってます。
diffで差分を拾ってきた結果↓から
-----
[root@xxxxx backup]# cat differ_data.txt
1d0
< backup20050709.tar.gz
-----
1d0 とか < とかを省いて「backup????????.tar.gz」の部分だけを拾ってきたリストを作って、
「rm -f < differ_data.txt」みたいに一発で消せる様に出来ないものなのでしょうか。
#もっとスマートな方法が有ったら教えてくだちぃ…。
0637名無しさん@お腹いっぱい。
2005/07/15(金) 13:30:01そもそもdump(8)を避けた理由は何かあるんでしょうか?
dumpなら普通に世代バックアップできるし。
dump先を普通のファイルにしておけば、そこからrestore -iで取り出す
手間もtarと大差ないし。
0639名無しさん@お腹いっぱい。
2005/07/15(金) 13:36:26早速のレス有り難う御座います。
dumpを避けた理由は…dumpというコマンドを知りませんでした。
手元の「RedHatLinux コマンドリファレンス」に載っていない様で…(汗
とりあえず一旦
man dump
してみます、有り難う御座いましたー!
0640名無しさん@お腹いっぱい。
2005/07/15(金) 13:37:44○ポケットリファレンス
(技術評論社)
0641名無しさん@お腹いっぱい。
2005/07/15(金) 13:46:58diffじゃなくてcommを使う。
rm -f `comm -23 now_data.txt days_data.txt`
で、一発で消せる。
ただし、now_data.txtとかはsort済みのこと。
0642名無しさん@お腹いっぱい。
2005/07/15(金) 14:39:55行けました!
有り難う御座います!!
#さすがUNIX板(^^*
0643名無しさん@お腹いっぱい。
2005/07/15(金) 19:41:120644名無しさん@お腹いっぱい。
2005/07/15(金) 20:13:070645名無しさん@お腹いっぱい。
2005/07/15(金) 23:15:19スクリプトは本来書き捨てるためのモノでもあり以下略。
0646名無しさん@お腹いっぱい。
2005/07/15(金) 23:21:190647名無しさん@お腹いっぱい。
2005/07/16(土) 00:16:100648名無しさん@お腹いっぱい。
2005/07/16(土) 01:13:36hoge="aaa"
if echo $hoge | grep -q "aaa"; then
echo ATARI
fi
とやると ATARI と表示されます。
[]でくくっても同じ。 評価された結果って
何を見てるんでしょうか?わからなくなってきました。
0649名無しさん@お腹いっぱい。
2005/07/16(土) 01:22:34当然だろ。
0650名無しさん@お腹いっぱい。
2005/07/16(土) 01:23:020651名無しさん@お腹いっぱい。
2005/07/16(土) 04:51:04#!/bin/sh
hoge="aaa"
echo $hoge | grep -q "aaa";
if [ $? = 1 ] ; then
echo ATARI
elif [ $? = 0 ] ; then
echo HAZURE
fi
0652名無しさん@お腹いっぱい。
2005/07/16(土) 05:16:05シェルのifやwhileでは0が真として評価されるんでつよ
って、そういう話じゃなくて?
0653名無しさん@お腹いっぱい。
2005/07/16(土) 11:10:13であれば、個数をカウントするから、ヒットしない場合が”0”
って、そういう話じゃなくて?
0654名無しさん@お腹いっぱい。
2005/07/16(土) 11:12:130655648
2005/07/16(土) 15:28:17やっぱそうやらないと駄目なんすね
>>652-653
いや、正にそういう話です。要するに 0が真として評価されるからなんですね。
例えば、正常終了時のリターンコードが0でないようなコマンドの場合、偽と
判断されるのかな、紛らわしいな…
0656名無しさん@お腹いっぱい。
2005/07/16(土) 16:42:56>>4のこともたまには思い出してあげて下さい。
0657名無しさん@お腹いっぱい。
2005/07/16(土) 17:10:16フォー!
0658名無しさん@お腹いっぱい。
2005/07/16(土) 18:22:10> 判断されるのかな、紛らわしいな…
もしかして、アホですか?
0659名無しさん@お腹いっぱい。
2005/07/16(土) 18:35:56> もしかして、アホですか?
それを言っちゃだめだって。
0660名無しさん@お腹いっぱい。
2005/07/16(土) 18:54:08紛らわしいも何も、それが仕様なんだから慣れろ
もっと詳細な制御がしたければ、$?に対して
Case文でも使えばいいだけの話だ
0661名無しさん@お腹いっぱい。
2005/07/16(土) 22:46:020662名無しさん@お腹いっぱい。
2005/07/16(土) 23:05:21そんなコマンドないよ。
>>653
が言ってる grep -c も、
文字列が見つからなかった場合、
「標準出力に」0が表示され、
「終了ステータス」は1になるので、無問題だよ。
0663名無しさん@お腹いっぱい。
2005/07/17(日) 12:52:340664名無しさん@お腹いっぱい。
2005/07/17(日) 12:59:06シェルスクリプト中でも、ふつうに、
su -c 'hoge1; hoge2'
または
sudo hoge
でいいと思うけど。
あるいはsetuidのスクリプトを呼び出すとか。
0665名無しさん@お腹いっぱい。
2005/07/17(日) 13:20:220666名無しさん@お腹いっぱい。
2005/07/17(日) 13:28:55セキュリティホールになるよ。
ググるとFAQか何かがすぐ出てくると思う。
0667名無しさん@お腹いっぱい。
2005/07/17(日) 13:39:56問題がない使い方で使うなら桶。
0668名無しさん@お腹いっぱい。
2005/07/17(日) 13:43:550669名無しさん@お腹いっぱい。
2005/07/17(日) 13:48:47grepとは違って、どういう場合が正常終了なのか、
デフォでは定義されていない(常に真)になっているだけ。
0670名無しさん@お腹いっぱい。
2005/07/17(日) 15:55:59>>596
×dejure standard, defact standard
○de jure standard, de facto standard
0671名無しさん@お腹いっぱい。
2005/07/17(日) 16:34:57下のようなsrcがあってbbbだけ抜き出すのは可能ですか?
bbbは変数でgrep bbbは使えません。
---------------------------------------------------------
</td>
<td colspan=3>
<a href=/aaa/aaaa/aaa><b class="sans">テストテスト</b></a>
<br>
<font face=osaka,MS Pゴシック,arial,helvetica size=-1>
bbbbbb
</font>
-------------------------------------------------------
0672名無しさん@お腹いっぱい。
2005/07/17(日) 16:39:10「テストテスト」と「bbbbbb」の違いは何?
grep使えないのはなぜ?宿題だから?
0673名無しさん@お腹いっぱい。
2005/07/17(日) 16:39:31質問が不明確。
VAR=bbb
grep "$VAR"
ということじゃないよね?
0674名無しさん@お腹いっぱい。
2005/07/17(日) 17:05:40こうかな?
cat src | tr -d "\n" | sed -e "s,</font>,\n,g" | sed -e "s,.*<font[^>]*>,,"
0675名無しさん@お腹いっぱい。
2005/07/17(日) 20:30:470676名無しさん@お腹いっぱい。
2005/07/17(日) 20:58:37あ、コマンドオプションにも変数使えたんですね。
どうもありがとうございました。
0677名無しさん@お腹いっぱい。
2005/07/17(日) 21:24:31そんなオチかよ!
0678名無しさん@お腹いっぱい。
2005/07/18(月) 01:51:18よ。。。
0679名無しさん@お腹いっぱい。
2005/07/21(木) 13:35:37例えば.shを.batに書き直すようなツールはありますでしょうか。
ぜひ教えてください。
シェルスクリプトもバッチも知識ゼロです。
Windows板で質問したらUNIX板へ帰れって言われました。
UNIX環境の質問ではないのですが、よろしくお願いします。
0680名無しさん@お腹いっぱい。
2005/07/21(木) 13:37:03http://pc8.2ch.net/test/read.cgi/unix/1119982766/
0681名無しさん@お腹いっぱい。
2005/07/21(木) 14:24:390682名無しさん@お腹いっぱい。
2005/07/21(木) 15:04:550683679
2005/07/21(木) 15:56:48Cygwinインストールしてみました。
Shell Scriptを実行してみたところsyntax errorが出たので、
やはり知識を身につけなければいけないようです。
公式な配布物の中身をいじってないのにErrorが出るのが何でかわかりませんが・・・orz
0684名無しさん@お腹いっぱい。
2005/07/21(木) 16:00:260685名無しさん@お腹いっぱい。
2005/07/21(木) 17:01:260686名無しさん@お腹いっぱい。
2005/07/21(木) 20:20:39「エスパーきぼんぬ」「氏ね」「(゚Д゚)ハァ?」等のレスを貰う八ヶ条。
1. ハードウェア、OSのバージョン等には一字一句触れない。
2. 大切な個人情報が漏れるとまずいので、己の行った操作、変更などは秘密。
3. エラーメッセージの類は決して書かない。「エラーが出るんです」で留める。
目の前で生じている現象をそのまま具体的に書くなどもっての外。
事実より俺様の脳内解釈を優先すべし。
4. 独り言文体で必勝。
「…なんだけど、どうすればいいのかなぁ」「何が悪いんだろう?」
5. 「急いでいます」「困っています」等、自分の都合を全面に押し出す。
6. もう試したことを得意げに指摘してくる奴には、厳しく対応。
「それが駄目だったから質問してるんです」「それはもう試してみて駄目でした」
"どう"だめだったのか、本当に実際それを行ったかどうかなんか問題じゃない。
7. ストレートに答えを書かないもったいぶったレスには、逆切れで対応。
「だからどうすればいいんですか?」「分からないなら引っ込んでろやゴルァ」
示されたURL等を参照するなんて態度は、回答者を甘やかすことに他ならないので
絶対に避ける。
8. 情報は小出しに。
「エスパーきぼんぬ」 補足
上の八ヵ条を「一つでも」満たす者は質問者として不適格だということだ。
そのような悪い質問に対して答えられるのは,
質問者の意図をすべて汲み取ることのできるエスパーでもなければムリ,
という意味であって,決して,高度な技術を持つユーザに対する尊称でなはい。
まちがっても「エスパーの方,回答お願いします」
なんて痛い質問するな。つうか氏ね。
0687名無しさん@お腹いっぱい。
2005/07/21(木) 20:28:59何か勘違いをしてるっぽいので、
詳しく聞きだしてみたい。
■ このスレッドは過去ログ倉庫に格納されています