トップページ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/
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なり、好きにして。
0737名無しさん@お腹いっぱい。2005/07/25(月) 00:17:07
>>735
えーと、

list={
. { /hoge/hoge1 => /fugo/fugoA }
. { /hoge/hoge2 => /fugo/fugoB }
. { /hoge/hoge3 => /fugo/fugoC }
}

foreach ( pair in list )
. コピー等の処理 pair[0] , pair[1]

みたいなことをしたいんです。


0738名無しさん@お腹いっぱい。2005/07/25(月) 00:18:04
>>736
まさにそれです^^
ありがとうございました。
0739名無しさん@お腹いっぱい。2005/07/25(月) 00:50:55
joinとpasteの違いってなんですか?
0740名無しさん@お腹いっぱい。2005/07/25(月) 01:00:25
man join
man paste
0741名無しさん@お腹いっぱい。2005/07/25(月) 10:19:39
>>725
そんな餌に釣られるクマー!


linuxが起動しなくなったんですけど(><)
0742名無しさん@お腹いっぱい。2005/07/25(月) 21:08:56
>>741
エラーが出るよ。
0743名無しさん@お腹いっぱい。2005/07/26(火) 01:00:43
すみません、質問があります。
mvコマンドで、一度に移動できるファイル数には上限があるのでしょうか?
最大で99999個のファイルを移動できるのか調査しているのですが・・・・

catコマンドが一度に1000件づつしか処理できないようなのですが。
ご存知の方がおりましたらどうぞよろしくお願いします。
0744名無しさん@お腹いっぱい。2005/07/26(火) 01:22:27
mv自身はintの上限-2個まで移動できると思う
0745名無しさん@お腹いっぱい。2005/07/26(火) 01:41:35
>>743
そんな調査するより xargs を使うべきじゃないの。
07467432005/07/26(火) 02:21:40
>>744 そうですか、それなら可能ですかね。。。?アドバイスありがとうございます。

>>743 xargsですか。ちょっと知らないコマンドですが、調べてみますね。レス感謝です。
0747名無しさん@お腹いっぱい。2005/07/26(火) 02:21:47
>>743
find /usr/include -name '*.h'|xargs grep ARG_MAX
0748名無しさん@お腹いっぱい。2005/07/26(火) 02:40:21
getconf ARG_MAX
0749名無しさん@お腹いっぱい。2005/07/26(火) 02:46:40
>>743
こういったことの周りの知識を知らないのも問題だが、
知識不足なのにいたずらに限界に挑戦しようとする方も問題。
知識不足なら知識不足なりに秘孔をついてしまわぬよう安全策をとるのが一つの見識。
0750名無しさん@お腹いっぱい。2005/07/26(火) 07:55:30
>>745
確かに xargs -n で引数を分割して実行できるが、
xargsはスペースや改行等を含んだファイル名を
正しく扱えないという、仕様上のバグがあるので、
xargs自体obsolete or deprecated。

xargs -0 (xargs --null)が使えるのはGNU xargsだけなので、
一般には使えないと考えるべき。
0751名無しさん@お腹いっぱい。2005/07/26(火) 09:42:40
逆に、ファイル名に問題あるのが確実にない状況なら十分使える。
でなきゃ GNU の入れりゃいいじゃん。
0752名無しさん@お腹いっぱい。2005/07/26(火) 09:44:18
>>750
だけではない。
0753名無しさん@お腹いっぱい。2005/07/26(火) 09:47:48
>>752
何が?
0754名無しさん@お腹いっぱい。2005/07/26(火) 09:59:11
(xargs -0 (xargs --null)が使えるのはGNU xargs)だけではない。
0755名無しさん@お腹いっぱい。2005/07/26(火) 11:01:49
>>751
「ファイル名に問題ないことが確実」な状況って、
自分の作業用ディレクトリ下で、
書き捨てスクリプトを書く場合くらいしかないぞ。
ユーザー開放のディレクトリ以下を一括処理したい場合、
どういうファイルネームが存在するかの仮定をしちゃいけないし、
GNU物を勝手に入れるのも禁止だから、
結局xargsなんて使えん、のが結論。
0756名無しさん@お腹いっぱい。2005/07/26(火) 11:03:45
>>755
勝手に入れちゃだめならしかるべき手続きを踏めばいいじゃない。
0757名無しさん@お腹いっぱい。2005/07/26(火) 11:11:25
ユーザー開放のディレクトリ以下を一括処理したい、と仮定されました。
0758名無しさん@お腹いっぱい。2005/07/26(火) 12:30:03
まあWindowsユーザは空白含みとか日本語ファイル名は普通に平気で付けるしな
特にSambaサーバにしてるならそういうファイル名は全然珍しくないわな
0759名無しさん@お腹いっぱい。2005/07/26(火) 16:14:40
自分も windows では日本語空白記号なんでも使うな。
0760名無しさん@お腹いっぱい。2005/07/26(火) 16:24:47
そこで、zargs ですよ。
0761名無しさん@お腹いっぱい。2005/07/26(火) 17:55:03
>>750

Solaris 9 だと空白は大丈夫だし、改行も \ でエスケープすれば問題なしですが。

$ /bin/echo 'a b\nc\\\nd' | xargs -L 1 -I '{}' /bin/echo "'{}'"
{a b}
{c
d}
0762名無しさん@お腹いっぱい。2005/07/26(火) 17:56:12
>>761
いまどきSolaris使っている馬鹿ってpupupu−−−
0763名無しさん@お腹いっぱい。2005/07/26(火) 18:23:08
>>762
「Soralis」と書けばよかったのに
0764名無しさん@お腹いっぱい。2005/07/28(木) 08:09:48
>>761

xargsの-L 1オプション使ったら、
1行ごとにコマンド(echo)が実行されてしまうから、
元質問の、「まとめて処理」ができないだろ。

それに、「改行を \ でエスケープ」と言っても、
そう都合良く findで出力できないだろ。

さらに、ファイル名に普通の文字として、
" や ' や \ などが含まれていると
やっぱり駄目だろ。

よって、xargsは使えん。
0765名無しさん@お腹いっぱい。2005/07/28(木) 08:23:23
改行文字がファイル名に含まれてるケースって、そんなにあるか?
基本的にそれは考慮せんでもいいと思うんだが
0766名無しさん@お腹いっぱい。2005/07/28(木) 09:24:00
ファイル名にはヌル文字も使えなかったっけ?
だとしたら xargs -0 も完全な解決策にはならないが。
0767名無しさん@お腹いっぱい。2005/07/28(木) 10:05:15
>>766
ファイル名にnull文字は使えねーよ。
だからxargs -0が最もマトモな解決法なのだが、
Solarisとかで使えないから問題になってるんだよ。
0768名無しさん@お腹いっぱい。2005/07/28(木) 10:10:17
>>765
改行は滅多にないとしても、
ファイル名に ' " \ などが含まれているのは
よくある。
「Don't Cry.mp3」とかね。

xargsが ' " \ を特殊文字扱いするのが問題になる。
0769名無しさん@お腹いっぱい。2005/07/28(木) 11:46:07
>>768
xargsが単純に改行をセパレータとして扱うような
プログラムだったなら、はるかにマシだっただろうね
0770名無しさん@お腹いっぱい。2005/07/28(木) 14:45:33
大学のマシンに xargs が なぜか /usr/local/X11/bin にあったのを思い出した
0771名無しさん@お腹いっぱい。2005/07/28(木) 14:50:42
>770
あっ、そんな記憶ある。
NEWS-OS 4 (3かな?) じゃないかな。
■ このスレッドは過去ログ倉庫に格納されています