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


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

シェルスクリプト相談室



1 名前:デフォルトの名無しさん [2005/04/04(月) 03:43:03 ]
シェルスクリプトに関する質問・回答や議論等を行う相談室スレッド。 


458 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 08:07:28 ]
例示ばかりで、肝心の変換のための法則について
何も書かれちゃいねぇ!

「変えたいところは」「ここの行を…としたい」
「あったりなかったりします」

場所と結果だけ示されてもねぇ。。

459 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 08:12:43 ]
ここはこうだから、これをこれと入れ換えます。
という説明はできないもんだろうか。

関係ないけど先日会社に面接に来た香具師。
「自己アピールは大切ですから」と言いつつ何ら具体的なことは何も言わないで帰った。
要は、客観視できていないし説明することもできないらしい。
#そのくせ、ランバ・ラルの台詞を語ってはいたのだが。

460 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 08:17:11 ]
何か耳が痛いな。

461 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 08:23:42 ]
言語機能の差が、スクリプト処理の決定的差ではないという事をおしえてやる

462 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 11:23:46 ]
1万行の処理なんて一瞬で終わると思うんだが……
仮に行数Lに対して実行時間が O(L^2) だとしてもちょっと待てば終わるくらいだと思

463 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 12:06:13 ]
すごい遅いマシン使ってるのかな?

464 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 17:32:54 ]
シェルスクリプトじゃないけど。awkでやってみた。
BEGIN{
while(getline<ARGV[2]){
cv[$1]=$2;
}
ARGV[2]="";
}
$1=="linux"{
$5=cv[$2];
}
{
print;
}


465 名前:デフォルトの名無しさん [2006/12/05(火) 21:39:41 ]
csh で if($hoge == hoge) とかやったばあい、
$hoge が -f などの場合
ファイルに関する演算子の -f とみなされて
比較してくれません。
こういう場合、どうすればいいのでしょうか?

466 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 22:17:11 ]
あ、適当な文字を両辺の先頭に付ければいけますね。
何か格好悪いので、もっといい解決法があればよろしくお願いします。



467 名前:デフォルトの名無しさん [2006/12/06(水) 22:42:36 ]
ファイル名の拡張子より前の名前を抽出するシェルを作っています。
例えばtest.shであれば

ls test.sh | awk -F '[.]' '{print $1}'
でtestと出力が得られるのですが、もしファイル名がtest_1.00.shの時は
test_1
のような出力になってしまいます。

awkの$NFで拡張子のshは得られるのですが、
$NF「以外全て」を出力を得るにはどのようにすればよいでしょうか?

468 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 22:48:02 ]
>>467
man basenameでだめなんか。
それから、シェルスクリプトのことをシェル呼ぶなってば。

469 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 22:49:51 ]
シェルスク?
シェクリ?
ルスクリ?

470 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 23:02:51 ]
>>468
できますた。
ありがとうございました。

471 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 23:13:44 ]
>>467
awkでやるなら
jgawk -F. "{print jsubstr($0,0,jlength($0)-jlength($NF)-1)}"
でどう?

472 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 23:28:06 ]
>>471
試してみたのですが残念ながら、現在の環境ではjgawkというのが入ってないみたいです…
basenameはcaseで知ってる拡張子を洗いざらい場合分けするスクリプトかいて処理しました。
(txt f90 c c++ java shなど)

jgawkのインストールについて調べてみます

473 名前:デフォルトの名無しさん [2006/12/06(水) 23:29:05 ]
c++じゃなくてcppだった…

474 名前:デフォルトの名無しさん [2006/12/06(水) 23:34:47 ]
ちなみにローカルな目的は、
a2psを使ってpsファイルを作る事でした。

a2ps test1.00.sh -o test1.00.ps

拡張子を取り除いてpsの拡張子を付けるためのスクリプトを作る方法を考えていました。
basename&case文で対応はできたのですが、jgawkというのが使えるのであれば
より汎用性のあるスクリプトができそうですね。

475 名前:デフォルトの名無しさん [2006/12/06(水) 23:40:59 ]
ちなみに、gawkはありましたが
$ gawk -F. "{print jsubstr($0,0,jlength($0)-jlength($NF)-1)}" test1.00.sh
gawk: cmd. line:1: (FILENAME=test1.00.sh FNR=1) fatal: function `jsubstr' not defined
でした。

476 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 00:01:50 ]
>>475
jgawkのjはJapanese(日本語)のj、
jlengthやjsubstrのjも同じ。
データーに日本語が入ってないならjは除けていいよ。




477 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 00:27:39 ]
>>467
Solaris のawkみたいに腐ったやつだとわからないけど、gawkなら
NF--; print $0
で取れないか?


478 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 00:33:01 ]
>>477
jgawkでやったら
aaa.bbb.ccc.dddが
aaa bbb cccになった。

479 名前:デフォルトの名無しさん [2006/12/08(金) 01:05:00 ]
NFってなに?
Systemコマンドの使い方教えて

480 名前:477 mailto:sage [2006/12/08(金) 01:21:03 ]
>>478
スマソ。OFSを設定してクレイ。
gawk -F'[.]' -v OFS='.' '{NF--; print}
あたりでよろしこ。



481 名前:デフォルトの名無しさん [2006/12/13(水) 21:04:58 ]
shellってすごいね

482 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 23:27:33 ]
#!/bin/sh
dump -0f /path/to/hda1.dump /dev/hda1
dump -0f /path/to/hda2.dump /dev/hda2

このスクリプトを実行して、hda1の実行途中でCtrl+Cを押したら
hda1は終了するけど次行のhda2のバックアップが開始されます。
スクリプト自体を終了するにはどうしますか?

483 名前:デフォルトの名無しさん [2006/12/24(日) 10:47:11 ]
>>482
dump は使ったことないので、勘ですが
dump -0f /path/to/hda1.dump /dev/hda1
if [ $? -ne 0 ]
then
dump -0f /path/to/hda2.dump /dev/hda2
fi
じゃ、だめですか?

484 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 12:55:55 ]
#!/bin/sh -e
dump -0f /path/to/hda1.dump /dev/hda1
dump -0f /path/to/hda2.dump /dev/hda2


485 名前:デフォルトの名無しさん [2006/12/26(火) 23:54:08 ]
sedで-dオプションを使って、特定の文字列がヒットした時に、
その行を削除したいのですがうまくいきません。
manpageみても使い方がよくわからず、困り果てております。
どうやって使えばいいかご教授お願いします。

486 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 23:58:45 ]
>>485
-dオプション???

単純に行削除だけなら例えば以下のように。
--
sed -e '1,5d' #最初の5行を削除
sed -e '/pattern/d' #patternを含む業を削除



487 名前:デフォルトの名無しさん [2006/12/27(水) 06:42:35 ]
>>486

使い方思いっきり間違ってました
ありがとうございます
助かりました

488 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 17:11:03 ]
てか、パターンを含む行を削除したいだけなら grep -v でやれば良い。


489 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 01:09:04 ]
きっとgrepでは業(カルマ)を削除できないのだろう。

490 名前:デフォルトの名無しさん [2006/12/29(金) 16:00:50 ]
sedでレコードのor検索やand検索ってできますか?


491 名前:デフォルトの名無しさん mailto:sage [2006/12/29(金) 16:12:11 ]
RDBでいうレコードの概念は、区切り文字とのパターンマッチでおおよそシミュレート可能。
その上で、パターン/X/と/Y/のandは/X/{/Y/}で、orは
/X/...
/Y/...
でシミュレート可能。

492 名前:デフォルトの名無しさん [2006/12/30(土) 12:08:44 ]
例えばレコードの100バイト目から105バイト目を置換したいんだけど、
全角・半角が不規則に混ざっているので、
s/(.{100,100})......)/\1abcdef/
とか正規表現でやってもうまくいかないんだよね。
良い方法あるかな?
ちなみにUNIX、sedでやるつもり。

493 名前:デフォルトの名無しさん mailto:sage [2006/12/30(土) 15:00:03 ]
>>492
多バイト文字を途中でぶった切ってもいいの?

$ LC_ALL=C sed -e 's/^\(.\{99\}\)\.\{6\}/\1abcdef/'
とか。LC_ALLは状況しだいでLANGとかLC_COLLATEあたりでもOK。
あとこの正規表現はGNU sed でないと多分食ってくれない。


494 名前:492 mailto:sage [2006/12/30(土) 23:40:41 ]
うちはcshなので
env LC_ALL=C sed 〜
って感じですね!
ありがd!
後いい忘れたけど固定長ファイルで置換部分は必ず1バイト文字なのでぶった切られることはないです。


495 名前:デフォルトの名無しさん mailto:sage [2007/01/02(火) 14:18:06 ]
RDB=ラーメンデータベース

496 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 00:18:43 ]
よく勘違いされてるんだけど、
ラーメン(Rahmen)というのはドイツ語で、
英語のframeに相当する単語なんだ。
だから「枠」とか「骨格」とか「軸組み」とかいうような
ニュアンスなんだよ、本来であれば。



497 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 09:39:49 ]
ラーメン違い。本来も糞もない。


498 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 12:33:20 ]
遅レス気味すまそ。
>>483
そういうの書くなら
dump -0f path/to/hda1.dump /dev/hda1 || exit 1
と || exit の方が、見やすくって良くないか。


499 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 01:26:49 ]
質問があります。
Vine4.0を使用していまして

#!/bin/sh
declare -i MAX
MAX=10
while[ $MAX -lt $1 ]
do
echo $MAX
MAX=$MAX+1
done

というスクリプトを書いたのですがいざ実行してみると下記のようなエラー?がでてしまします。
command not foundということは何かがたりないのでしょうか?
アドバイスお願いします。

. a05.sh 12
bash: while[ 10 -lt 12 ]: command not found
bash: a05.sh: line 5: syntax error near unexpected token `do'
bash: a05.sh: line 5: `do'


500 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 02:35:36 ]
whileの後ろに空白がないんじゃないか?>499

501 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 03:45:07 ]
>>499
空白入りの引数を渡すとエラーを吐くから
$1 の所をクォートしておくと吉

502 名前:499 mailto:sage [2007/01/06(土) 02:58:14 ]
>>500,501
whileの後ろに空白をいれたら無事に動作しました。
クォートとは''の事ですよね?参考になりました。
ありがとうございました。

新しい質問なんですけど

#!/bin/bash
while [ -f .count.lock ]; do
sleep 0.1
done
touch .count.lock
declare -i INTEG
INTEG='cat access_count.txt'
INTEG=$INTEG+1
echo $INTEG >| access_count.txt
echo "$INTEG"
rm -f .count.lock

を動作させると

bash: cat access_count.txt: syntax error in expression
(error token is "access_count.txt")
15 ←access_count.txtの内容を書き換えてもどんどんインデントされていきます。
の様に吐き出されてしまいます。
INTEG='cat access_count.txt'の部分が悪い様なのですがINTEGにcatを使って
ファイルの内容を代入することはできないのでしょうか?
access_count.txtの中身は 0 とだけ入っています。

よろしくお願いします。

503 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 03:33:25 ]
コーテーションの向きを確認すべきかと

504 名前:492 mailto:sage [2007/01/06(土) 11:02:47 ]
すいません、また来ました…

\{99\}使えんかったorz
.を99個書くしかないんかね〜


505 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 21:31:43 ]
>>504
sedを使わない方法
(dd bs=1 count=99;dd bs=6 count=1 of=/dev/null; echo -n abcdef; cat)

506 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 02:48:47 ]
>>504
使ってる sed がGNU sedでないとかない?

echo abcdefghijklmn | sed -e 's/^\(.\{5\}\).../\1XXX/'

abcdeXXXijklmn
になるよ(Fedora Core5)

あと、493は後ろのドットに余計な\がついてるからそれはとっておくんなまし。




507 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 15:39:41 ]
>>504
awk '{print substr(1, 99, $0) "12345" substr($0, 105)}' hoge.txt


508 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 23:38:53 ]
>>504
printf "%099d\n" |tr 0 \.

509 名前:504 mailto:sage [2007/01/16(火) 00:52:23 ]
やっぱawkじゃね〜
サンクスコ


510 名前:デフォルトの名無しさん mailto:sagw [2007/01/16(火) 17:35:01 ]
ちょいとawkスクリプトでお尋ねしたいんだが、
2つ以上のファイルから文字列の切り出しってできますかね?
色々試してみたのだけれど全然できなかったんで

hoge1.dat の$1,$3 と hoge2.dat の$5,$2 を 1行でhogehoge.datに出力という形

GMTっていうマイナーなツールで絵を描いてるんだけど、GMT内の計算スクリプトで出たデータのお尻に
別のデータを加えてそのまま描けないかなぁって試行錯誤してるんですが。

511 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 17:44:04 ]
できます。しかし、残念ながらスレ違いにつきawkスクリプトは割愛。

512 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 18:08:10 ]
>>511
スクリプトが複数行に渡らずにできるならなんとかサンプル探してやってみる

513 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 18:33:03 ]
>>512
なぜにワンライナーにこだわるん?

514 名前:512 mailto:sage [2007/01/16(火) 19:44:23 ]
スレ違いだけど一応
>>513
簡単に言えば頭の悪い素人だから。
マニュアルになりそうなもんは見たりするんだけど、大体そういうのって一行で処理終わらせるのが多くて。
専門用語がてんでダメだし、

何故処理できるのか?を理解してなくて、「こうやればこういうのができる」でしか認識してなく
自分自身、誰かが書いたソースの簡単な処理や変数を弄るだけしかできないって分かってる。
複数行に渡ると検索でHITしにくいし、「できる」て事さえ分かれば後は調べたらなんとかなるかな、と

スレ読んでたら組み合わせ次第でなんとかできそうだわ

515 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 19:55:53 ]
カラム数が固定ならpasteとawkをパイプで繋ぐのが楽かな。

516 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 00:33:49 ]
一応、書いてみたんだがな…、1行ぢゃないから駄目か

#!/usr/bin/gawk -f
BEGIN{
    while( (getline line1 < "hoge1.dat" ) > 0 && \
           (getline line2 < "hoge2.dat" ) > 0 ){
        split(line1,col1)
        split(line2,col2)
        print col1[1],col1[3],col2[5],col2[2]
    }
}



517 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 01:45:36 ]
>>510
bash 限定かも

$ paste <( awk '{print $1,$3}' hoge1.dat ) <( awk '{print $5,$2}' hoge2.dat )


518 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 10:59:01 ]
対話式のスクリプトを作っており、read で入力されたIPアドレスを
正規表現でIPアドレス規則が正しいかを判断さえたいのですが、
どうしたらいいですかね。

519 名前:デフォルトの名無しさん [2007/01/24(水) 11:51:57 ]
関数やサブシェルについての質問です。
まずサブルーチンの方ですが、以下のようにしました。
「Name_sub.sh」
#!/bin/sh

echo "What is your name and age ?"
read your_name your_age

CHECK_NAME () {
echo $1 $2
}

CHECK_NAME $your_name $your_age

これ単体で実行すると、正常に$your_name $your_ageが戻ってくることを確認しました。
これを他のmainスクリプトから呼び出して使おうとしました。

「Name_main.sh」
#!/bin/sh

var=(`./Name_sub.sh`)
echo '${var[@]} = ' ${var[@]}

ここで、Name_sub.shの戻り値を配列varに入れようとすると、
Name_sub.shの対話部分が表示されませんでした。
対話部分をプロンプトに表示して、関数のCHECK_NAMEの戻り値のみ
配列varに代入するにはどうすればよいのでしょうか?

520 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 12:29:27 ]
とりあえずtmp.txtファイルに値を保存して、その値をmainで読み込むことにしました。

521 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 13:17:20 ]
source を使うケースじゃないのかな。


522 名前:デフォルトの名無しさん [2007/01/25(木) 15:51:10 ]
>>518
sh や bash の場合 (ksh もこうだったかも知れない)
IFS=.
とすると set で指定した変数は '.' で区切られて $n に入るようになる。
たとえば ipaddr に 172.24.1.2 と入っているときに

IFS=.
set $ipaddr

とやると $1 に 172, $2 に 24, $3 に 1, $4 に 2 が入り、更に $# が
4になる(4つに分割されたということ)。

なのでまずはこの直後に
if [ $# -ne 4 ]; then echo Error ; exit 1 ; fi
のようなことをして4つでなければエラー扱いにしてしまえば良いと思う。

更に $1 から $4 に入っているので for でループさせることもできる。
なのでここで数値が 0 〜 255 になっていなければエラーにすれば良い。

# n に 172, 24, 1, 2 の順で代入されてループする。
for n
do
 if [ 0 -gt "$n" -o 255 -lt "$n" ]; then echo Error ; exit 1 ; fi
done

テストで数を先に書いている理由は n には何が入ってくるか分からないから。
('-' で始まるオプションのようなものを入れられてしまうとテストコマンドの
動作が変わってしまうかも知れないため)


523 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 16:05:50 ]
どうしても正規表現を使わないと我慢ならんという場合はこんな感じかな。
なんか無理があるが。

if perl -e '$_='\'"$ipaddr"\'';if(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/){if($1>=0&&$1<=255&&$2>=0&&$2<=255&&$3>=0&&$3<=255&&$4>=0&&$4<=255){exit 0}}exit 1;'
then
 echo ok
else
 echo ng
fi


524 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 17:38:15 ]
正規表現の時は >=0 の判定はいらんと思う。
どちらにしろ面倒だけど。

525 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 22:03:14 ]
あ、そうだね。いらないね。

526 名前:デフォルトの名無しさん [2007/02/07(水) 22:53:33 ]
[質問]
シェルスクリプト初心者です.

power 12.34 dBm
power 13.45 dBm
power 14.56 dBm

ある,power(電力) の変化を確認するのに

while true; do sleep 1 echo `command`; done

で 表示しているのですが

改行して新たな出力を出さないで,
前の出力を消し power 値 dBm の値のところだけが変わる

ようにしたいのですが,いい方法ありませんか?

clear は使わずにお願いします.

分かりにくい説明ですみませんがどうかよろしくお願いします.



527 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 23:09:16 ]
>>526
キャリッジリターンを使うと吉。
command が複数行出力しているとこれでは上手くいかないけど。

while true; do sleep 1; echo -en "`command`\r" ; done

詳細は man printf かな?

528 名前:デフォルトの名無しさん [2007/02/11(日) 11:20:30 ]
シェルスクリプトって例外処理できます?
例えば一つ上の行でエラーが発生したときはそのシェルスクリプトの処理を終了するとか。

529 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 12:14:42 ]
>>528
プロセスの終了ステータスを見て条件分岐することはできる。

530 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 13:13:06 ]
>>528
普通は>>529の終了ステータスを使う。エラー時に終了するだけならこれで十分。
シグナルが飛ぶならtrapでシグナルハンドラを書くのもあり。

try/catch/throwに直接対応するものは、Bourne shell、csh、bashにはない。


531 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 20:02:45 ]
set -eしとけば、(検査されていない)終了ステータスが0以外の場合は
スクリプトが終了する。終了処理はtrap "..." 0

532 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 08:56:55 ]
どもですm(_ _)m

533 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 19:47:34 ]
リダイレクトのことで質問なんですが
echo hoge > test
ls -l < test
とやるとlsは標準入力(つまりtest)の内容を読み込むのなら
普通にls -lとした場合はキーボードからの入力を読み込もうとすると思うんですが、
そうはならないのは何故なんでしょうか?

534 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:19:42 ]
>>533
入力がリダイレクトされても、lsは何も読むわけではない。
つまり、ls -l < test と書いても ls -l と書いても同じ事。

535 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:42:01 ]
たしかにls -l < testとやっても変わらないみたいです。
今、入門UNIXシェルプログラミングという本で勉強しているのですが、
その本の89ページには
echo abc nnn > xyz
ls -l < xyz
とするとls -l abc nnnとしたときと同じ結果になる。書いてあったのですが、
この本が書かれた時と今ではlsの動作が異なるということなんでしょうか?


536 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:55:46 ]
いつの時代か知らんが、lsが標準入力から引数を貰うような作りになってる
という話は聞いたことがないな。

ls -l `cat xyz`とか xargs ls -l < xyz ならありえる。

xargsは、はしょって言うと、標準入力から受け取ったものを、自分に与えられ
た引数につなげたて、その全体を実行するコマンド。、




537 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 22:01:14 ]
うーんサンプルコードを見ても特にxargsを使っているわけではないようです。
本のタイトル名で検索したらサポートページがあったので、後で
この件に関してメールを送ってみようかと思います。ありがとうございました。

538 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 22:12:21 ]
>>537
物はこれか?
ttp://shop.sbcr.jp/isbn/shell/index.htm
ここには載っていないようだな。
ttp://shop.sbcr.jp/isbn/shell/errata.htm

539 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 22:17:38 ]
この本か。
会社に置きっぱなしだから明日確認してみる。

540 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 22:22:57 ]
著者名のつづりのミスもみつけられんとこ信用するな

541 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 01:49:29 ]
>>535
ls -l `< xyz` なら期待通りの結果になるよ。

bash 依存の記法だったと記憶しているけど。


542 名前:539 mailto:sage [2007/04/05(木) 10:21:44 ]
入門UNIXシェルプログラミング(ソフトバンク株式会社、Bruce Blinn、初版)
の87ページに確かに載っているな

----------
$ cat xyz # xyzファイルの中身を確認
abc nnn
$ ls -l < xyz # xyzファイルを「標準入力」としてリダイレクトする
----------

ls (GNU coreutils) 5.97では動きませんでしたがええ。

543 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 12:53:34 ]
リダイレクトのことで質問なんですが
中身がスペース一つのファイルsampleを
cat test | sed -e 's/ / /' > test2
とするとtest2にスペース10個が出力されるので
cat test | sed -e 's/ / /' > test
とするとtestの中にはスペースが10個入っていると思うんですが、
中身を見てみると空になってしまいます。
一つのコマンドの中で同じファイルに対して入出力のリダイレクトを行うと
空になってしまうのはわかるんですが、今回の場合はどうしてうまくいかないのでしょうか?

544 名前:543 mailto:sage [2007/04/05(木) 12:55:16 ]
すいません、上の例でのtestはsampleの間違いですorz

545 名前:543 mailto:sage [2007/04/05(木) 12:57:52 ]
何度もすいませんorz
どうやら連続した半角スペースは一つにまとめられてしまうみたいで、
上の例のs/ / /はs/スペース1個/スペース10個/ってことです。

546 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 13:50:57 ]
>>545
一部のOSのようにパイプラインを非同期にしか実装してない環境ならいざ知らず、
まともなOSではパイプラインの前後のプロセスは同時に実行されるので、
パイプラインに接続する一つのファイルを読み書きしようとすれば当然そうなる。




547 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 14:50:40 ]
つまり上の例だと
・最初に書き込み用にファイルを開く、当然ファイルの中身は空になる。
・catは空のファイルの中身を出力する
・空がsedに渡されるので当然空をファイルに書き込む
という順番で処理が行われるんでしょうか?

548 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 15:14:56 ]
ちょっと違うな。
cat test | sed -e 's/ / /' > test
の場合、
シェルがtestを"w"で開いてからcatとsedを起動する筈だから、
catが起動された時点でtestは既に空の筈だ。
空の入力に対してcatは何も出力しないし、sedも同じように何も出力しない。
従って、空になるのはcatやsedが起動される前と言うことだ。

ちなみに、どうしても同じファイルに読み書きしたいなら
sed -e 's/ / /' < test | tee test
のようにしてしまえばいい。
これなら、シェルがtestを開いてからteeがtestを開こうとするので
(unixの開きっ放しのファイルは削除できたように見えてもそれは見掛けだけ仕様に基づき)
無事に処理される筈だ。

549 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 15:27:54 ]
まず最優先でリダイレクトのための処理が行われて、それから
コマンドの処理が行われるんですね。わかりました。ありがとうございます。

550 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 17:02:21 ]
なんか今一判っていない悪寒。

551 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 02:40:06 ]
>>549
GNU sed 使ってるなら -i オプションつけとけ


552 名前:デフォルトの名無しさん [2007/04/07(土) 19:35:57 ]
シェルを初めて組みます。
Cシェルで、自分のグローバルIPを取得して、そのIPをメールで送信するようなプログラムを
組みたいと思っております。

で、グローバルIPの取得の仕方が分からないのですが、
どのようにかけばよいのでしょうか?

OSはRedHat10です。

553 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:07:14 ]
シェルスクリプトのことをシェルゆーな。
Cシェルで書くな。

プライベートアドレス
10.x.x.x
172. {16-32} .x.x
192.168.x.x

割り当てられているIPアドレスは

LANG=C
/sbin/ifconfig |sed -n 's/inet addr:¥([^ ][^ ]*¥) .*/¥1/p'
で取れるから、あとはawkでも使って該当しないものを除外すれば
いいんじゃないか?

と書いてから気づいたが、家のダイアルアップルータに繋がっている
LinuxからグローバルIPアドレスを取ろうとするなら、Linuxにはプライ
ベートIPアドレスしか割り当てられてない。取るべきはルータに付いてる
グローバルIPアドレスになるから別の方法が必要だぞ。


554 名前:デフォルトの名無しさん [2007/04/07(土) 22:25:30 ]
>>553
すいません、ありがとうございます。
何もわかってないんで^^;
ずばり、そのとおりで、取得したいのはルータについてるグローバルIPです。。

555 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 22:42:16 ]
>>554
ダイアルアップルータやモデムにはtelnetサーバが内蔵されていることがある。
叩くコマンドが分かれば、expectを使って取得できるかもしれない。

httpサーバを内蔵していることもあるが、こっちはずばりIPアドレスを確認する
ページを持ってるかもね。


556 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 23:00:35 ]
>>554
誰もおまいのルータの仕様を知っているやつはいないからな・・・

うちのFLASHWAVE 2040 M1ならID:PASS@ルータのIP/doKeeping.htmlを
wgetで取得してvar sIpAddress="*.*.*.*";の場所を取得すればわかる。



557 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 00:37:43 ]
何も考えずにメール出せば、大抵はReceived:にIPアドレスが自動的に書かれる。
書かれないならば、書いてくれるメールサーバを提供しているISPに乗り換える。


558 名前:537 mailto:sage [2007/04/11(水) 10:24:46 ]
ソフトバンクさんからメールの返事が届きました。
正誤表も更新したみたいです。






[ 続きを読む ] / [ 携帯版 ]

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

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