[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 08/05 09:21 / Filesize : 196 KB / Number-of Response : 858
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

シェルスクリプト総合 その10



1 名前:名無しさん@お腹いっぱい。 [2008/02/11(月) 19:21:07 ]
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。

前スレ
シェルスクリプト総合 その9
pc11.2ch.net/test/read.cgi/unix/1187130302/

541 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 14:58:03 ]
>>538
> psだけの問題じゃない
これはmysqlが言っていること、

www.google.com/codesearch?q=%2Fdev%2Fkmem&hl=en&btnG=Search+Code
これらが安全だと示してくれればオレは取り下げる。もしくは「環境変数は安全」という仕様でもよい。

542 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 15:02:51 ]
>>541
> オレは取り下げる
というのは「オレが(も)主張する」が前提だよな。当然その立証が先。

543 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 15:05:17 ]
途中で送ってしまった。

>>541
> オレは取り下げる
というのは「オレが(も)主張する」が前提だよな。当然その立証が先。
それができなきゃ取り下げざるを得ないのであって、安全だと示してくれれば
などと条件をつけられる立場ではない。

544 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 18:32:47 ]
>>543
話そらすなよ。
名無しのお前が環境変数は安全だと主張している。
mysqlの公式ドキュメントは安全だと考えていない。

権威の無いお前が安全だと立証しろ。

545 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 23:15:20 ]
>>540
rootが信用できないマシンに重要な情報を置くな。
(環境変数以前の問題でしょ?)

546 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 01:32:52 ]
>>539
かなり昔前からkmemグループによる管理だぞ。
もう20年近く立っているはず。

最近/procがいい加減なことが多いが。

547 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 06:59:36 ]
>>546
psがkmemグループ(setgid)で動作していたのっていつの時代? それも10年前かw

548 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 08:12:22 ]
>>544
自分で証明できないものだから権威とやらに頼るとは、まさしくこれだな

>>538
> まさか引用した箇所にそう書いてあるからそうなんだとか言わんよな。

話をそらしているというか露骨に逃げてるのは君の方だ。
この議論において根拠を提示できないなら意味がない。
恥を知っているというのは口先だけだったな。

549 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 11:12:51 ]
>>548
多くの人がレビューした文書と、名無しのお前の主張じゃぶっちぎりでお前のほうが信憑性が低い。
お前が立証しろ。当たり前だ。



550 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 13:16:10 ]
議論というのは発言者が誰であれ根拠に基づいて行うのが当たり前。
勝負あったな。

551 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 13:33:58 ]
つか本人が言ってたよね。

> 自称セキュリティ研究者の厨房が騒ぎ立てるまでは、環境変数が読めるのが仕様だった。

それが脆弱性としてアドバイザリまで出されてるってことは
今(10年前ではないw)は他人の環境変数は読めないのが仕様ってことでしょ。
違うというなら仕様として他人の環境変数読めるものを出してみろと。

552 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 13:36:36 ]
psに限らず、が抜けてた。

553 名前:名無しさん@お腹いっぱい。 [2008/04/02(水) 15:17:59 ]
質問があります。

shまたは、bashで、makeのように、
2つのファイルを比較して、新しいファイルが生成されている
時だけ処理をしたいのですが、shellへの理解が足りない
ためにうまく動かないので、教えてもらえると助かります。

こんな感じです。

do_iconv(){
echo "mv ${i} ${i}.old"
echo "iconv -f euc-jp -t utf-8 < ${i}.old > ${i}"
}

for i in *.html
if [ -e ${i}.old ]
then
if [[ ${i} -nt ${i}.old ]]
then
do_iconv
fi
else
do_iconv
fi
done

554 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 15:31:28 ]
>>553
> echo "iconv -f euc-jp -t utf-8 < ${i}.old > ${i}"
した時点で、${i}の方が常に${i}.oldより新しくなるじゃないか。

本当は何がしたいんだ?

555 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 15:53:19 ]
>>554
それより前に if [[ ${i} -nt ${i}.old ]] で比較してるだろ。
わからないなら黙ってろ。

556 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 15:54:56 ]
>>553
for i in *.html
の次の行に
do
が抜けてる。

557 名前:553 mailto:sage [2008/04/02(水) 15:55:02 ]
>> 554
本当は、上記に書いてますがシェルスクリプトでmake
みたいなことがしたいです。

ちなみに、
>> echo "iconv -f euc-jp -t utf-8 < ${i}.old > ${i}"
>した時点で、${i}の方が常に${i}.oldより新しくなるじゃないか。
で、ハッとして touch ${i}.old をiconvの後にしてみましたが
変わりません。

$ ls -la --time=ctime *.html
-rw-r--r-- 1 foo bar 5388 2008-04-02 14:23 SandBox.html
-rw-r--r-- 1 foo bar 4323 2008-04-02 14:06 Travel.html

$ ls -la --time=ctime *.old
-rw-r--r-- 1 foo bar 5374 2008-04-02 14:06 SandBox.html.old
-rw-r--r-- 1 foo bar 3334 2008-04-02 14:06 Travel.html.old

のようなときに、SandBox.htmlだけ iconv 処理をしたいのです。


558 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 15:56:54 ]
>>553

とりあえずforにはdoつけろな。


559 名前:553 [2008/04/02(水) 15:58:24 ]
>> 556
御指摘ども、本当のスクリプトには入れてます。

いまは要点だけ抜き出すと、下記のような感じにしています。

do_iconv(){
echo "mv ${i} ${i}.old"
echo "iconv -f euc-jp -t utf-8 < ${i}.old > ${i}"
echo "touch ${i}.old"
}

for i in *.html
do
if [ -e ${i}.old ]
then
if [[ ${i} -nt ${i}.old ]]
then
do_iconv
fi
else
do_iconv
fi
done




560 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:01:10 ]
>>557
おい、--time=ctime かよ。mtimeじゃなくて。

シェルの[[ ]] の -nt では、ctimeでの比較はできない。
mtimeのみ。
本当にctimeでやりたいんなら無理。

561 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:06:09 ]
えっと、次は、
> うまく動かない
の中身プリーズ。


562 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:06:49 ]
>>561
>>560

563 名前:553 mailto:sage [2008/04/02(水) 16:22:10 ]
>> 561

うまくいかないの、ココロは、意図は、SandBox.htmlだけ iconv したい
のですが、プログラムは SandBox.html および Travel.html の
両方を iconv しようとします。

>> 560

ctimeはダメですか。リダイレクトでファイルを作るから、ctimeでないと
ファイルの作成時刻を比較できないと思ってました。がーん、他の方法
を考えなくては


564 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:24:32 ]
makeを使えばいいんじゃないか?

565 名前:553 mailto:sage [2008/04/02(水) 16:27:05 ]
>> 564
はい。makeを使うことを考えます。
ありがとうございました>みなさん

566 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:31:00 ]
>>564-565
アフォか。
makeだって mtimeで比較するよ。
ctimeでの比較が必須なら make使ったって問題は解決しない。

(ctimeの意味を誤解していて、実はmtimeでもOKなら話は別だが)


567 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:37:06 ]
>>563
>リダイレクトでファイルを作るから、ctimeでないと
>ファイルの作成時刻を比較できない

は誤解してるようだね。

だとすると mtimeで比較して問題ないことになる。
とすると、>>559 のスクリプトでうまく動いているはず。
うまく動いているのに、>>557 で --time=ctime で見ているもんだから、
うまく動いていないと思い込んでいるだけ、というオチ。


568 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:39:24 ]
汚いシェル関数だなぁ。echo消せ。引数使え。

569 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:50:19 ]
[ ] と [[ ]] が同居するスクリプトを初めて見た。どっちかに統一しろよ。
[ ] の方推奨だが。
testの -nt は純正シェルでは使えない。
${i} なんて書くくらいなら "$i" って書け。
{ } 付けただけじゃスペース入りファイル名とかの問題回避できないぞ。



570 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 17:28:49 ]
純正シェル(笑)

571 名前:553 [2008/04/02(水) 17:52:14 ]
>> 567
誤解してました。
>> 568
shell関数まで添削してもらえるとは恐縮です。
>> 569
ありがとう。[[ ]]ではなく[ ] を使います。

あと、"$i"の記法はshellの本を注意深く読んだらちゃんと書いてありました。
下記のように直して、実行したら意図どおりに動いてます。m(_"_)m
==========================================
#/bin/bash -x
do_iconv(){
mv $1 "$1".old
/usr/bin/iconv -f euc-jp -t utf-8 < "$1".old > $1
touch "$1".old
}
for i in *.html
do
if [ -e "$i".old ]
then
if [ "$i" -nt "$i".old ]
then
do_iconv "$i"
fi
else
do_iconv "$i"
fi
done
======================================


572 名前:553 mailto:sage [2008/04/02(水) 17:52:54 ]
bash -x の実行例
+ for i in '*.html'
+ '[' -e SandBox.html.old ']'
+ '[' SandBox.html -nt SandBox.html.old ']'
+ do_iconv SandBox.html
+ mv SandBox.html SandBox.html.old
+ /usr/bin/iconv -f euc-jp -t utf-8
+ touch SandBox.html.old
+ for i in '*.html'
+ '[' -e Travel.html.old ']'
+ '[' Travel.html -nt Travel.html.old ']'
+ for i in '*.html'


573 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 19:12:56 ]
>>554の言うように、
"$i".oldの方を編集しない限り、
必ず"$i"の方が新しいのに、(iconvの結果)
> if [ "$i" -nt "$i".old ]
してる。逆に"$i".oldを編集したら何も行われない。

仕様を日本語で書いたらどうか?

たぶん.iconvedを作って、
"$i"と時間比較して新しいものだけiconv、
最後に必ずtouch .iconved、
これでやりたいことに合うんじゃないか?


574 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 19:43:56 ]
>>573
その問題は、

>>557
>touch ${i}.old をiconvの後にしてみましたが

で解決済。

というか、>>571 で、「実行したら意図どおりに動いてます。」
ですべて解決済なんだから、これ以上言うことはない。


575 名前:名無しさん@お腹いっぱい。 [2008/04/02(水) 20:00:06 ]
カレントディレクトリが
/abc/def/ghi/jkl/mno/pqr/stu/
とフルパスであったときに一番最後の部分(stu)を取り出したいのですが
どのように書けばよいのですか


576 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 20:18:40 ]
basename /abc/def/ghi/jkl/mno/pqr/stu/

577 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 20:19:16 ]
basename `pwd`

578 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 21:33:15 ]
>>551
はいはい、それがお前が出した唯一の根拠ね。
で、それが何かの標準になってるのか?

ところで、>>516ので試みた捏造に関しての弁明はどうした?

579 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 21:49:00 ]
まだやってんのかw



580 名前:sage [2008/04/05(土) 16:40:16 ]
リナックス等の研究やってます。
www.ine.sie.dendai.ac.jp/homepage/
www.ine.sie.dendai.ac.jp/wiki/index.php?FrontPage

581 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 07:37:45 ]
シェルスクリプトから以下のようなテキストを呼びだして、
環境変数を展開した上で、位置変数に set したいのですが、
お知恵を拝借したく、どうかよろしくお願いします。

$ cat test.txt
$HOME/doc/

いまは、シェルスクリプト内部で、 sed -e 's/\$HOME/$HOME/g' のようにしています。


582 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 07:40:42 ]
>>581
eval set `cat < test.txt`

583 名前:581 mailto:sage [2008/04/10(木) 08:20:51 ]
>>582
どうもありがとうございます!

eval を使ってもう一度、$HOMEを変数展開をするのですね。
独力では全く思いつきませんでした。
本当にありがとうございました。


584 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 08:25:30 ]
>>582
catが無駄です。

585 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 08:28:30 ]
>>584
catなしでどう書くの?

586 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 08:29:07 ]
eval set `< test.txt`

587 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 09:30:12 ]
はいはい。bash依存。

588 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 08:28:49 ]
質問です!
timeコマンドの結果をファイルに出力したいのですが、
どうやっても0バイトで出力されます。

以下、やってみたことを記載します。
$ time sleep 1
real 0m1.004s
user 0m0.000s
sys 0m0.001s
$ time sleep 1 > hoge.dat
real 0m1.439s
user 0m0.000s
sys 0m0.001s
$ cat hoge.dat
$ time sleep 1 > hoge.dat 2>&1
real 0m1.009s
user 0m0.000s
sys 0m0.001s
$ cat hoge.dat

やってみたこと以上です。

なぜ出力されないのでしょうか?どのようにすれば出力されますでしょうか?


589 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 08:32:44 ]
>>588
bash使ってるだろ。
timeはbashの特殊な内部コマンドで、リダイレクトできない。
解決するには一旦サブシェルを通す。

$ (time sleep 1) 2> hoge.dat



590 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 11:19:02 ]
>>588
/usr/bin/timeならファイルに出力できるよ。

591 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 11:37:22 ]
>>590
>>589

/usr/bin/time は表示書式が違う

592 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 14:39:52 ]
\time


593 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 14:40:30 ]
bashってtimeが内部コマンドなのかw


594 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 14:44:15 ]
正確には shell keyword

595 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 14:50:22 ]
あれ?
マニュアルではtimeじゃなくて、timesになっているけど?

596 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 14:51:30 ]
>>595
ぉぃぉぃ、timesとtimeは全く別のコマンド

597 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 14:58:21 ]
times Print the accumulated user and system times for the shell and
for processes run from the shell. The return status is 0.

ごめん。マニュアル読んだだけでは何が違うのか分からん。
それに、timeの項目自体が見つからんし。


598 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 15:05:56 ]
bash なら help time

599 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 15:06:37 ]
man bash なら Pipelines の節。



600 名前:名無しさん@お腹いっぱい。 [2008/04/12(土) 00:11:45 ]
しぇるすぷりくとでHTML書いて
ボタン押したらhoge.shを実行したい

ヒントください><;

601 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 01:02:36 ]
>>600
実行環境を限定しなさい。
OSは? httpサーバは? 使用可能なCGIは? CGI実行時のセキュリティ要件は?

602 名前:名無しさん@お腹いっぱい。 [2008/04/12(土) 01:29:51 ]
OS: FreeBSD 6.3-RELEASE-p1
http: Apache HTTP Server 2.2.8
CGI: This is perl, v5.8.8 built for i386-freebsd-64int
セキュリティ要件: 無し

603 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 01:40:48 ]
>>600
すみません、日本語でお願いします。

604 名前:名無しさん@お腹いっぱい。 [2008/04/12(土) 02:00:52 ]
日本語で書いたつもりなのに文字化けしてるんですか?><

605 名前:>>588 mailto:sage [2008/04/12(土) 06:09:32 ]
>>589
ありがとうございます。


606 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 06:21:07 ]
これシェルスクリプトの話か・・・?

607 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 07:16:24 ]
>>601
答えられないくせに実行環境だけ聞くなよ。
実行環境あまり関係ないだろ。

608 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 07:24:57 ]
>>600
エスパーすると、Webのフォーム入力でシェルスクリプトを入力して
[送信]ボタンを押すと、そのシェルスクリプトが実行されて、
実行結果がWeb上に表示される、って感じのものを作りたいのかな?

609 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 09:21:01 ]
エスパーじゃなくてもシェルスクリプトでCGIプログラム作りたいという事はわかる、>>601が無能なだけ。
>使用可能なCGIは?
この質問に至っては噴飯ものだ。 CGI/1.1と答えればいいのだろうか?

>>600
CGIというサーバー上でプログラムを動かす仕組みがあるから、検索してわからない事があったらまた来なさい。



610 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 09:52:37 ]
>>609
「シェルスクリプトでCGIプログラム作りたい」のじゃなくて、(さすがにそれは知ってるだろ)
ユーザーがWeb上で入力したシェルスクリプトを実行してくれるような
CGIを作りたいんじゃないのか?

611 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 10:26:00 ]
まぁまぁ、ここは有能な>>609に任せておいたらどうだ

612 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 10:38:47 ]
>>610
>>600からそこまで読み取れるなんて想像力がたくましいな。
でも俺に聞かれても困る。元質問者に聞いてくれ(そして、板違いだからwebprog行け)
それとも「CGIを作る? CGI/1.2とかいう新しい規約でも作りたいのか?」と突っ込んで欲しいのか?

>>611 == >>601だな。無能という事実を突きつけられて悔しかったのか?
> 使用可能なCGIは?
この質問で意図した事を答えてみろ。

613 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 10:43:06 ]
hoge.sh は実在します。例示には example.com 等を使いましょう。

614 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 10:51:55 ]
>>612
> >>611 == >>601だな。
違うよ。

615 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 11:11:59 ]
>>602 読むと、CGI自体はperlで作るらしいから、
>>610 の解釈が正しそうだな

616 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 11:53:43 ]
saryのように高速でかつgrep並みの正規表現検索ができるユーティリティってありませんかね?
libstreeとか使って誰か作ってそうな気がするんですが、ぜんぜん見つかりません

617 名前:名無しさん@お腹いっぱい。 [2008/04/12(土) 21:54:43 ]
hoge.sh はドメインじゃなくて スクリプト名では・・・

618 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 22:01:28 ]
ネタにマジレス

619 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 23:54:44 ]
実際にwhoisしてみると、空いているらしい。>hoge.sh




620 名前:600 mailto:sage [2008/04/13(日) 00:33:33 ]
>>602
|しぇるすぷりくとでHTML書いて
$create.sh > /usr/local/www/html.html

$cat create.sh
#!/bin/sh
echo \<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\>
echo \<HTML LANG=ja\>
echo \<HEAD\>
echo \<meta http-equiv=\"content-style-type\" content=\"text/css\"\>
echo \<META HTTP-EQUIV=Content-Type CONTENT=\"text/html\; charset=EUC-JP\"\>
echo \<META name=\"generator\" content=\"shell script\"\>
echo \<LINK REV=made HREF=\"mailto:yourmailaddress@your.mail.domain.com\"\>
echo \<LINK REL=contents HREF=\"./index.htm\"\>
echo \<LINK REL=stylesheet HREF=\"./default.css\" TYPE=\"text/css\" TITLE=\"./default.css\" MEDIA=\"screen,tv\"\>
echo \<TITLE\>sample\</TITLE\>
echo \</HEAD\>
echo \<BODY\>
echo \<FORM ACTION=\"/cgi-bin/hoge.cgi\" METHOD=\"POST\" ENCTYPE=\"text/plain\" LANG=\"ja\"\>
echo \<div\>\<INPUT TYPE=\"submit\" TABINDEX=\"0\" ACCESSKEY=\"S\"\>\</div\>
echo \</FORM\>
echo \</BODY\>
echo \</HTML\>

|ボタン押したらhoge.shを実行したい
セキュリティ要件:なしなら、perlスクリプト内に以下のように書けば...
$list[0] = "hoge.sh"
system "/bin/sh", @list;


621 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 07:32:30 ]
>>620
お前 >>600 じゃなくて >>601 だろ。
echoが無駄です。echoは1個だけでできます。
perlのsystemでも、一旦listに入れるのが無駄です。
あと、そもそも >>600 の質問意図とは違うと思います。

622 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 10:30:33 ]
echo1つで済むつーか、catとヒアドキュメントの出番じゃね?


623 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 10:37:58 ]
ヒアドキュメントはテンポラ作るから嫌い。echo 1つがスマート。

624 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 11:44:04 ]
テンポラリ作るとまずいことでもあるんですか?

625 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 11:51:04 ]
>>623
どこにできるんだ?

626 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 12:16:26 ]
>>624
意味もなくHDDに書き込むのが無駄。

>>625
教えて欲しければ「教えてください」と家。
普通は /tmpにできる。シェル側からすぐに unlinkされるから
lsでは見えないけど。トレースすればわかる。

627 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 12:57:52 ]
>626
実装による?

Linuxのzshとbashで
strace cat <<HOGE
hoge
HOGE
としてみたけど別にテンポラリファイル作ってなかった。
fd3番以降を開いてるのは共有ライブラリのリンク時くらい。
"hoge¥n"のreadは0から。
dupとかなかったから、ファイル開いてリダイレクト処理をしたわけでもないな。


628 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 13:18:32 ]
>>627
トレースが下手だな

catをstraceしてもしょうがないだろ。
bashやzshをstraceすること。
catに渡される時にはすでにunlinkされてるから、
catをstraceしても見つからないはず。

629 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 13:35:53 ]
(bashの場合)

$ strace -f bash -c 'cat << EOF
hoge
EOF
'

(中略)
:
[pid 11486] open("/tmp/sh-thd-1208089889", O_RDONLY|O_LARGEFILE) = 4
[pid 11486] unlink("/tmp/sh-thd-1208089889") = 0

テンポラリファイル作ってるね。


(zshの場合)
$ strace -f zsh -c 'cat << EOF
hoge
EOF
'

(中略)
:
open("/tmp/zsh6MaAd3", O_RDONLY|O_NOCTTY|O_LARGEFILE) = 3
unlink("/tmp/zsh6MaAd3") = 0

テンポラリファイル作ってるね。



630 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 13:36:32 ]
$ strace -o bash.log bash
bash-3.1$ cat <<HOGE
> hoge
> HOGE
hoge
bash-3.1$ exit
$ egrep '(creat|unlink)' bash.log
(なにもなし)

だめか。どうやって確認すればいいか、正しいやり方を教えてけろ。


631 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 13:37:09 ]
あああ、-fか。理解。



632 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 16:38:06 ]
/tmpの日付見ればいいんじゃないの?

633 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 16:59:54 ]
catだとすぐ終了しちゃうから、tail -fを使うと良い。

$ tail -f << EOF
hoge
EOF

ってやっておいて、別のxtermから、

$ lsof | grep tail

ってやると、(deleted)って表示されてる /tmp以下の一時ファイルがあるのがわかる。

634 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 17:23:23 ]
>>632
それだけだと、無関係のプロセスが/tmpをいじくった可能性が残る。


635 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 17:33:54 ]
忙しくないマシンで何回かやれば可能性は実用上0になるだろ

636 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 17:36:00 ]
それで満足ならいいんじゃね?


637 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 17:59:36 ]
>>633 がもっといい方法示してるじゃないか。

638 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 19:53:17 ]
>>626
礼儀知らずで申し分けありませんでした。テンポラリファイルを作るというこ
とは、シングルユーザーモードなどで、リードオンリーファイルシステムだと
here doc を使ったシェルスクリプトは動かないということでしょうか?


639 名前:名無しさん@お腹いっぱい。 [2008/04/13(日) 20:15:12 ]
エディタの置き換えでも出来る事なのですが良ければ教えてください

わるs
わるk
わるi
わりこn
わりこm
わりあt
じょうち
じょうちょう
じょうなん
のように語尾にアルファベットが付いているのと付いてないのがあるんですけど
アルファベットを削除する方法とかってSEDではどのようにするのでしょうか?




640 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 20:20:09 ]
>>639
sed 's/[a-z]$//'

641 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 20:56:04 ]
>>586-587
bash依存じゃないだろ。kshでも使えるから、標準で使っていいんじゃないの?

642 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/14(月) 02:04:22 ]
>>641
読まずにりぷらい、まあ、もちつけ共通拡張かも知れないだろ。
POSIXに規定されているか読みなおすんだ。

643 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/14(月) 13:18:12 ]
配列の値の設定ってバックスラッシュか何かで
複数行にまたがって書くことはできないのでしょうか?

644 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/14(月) 13:36:12 ]
>>643
できる。シングルクォートを使うのがいい。

$ hoge=('aaa
aaa
aaa'
'bbb
bbb
bbb')
$ echo "${hoge[0]}"
aaa
aaa
aaa
$ echo "${hoge[1]}"
bbb
bbb
bbb


645 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/14(月) 14:56:04 ]
>>644
どうもありがとうです

646 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/14(月) 15:00:53 ]
はいはい、バッシュ依存。

647 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/14(月) 21:22:58 ]
kshでも使えるからデファクトだろ?

648 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 13:24:12 ]
Solaris8上でBourne Shellを用いてスクリプトを書いています。
dateコマンドを整形する際にシングルクォートで括りますが、
$ echo `date '+%H%M`
などとしても通ってしまうのは何故なんでしょうか?

649 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 13:54:55 ]
>>648
Solarisのバグです。シングルクォートはちゃんと閉じましょう。



650 名前:名無しさん@お腹いっぱい。 [2008/04/15(火) 20:40:12 ]
シェルを始めたのですが、変数でいきなり詰まりました ><
$i = 123;
=: command not found
もしかしてシェルでは = は外部コマンドなんでしょうか?

651 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 20:47:30 ]
何シェルかくらいかこうぜ・・・

i=123

652 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 20:49:37 ]
>>651
今度はこうなります
i = 123
i: command not found

653 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 20:57:39 ]
>>651のをコピペしな

あと、何シェルかくらいかこうぜ・・・

654 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 21:03:03 ]
>>653
この場合何シェルか関係あるか??

655 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 21:24:30 ]
関係有るから指摘している。
が、cshだったら他所へ行ってくれ。

656 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 21:26:27 ]
cshだったらエラーメッセージが違うじゃん。回答者はそれくらい見抜かないと。

657 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 21:27:17 ]
>□お約束
>・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
> bash/zsh/ksh/ashなどに依存する場合は明示しましょう。


658 名前:650 mailto:sage [2008/04/15(火) 21:30:24 ]
#!/bin/shです。
i = 123;
ってやっても、やっぱり
i: command not found
と出ます><

659 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 21:31:33 ]
650はネタなのかマジなのか。



660 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 21:50:24 ]
シェルでは = は比較を表す (例: [ $i = 123 ] )
代入は := で。

661 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 21:50:27 ]
i = 123でなくてi=123です。スペースを入れてはいけません。

662 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 22:08:02 ]
ネタはほっとけ。

663 名前:名無しさん@お腹いっぱい。 [2008/04/16(水) 08:48:00 ]
質問させて下さい。

あるディレクトリ以下の、特定の拡張子(.tig)をもつファイルの(find ./ -name "*.tig")
名前を変えて( hoge.tig -> hoge_org.tig)
その二つの名前を与えたコマンドを実行したいです。( hoge -t hogu hoge_org.tig hoge.tig)

for org_name in `find ./ -name "*.jpg"`
do
$name = $org_name + "_org";
echo $org_name; echo $name;
done

と言うのを考えてみたのですが、エラーでうまく行きません。
あと、拡張子の前に名前を追加したいのですが、実現方法が分かりません。

もしよろしければ、教えて頂けると助かります。
よろしくお願いします。


664 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/16(水) 08:53:43 ]
>>663
とりあえず、
$name = $org_name + "_org";
の部分のみに回答。
まず、perlみたいな書き方の癖はやめろ。

name=`basename $org_name .jpg`_org.jpg


あと、質問が、最初は .tigと言ってるのに下のfor文は .jpgで、矛盾してるぞ。

665 名前:663 mailto:sage [2008/04/16(水) 08:58:21 ]
ありがとうございます。
それがわかれば、なんとかできそうです。

.jpgなのは、ローカルな環境でテストをしたため違うファイルを使っていました。



666 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/16(水) 13:41:14 ]
findでやってるから'/'含みのpathnameになる。
しかしbasenameは最後のコンポーネントだけ切り出してしまう。

name=`echo $org_name | sed 's/.jpg$/_org.jpg/'`

の方が良いと思われ。あるいは、

dir=`dirname "$org_name"`
org=`basename "$org_name"`
new=`basename "$org_name" .jpg`_.org.jpg
orgpath="$dir/$org"
newpath="$dir/$new"

667 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/16(水) 18:41:06 ]
phpのsystem関数から
シェルコマンドを実行を試してます。

lftp -f hoge.conf
rm hoge.conf
したいのですが、
lftp -f hoge.conf がかなり時間がかかるため、
lftp -f hoge.conf > /dev/null & してから
rm hoge.conf を実行したいと思います。

system("lftp -f hoge.conf > /dev/null & rm 000 hoge.conf");
とすると
lftpが正常に実行されません。
おそらくrmがlftp完了前に実行されているからと思いますが、
どのように記述すれば良いでしょうか?

どなたかご教授くださいませ。


668 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/16(水) 18:56:25 ]
>>667
system("lftp -f hoge.conf > /dev/null ; rm hoge.conf");
じゃだめなの?

669 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/16(水) 19:08:25 ]
OSコマンドインジェクションを入れ込まないように気をつけろよ



670 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/16(水) 19:08:44 ]
& を何だと思ってるんだ

671 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/16(水) 19:26:22 ]
system("(lftp -f hoge.conf > /dev/null ; rm hoge.conf) &");
こうかな

672 名前:667 mailto:sage [2008/04/16(水) 19:36:29 ]
>>668
これだと rm hoge.conf が lftp 完了前に実行されたようです

>>671
"("なんてしらねーよ、みたいなエラーが出てしまいました。

673 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/16(水) 19:49:57 ]
>>672
system("sh -c 'lftp -f hoge.conf > /dev/null ; rm hoge.conf' &");

674 名前:667 mailto:sage [2008/04/16(水) 20:08:22 ]
>>673
神サンクスです!!それでいけました!

675 名前:667 mailto:sage [2008/04/16(水) 20:35:38 ]
すいません、
いけたと思ったら、lftpが終わるまでブラウザで読み込みが続いてしまいます。

www.stackasterisk.jp/tech/php/php02_02.jsp
----------------------------------------------
> /dev/null」 が「リダイレクト」に相当する記述です。
/dev/null というのは、「ゴミ箱」と思って頂いて構いません。
すべての出力を捨てます。
最後の & は、バックグラウンドで実行するという意味です。
このあたりの詳しいことは UNIX のシェルの本をみれば載っています。
「PHPはそのプログラムの実行が終了するまでハングします」というのは、
つまり IE の地球マークが廻りつづける状態をいいます。
----------------------------------------------
というのを参照しています。

676 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/17(木) 02:33:27 ]
ぐぐって得た付け焼き刃の知識をこねくるんではなく
一度基礎から勉強した方がよろしいかと。

677 名前:名無しさん@お腹いっぱい。 [2008/04/17(木) 08:36:16 ]
>>675
結局jpgなんだねw


678 名前:名無しさん@お腹いっぱい。 [2008/04/17(木) 12:33:53 ]
シェルスクリプトで関数計算とかできるの?

A= 2√3/0.0000456789*π+$hoge
echo $A

小数点以下なげーとか・・・・


679 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/17(木) 12:47:28 ]
>>678
$ hoge=123
$ echo "2*sqrt(3)/0.0000456789*(a(1)*4)+$hoge" | bc -l
238368.58352774053454525488

注: πは (a(1)*4) で表す。(atan(1) = π/4 を利用)



680 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/17(木) 12:53:56 ]
そういう場合はbcとか関数計算を行うプログラムに実行させる。

POSIXシェルならば整数の四則演算が行えるので、この上に(関数演算を含む)
浮動小数点演算を実装すればシェル単独でも可能。

681 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/17(木) 13:00:42 ]
>>679 少し分かりやすく
hoge=123
pi="(a(1)*4)"
echo "2*sqrt(3)/0.0000456789*$pi+$hoge" | bc -l

682 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/17(木) 13:14:45 ]
実例 >>679 が投稿された「あと」で、
実例示せずに能書きだけ書いてる >>680 ってマヌケだよなぁ。

683 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/17(木) 14:29:32 ]
「やりかた」を書くだけで間抜けなのか

684 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/17(木) 14:33:27 ]
具体的な「やりかた」を書いているのは >>679 の方。
>>680 は具体的な「やりかた」を何ひとつ書いていない、だから間抜け。

685 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/17(木) 14:34:14 ]
そんなことより、批判だけするやつのほうが・・

686 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/17(木) 15:55:30 ]
シエルで、フォントサイズを変えるのはどうやるんですか

A$ = "エラーが発生しました"
echo A$

のところで、「エラー」の文字だけ大きくしたいんですが

687 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/17(木) 16:00:27 ]
banner Error; echo 'が発生しました'

688 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/17(木) 16:46:29 ]
仮想端末のエスケープシーケンスにフォントサイズ変更があれば
「エラー」の前後にそのエスケープシーケンスを書けばいい。
色やブリンクの有無といった変更も同様。


689 名前:名無しさん@お腹いっぱい。 [2008/04/17(木) 19:13:26 ]
スクリプトの神様

今日もありがとうございました
勉強になりました!!!




690 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/17(木) 19:54:36 ]
banner面白いなw

691 名前:名無しさん@お腹いっぱい。 [2008/04/17(木) 22:12:31 ]
>>679 >>680 >>681 神よ! d(゚Д゚)☆スペシャルサンクス☆( ゚Д゚)b

さて、Excelを窓からブン投げるかw

692 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/18(金) 01:03:30 ]
このスレは定期的に神が現れるな。的確で即レス、何者なんだろ

693 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/18(金) 01:38:31 ]
>>686
少し目的からずれる気がするが、以前どっかのスレに
投下したスクリプトをちょっと改造したもの。

#! /usr/bin/env bash
# vivid_error.sh -- 標準エラー出力に色を付ける
# Original:
# ttp://d.hatena.ne.jp/goth_wrist_cut/20080122/1201003827

name='vivid_error.sh'
(( $# > 0 )) || {
echo "error: $name: No argument." 1>&2
exit 1
}

temp=$( mktemp "$TEMP/$name.$PID" )
rm -f "$temp"
mkfifo "$temp"

sed 's/.*/1m\0m/' < "$temp" 1>&2 &
"$@" 2> "$temp"
status=$?

rm -f "$temp"
exit "$status"

694 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/18(金) 02:37:38 ]
ESC=$(printf '\033')
とかするのおすすめ

695 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/18(金) 08:19:53 ]
terminfoなsystemじゃないとtputはないかも。

BOLD=`tput bold`
EXIT=`tput sgr0`
printf "${BOLD}This ${EXIT}is a ${BOLD}test${EXIT}.\n"

カラーも可能。
文字列加工はsed等で。


696 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/18(金) 13:32:39 ]
fifoなんていらないよね。

#!/bin/sh
# 標準エラー出力に色をつけてコマンドを実行
if [ $# -eq 0 ]
then
    echo "Usage: $(basename $0) command args..." 1>&2
    exit 1
fi

exec 3>&1
ESC=$(printf '\033')
"$@" 2>&1 1>&3 | sed "s/.*/$ESC[1;31m\0$ESC[0m/" 1>&2

697 名前:名無しさん@お腹いっぱい。 [2008/04/20(日) 18:50:18 ]
初歩的な質問ですが
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
の様に変更したいのですが・・・
sed -i "s/^LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" combined/LogFormat \"%h %l %u %t \\\"%!414r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" combined/g" /root/test
で良い様に思うのですが・・・
"%h \"の様な所でエラーが出て変換ができません よろしくです

698 名前:名無しさん@お腹いっぱい。 [2008/04/20(日) 18:51:56 ]
初歩的な質問ですが
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
の様に変更したいのですが・・・
sed -i "s/^LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" combined/LogFormat \"%h %l %u %t \\\"%!414r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" combined/g" /root/test
で良い様に思うのですが・・・
"%h \"の様な所でエラーが出て変換ができません よろしくです

699 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/20(日) 18:53:14 ]
なんとなくワロタ



700 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/20(日) 19:48:07 ]
>>698
まず、sedプログラム本体は " " じゃなくて ' 'で囲むこと。
" " だといろいろエスケープが面倒。

701 名前:名無しさん@お腹いっぱい。 [2008/04/20(日) 21:47:22 ]
>>700
ありがとうございました 修正できました

702 名前:名無しさん@お腹いっぱい。 [2008/04/20(日) 22:34:02 ]
シェルスクリプトでPerlとかRubyのchopと同等なことって、
どうすればいいですか?
bash限定でもかまいません。

703 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/20(日) 22:42:41 ]
>>702
シェルでは、何も考えなくても readとかで読み込んだら自動的に chopされてる。

704 名前:名無しさん@お腹いっぱい。 [2008/04/20(日) 23:31:00 ]
>>703 さっきは、
「echo -nで改行が取れないなあ、あれ?」って状態で質問したのですが、
readでも取れませんでした。で、ようやく\r\n改行だったことに気づきました。
bashの%*\r*で解決しました。

705 名前:名無しさん@お腹いっぱい。 [2008/04/21(月) 00:26:14 ]
質問させてください

テキストファイル内に

建造物 (けんぞうぶつ)
構築物 (こうちくぶつ)
構造体 (こうぞうたい)

()でくくられた文字のみを取り出したいのですが可能でしょうか?

706 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 00:36:23 ]
>705
いくらでも方法はある。
sed、awk、perl あたりなら一行野郎でいける。

awk -F '\\(|\\)' 'length($2)>0{print $2}'


707 名前:名無しさん@お腹いっぱい。 [2008/04/21(月) 00:44:02 ]
>>706
レスありがとうございます!
ちなみにsedだと、どういう風になりますか?


708 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 02:15:09 ]
>>706
建造物 (けんぞうぶつ) 構築物 (こうちくぶつ) 構造体 (こうぞうたい)
こういうテキストのこともないかな。





709 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 02:19:44 ]
$ echo '建造物 (けんぞうぶつ) 構築物 (こうちくぶつ) 構造体 (こうぞうたい)' | sed 's/[^(]*(\([^)]*\))/\1/g'
けんぞうぶつこうちくぶつこうぞうたい




710 名前:名無しさん@お腹いっぱい。 [2008/04/21(月) 18:20:49 ]
多分、作りこまないと駄目だと思うんですが、駄目元で質問します。
`find .`の結果を各ディレクトリ毎に、
第1のソートキー:ディレクトリorファイルの別(ディレクトリが先)
第2のソートキー:更新時間の降順
でソートしたものが欲しいです。
ファイルブラウザとかだと、そういう表示が出来るので、
もしかすると、簡単におこなう方法があるのかな?と密かに期待してます。
宜しくお願いします。

711 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 18:56:59 ]
普通に考えたら出来る

712 名前:名無しさん@お腹いっぱい。 [2008/04/21(月) 19:01:20 ]
>>711
結果をファイルに出力してもいいのであれば、
find -type dでループを回していけばやれるのはわかっているのですが、
作業ファイルを介さずにそのままwhile readで受け取れるくらい
簡単な方法がないかな?と思って質問させて頂きました。

713 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 19:12:16 ]
多分スクリプト言語使った方がいいと思う

714 名前:名無しさん@お腹いっぱい。 [2008/04/21(月) 19:19:38 ]
>>713
ちょっとごめんなさい
ディレクトリは名前順でもいいです。
当初>>710で書いたよりはずっと簡単に実現できます。

715 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 19:19:44 ]
>>711
そういうことはお前の考えた結果を貼ってから家。

716 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 19:26:48 ]
>>714
「ディレクトリが先」という条件さえなければ、
単に ls -latR で行ける。findすらいらない。

>>712
結果をファイルに出力する方法でやる方法がわかってるなら、
それをファイルに出力しない方式に書き換えることは多分できる。

717 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 19:31:02 ]
>>710
GNU ls使えば、
ls -latR --group-directories-first
で一発。


718 名前:名無しさん@お腹いっぱい。 [2008/04/21(月) 20:23:19 ]
みなさんどうもありがとうございました。
結局(とりあえず)、
find -d でループを回して作業ファイルを作る方法にしました。
ディレクトリは名前順でファイルは更新時間降順にしました。
ちなみにGNU ls 5.21で--group-directories-firstはサポートされてませんでした。

719 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 21:04:47 ]
find ... -print0|xargs -0 ...
と区切りをわざわざ^@にするのが推奨されてるのって何故なんですか?



720 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 21:13:18 ]
他の文字はファイル名に使われてるかもしれないから。

721 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 21:55:46 ]
-print0|xargs-0を使うのは石器人。
現代人なら-exec utility_name [argument ...] {} +

722 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 21:57:15 ]
いまさら-execはちょっと…という気分
気分だけね

723 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 22:08:08 ]
>>722
お前、行末の「+」の意味知ってて発言してるのか?

724 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 22:15:16 ]
>>718
GNUコマンド群くらい最新にしとけよ。6.xなら使える。

725 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 02:59:08 ]
>>724
バージョンアップできない(許可されない)環境って結構多いぞ。
(*nix系ならローカルに実行環境つくれば済む話だが)

726 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 07:04:01 ]
>>725
もしそういう環境なら、GNU lsを入れること自体許可されないだろ。
(古いバージョンとは言え)GNU lsが入っているということは、
OS標準じゃないコマンドを自分でインストールしてもいい環境と考えられる。

727 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 10:39:16 ]
システム構築時にGNU系を入れて構築、運用開始した後、
バージョンアップの費用(現システムの稼働確認費用)が認められないため、そのままってパターンが多い。

そういうトコだと、ローカルに新版lsをコピーしてくる方が(手続き的に)楽だったり。

728 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 12:30:34 ]
>>710
タイムスタンプが、
2008-04-22 12:30
こういう形式で、
$6, $7にあると仮定すれば、
ls -l | sort -k 6,7 | sort -sr
でいい。-sはstable sort。

729 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 13:27:05 ]
>>728
それだと symbolic link が先頭に来てしまうので失格。



730 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 13:30:00 ]
>>728
というか、せっかく sort -k 6,7 したあとで sort -sr したら
最初の sort -k 6,7 が無意味になってしまうし、全然ダメじゃん。

731 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 19:43:49 ]
つ sort -srk 1,1

732 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 19:58:42 ]
>>731
>>729
失格。

733 名前:名無しさん@お腹いっぱい。 [2008/04/23(水) 15:40:13 ]
Apache の mod_ext_filter モジュールを利用したスクリプトを作成しています。

Apache --標準出力--> script --標準出力 --> Apache を行うスクリプトにて、
Apache からの標準出力を $temp_file に書き出して主な処理をした後に
cat $temp_file を行い Apache に返しているのですが、

#!/bin/sh

temp_file=`mktemp`
while read line
do
echo "$line" >> $temp_file
done

ファイル操作

cat $temp_file
rm -f $temp_file


上記コードだと、HTML ソースに \ $ ` などが入っていた際に、
echo "$line" >> $temp_file で意図せぬ動作が起きてしまいます。

またファイルに書き出す事で処理速度の低下も考えられるので、
Apache からの標準出力(複数行)を変数に格納する方法はないかと思ったのですが、

どなたかご教授ください。

734 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/23(水) 20:08:40 ]
>>733
それはシェルのreadの仕様だから仕方ない。
そもそも while readで読む必要ないだろ。

while do ... done の部分全部を、
cat > $temp_file
に置き換えればよろし。

735 名前:733 mailto:sage [2008/04/23(水) 20:31:31 ]
>>374
おぉ、色々と勘違いしていたみたいですね。
ご指摘の方法でやってみたところちゃんとできました。
すみません、ほんと有難うございます。


736 名前:733 mailto:sage [2008/04/24(木) 00:18:33 ]
733です。
度々すみません。

#!/bin/sh

temp_file=`mktemp`
cat > $temp_file

ファイル操作

cat $temp_file
rm -f $temp_file

確かにご教授いただいた上記コードで可能なのですが、
Apache からの標準出力をファイルに書き出さず、変数として処理する事は出来ないのでしょうか?

737 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 00:55:16 ]
そんなに速度が気になるなら他の言語でやったほうがいい

738 名前:733 mailto:sage [2008/04/24(木) 01:45:55 ]
>>737
ありがとうございます。
色々試行錯誤してみます。

739 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 06:52:22 ]
>>736
その「ファイル操作」の内容が、

sed 's/hoge/boke/' < $temp_file

だとすると、そもそもcatは2つとも要らない。

#!/bin/sh
sed 's/hoge/boke/'

↑の2行だけでOK。
sedは、何も指定しないと標準入力から読んで標準出力に出すから。



740 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 06:56:05 ]
>>736
一旦変数に入れたいなら、

tmp=`cat`

とする。これで変数tmpに入る。
参照する時は、

echo "$tmp"
とする。シェルに特殊文字を解釈されないように" "を付けるのを忘れないように。

741 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 19:36:45 ]
>>739
返信ありがとうございます。
標準入力の内容によって条件わけがしたかったので、ご指摘の方法は断念しました。

>>740
返信ありがとうございます。おかげさまで出来ました。
一つ疑問が残るのですが、ダブルクォート (") は $ ` \ 以外を普通の文字として扱うと認識していますが。

# echo "`date`"
Thu Apr 24 17:55:30 JST 2008

# cat sample.html
<html>
<body>
`date`
</body>
</html>

# cat filter.sh
#!/bin/sh
temp=`cat`
echo "$temp"

# cat sample.html | sh filter.sh
<html>
<body>
`date`
</body>
</html>

なぜ echo "$temp" では ` が普通の文字として扱われているのでしょうか?
お恥ずかしい質問で済みません。

742 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 19:38:59 ]
変数、サブシェルなどの展開は一度だけ。
再度展開したい時はeval。

743 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 20:15:21 ]
>>742
eval をさっそく調べ、勉強になりました。
ありがとうございます。


744 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 00:26:56 ]
質問させてください。
シェルスクリプトで16進数を2進数に変換するにはどうしたらいいでしょうか?


745 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 00:49:57 ]
どうしてもシェルスクリプトというならこんな感じか。
最適なのはbc。sedだけでもできる。

h2b() {
for h in `echo $1 | sed 's/\(.\)/ \1/g'`; do
case $h in
0) echo -n 0000;;
1) echo -n 0001;;
2) echo -n 0010;;
3) echo -n 0011;;
4) echo -n 0100;;
5) echo -n 0101;;
6) echo -n 0110;;
7) echo -n 0111;;
8) echo -n 1000;;
9) echo -n 1001;;
a|A) echo -n 1010;;
b|B) echo -n 1011;;
c|C) echo -n 1100;;
d|D) echo -n 1101;;
e|E) echo -n 1110;;
f|F) echo -n 1111;;
esac
done
echo
}


746 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 00:54:10 ]
>>755
あ、どうしてもってわけじゃないです。
コマンドとかありますか?何度もすいません。

747 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 01:17:50 ]
bcで16進数を2進数に変換。
できそうでよくわからない・・・orz

748 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 01:18:21 ]
bcならこんな感じかな、便利だね知らなかったよ。
echo "obase=2; ibase=16; $1" | bc

749 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 01:32:27 ]
>>748
ありがとう。しかしながら
例えば 0xffffff00 これを10進数に変換したいと思い

echo "obase=10; ibase=16; 0xffffff00" | bc

とやってみましたがsyntax errorがでました・・・orz



750 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 01:40:21 ]
頭に0xは付けずに,それから大文字で書かないといけないっぽい.

751 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 02:03:41 ]
>>750
なるほど。ありがとうございました。

752 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 06:48:02 ]
>>749
bcなんか使わなくても printfで一発だろww

$ printf '%d\n' 0xffffff00
4294967040


753 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 08:48:45 ]
んっと、釣られとくけど、

志村ー

754 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 13:18:18 ]
>>753
なにが釣りなのかわからないゆとりな俺にkwskたのむ

シェルスクリプトのtmtowtdiな感じって好きだ

755 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 13:28:34 ]
printf(3)は二進がないからなあ。
printf(1)の%bは違う意味だし。

756 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 13:35:12 ]
>>775
欲嫁。
>>749 は 16進→10進の質問。
>>752 はそれに最適解を答えている。

757 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 22:01:10 ]
昨日質問した者です。ちょっと間違ってました。ごめんなさい。

正しくは ffffff00 これを 255.255.255.0 に変換したい。です。
これってできるのでしょうか?

758 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 22:09:13 ]
簡単だね
>>757
$ hex=ffffff00
$ printf '%d.%d.%d.%d\n' `echo $hex | sed 's/../0x& /g'`
255.255.255.0

759 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 22:57:09 ]
>>758
すごいなぁ。ありがとう。



760 名前:名無しさん@お腹いっぱい。 [2008/04/26(土) 12:50:24 ]
>>758 これは(・∀・)イイ!! もれももらた

761 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/26(土) 16:59:52 ]
よく読まずに余計な突っ込みした >>753 は今ごろ赤面ww

762 名前:名無しさん@お腹いっぱい。 [2008/04/28(月) 17:23:56 ]
>>761

kannke-nexekedo
お前のレスうざい

763 名前:名無しさん@お腹いっぱい。 [2008/04/29(火) 09:04:12 ]
シェルで、拡張子の付いていないファイルを一発でワイルドカード指定するには
どうすればいいですか?

あるいは、何かのオプション変更とかで、
* で、hogeとかだけにマッチして、
hoge.hog にはマッチしないようにして、
*.* とやった時だけ hoge.hogにマッチするようにしたいんです。

764 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 09:43:06 ]
一部シェル限定ならできる
一発でなくていいならできるようにはできる

765 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 11:18:22 ]
>>764
kwsk

766 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:33:12 ]
>>764 は、具体的な「やりかた」を書かない(書けない)知ったかの
>>680 と同一人物、に1俵。

767 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:39:25 ]
>>765
シェルは何だ?
ワイルドカード使うシチュエーションは?カレントディレクトリだけなのか?
ファイルの表示ができればいいだけなのか?各ファイルに何かするのか?

>>766
あいにく違うな
1俵よこせ


768 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:43:35 ]
>>767
じゃなくて、逆にその「できるシェル」を教えて欲しい。
シチュエーション関係なしに、すべての場合において
* が hoge.hogにはマッチしないようにしたい。

769 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:46:16 ]
EXTENDED_GLOBつきのzshで*~*.*かな。



770 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:55:22 ]
* 1個の動作を変えられるようなシェルはないかと思う

同じくzshで
setopt EXTENDED_GLOB
ls -d [^.]#


771 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:57:46 ]
command.com

772 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 13:01:56 ]
少なくとも >>766 だけうざいな

773 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 13:50:40 ]
シェルを秘密にしたいのだからエスパースレに行くべきだな。
全ての場合を見通して答えてくれるエスパー様(>>766)に任せよう。

774 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 13:58:03 ]
できるシェルを教えてくれっていう質問だから、
シェルを秘密にしてるのとは違うかと

775 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 20:45:09 ]
よく読まずに余計な突っ込みした >>773 は今ごろ赤面ww

776 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 21:08:40 ]
>>775
お前のレスうざい


777 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 21:32:45 ]
OSを秘密にしているのだから、エスパー様の出番だな。
余計な突っ込みした、知恵足らずの>>775は今ごろ赤面ww

778 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 21:41:31 ]
シェルはOSには依存しないな。
余計な突っ込みした、知恵足らずの>>777 は今ごろ赤面ww

779 名前:名無しさん@お腹いっぱい。 [2008/04/29(火) 21:43:02 ]
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。



780 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 21:54:17 ]
まあよくある願望とごっちゃにしたな

781 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:04:17 ]
たとえば最近の例を引き合いに出すが、
>>757 の質問(OS不明)に >>758 が的確に回答してる。
どこにもOSに依存してるところはないな。

>>757 に対して「OSが秘密じゃ答えられない」なんていってる奴は
無知をさらけ出してる奴。OSがわかったところで答えられないだろう。

782 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:06:52 ]
全然関係ない事例を持ち出して
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
を誤魔化そうとする>>778憐れ。

783 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:08:34 ]
本件事例の
>>769 の回答は、OSには依存しないな。

784 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:17:34 ]
糞みたいな雑談でスレを延ばすなよ
コードで語れ

785 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:22:29 ]
G Em7 Am7 Am7/D D7 G

786 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:23:36 ]
>>769は誤回答。お題は「* で、hogeとかだけにマッチして、hoge.hog にはマッチしない」

787 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:25:33 ]
OSに依存しない誤回答ですね。

788 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:45:17 ]
誤解答を例示して
> シェルはOSには依存しないな。
を誤魔化そうと必死の>>778憐れ。

789 名前:名無しさん@お腹いっぱい。 [2008/05/02(金) 11:38:05 ]
$ls
test1.jpg  test10.jpg test2.jpg
test3.jpg  test4.jpg  test5.jpg
test6.jpg  test7.jpg  test8.jpg
test9.jpg

と1桁の数字からなる連番ファイルがあるときに

$ls
test0001.jpg  test0002.jpg  test0003.jpg
test0004.jpg  test0005.jpg  test0006.jpg
test0007.jpg  test0008.jpg  test0009.jpg
test0010.jpg

というように4桁の連番ファイルにリネームしたいのですが、
ご教授お願いします。



790 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:40:37 ]
>>789
mv
sed
printf
for

これだけ調べればできる

791 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:41:07 ]
書き忘れた、

test10.jpg
これ 1桁の数字じゃないよな

792 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:43:03 ]
>>789
環境依存かつ汎用性ナシだけど、
おれならこうやっちゃう。
$ for i in {1..9}; do mv test$i.jpg test000$i.jpg; done
$ mv test10.jpg test0010.jpg

793 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:49:01 ]
>>789

#!/bin/sh

for file in *.jpg
do
num=`expr $file : '[^0-9]*\([0-9]*\)'`
base=`expr $file : '\([^0-9]*\)'`
num=`printf %04d $num`
echo mv $file $base$num.jpg
done


794 名前:789 mailto:sage [2008/05/02(金) 11:52:46 ]
>>791
最初1桁の例だけ書いてたんで、
2桁も混じっているということを書き忘れました。

>>792
$ for i in {1..9}; do mv test$i.jpg test000$i.jpg; done
$ for i in {10..99}; do mv test$i.jpg test00$i.jpg; done

ってかんじですかね。ありがとうございます。

795 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:52:51 ]
>>790
具体例を示さない奴は黙ってろ。あと、sedよりexprの方がいいな。

796 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:53:29 ]
>>794
>>793

797 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:55:18 ]
3桁のときは、0を一つ、2桁の時は、0を2つ
一桁のときは、0を3つってつけてけばいいねん
sedだけでできる

798 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:56:45 ]
>>797
そんなことをしなくても >>793 で一発。

799 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:57:56 ]
でしたね^^
解決したようで



800 名前:793 mailto:sage [2008/05/02(金) 12:09:21 ]
sedだけでやるならこうかな

#!/bin/sh

for file in *.jpg
do
new=`echo $file | sed 's/[0-9]/0000&/; s/[0-9]*\([0-9][0-9][0-9][0-9]\)/\1/'`
mv $file $new
done


801 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 12:11:08 ]
ごちゃごちゃしてるなぁ

802 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 12:13:48 ]
そう思うならprintfの方がすっきりする

803 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 12:16:28 ]
カレントディレクトリ配下で自分が所有者のファイルを探してすべて消したいのですが、
どのように書けばいいですか?

804 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 12:17:35 ]
find . -user `whoami` -exec rm -f {} \;

805 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 12:18:06 ]
ありがとうございます
試してみます

806 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 20:11:05 ]
>>795
> >>790
> 具体例を示さない奴は黙ってろ。あと、sedよりexprの方がいいな。
お前が真っ先に黙れ。

807 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 12:08:46 ]
若干スレ違いですが、
シェルスクリプラーなみなさんが詳しそうなので質問させてください。

unix,linuxで、
カーネルの脆弱性なんかでrootに権限昇格の可能性があるのって
特定コマンドを利用不可にしていたら難しい、
なんてことあるでしょうか?

また、特定コマンドを利用した回数、利用したユーザ、
とか調べる方法ってないでしょうか?

808 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 13:02:50 ]
つ BSD acct & lastcomm

809 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 13:55:52 ]
>>807-809
具体例を出さない書き込みは禁止。



810 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 15:43:33 ]
若干どころじゃなくスレ違い。

811 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 15:47:30 ]
「シェルスクリプロ」って何ですか?

812 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 15:57:16 ]
シェルスクリプる

813 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 08:56:10 ]
a 5 9 2
b 7 3 6
c 5 3 2
d 8 3 7
e 4 4 4

のようなテキストファイルから

a 5 9 2 16
b 7 3 6 16
c 5 3 2 10
d 8 3 7 18
e 4 4 4 12

のように行の値の合計を右端に出力したいのですがどうしたらできますか?
awk '{print $1,$2,$3,$4,$1+$2+$3}'
のようにではなく、列の値の数が3でなくても対応できるようにしたいです。

814 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 09:01:46 ]
>>813
簡単だね。

#!/bin/sh

while read line
do
set $line
shift
sum=0
for i in "$@"
do
sum=`expr $sum + $i`
done
echo "$line $sum"
done < file


815 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 09:20:27 ]
適当にがんばってみたらできたました。
ありがとうございました。
awk '{sum=0;for(i=1;i<=NF;i++)sum+=$i; print $"$i",sum}' test.txt

816 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 09:38:50 ]
>>815
ちゃんと「シェルで」答えてくれた >>814 に礼もなしで
自己解決かよ。

しかも、awkでやるならスレ違い。awkスクリプトはシェルスクリプトにあらず。

817 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 09:41:33 ]
おいおい、 >>815 の awkだと間違ってるぞ。
1列目の文字がたまたま数値的に 0 と評価されたら
結果的に正しく動いてるように見えるけど、
1列目に数値と解釈される文字があったらアウト。
このスレ的には >>814 が正解。

818 名前:名無しさん@お腹いっぱい。 [2008/05/06(火) 20:45:33 ]
unix初心者ですが、シェルについて教えてください。
if文で、if〜then〜else〜endif を使用しています。
if文の判定は、ファイル有無の判定です。
判定対象のファイルを正規表現で記述すると、elseまで辿り着きますが、
メタキャラ"?"で判定すると、elseまで辿り着かず、

「照合パターンに合いません」

と出力され終了してしまいます。
シェルの構文は下記の通りです。


#!/bin/csh
if ( -f /tmp/a?a.log ) then
echo "ファイルが見付かりました"
else
echo "ファイルが見付かりませんでした"
endif

メタキャラを使用して、ファイル判定をする方法を教えて頂けませんでしょうか。

宜しくお願い致します。


819 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 20:50:12 ]
>>818
cshでスクリプトを作ってはいけません。
どうしてもcshが良いなら独学でどうぞ。



820 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 21:05:42 ]
>>818
#!/bin/sh

if [ -f /tmp/a?a.log ]; then
echo 'ファイルが見付かりました'
else
echo 'ファイルが見付かりませんでした'
fi


821 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 21:15:22 ]
#!/bin/sh

[ -f /tmp/a?a.log ] && {
echo 'ファイルが見付かりました'
} || {
echo 'ファイルが見付かりませんでした'
}

822 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 21:19:42 ]
#!/bin/sh

s=; [ -f /tmp/a?a.log ] || s='せんで'; echo 'ファイルが見付かりま'"$s"'した'

823 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 21:27:57 ]
s=;(</tmp/a?a.log)2>/dev/null||s='せんで';echo 'ファイルが見付かりま'"$s"'した'

824 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 22:16:35 ]
ゴルファーがいるw

825 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 22:21:36 ]
すんません、検索したけど見つからなかったので教えてください。
bash + awk, bc, perl あたりで、小数部が3桁の計算をして、
その結果を変数に格納してます。その後、その変数の値を
絶対値にして返してくれるコマンドはありませんか?
上記のbash, awk, bc, perl あたりでできれば一番良いのですが。
よろしくお願いしまつ。

826 名前:名無しさん@お腹いっぱい。 [2008/05/06(火) 22:44:52 ]
> 820、821

ありがとうございました。
Bシェルで作成します。


作成したのですが、複数ファイルがマッチした場合、

ファイル名: binary operator expected

が表示され、マッチしたにも関わらず、elseが適用されます…。

ご存知でしたら、複数マッチしても、真となるような方法を教えて頂けませんでしょうか。

827 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 22:58:20 ]
>>825
マイナス符号を取ったらいいだけだろ

$ var1=-123.456
$ expr $var : '-*\(.*\)'
123.456
$ var2=123.456
$ expr $var : '-*\(.*\)'
123.456


828 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 23:01:42 ]
>>826

#!/bin/sh

if ls /tmp/a?a.log 2>/dev/null; then
echo 'ファイルが見付かりました'
else
echo 'ファイルが見付かりませんでした'
fi


829 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 23:14:46 ]
>>825

$ var=-123.456
$ echo ${var#-}
123.456
$ var=123.456
$ echo ${var#-}
123.456



830 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 23:22:26 ]
bash依存乙。

831 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 23:29:02 ]
だからksh由来だと何度(ry

まあテンプレにもあるようにsh以外ならそう明記すべきだな。

832 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 11:40:42 ]
カレントディレクトリ配下のファイルにsedをかけたいのですが、
どのようにしたらできますか?

833 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 11:50:19 ]
>>832
要エスパー質問だなw

for file in *
do
sed 's/hoge/hage' "$file" > "$file".new
done

てことをやりたいのか?

834 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 11:54:09 ]
>>832
OSやシェルの種類/バージョンは秘密ですか?
それを秘密にしたままでは誰も答えられないでしょう。
このレス以外、レスは0件でしょう。

835 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 11:58:42 ]
OSはわかりません。(アウトソーシングでunameが使えないため)
ShellはBashです。
$ bash --version
GNU bash, version 3.1.17(1)-release

>>833
それだと、カレントディレクトリのファイルしか置き換えできません。
カレントディレクトリ配下をすべて置き換えたいです。
また、置き換えしたいので、.newファイルを作成したいのではないです。
(名前を変更すればいいだけですが。)

836 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 12:02:49 ]
>>835
find . -type f -exec sed -i 's/hoge/hage' {} \;

837 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 12:06:32 ]
>>834
OS関係ないだろw

すでに適切な回答がなされた後で再読み込みもせずに余計なことを書いた
>>834 は今ごろ赤面。

838 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 12:09:01 ]
>>835
「カレントディレクトリ配下」という言葉の使い方を間違ってます。

839 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 14:40:31 ]
>>832, >>834-835, >>837-839
具体例を出さない書き込みは禁止。



840 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 18:20:43 ]
>>838
配下っていう意味的にはあってるでしょ

841 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 18:21:36 ]
>>840
合ってない。直下のディレクトリのみ指す用語。

842 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 18:24:34 ]
>>841
配下って言うのは、傘下って意味。
参加は直下以外も指す。

ダイハツの下もTOYOTAの傘下でしょ。

843 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 18:39:44 ]
>>842
勝手に言葉を定義されても、困るのですが。

844 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 18:46:27 ]
その人の支配に属していること。また、その者。手下。部下。
- 三省堂提供「大辞林 第二版」より

類語:
⇒ 関連語 てした【手下】
⇒ 関連語 さんか【傘下】
⇒ 関連語 したやく【下役】
- YAHOO辞書より

845 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 18:47:48 ]
一言「サブディレクトリ以下も含む」と付け加えれば意味が通じたのに、
>>832 は「サブディレクトリ」という用語を知らないに1票。

846 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 18:52:45 ]
例えば、
/aaa/bbb
というディレクトリがあって、
touch /aaa/bbb/ccc.txt
ってやりたい時、
bbbディレクトリに書き込みパーミッションがあれば、
aaaディレクトリは書き込み禁止であっても書き込める。
よって、bbbはaaaに支配されているわけではない。
aaa自体の書き込みパーミッションは、
aaa直下に作成するファイルにしか効かない。
つまり、bbbはaaaの支配には属していない。

847 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 19:10:11 ]
基本的には親ディレクトリを削除したら下は全部削除されるんだから支配されてるでしょ。
孫請け会社が親とは直接的なやり取りがないのとおなじ

848 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 19:19:12 ]
リンク

849 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 19:19:17 ]
>>846 >>847
だから、勝手に言葉を定義されても困るのですが。

>>845
「再帰的(reccursive)に」というキーワードがありますね。 よくあるオプションは-rですか。




850 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 19:21:22 ]
-Rだな

851 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 19:33:05 ]
>>849
言葉を定義してるはあなたも同じでしょ。

YAHOO辞書に従うと、類義で傘下があるから傘下としてはただしいんだし。

852 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 19:42:10 ]
>>851
いや、してませんけど。
言葉は流動的なもので、大辞林や広辞苑にこう書かれている、としても、
それがすべての場合に同様に正確にあてはまるわけではないのは、日常の
言葉のやりとりで体得していないのですか?
プログラム言語じゃあるまいし。

853 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 20:20:38 ]
>>847
逆。下のディレクトリがあると親ディレクトリは削除できない。
そういう意味では子に親が支配されてる。

あと、NFSとかnullfsでループバックマウントする場合、
子のディレクトリを別の場所にマウントすると
まさに親ディレクトリに関係なく子のディレクトリにアクセスできる。
ディレクトリ間は単にリンクしあっているだけであって、支配関係はない。

854 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 22:40:38 ]
>>852
指標にはなるでしょ。
根拠をしめしてるだけ、ちゃんと示してる。

>>853
削除できないようにしてるだけ。

855 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 22:59:03 ]
いったいなんのスレだここはw

856 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/08(木) 05:17:48 ]
こういう宗教戦争があるのがUNIX板のいいところ

857 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/08(木) 08:25:57 ]
どうでもいいが、>>836 で正解もらってるのに、
>>835 = >>832 から礼の一言もなしに書き逃げしてるなw






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<196KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef