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

シェルスクリプト総合 その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/
0637名無しさん@お腹いっぱい。2005/07/15(金) 13:30:01
>>636
そもそもdump(8)を避けた理由は何かあるんでしょうか?

dumpなら普通に世代バックアップできるし。
dump先を普通のファイルにしておけば、そこからrestore -iで取り出す
手間もtarと大差ないし。
06386372005/07/15(金) 13:31:54
>>637 dump先を普通のファイルにしておけば
これはちょっと勝手に話の先を読みすぎたかも。
関係なかったら無視して。
0639名無しさん@お腹いっぱい。2005/07/15(金) 13:36:26
>>637
早速のレス有り難う御座います。
dumpを避けた理由は…dumpというコマンドを知りませんでした。
手元の「RedHatLinux コマンドリファレンス」に載っていない様で…(汗

とりあえず一旦
man dump
してみます、有り難う御座いましたー!
0640名無しさん@お腹いっぱい。2005/07/15(金) 13:37:44
×コマンドリファレンス
○ポケットリファレンス
(技術評論社)
0641名無しさん@お腹いっぱい。2005/07/15(金) 13:46:58
>>636
diffじゃなくてcommを使う。

rm -f `comm -23 now_data.txt days_data.txt`

で、一発で消せる。

ただし、now_data.txtとかはsort済みのこと。
0642名無しさん@お腹いっぱい。2005/07/15(金) 14:39:55
>>641
行けました!
有り難う御座います!!

#さすがUNIX板(^^*
0643名無しさん@お腹いっぱい。2005/07/15(金) 19:41:12
comm, join, paste あたりはつい忘れちまう
0644名無しさん@お腹いっぱい。2005/07/15(金) 20:13:07
そしてPerlスクリプトを書き捨てる羽目になる。
0645名無しさん@お腹いっぱい。2005/07/15(金) 23:15:19
>>644
スクリプトは本来書き捨てるためのモノでもあり以下略。
0646名無しさん@お腹いっぱい。2005/07/15(金) 23:21:19
旅のスクリプトは書き捨てだよも以下略。
0647名無しさん@お腹いっぱい。2005/07/16(土) 00:16:10
サムッ
0648名無しさん@お腹いっぱい。2005/07/16(土) 01:13:36
grep はパターンにマッチした行があると0を返すのですが、

hoge="aaa"
if echo $hoge | grep -q "aaa"; then
   echo ATARI
fi

とやると ATARI と表示されます。
[]でくくっても同じ。 評価された結果って
何を見てるんでしょうか?わからなくなってきました。
0649名無しさん@お腹いっぱい。2005/07/16(土) 01:22:34
>>648
当然だろ。
0650名無しさん@お腹いっぱい。2005/07/16(土) 01:23:02
だよねー
0651名無しさん@お腹いっぱい。2005/07/16(土) 04:51:04
grepが返すのは終了コード($?)っしょ?

#!/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
>>648
シェルのifやwhileでは0が真として評価されるんでつよ

って、そういう話じゃなくて?
0653名無しさん@お腹いっぱい。2005/07/16(土) 11:10:13
grep -c
であれば、個数をカウントするから、ヒットしない場合が”0”

って、そういう話じゃなくて?
0654名無しさん@お腹いっぱい。2005/07/16(土) 11:12:13
喜多━━━━━━(゚∀゚)━━━━━━ !!!!
06556482005/07/16(土) 15:28:17
>>651
やっぱそうやらないと駄目なんすね
>>652-653
いや、正にそういう話です。要するに 0が真として評価されるからなんですね。
例えば、正常終了時のリターンコードが0でないようなコマンドの場合、偽と
判断されるのかな、紛らわしいな…
0656名無しさん@お腹いっぱい。2005/07/16(土) 16:42:56
>>643
>>4のこともたまには思い出してあげて下さい。
0657名無しさん@お腹いっぱい。2005/07/16(土) 17:10:16
>>656
フォー!
0658名無しさん@お腹いっぱい。2005/07/16(土) 18:22:10
> 正常終了時のリターンコードが0でないようなコマンドの場合、偽と
> 判断されるのかな、紛らわしいな…

もしかして、アホですか?
0659名無しさん@お腹いっぱい。2005/07/16(土) 18:35:56
>>658
> もしかして、アホですか?

それを言っちゃだめだって。
0660名無しさん@お腹いっぱい。2005/07/16(土) 18:54:08
>>655
紛らわしいも何も、それが仕様なんだから慣れろ

もっと詳細な制御がしたければ、$?に対して
Case文でも使えばいいだけの話だ
0661名無しさん@お腹いっぱい。2005/07/16(土) 22:46:02
紛らわしいのは、正常終了時のリターンコードが0でないようなコマンドだろう
0662名無しさん@お腹いっぱい。2005/07/16(土) 23:05:21
>>661
そんなコマンドないよ。

>>653
が言ってる grep -c も、
文字列が見つからなかった場合、
「標準出力に」0が表示され、
「終了ステータス」は1になるので、無問題だよ。
0663名無しさん@お腹いっぱい。2005/07/17(日) 12:52:34
シェル中でrootになりたいんだが、どうやればいい?
0664名無しさん@お腹いっぱい。2005/07/17(日) 12:59:06
>>663
シェルスクリプト中でも、ふつうに、
su -c 'hoge1; hoge2'
または
sudo hoge
でいいと思うけど。

あるいはsetuidのスクリプトを呼び出すとか。
0665名無しさん@お腹いっぱい。2005/07/17(日) 13:20:22
setuidのスクリプトってどうなの?
0666名無しさん@お腹いっぱい。2005/07/17(日) 13:28:55
>>665
セキュリティホールになるよ。
ググるとFAQか何かがすぐ出てくると思う。
0667名無しさん@お腹いっぱい。2005/07/17(日) 13:39:56
セキュリティホールになるのを知った上で、
問題がない使い方で使うなら桶。
0668名無しさん@お腹いっぱい。2005/07/17(日) 13:43:55
awkは?
0669名無しさん@お腹いっぱい。2005/07/17(日) 13:48:47
awkはexitコマンドで明示的に終了ステータスを返せるじゃん。
grepとは違って、どういう場合が正常終了なのか、
デフォでは定義されていない(常に真)になっているだけ。
0670名無しさん@お腹いっぱい。2005/07/17(日) 15:55:59
>>599
>>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
>>671
質問が不明確。
VAR=bbb
grep "$VAR"
ということじゃないよね?
0674名無しさん@お腹いっぱい。2005/07/17(日) 17:05:40
>>671
こうかな?
cat src | tr -d "\n" | sed -e "s,</font>,\n,g" | sed -e "s,.*<font[^>]*>,,"
0675名無しさん@お腹いっぱい。2005/07/17(日) 20:30:47
echo bbb
0676名無しさん@お腹いっぱい。2005/07/17(日) 20:58:37
>>673
あ、コマンドオプションにも変数使えたんですね。
どうもありがとうございました。
0677名無しさん@お腹いっぱい。2005/07/17(日) 21:24:31
工エエェェ(´д`)ェェエエ工

そんなオチかよ!
0678名無しさん@お腹いっぱい。2005/07/18(月) 01:51:18
コマンドラインオプションに変数使えなかったら、どこで使うんだ
よ。。。
0679名無しさん@お腹いっぱい。2005/07/21(木) 13:35:37
拡張子が.shのファイルをWindowsで実行するにはどうすればいいですか?
例えば.shを.batに書き直すようなツールはありますでしょうか。
ぜひ教えてください。

シェルスクリプトもバッチも知識ゼロです。
Windows板で質問したらUNIX板へ帰れって言われました。
UNIX環境の質問ではないのですが、よろしくお願いします。
0680名無しさん@お腹いっぱい。2005/07/21(木) 13:37:03
Cygwin使っている人いますか? その15
http://pc8.2ch.net/test/read.cgi/unix/1119982766/
0681名無しさん@お腹いっぱい。2005/07/21(木) 14:24:39
run.exe
0682名無しさん@お腹いっぱい。2005/07/21(木) 15:04:55
シェルスクリプトとバッチの知識を身につける
06836792005/07/21(木) 15:56:48
>>680-682
Cygwinインストールしてみました。
Shell Scriptを実行してみたところsyntax errorが出たので、
やはり知識を身につけなければいけないようです。

公式な配布物の中身をいじってないのにErrorが出るのが何でかわかりませんが・・・orz
0684名無しさん@お腹いっぱい。2005/07/21(木) 16:00:26
なにをやろうとしてるの?
0685名無しさん@お腹いっぱい。2005/07/21(木) 17:01:26
改行コードが違ってたり、ってことは配布物いじってないならないか…。
0686名無しさん@お腹いっぱい。2005/07/21(木) 20:20:39
お約束 >>679
「エスパーきぼんぬ」「氏ね」「(゚Д゚)ハァ?」等のレスを貰う八ヶ条。
1. ハードウェア、OSのバージョン等には一字一句触れない。
2. 大切な個人情報が漏れるとまずいので、己の行った操作、変更などは秘密。
3. エラーメッセージの類は決して書かない。「エラーが出るんです」で留める。
  目の前で生じている現象をそのまま具体的に書くなどもっての外。
  事実より俺様の脳内解釈を優先すべし。
4. 独り言文体で必勝。
  「…なんだけど、どうすればいいのかなぁ」「何が悪いんだろう?」
5. 「急いでいます」「困っています」等、自分の都合を全面に押し出す。
6. もう試したことを得意げに指摘してくる奴には、厳しく対応。
  「それが駄目だったから質問してるんです」「それはもう試してみて駄目でした」
  "どう"だめだったのか、本当に実際それを行ったかどうかなんか問題じゃない。
7. ストレートに答えを書かないもったいぶったレスには、逆切れで対応。
  「だからどうすればいいんですか?」「分からないなら引っ込んでろやゴルァ」
  示されたURL等を参照するなんて態度は、回答者を甘やかすことに他ならないので
 絶対に避ける。
8. 情報は小出しに。

「エスパーきぼんぬ」 補足
上の八ヵ条を「一つでも」満たす者は質問者として不適格だということだ。
そのような悪い質問に対して答えられるのは,
質問者の意図をすべて汲み取ることのできるエスパーでもなければムリ,
という意味であって,決して,高度な技術を持つユーザに対する尊称でなはい。
まちがっても「エスパーの方,回答お願いします」
なんて痛い質問するな。つうか氏ね。
0687名無しさん@お腹いっぱい。2005/07/21(木) 20:28:59
windows で sh を実行などというからには
何か勘違いをしてるっぽいので、
詳しく聞きだしてみたい。
0688名無しさん@お腹いっぱい。2005/07/21(木) 20:38:07
>>686
補足は蛇足。コピペ時にはカットよろしこ。
0689名無しさん@お腹いっぱい。2005/07/21(木) 20:59:09
>>686
これ貼るだけでいいよ。
http://myu.daa.jp/osiete/index.html
0690名無しさん@お腹いっぱい。2005/07/21(木) 22:03:52
>>679
ちょとかわいそうなのでマジレス。

シェルの種類は複数あって、拡張子が.shであっても
書式が共通しているとは限らない。
(Cygwin のやつは bash という種類。)

その「公式な配布物」が何なのかを書けば
もう少しまともなレスが得られるかも知れない。
0691名無しさん@お腹いっぱい。2005/07/21(木) 23:01:04
シェルスクリプトファイルの絶対パスをシェルスクリプト自身で
見つけ出すことは出来ますか?

pwdとやってもシェルスクリプトを起動させた時点でのカレント
ディレクトリしか出ないので質問しました。
0692名無しさん@お腹いっぱい。2005/07/21(木) 23:04:28
>>691 $0 とか `dirname $0` とか
06936792005/07/21(木) 23:22:17
>>684-690
お騒がせしてます;
根本的にはCygwinでbashを使うことで"解決"しております。
アドバイスありがとうございました。

SyntaxErrorは行番号が出ているものの、
その行の記述が間違っていないことがわかったので、
自分が悪いと思って出し辛かった、といいますか
人に聞く前に調べようと思って、あの場では書きませんでした。

エスパーの方,回答お願いします。つうか氏ぬ。

#今回はじめて掲示板のお世話になったのですが、実際>>686のように書かれると嫌になるね。質問1つもちゃんとできない自分が。
06946912005/07/21(木) 23:23:16
便利なコマンドがあるんですね。
パスが通っている場合や、カレントディレクトリで実行した場合は
絶対パスが出るみたいですが、下のようにディレクトリを指定して実行した場合は
ディレクトリ名しか出ません。つまり、

shtest/shtest.sh

を実行したときは shtest だけが得られる。得られたパスの初めの文字を判定して
/(スラッシュ)でなければ `pwd`/ を付け加えるというようにすればいいと
思うのですが、どうすれば出来るのですか?たびたびすみません。
0695名無しさん@お腹いっぱい。2005/07/21(木) 23:28:21
>>692
$0 いじって呼ばれたらだめだな。
0696名無しさん@お腹いっぱい。2005/07/21(木) 23:57:18
他にも方法はあるけど正規表現を使わない方向で。

#!/bin/bash
if [ "${0#/}" != "$0" ]; then
 path="$0"
elif [ "${0#./}" != "$0" ]; then
 path=`pwd`"${0#.}"
elif [ "${0#../}" != "$0" ]; then
 path=`dirname "$(pwd)"`"${0#..}"
else
 path=`pwd`/"$0"
fi
echo $path
0697名無しさん@お腹いっぱい。2005/07/22(金) 00:36:21
DIR=`dirname $0`
APATH=`cd $DIR; pwd`/`basename $0`
echo $APATH
とか。
0698名無しさん@お腹いっぱい。2005/07/22(金) 00:40:21
http://www.nurs.or.jp/~asada/FAQ/UNIX/section4.4.html
0699名無しさん@お腹いっぱい。2005/07/22(金) 00:48:20
本当にFAQですよね。
0700名無しさん@お腹いっぱい。2005/07/22(金) 00:52:12
リンクとかされてることもあるしね。
0701名無しさん@お腹いっぱい。2005/07/22(金) 02:02:40
環境によるとは思うんだけど、$0を入れ換えられてる場合をのぞけば、
shellの中で、

realpath $0
か、
readlink -f $0

が、スマートなんじゃないだろうか?

0702名無しさん@お腹いっぱい。2005/07/22(金) 03:25:52
それがある環境に限れるならね。
07036912005/07/22(金) 08:39:45
ありがとうございます。いろいろ試してみようかと思います。
0704名無しさん@お腹いっぱい。2005/07/22(金) 08:50:19
パスを書いておけばおk
0705名無しさん@お腹いっぱい。2005/07/22(金) 15:33:00
awkスクリプトをperlスクリプトに変換する
a2pコマンドが吐き出すシェルスクリプトについてですが、
2行目、
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'

のように、"$@"をわざわざ ${1+"$@"}と書く周到ぶりですが、
その反面、$0 を、"$0"じゃなく裸のまま $0 と書いちゃってます。

今はディレクトリ名にスペースを含むこともあったりするし、
ちゃんと "$0" と記述したものを出力するべきじゃないでしょうか。
逆に、$0で桶なら、${1+"$@"}だけ拘っているのが、
クォリティ的にちぐはぐに思います。

識者の意見求む。
0706名無しさん@お腹いっぱい。2005/07/22(金) 21:31:01
今はディレクトリ名にスペースを含むこともあったりするし、
0707名無しさん@お腹いっぱい。2005/07/22(金) 21:36:07
藤岡弘、
0708名無しさん@お腹いっぱい。2005/07/22(金) 21:44:56
確かに「今は」の意味が分からんな
0709名無しさん@お腹いっぱい。2005/07/22(金) 22:21:07
Sambaで共有して、エクスプローラーでフォルダーを作ったりもするから、
"/usr/local/Program Files" の下にシェルスクリプトがあったり
するんじゃないの?
0710名無しさん@お腹いっぱい。2005/07/22(金) 22:41:00
Sambaなんて10年前からあるじゃん
0711名無しさん@お腹いっぱい。2005/07/22(金) 22:42:03
>>707
http://www.wwwwwwwwww.net/1/soko/VIP00991.JPG
0712名無しさん@お腹いっぱい。2005/07/22(金) 22:44:46
10年前は今じゃないの?
0713名無しさん@お腹いっぱい。2005/07/22(金) 22:50:12
10年前と今の区別がつかない老人がいるスレはここですか?
0714名無しさん@お腹いっぱい。2005/07/22(金) 22:53:05
>>705
a2pのバグと思われ。(s2pもそうかな)
所詮perlのおまけソフトなので、
それがperlクオリティー。
0715名無しさん@お腹いっぱい。2005/07/23(土) 02:08:25
${1+"$@"}の意味がわかりません (><)
0716名無しさん@お腹いっぱい。2005/07/23(土) 07:42:24
>715 >293-
0717sasasa2005/07/23(土) 12:17:12
別のスクリプトをlsという名前に変えた際に正しいlsが表示されるようにするにはどうすればいいのでしょう?
0718名無しさん@お腹いっぱい。2005/07/23(土) 12:18:39
command ls
0719名無しさん@お腹いっぱい。2005/07/23(土) 12:30:13
>>717
その、新しいスクリプトのlsが存在するディレクトリに
先にPATHを通す。

PATH=/home/hoge/bin:$PATH; export PATH

とか。
(csh系は糞なので敢えて説明はしないがrehash等が必要)

>>718 はアフォなので無視。
# commandコマンドの動作を勘違いしてるようだし、
# command自体、Bourneシェルでは使えない

あ、「正しいls」というのが、「元の標準のls」という意味なら、
/bin/ls と、フルパスで実行する。
0720名無しさん@お腹いっぱい。2005/07/23(土) 12:36:58
>>719
(゚Д゚)ハァ?
0721名無しさん@お腹いっぱい。2005/07/23(土) 12:38:58
>>719
(゚Д゚)ハァ?
0722名無しさん@お腹いっぱい。2005/07/23(土) 12:59:06
>>718
lsがシェル関数だとcommand lsで回避できますが、
スクリプトだとだめでした。

>>719
ありがとうございます。
やっぱり絶対PATHしかないんですね。
0723sasasa2005/07/23(土) 13:16:11
あとプロファイルにおいて
"
'
`
の意味って何を意味しているんですか?
0724名無しさん@お腹いっぱい。2005/07/23(土) 13:20:29
>>723
'"` はクォートという。
質問が基本的過ぎるので、
man shして、クォートの欄を読むか、
シェルスクリプトの参考書のクォートの欄を読め。
ここでの質問はもっと具体的なものでよろしこ。
0725名無しさん@お腹いっぱい。2005/07/23(土) 13:30:51
>>723
たとえば、
rm -rf /
は危険なコマンドとして有名だが、
' 'を使って、 'rm -rf /' とすると、
スペースを含めて「rm -rf /」という名前のコマンドとみなされるので、
実行しても、

# 'rm -rf /'
rm -rf /: No such file or directory

と、エラーになるので全く安全。

では練習問題。' 'を ` ` に変えて

# `rm -rf /`

をやってみよう。
0726名無しさん@お腹いっぱい。2005/07/23(土) 13:37:28
>>725
これはひどい練習問題だ。
0727名無しさん@お腹いっぱい。2005/07/23(土) 13:39:38
しかもプロンプトが#でいやらしいぜ
0728名無しさん@お腹いっぱい。2005/07/23(土) 14:03:50
>>725
全く安全というか、意味ねーし
0729名無しさん@お腹いっぱい。2005/07/23(土) 14:04:34
>>728
(゜Д゜)ハァ?
0730名無しさん@お腹いっぱい。2005/07/23(土) 14:37:16
>>725
お前、意地悪だな
0731名無しさん@お腹いっぱい。2005/07/23(土) 14:47:26
>>723
課題の内容をここで聞いてるのか・・・・。
ちなみにきっと俺とお前は同じ大学だろう。
0732名無しさん@お腹いっぱい。2005/07/23(土) 14:54:24
>>717
http://pc8.2ch.net/test/read.cgi/unix/1119703835/573
0733名無しさん@お腹いっぱい。2005/07/23(土) 15:43:56
>>725
ぷげら
0734名無しさん@お腹いっぱい。2005/07/25(月) 00:07:31
質問させてください。

特定のディレクトリを次々にバックアップするために、
コピー元 => コピー先
のペアをリスト化してループ処理させたいのですが、
どのように記述すればよいのでしょうか。
0735名無しさん@お腹いっぱい。2005/07/25(月) 00:09:40
なにしたいのかいまいちわからんが
find でがんばる、とか?
0736名無しさん@お腹いっぱい。2005/07/25(月) 00:16:59
>>734
なんだいな?backuplistファイルの内容が
source1 dest1
source2 dest2
...
とかなってたら、
cat backuplist | while read source dest
do
cp $source $dest
done
とかでいいじゃん。cpの代わりにtarなりcpioなり、cp -aなり、好きにして。
■ このスレッドは過去ログ倉庫に格納されています