|
>>3636 tomato inet_aton には IP アドレスも渡せます。なので、 socket(SOCKET, PF_INET, SOCK_DGRAM, 0); $ip = '192.168.253.155'; $iaddr = inet_aton($ip); $sock_addr = pack_sockaddr_in(2426, $iaddr); send(SOCKET, "test", 0, $sock_addr); でよいです。 http://x68000.startshop.co.jp/~68user/net/func.html#inet_aton ではホスト名しか渡せないような書き方をしていますので、ちょっと 不適切でした。 そもそも、C 言語での inet_aton の機能は、 aaa.bbb.ccc.ddd という文字列を解析し、in_addr 構造体に格納する というもので、名前解決は行いません。一方、perl の Socket パッケージの inet_aton は、ホスト名も受け付けるように機能拡張されているわけです。 |
|
また初歩的なことで申し訳ありません。 以下のプログラムで、13行目以降で配列(CMD)の内容を表示させて いるのですが、全てNULLになってしまいます。 +1 #!/usr/bin/ksh +2 INDEX=0 +3 TEST=`ls -l | +4 while read LINE +5 do +6 CMD[$INDEX]=$LINE +7 echo $INDEX":"${CMD[$INDEX]} +8 let "INDEX = INDEX + 1" +9 done` +10 echo "$TEST" +11 +12 INDEX=0 +13 while [ $INDEX -lt 5 ] +14 do +15 echo $INDEX":"${CMD[$INDEX]} +16 let "INDEX = INDEX + 1" +17 done このプログラムの3行目から10行目を以下の様に修正すれば、13行目 以降でも配列の中身が正常に表示されます。 +3 ls -l | +4 while read LINE +5 do +6 CMD[$INDEX]=$LINE +7 echo $INDEX":"${CMD[$INDEX]} +8 let "INDEX = INDEX + 1" +9 done +10 最初のプログラムの様に、最初のループの結果を変数にセットする 場合で、ループから出た以降も配列の中身を保つ方法は無いでしょう か? |
|
>>3638 バンガード バッククォーテーションでくくると別プロセスになるから 変数を保持することはできないと思いますが・・・ |
|
>>3638 バンガード > このプログラムの3行目から10行目を以下の様に修正すれば この修正ではなぜダメなのか理由を書いていただかないと、代案が出せないです。 |
|
>>3640 68user 3行目から10行目の修正ですとwhile文の出力は標準出力へ出て行くだけです。 これを最初のプログラムの様にwhile文の出力を変数に格納したいと考えています。 |
|
>>3641 バンガード > while文の出力は標準出力へ出て行くだけ それは echo しているからでは? echo しなければ OK かと思います。 > while文の出力を変数に格納したいと考えています 修正版の方でも CMD[$INDEX]=$LINE と格納しているように見えます。 また、ループを抜けた後でも参照が可能だと思います。 |
|
>>3642 68user まず、3行目から10行目を修正した場合の結果は以下の通りです。 0:合計 7 1:-rw-r--r-- 1 furu man 4 Mar 22 15:59 test1 2:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test2 3:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test3 4:-rw-r--r-- 1 furu man 12 Mar 22 16:01 test4 5:-rw-r--r-- 1 furu man 12 Mar 22 16:01 test5 6:-rw-r--r-- 1 furu man 4 Mar 22 16:01 test6 7:-rw-r--r-- 1 furu man 20 Mar 22 16:02 test7 0:合計 7 1:-rw-r--r-- 1 furu man 4 Mar 22 15:59 test1 2:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test2 3:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test3 4:-rw-r--r-- 1 furu man 12 Mar 22 16:01 test4 次に3行目から10行目を修正しない場合の出力結果です。 0: 1: 2: 3: 4: ちなみに7行目のecho文をコメントにしても結果は同じです。 この様にwhile文をダブルクォーテーションで囲むかどうかでwhile 文を抜けた後で配列を参照できるかが異なってきます。 No.3639でzshさんが回答されている様にダブルクォーテーションで囲んでいるために別プロセスになってしまうのが原因の様です。 whileの出力を変数に格納した上で、whileから抜けた後も配列の内容が参照出来る様にするにはどうしたら良いのでしょうか? |
|
>>3643 バンガード > ちなみに7行目のecho文をコメントにしても結果は同じです。 わたしはありえないと思いますが、そういう ksh もあるんですかね。 当方の HP-UX11i で #!/usr/bin/ksh INDEX=0 ls -l | while read LINE; do CMD[$INDEX]=$LINE let "INDEX = INDEX + 1" done INDEX=0 while [ $INDEX -lt 5 ]; do echo $INDEX":"${CMD[$INDEX]} let "INDEX = INDEX + 1" done というのスクリプトを実行したところ、 0:合計 7 1:-rw-r--r-- 1 furu man 4 Mar 22 15:59 test1 2:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test2 3:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test3 4:-rw-r--r-- 1 furu man 12 Mar 22 16:01 test4 というような、先頭 5 行分だけの出力が得られました。 |
|
>>3644 68user 御提示いただいたシェルなら当方(AIX 5.1)でも同様の結果が出 ます。 以下の様に修正した場合に配列の中身が2つ目のwhile文で出力され なくなります。 #!/usr/bin/ksh INDEX=0 TEST=`ls -l | while read LINE; do CMD[$INDEX]=$LINE let "INDEX = INDEX + 1" done` INDEX=0 while [ $INDEX -lt 5 ]; do echo $INDEX":"${CMD[$INDEX]} let "INDEX = INDEX + 1" done |