Bシェルで、whileとreadを使ったファイルからの読み込み について教えてください。 while文の中の変数をwhile文の外で使いたいのですが、 以下の様に、whileとreadを使ってファイルから読み込み doをdoneの間で処理を行い、ループを抜けた後、doneの 後ろで、結果を表示させたのですが、正しく表示されません。 どうしたら正しく表示されますか。 環境 Solaris8 Bシェル --------------------------------------------------------- #!/bin/sh # num=0 while read line ; do echo $line num=`expr $line + $num` done < a.txt echo "-----" echo $num cat a.txt 1 2 3 4 5 6 7 8 9 10 |
Bシェルで、sedを使って、2行を1行にしているのですが上手く行きません。 改行している次の行で、半角スペースから始まっている行を、sedを使って 1行にしたいのです。 sed -e ':loop' -e '$b' -e 'N;/\n /{s/\n *//;b loop' -e '};P;D;b loop' file.txt としたのですが、最初に引っかかったのは、1行になるのですが、 それ以降のものは、1行になりません。 環境 Solaris8 Bシェル 内容 --------- [Fri Jan 1 00:00:00] 開始 [Fri Jan 1 00:00:00] INFO:あいうえお abcdefg [Fri Jan 1 00:00:00] INFO:あいうえお 1234567890 [Fri Jan 1 00:00:00] INFO:あいうえお aaaaaaa bbbbbb cccccc [Fri Jan 1 00:00:00] INFO:あいうえお ABC 1234 [Fri Jan 1 00:00:00] INFO:12345 [Fri Jan 1 00:00:00] INFO:ABCDE [Fri Jan 1 00:00:00] INFO:あいうえお [Fri Jan 1 00:00:00] 終了 期待する結果 ---------- [Fri Jan 1 00:00:00] 開始 [Fri Jan 1 00:00:00] INFO:あいうえお abcdefg [Fri Jan 1 00:00:00] INFO:あいうえお 1234567890 [Fri Jan 1 00:00:00] INFO:あいうえお aaaaaaa bbbbbb cccccc [Fri Jan 1 00:00:00] INFO:あいうえお ABC 1234 [Fri Jan 1 00:00:00] INFO:12345 [Fri Jan 1 00:00:00] INFO:ABCDE [Fri Jan 1 00:00:00] INFO:あいうえお [Fri Jan 1 00:00:00] 終了 実際の結果 --------- [Fri Jan 1 00:00:00] 開始 [Fri Jan 1 00:00:00] INFO:あいうえお abcdefg [Fri Jan 1 00:00:00] INFO:あいうえお 1234567890 [Fri Jan 1 00:00:00] INFO:あいうえお aaaaaaa bbbbbb cccccc [Fri Jan 1 00:00:00] INFO:あいうえお ABC 1234 [Fri Jan 1 00:00:00] INFO:12345 [Fri Jan 1 00:00:00] INFO:ABCDE [Fri Jan 1 00:00:00] INFO:あいうえお [Fri Jan 1 00:00:00] 終了 となります。 期待する結果を得たいのですが、どうすればよいですか。 |
>>5040 あきもと >>4776 zsh を参照してください。 >>5041 おう sed -e '$!N; s/\n \{1,\}//; P; D' file.txt でどうでしょうか? |
管理人さんへ 『User-Agent 統計』のページ (http://x68000.q-e-d.net/~68user/cgi-bin/view-browser.cgi) が『エラー : 内部エラーが起こりました。』となっているので お知らせします。 |
>>5042 zsh ありがとうございます。 教えて頂いたところに書いてある方法で 上手くいきました。 |
>>5042 zsh ありがとうございます。 上手くいきました。 |
はじめまして。ボンジーと申します。ハッキングのやり方を教えてください。しーローとなもので |
いつもUNIXコマンドでお世話になっています。 画像変換のconvertコマンドについてお伺いしたいことがあります。 私は今、趣味でサイトを作っています。 画像アップロードした際にGIFからjpgに変換させる処理にconvertを使っているのですが、 ファイル名の拡張子は.jpgになっているのですが、バイナリエディタで開いて確認するとGIFファイルのままです。 convertはImageMagickダウンロードしてきて新規インストールしたものです。 このページではGIFからJPGへの画像変換を紹介されていたのですが、 私のところと同じような現象がおこっていませんでしょうか。 http://x68000.q-e-d.net/~68user/unix/pickup?keyword=convert&target=command |
>>5056 Misaki そういう事象は聞いたことがないですが、ありうることとしては libjpeg のリンクがうまくいっていない、でしょうか (それにしても エラーが出るのではないかと思うのですが)。 変換前後のファイルを file コマンドで調べても、やはり gif でしょうか? |
>> 5057 早速、回答ありがとうございます。 fileコマンドでgifかどうか判別できるんですね! やってみたところGIFでした。 簡単に調べてみましたがlibjpegが上手く入っていなかったようです。 帰ったらもうちょっと詳しく調べてみます。 ldd結果 $/usr/bin/ldd /usr/local/bin/convert linux-gate.so.1 => (0x00110000) libMagickCore.so.3 => /usr/local/lib/libMagickCore.so.3 (0x00111000) libMagickWand.so.3 => /usr/local/lib/libMagickWand.so.3 (0x00427000) libz.so.1 => /usr/lib/libz.so.1 (0x0059a000) libpthread.so.0 => /lib/libpthread.so.0 (0x005af000) libdl.so.2 => /lib/libdl.so.2 (0x0056b000) libgomp.so.1 => /usr/lib/libgomp.so.1 (0x00523000) libm.so.6 => /lib/libm.so.6 (0x00571000) libc.so.6 => /lib/libc.so.6 (0x005c6000) /lib/ld-linux.so.2 (0x0040c000) librt.so.1 => /lib/librt.so.1 (0x0081e000) |
初めまして。かばらと申します。 現在、マシン間のソケット通信に関して勉強中なのですが、connectシステム コールについて質問させていただきいても宜しいでしょうか。 質問1 クライアント側から発行されるconnect()はサーバー側で発行されるaccept()の ように処理をロックすることがあるのでしょうか。もしあるとすればどの タイミングでコールした場合でしょうか。 質問2 サーバー側がlisten()をコールする以前にクライアント側でconnect()をコール するとエラー(返却値-1)が起きますが、クライアントがサーバーの状態を監視し、 connect()をコールするタイミングを得ることは可能でしょうか。 (試しにselect()を使用してみましたが上手くいきませんでした。) 突然の不躾な質問で申し訳ございませんが、何卒ご教授くださいますよう よろしくお願いいたします。 |
>>5059 Misaki > 簡単に調べてみましたがlibjpegが上手く入っていなかったようです。 これはまたシンプルな convert ですね。ウチでは以下のとおりです。 /usr/local/bin/convert: libMagick.so.10 => /usr/local/lib/libMagick.so.10 (0x28073000) libWand.so.10 => /usr/local/lib/libWand.so.10 (0x283c7000) libjbig.so.1 => /usr/local/lib/libjbig.so.1 (0x28479000) liblcms.so.1 => /usr/local/lib/liblcms.so.1 (0x28484000) libtiff.so.4 => /usr/local/lib/libtiff.so.4 (0x284b1000) libjasper.so.4 => /usr/local/lib/libjasper.so.4 (0x284fe000) libjpeg.so.9 => /usr/local/lib/libjpeg.so.9 (0x28548000) libpng.so.5 => /usr/local/lib/libpng.so.5 (0x28566000) libfpx.so.1 => /usr/local/lib/libfpx.so.1 (0x2858b000) libdpstk.so.1 => /usr/X11R6/lib/libdpstk.so.1 (0x2862b000) libdps.so.1 => /usr/X11R6/lib/libdps.so.1 (0x28633000) libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x2867a000) libXt.so.6 => /usr/X11R6/lib/libXt.so.6 (0x28689000) libbz2.so.1 => /usr/lib/libbz2.so.1 (0x286da000) libxml2.so.5 => /usr/local/lib/libxml2.so.5 (0x286e9000) libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x28818000) libfreetype.so.9 => /usr/local/lib/libfreetype.so.9 (0x28907000) libz.so.2 => /lib/libz.so.2 (0x28971000) libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0x2897f000) libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0x28988000) libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x2899f000) libm.so.2 => /lib/libm.so.2 (0x28a67000) libc.so.5 => /lib/libc.so.5 (0x28a80000) libstdc++.so.4 => /usr/lib/libstdc++.so.4 (0x28b5a000) >>5060 かばら > 質問1 > クライアント側から発行されるconnect()はサーバー側で発行されるaccept()の > ように処理をロックすることがあるのでしょうか。もしあるとすればどの > タイミングでコールした場合でしょうか。 「connect はブロックするか」(connect を発行した後、待たされることはあるか) という趣旨でよいですかね。ざっと考えつくところは、 1. 3way handshake が完了するまでブロックする 2. サーバもしくはサーバ側ルータにて一切のレスポンスを返さない 構成の場合、いつまでたっても返事がないので SYN を送り続け、ブロックする 3. サーバ側で処理しているソケット数が SOMAXCONN を超えていた場合、 滞留しているクライアントの処理が終わるか、タイムアウトになるまで ブロックする 4. サーバ側が listen しているが accept していない場合、ブロックする などなど。3・4 は記憶に頼って書いてますので、本当かどうかは自信がないです。 一方、ノンブロッキングソケットで connet すれば、ブロックしません。 > 質問2 > サーバー側がlisten()をコールする以前にクライアント側でconnect()をコール > るとエラー(返却値-1)が起きますが、クライアントがサーバーの状態を監視し、 > connect()をコールするタイミングを得ることは可能でしょうか。 > (試しにselect()を使用してみましたが上手くいきませんでした。) サーバ側で準備が整ったら通知がくるといった仕組みはないので、リトライ し続けるしかないですね。 |
お礼遅くなりました。 libjpegを入れて再インストールしたらちゃんと変換されました。 私ははgifの取り扱いに失敗しているものだと勘違いしていました。 迅速かつ的確な回答ありがとうございました。 |
ご回答ありがとうございます。 質問1、2共に納得です。 大変お世話になりました! |
はじめまして、Mod's(マスター・オブ・ドヘン○イ)と申します。 困った時に参考にさせて頂いております。 Bシェルスクリプトを独学中です。と言いつつBashの環境設定ファイルとサブシェル (詰まる所はプロセスの理解不足)について質問させてください。 利用環境:MacOSX 10.6 ログインシェル:Bash bash-3.2$ bash --version GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0) 元々はログインシェルがBashの利用環境にてログイン過程のシェル起動や以降のシェル起動による 環境設定ファイルの読み込み順序などを調べる為に/etc/profile、/etc/bashrc、~/.bash_profile、 ~/.bashrcの4つにそれぞれechoコマンドを仕込んで実際にそれらログインスクリプトが起動した 時に任意のファイルへ「読み込みました」的な内容の出力をするようにしました。 結果、ログイン時にはそれら全ての環境設定から出力されその後のBashの起動では~/.bashrcから のみ出力があり、ここまでは予想通りでした。 グローバル環境設定ファイル、およびローカル環境設定ファイルのいずれもprofile側からrc側を sourceしています。 ここまでは良いのですが、カレントシェルからシェルスクリプトを実行した際、私の予想では ~/.bashrcから出力を得られるつもりでいました。シェルスクリプトを実行する際にサブシェルを 起動すると「されている(←私の中で未確定)」わけですから。 従いまして下記のように2つ推測を立ててみました(どちらも外れているかもしれませんが:笑)。 <推測> 推測① :新たにシェルは起動している、しかし。 スクリプト実行によるサブシェルはあくまでスクリプトを実行するシェルであって対話シェル として起動しているわけではないのでローカル環境設定ファイルを読み込む必要がない。 言い換えると環境設定ファイルはあくまでログインスクリプトだから。 推測② :新たにシェルは起動していない。 あくまでスクリプトを解釈するのはカレントシェルであって解釈後の実際の処理はシェルの 起動を伴わない子プロセスが実行するから。 推測②を書いていてふと思ったのですが、1つのプロセスというのは同時に一つの事しか出来ない 「はず」で、カーネル視点から考えるとシェルとしてプロセスを起動した以上は入力されたコマンド を自身が理解出来る命令へ翻訳して受け取るための1プロセス。 そして翻訳された命令を受け取ったカーネルは実際のデータ処理実行でまた次の1プロセスを育成。 つまり、こちらはカーネル上のデータ処理のプロセスであってシェルの起動ではない。 よってカレントシェルからのスクリプト実行の処理というのはカレントシェルがスクリプト内の コマンドを翻訳してカーネルが翻訳された命令を受け取って子プロセスが育生されるので~/.bashrcは 読み込まれない。 つまり、「サブシェルが起動する」というのはカレントシェルのプロセス上でデータ処理が行われる 訳ではないということを便宜的に説明するための「考え方」でしかないのか? と、以上までのような推測を立ててみました。 個人的にはこのように考えるとcronからのスクリプト実行でも環境変数を~/.bashrcから読み込ま ない事にも合点がいくのですが。。。 もっともcronプロセスはログインプロセスとは全くべつのプロセスなので環境変数で引き継ぐも なにもないのですがシェルが起動するということを中心に考えると、むぅ〜ん、という感じです。 どちらにせよ、~/.bashrcをシェルスクリプト実行時に起動させたければsourceすれば良いだけの ことですが、一般的な説明としてスクリプト実行には新たにシェルが起動しているという説明と ~/.bashrcが起動しない結果が自分の中で噛み合ないので質問させて頂きました。 psコマンドを使いこなせていれば良いのだろうなぁと思いつつ。いきなりの長文で失礼しました。 http://x68000.q-e-d.net/~68user/unix/pickup?keyword=%A5%B5%A5%D6%A5%B7%A5%A7%A5%EB&target=command |