1 名前:login:Penguin [2007/07/10(火) 23:17:13 ID:qGthZdME] UNIX板のスレを見ている方も多数おられるかと思いますが、 まあそれはそれとして、BASHウゼーとか言われる心配なく 平和にLINUX的スクリプト談義しましょうよ。 初めての自作スクリプト、自信ないから見てください。な初心者から トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで いろいろな人に参加して頂けると嬉しいです。 perlやらPythonやらの話が混ざっても良いんでない? 【sed】シェルスクリプト総合@LINUX Part2【awk】 pc11.2ch.net/test/read.cgi/linux/1154578200/ pc8.2ch.net/test/read.cgi/linux/1121994321/ >>2-5 あたりに色々と。
296 名前:login:Penguin mailto:sage [2007/11/10(土) 11:07:23 ID:vw7Wu+HW] マルチウインドウ端末エミュレータ支援ソフト西やら マルチウインドウ端末エミュレータ支援ソフト力石やら マルチウインドウ端末エミュレータ支援ソフトホセ=メンドーサやら知らん。
297 名前:login:Penguin mailto:sage [2007/11/10(土) 11:19:14 ID:9Zj/zooJ] >>296 一応ここでタオル投げときますね。つ〜
298 名前:login:Penguin mailto:sage [2007/11/10(土) 18:43:49 ID:Skjd8N2z] そういやこの間表参道歩いていたら、 胸にでっかく 「マンモス西」 と書かれたTシャツを着たガイジンが 前からいきなり歩いてきてビビった。 東京は怖い街だよ。
299 名前:login:Penguin mailto:sage [2007/11/10(土) 19:19:41 ID:PRddAKpB] そんなアナタに engrish.com/
300 名前:login:Penguin mailto:sage [2007/11/10(土) 20:24:35 ID:Skjd8N2z] そこのこの写真に、"Photo courtesy of Paul Gilbert"ってあるけど、 あのポールギルバートなんだろうか? ttp://www.engrish.com/detail.php?imagename=Hate.jpg&category=Clothing&date=2001-11-03 日本に住んでたしなあ。
301 名前:HhMiKdKNVb mailto:vyqkae@ndzhjf.com [2007/11/12(月) 01:38:17 ID:J0HpIKvZ] hlUotX <a href="jtpkztrjwlma.com/">jtpkztrjwlma</a>, [url=ykcooubrqrga.com/]ykcooubrqrga[/url], [link=tvapeckiqvbf.com/]tvapeckiqvbf[/link], cygdvmjubaqg.com/
302 名前:login:Penguin mailto:sage [2007/11/13(火) 02:33:43 ID:tnRwnYpT] 恥を忍んで質問なのですが /home/me/ 以下にjpgファイルが数千有ります 中身はこんな感じなのですが 1082053423922.jpg 1082053508305.jpg 1082053537535.jpg 1082053614971.jpg 1082053699948.jpg 1082053732609.jpg 1082053763346.jpg 1082391828601.jpg 1082392563669.jpg 1083091232922.jpg この数千の*.jpgのファイルをディレクトリから読み込んで以下タグの中にディレクトリから読み インクリメンタルに全ての画像ファイルがリンク代入された状態で出力したいと思っています <div id="myGallery"> <div class="imageElement"> <h3>Item 1 Title</h3> <p>Item 1 Description</p> <a href="mypage1.html" title="open image" class="open"></a> <img src="images/foo/a.jpg" class="full" /> <img src="images/foo/a-thum.jpg" class="thumbnail" /> </div> ディレクトリから読み込んだfileの名前a.jpgににファイルの中が無くなるまで 置換したいという意味なのですが.. どうか、助言願えないでしょうかm(__ __)m
303 名前:login:Penguin mailto:sage [2007/11/13(火) 07:47:54 ID:xB6HVDtO] まずは「この数千の……」以降の文章を推敲して他人に理解できるよう 書き換える。
304 名前:login:Penguin mailto:sage [2007/11/13(火) 10:11:50 ID:VZT+kd7x] >>302 zphoto でも使ったら?
305 名前:login:Penguin mailto:sage [2007/11/13(火) 12:34:27 ID:v1//zET/] こういうことか? for f in `ls -1 /home/me` ; do echo '<img src="images/foo/'$f'" class="full" />'; done for f in `ls -1 /home/me | gawk '{gsub("\\\.", "-thum.");print}'` ; do echo '<img src="images/foo/'$f'" class="full" />'; done
306 名前:302 mailto:sage [2007/11/13(火) 14:02:39 ID:tnRwnYpT] >>303 深夜に回転数が落ちていまして申し訳ないですm(_ _)m >>304 それも考えたのですが、出来ればこちらの方が良いなと思いまして.. >>305 バッチリ書き出せました、もの凄い感謝なのですが thumとthum無しのイメージが交互に書き出すことが出来ると思います 教えていただいた物を各ディレクトリに置き換えたものが以下の物なのですが for f in `ls -1 /www/web_dir/photo_album/images/foo/`; do echo '<img src="images/foo/'$f'" class="full" />'; done for f in `ls -1 /www/web_dir/photo_album/images/foo/ | gawk '{gsub("\\\.", "-thum.");print}'` ; do echo '<img src="images/foo/'$f'" class="full" />'; done 1行目と2行目を並べて出力できるように努力したのですが... gawkの部分で引っかかってしまいます、というか1行目しかループしてくれません(T.T) 補足いただければと思うのですが、よろしくお願いします マジ感謝感激です shell sciptとawkの本もamazonしようと思っています
307 名前:302 mailto:sage [2007/11/13(火) 14:19:58 ID:tnRwnYpT] もうちょっとで出来そう...
308 名前:302 mailto:sage [2007/11/13(火) 15:05:30 ID:tnRwnYpT] 出来ました ありがとうございましたm(__ __)m
309 名前:login:Penguin mailto:sage [2007/11/13(火) 15:14:48 ID:MuKLiZO1] 最終的にどうやりましたか? 報告して下さい。
310 名前:302 mailto:sage [2007/11/13(火) 15:32:02 ID:tnRwnYpT] ディレクトリを作りthumnail入れてこれで出力できました for f in `ls -1 /www/web_dir/photo_album/images/foo/`; do echo '<div id="myGallery">'; echo '<div class="imageElement">' echo '<h3>Item 1 Title</h3>' echo '<p>Item 1 Description</p>' echo '<img src="images/foo/'$f'" class="full" />'; echo '<img src="images/foo-thum/'$f'" class="full" />'; echo'</div>'; echo ' '; done
311 名前:login:Penguin mailto:sage [2007/11/13(火) 15:42:18 ID:MuKLiZO1] ちなみにサムネールは thumnail じゃなくて thumbnail ね。
312 名前:302 mailto:sage [2007/11/13(火) 16:02:23 ID:tnRwnYpT] はい、ありがとうございました^^
313 名前:login:Penguin mailto:sage [2007/11/13(火) 18:23:44 ID:v1//zET/] >>306 ls -1 /www/web_dir/photo_album/images/foo/ | gawk '{gsub("\\\.", "-thum.");print}' ここだけ実行するとどうなるの?
314 名前:login:Penguin mailto:age [2007/11/16(金) 18:50:01 ID:q8UeZNS0] ls -d /a/b/c/d/*/ のようにコマンドを打ち込むと /a/b/c/d/hoge1 /a/b/c/d/hoge2 /a/b/c/d/hoge3 のように出力が帰ってきますよね。この中から hoge1, hoge2, hoge3 の部分のみ、つまり ディレクトリ階層の一番深い部分のディレクトリ名 のみを得る為にはどうすれば良いのでしょうか?シェルスクリプト内で必要なのですが 分かりません。教えてください。 自分で調べた限りだと basename とか dirname がそれに近そうだったのですが、 ちょっと違うようです。他には見つけることが出来ませんでした。
315 名前:login:Penguin mailto:sage [2007/11/16(金) 18:54:10 ID:PPFIsM3H] >>314 > のように出力が帰ってきますよね。 いいえ。
316 名前:login:Penguin mailto:age [2007/11/16(金) 19:44:27 ID:q8UeZNS0] >>315 /a/b/c/d/hoge1 /a/b/c/d/hoge2 /a/b/c/d/hoge3 じゃなくて /a/b/c/d/hoge1/ /a/b/c/d/hoge2/ /a/b/c/d/hoge3/ の間違いでした。 このリストから hoge1, hoge2, hoge3を抜き出したい。 hoge1/ の最後の "/" も切り落としてしまいたいのですが、どうすれば良いでしょうか?
317 名前:login:Penguin mailto:sage [2007/11/16(金) 19:51:40 ID:PPFIsM3H] >>316 sed なり awk なりで切り出せると思うけど、 最初から find /a/b/c/d -mindepth 1 -maxdepth 1 -type d -printf "%f\n" とかじゃだめなん?
318 名前:login:Penguin mailto:sage [2007/11/16(金) 20:01:17 ID:gAB+KHmJ] >>316 for i in ls -d /a/b/c/d/*/; do basename $i; done
319 名前:login:Penguin mailto:sage [2007/11/16(金) 20:10:36 ID:PPFIsM3H] >>318 for i in `ls -d /a/b/c/d/*/`; do basename $i; done と言いたいんだろうが、 for i in /a/b/c/d/*/; do basename $i; done でいいな。 空白とか入ってなければ。
320 名前:login:Penguin mailto:age [2007/11/16(金) 20:14:17 ID:q8UeZNS0] >>317 レスありがとうございました。 しかしfindコマンドに詳しくない為自分ではよく分かりません。それ・・・。 >>318 レスありがとうございました。 こちらの方法はまさに私が求めていた方法です。非常に分かりやすくて助かります。 本当にありがとうございます。
321 名前:320 mailto:age [2007/11/16(金) 21:33:37 ID:q8UeZNS0] 解決したと思ったのですが、 ROOT=/a # ←ココは何でもいい、とにかくディレクトリ cd ${ROOT} for DIR in `ls -d ./*/` do for TARG in `basename ${DIR}` do echo ${DIR} echo "${TARG}" done done といった感じにしてみたのですが、 Venus7.0 Personal Edition といったディレクトリが Venus7.0 と Personal と Edition の3つに分割されてしまい、そのディレクトリに対して 処理したいのに3つの存在しないディレクトリに対して処理しようとする為、 no such file or directory エラーが次々と帰ってきました。 どうも ディレクトリ名に半角スペースが入っているのがダメなようです。解決策はありませんか? ちなみに全角スペースの場合は1つのディレクトリとして正常に動作しています。 for DIR in `ls -d ./*/` ←この部分で分断されてしまっていると思いますが for DIR in `ls -d ./"*/"` などと" " で囲んで見ましたが */ なんてディレクトリは見つからない と怒られました。 ' ' で囲んでも同じ結果です。どうしたら半角スペースをセパレータとして 認識するのを防げますか?
322 名前:login:Penguin mailto:sage [2007/11/16(金) 21:43:34 ID:lBcVe9Af] なんでそんなディレクトリがあるのか を考えたほうが根本的な解決になりそう
323 名前:login:Penguin mailto:sage [2007/11/16(金) 21:44:56 ID:PPFIsM3H] >>321 だから >>319 で言ったじゃん。 >>322 いや、あるときはあるでしょ。 そんなにおかしいことではない。
324 名前:login:Penguin mailto:sage [2007/11/16(金) 22:02:10 ID:lBcVe9Af] わざわざ_使ってる人の意味を考えよう >>321 は''の囲み方が間違ってるだけだが _があるのが普通って考えたほうが手間なくていい windowsがらみならwindowsでやったほうがいい
325 名前:320 mailto:age [2007/11/16(金) 23:35:30 ID:q8UeZNS0] >>322 ま、まぁ色々事情がありまして。あるんですよ。。。 >>323 >>319 の事かと思ってレスを投稿する前に確認したのですが、 for DIR in ./*/ do for TARG in `basename "${DIR}"` do echo ${DIR} echo ${TARG} done done で確認したところ 変数DIRには正しく取れました。 しかし `basename "${DIR}"` としているにも関わらず 元ディレクトリ名 AVG Anti-Virus Free Edition 7.3 実行結果 AVG Anti-Virus Free Edition 7.3 とこのように分断されてしまいます。 " " で囲っているにも関わらず、です。 何がいけないのでしょうか?
326 名前:login:Penguin mailto:sage [2007/11/16(金) 23:59:15 ID:2bsqELIP] #!/bin/sh LIST="\"space aaa\" \"bbb\" \"space ccc\" \"ddd\""; echo $LIST; # "space aaa" "bbb" "space ccc" "ddd" func(){ echo "arg= $#"; #6 echo "$1"; # space echo "$2"; # aaa echo "$3"; # bbb echo "$4"; # space echo "$5"; # ccc echo "$6"; # ddd } func $LIST; 上のようなスクリプトで func には、"space aaa" みたいにスペースの入った引数を渡したいんですが、 なにか方法はないでしょうか? この場合funcにわたす引数を4つにしたいんです。 展開されて、引数が6つになってる。。。素人ですません。
327 名前:login:Penguin mailto:sage [2007/11/17(土) 00:44:46 ID:X3VLuMy8] >>325 for TARG in `basename "${DIR}"` -> for TARG in AVG Anti-Virus Free Edition 7.3
328 名前:login:Penguin mailto:sage [2007/11/17(土) 07:31:23 ID:FrK+lOPY] >>326 $LIST をクォートする。
329 名前:login:Penguin mailto:sage [2007/11/17(土) 08:31:04 ID:tPTtgwaW] >>328 これだけで良かったんですね。 3時間くらい悩んでたよ。d
330 名前:login:Penguin mailto:sage [2007/11/17(土) 09:32:44 ID:X3VLuMy8] つeval
331 名前:320 mailto:age [2007/11/17(土) 10:54:12 ID:oelt9+66] >>327 レスありがとうございます。 そうなんですよ、そんな風に展開されてしまうんですよ。 ${DIR} だけを出力しても ./AVG Anti-Virus Free Edition 7.3 となるのに "${DIR}" とダブルクォートで囲っても ./AVG Anti-Virus Free Edition 7.3 と全く同じ出力になってしまう。つまりダブルクォートが利いてない・・。 だからそれをどうすれば1つの文字列として扱えるのですか?空白を区切りとしないようにする為には・・・。
332 名前:login:Penguin mailto:sage [2007/11/17(土) 12:01:58 ID:dajSe2oX] >331 basename の結果が正しいんだからダブルクォートは効いてるだろ? その後、`` で置き換えた時には既に "${DIR}" とは無関係の文字列なんだから 直書きされてるのと同様に空白で分割されてるだけ。 あえて書くなら for DIR in ./*/ do BASE=`basename "${DIR}"` for TARG in "${BASE}" do echo ${DIR} echo ${TARG} done done っていうか、なんで 2 段で for を回す必要があるのか。
333 名前:login:Penguin mailto:sage [2007/11/17(土) 12:23:43 ID:dh2GLbwy] >>331 バッククォート内はコマンドの出力に置き換えされるんだから、その出力を クォートすればいい。 for TARG in "`basename "${DIR}"`" っていうか、なんで 2 段で…
334 名前:320 mailto:age [2007/11/17(土) 22:43:03 ID:oelt9+66] >>332-333 な、なるほど・・・・ お二人の解説文を10回ほど読み直しながらじっくり考えてみた所、ようやく理解できました。 特に "`basename "${DIR}"`" はややこしくて 最初は何をかいているのだろうかと思いましたが `basename "{DIR}"` の出力結果そのものを " " で囲っているわけですね。なるほどなるほど。 う〜ん、これは思いつかない・・・。発想力ですか・・・。 で、2段でfor回していますが、確かに冷静に考えると2段で回す必要はありませんね・・・。 むしろ2段で回す処理にしている事で複雑化してしまった感があります。 1段forでいけそうです。
335 名前:login:Penguin mailto:sage [2007/11/23(金) 15:28:58 ID:P7OyMgNI] >326です。 拡張が必要になり、問題が増えました。 #!/bin/sh echo $LIST; # "aaa aaa" "bbb" "ccc ccc ccc" "ddd" func(){ 〜処理〜 } func "eee eee" "fff fff" "$LIST" "ggg ggg"; 以下のようにfuncにスペースを含んだ形で ${LIST}とその他の値を同列に引数として渡したいのです。 ↓funcに渡したい引数 "eee eee" "fff fff" "aaa aaa" "bbb" "ccc ccc ccc" "ddd" "ggg ggg" >>328 >>330 にあったように eval func で展開すると LIST以外の引数がスペースで展開されてしまいます。 LIST以外の引数を "eee\ eee" とか"\"eee eee\""とする手で回避も可能ですが、 修正箇所が増えるので、極力この形は取りたくありません。 なにか方法はありませんか?
336 名前:login:Penguin mailto:sage [2007/11/23(金) 22:55:10 ID:rrMjYG9S] Σ^)/アホーアホー☆ミ-
337 名前:login:Penguin mailto:sage [2007/11/23(金) 23:18:09 ID:OSmgQwJo] uniqはsortしておかないとだめですが、 sortしなくても2回目意向の重複を削除するコマンド内ですか?
338 名前:login:Penguin mailto:sage [2007/11/23(金) 23:25:42 ID:KoVu18yL] some | command | perl -ne 'print unless $seen{$_}++'
339 名前:login:Penguin mailto:sage [2007/11/24(土) 02:54:03 ID:Qc2k01yB] >>335 func をスペースを分割しないで処理するようにして、 func に渡す前に "$LIST" だけ分割しちゃえば良いんじゃないの?
340 名前:login:Penguin mailto:sage [2007/11/24(土) 13:44:38 ID:3ItHeK84] >>338 おおおお、できました。ありがとうございました。
341 名前:login:Penguin mailto:sage [2007/11/24(土) 15:57:48 ID:uBYpiRKV] From - Fri Nov 20 14:53:45 2007 From: "Jfda dsadsada" <fdsfdsa@thdsadaer.de> From - Fri Nov 21 14:53:45 2007 From: "rwerw dfsa" <sfdaf@fdfds.com> From - Fri Nov 23 14:53:45 2007 From: "a bcd" <d@dfds.com> From - Fri Nov 23 14:53:46 2007 From: "abc" <abc@abc.net> このようなテキストの中から、日付に対応したアドレスだけをテキストに出力するにはどうしたらいいのでしょうか? 11月20日が指定されたらfdsfdsa@thdsadaer.deを出力 11月23日が指定されたらd@dfds.comとabc@abc.netを出力といった具合です
342 名前:login:Penguin mailto:sage [2007/11/24(土) 16:23:59 ID:bvlPAES0] grep -A1 "Nov 20" | grep -o "<.*@.*>"
343 名前:login:Penguin mailto:sage [2007/11/24(土) 17:59:39 ID:z00X8bIQ] >>339 それが出来れば良いんですが、 できないのです。方法ありますか? func内で echo $3; した場合。 func "eee eee" "fff fff" "$LIST" "ggg ggg"; echo $3 → "aaa aaa" "bbb" "ccc ccc ccc" "ddd" 当然のように、LIST全体が一つの引数に、、、 以下のようにクォートをなくすと func "eee eee" "fff fff" $LIST "ggg ggg"; echo $3 → "aaa LIST内のスペースで、分解されてしまいます。 $3 に "aaa aaa" を渡したいのに、、、
344 名前:login:Penguin mailto:sage [2007/11/24(土) 22:04:52 ID:DnopHw8N] 無理にシェルで書くより perl かなんか使った方がいいんじゃね。 適材適所。
345 名前:login:Penguin mailto:sage [2007/11/24(土) 22:28:40 ID:bmHXinLt] eval set $LIST func "eee eee" "fff fff" "$@" "ggg ggg"
346 名前:login:Penguin mailto:sage [2007/11/25(日) 17:46:10 ID:ex492j4k] >>345 これだ! こんなトリッキーな手法もあるんですね。 奥が深い。ありがとうございました。
347 名前:login:Penguin mailto:sage [2007/11/25(日) 22:12:54 ID:nNUo7Vyu] >>342 ありがとうございました
348 名前:login:Penguin [2007/11/28(水) 16:44:21 ID:lxwXbk7L] 特定のディレクトリ以下にあるディレクトリ名を検索し そのディレクトリの中にファイルがあった場合のみ変数にディレクトリ名を追加する。 という処理をしたいと考えています。 LIST=`find 特定のディレクトリ -maxdepth 1 -mindepth 1 -type d` 上記のコマンドでディレクトリ一覧は取得できたのですが 取得したディレクトリ一覧の中にファイルがあるかどうかの条件設定方法がわかりません ご教授ください
349 名前:login:Penguin mailto:sage [2007/11/28(水) 16:51:01 ID:hjQ8uHjr] >>348 GNU の find なら ! -empty で。
350 名前:348 mailto:sage [2007/11/28(水) 17:14:26 ID:lxwXbk7L] >>349 レスありがとうございます。 LIST=`find 特定のディレクトリ -maxdepth 1 -mindepth 1 -type d ! -empty` 上記のコマンドで無事に条件を満たすことが出来ました。 感謝です><
351 名前:login:Penguin mailto:sage [2007/11/30(金) 01:52:45 ID:vbHro4B7] 1 A 1 B 1 C 2 P 2 Q 3 X 3 Y 3 Z ... のような入力を 1 A B C 2 P Q 3 X Y Z ... のように整形する簡単な方法はありますか?
352 名前:login:Penguin mailto:sage [2007/11/30(金) 02:21:47 ID:8mp/o88K] awk '{h[$1] = h[$1] " " $2} END { for (key in h) print key h[key] }' < input | sort
353 名前:login:Penguin mailto:sage [2007/11/30(金) 13:45:29 ID:zEAz9Kgp] >>352 惚れた
354 名前:login:Penguin mailto:sage [2007/12/01(土) 01:13:52 ID:285rAG3t] inputをリダイレクトしているのがイヤ。
355 名前:login:Penguin mailto:sage [2007/12/01(土) 01:27:18 ID:aR34EpD+] awkはファイル名を引数に取れるんだな。 パイプでしか使った記憶がなく、素で知らなかった。
356 名前:login:Penguin mailto:sage [2007/12/01(土) 11:59:35 ID:lphCOL1Q] むしろパイプでしか使えないコマンドの名前を パッと挙げろという方がむつかしいだろ
357 名前:login:Penguin mailto:sage [2007/12/01(土) 12:16:31 ID:z08ppphA] オプションの引数という形もない、というものはだいぶ少ないね
358 名前:login:Penguin mailto:sage [2007/12/01(土) 19:59:33 ID:aR34EpD+] とっさに出てきたのは tr
359 名前:login:Penguin mailto:sage [2007/12/01(土) 21:03:16 ID:z08ppphA] MS-DOS 標準添付の SORT (.EXE か .COM か自身がない)
360 名前:login:Penguin mailto:sage [2007/12/01(土) 23:25:16 ID:+jVAJI5Z] MS-DOS 標準添付の MORE
361 名前:login:Penguin [2007/12/03(月) 14:25:58 ID:pB5IpK3Q] 複数のコマンドを実行してログを残したいのですが ( { command1 && command2 } > normal.log ) >& error.log で、標準出力と標準エラーをファイルにリダイレクトまではうまくいきました。 このエラー出力を、画面にも出すにはどんなふうに書くのでしょう? ttp://x68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8 ちなみに、ここまではこの辺を参考にさせていただきました。 お願いいたします。
362 名前:login:Penguin mailto:sage [2007/12/03(月) 14:26:53 ID:pnpsuBAG] >>361 tee
363 名前:login:Penguin [2007/12/03(月) 15:02:26 ID:pB5IpK3Q] >>362 ありがとうございます できました。 最初に言ってたのとちょっと違うのですが、ようは、すべてログに保存して なおかつERRORの文字が入ってる行だけを画面に出力したかったので 2>&1 | tee file.log | grep ERROR でやりたいことができました。 いろいろ勉強になりました。サンクス。
364 名前:login:Penguin mailto:sage [2007/12/03(月) 16:10:39 ID:+7LXyEUm] コマンドラインとGUIを融合するHotwire opentechpress.jp/developer/article.pl?sid=07/12/03/0133253
365 名前:login:Penguin mailto:sage [2007/12/03(月) 16:33:46 ID:CJjSSdo9] >>364 面白そうだけど、記事の中に具体的な画像が欲しいね・・・・
366 名前:login:Penguin mailto:sage [2007/12/03(月) 16:43:39 ID:pm3xTTNy] >>365 code.google.com/p/hotwire-shell/wiki/Screenshots
367 名前:login:Penguin mailto:sage [2007/12/03(月) 17:31:20 ID:BNt6sl0D] >>366 画像が表示されないのは、送ってくるContent-Typeがおかしいのか。 なんでapplication/octet-streamやねん。
368 名前:login:Penguin [2007/12/04(火) 22:59:48 ID:Bpu7L1AF] ややスレ違いだが、くだ質よりこっちかなと シェルスクリプトの本を買う際に、Linuxユーザーでbashメインで使ってるなら 主旨がbash向けのものを買うべきですか? それともB shell全般向けやsh向けでbashは補完程度の本でも質の高いものを買うべきでしょうか 両シェルの間にそれほど機能、性格の差はなさそうだし
369 名前:login:Penguin mailto:sage [2007/12/04(火) 23:06:21 ID:0gQg9Z1k] bashismって言葉があるくらいで、ついついbashの機能を使ってしまうことは多い。 素のBourne Shellの機能がどこまでなのか書いてある本がいいと思う。
370 名前:login:Penguin mailto:sage [2007/12/04(火) 23:28:47 ID:Bpu7L1AF] >>369 サンクス sh向けでも最近の多くの書籍はbashもカバーしているようですので、その辺りを探してみます
371 名前:login:Penguin mailto:sage [2007/12/05(水) 11:12:29 ID:tDVDuECI] ttp://www.amazon.co.jp/dp/4774122610 そのへん意識するならこれいいかも。 SunOS の bsh と FreeBSD の bsh ( ash ) で違いがある場合についてまで 明記されてる。
372 名前:login:Penguin mailto:sage [2007/12/05(水) 21:59:53 ID:KlliiKVC] >>371 その本と、「UNIXシェルスクリプトコマンドブック 山下 哲典」を最後に候補にしてましたが、後者を買いました。 sh、bash共用でサンプルが多いので。
373 名前:login:Penguin [2007/12/06(木) 18:06:51 ID:ltYfbiEn] いつも複合条件式でまるんですけど #!/bin/bash WAITSEC="" if [ -z "$WAITSEC" -o $WAITSEC -lt 60 ]; then WAITSEC=10 fi を実行すると ./hoge.sh: line 3: [: too many arguments というエラーになります。-oとか-aで記述するifは今まで何回かやったのに 一度もできた記憶が無い!!。結局ifを分けたりして対処してきた負け人生です。 いったい何が悪いというのでしょうか?? 教えていただけますか?
374 名前:login:Penguin mailto:sage [2007/12/06(木) 18:31:24 ID:bgO18Eza] 確かにbashだとなるねぇ。zshだとならんから気づかなかったw #!/bin/bash WAITSEC=$1 if [ -z "$WAITSEC" ] || [ $WAITSEC -lt 60 ]; then WAITSEC=10 fi echo $WAITSEC とりあえずこれで。
375 名前:login:Penguin mailto:sage [2007/12/06(木) 18:35:40 ID:bgO18Eza] と、思ったら出来たw if [ -z "$WAITSEC" -o \( $WAITSEC -lt 60 \) ]; then こういうことだな。 優先順位がおかしいんだ。
376 名前:login:Penguin mailto:sage [2007/12/07(金) 00:20:04 ID:2WlU8Mqa] >>373 -z "$WAITSEC" の成否にかかわらず $WAITSEC -lt 60が実行されちゃってるから問題なんじゃないか? おそらく -z "$WAITSEC"のときは 後ろの条件は 「-lt 60」になるだろうから、>>374 のようにするか${WAITSEC:-0}とかやったらいいんじゃね?
377 名前:login:Penguin mailto:sage [2007/12/07(金) 10:01:03 ID:uKkYmJTB] >WAITSEC="" なので、 >if [ -z "$WAITSEC" -o $WAITSEC -lt 60 ]; then は if [ -z "" -o -lt 60 ]; then と解釈されてエラー。 zsh は sh と違って $WAITSEC は "$WAITSEC" と同じ意味なのでエラーにならない。 "$WAITSEC" -lt 60 と書き換えた場合は、 >-z "$WAITSEC" の成否にかかわらず $WAITSEC -lt 60が実行されちゃってるから問題なんじゃないか? この理由で正しい。
378 名前:login:Penguin mailto:sage [2007/12/11(火) 22:53:04 ID:8t30b6aC] シェルスクリプトにコメントを書くには # comment っていう感じに # を行頭につけてコメントにしますが、自作のシェルスクリプト等に 日本語でコメントを埋め込むのは良くない事なのでしょうか? 英語でコメントを埋め込むべきなのでしょうか? 理由>環境によっては文字化けするかもしれないから その場合、英語では上手くコメントがかけないのですが、、、皆さんはこの辺どうしていますか?
379 名前:login:Penguin mailto:sage [2007/12/11(火) 23:22:06 ID:8VUAk6YG] >>378 英語では上手くコメントがかけない、って、自分が書いた自分用のスクリプトだったら、 べつに、自分にさえ分かればいいんじゃないの?極端な話、ローマ字で書いた日本語でもいいんじゃないかと。
380 名前:login:Penguin mailto:sage [2007/12/11(火) 23:27:45 ID:LcSZkVoI] Shift_JISで書いて2バイト目に ¥ が含まれるとコメントが継続しちまうかな、 と思ったんだが、そうでもないみたいだな。
381 名前:login:Penguin mailto:sage [2007/12/12(水) 08:33:10 ID:itajSrlG] >>379 いやー、他の人にもスクリプトの内容が分かるようにコメント書かないといけない場合はどうすれば? 今はローマ字で書いたりしていますが、さすがに見にくいというか・・・ かといって英語では上手くかけないし・・ C言語やJava等では // 日本語コメント が使えるし MS-DOSの.batファイルでも REM 日本語コメント が使える、Windows Script Hosting(WSH)であっても '日本語コメント が使えて、大抵のスクリプト言語は日本語のコメントが使えるのになぜにLinuxのシェルスクリプト だけこんな事で悩まないといけないんだろうと・・・。 まぁOSが違うから文字コード周りのトラブルなんだろうけど・・。
382 名前:login:Penguin mailto:sage [2007/12/12(水) 09:12:34 ID:fnWAKO+5] 使えるか使えないかっていうなら使えるだろ。 確実に自分しか使わないならShift_JISのようなbrain damagedな文字コードじゃなきゃ 別に何でもいいんじゃない。 しかし使ってよいか使わざるべきかというと、一般にスクリプトって どのロケールで実行されるかわからないよとかの問題が出てくる。 あなたが出した例ではCやJavaのソースファイルはコンパイルするときの 環境が限定できれば問題ないし、DOSのバッチファイルも日本語DOSしか 考えていない。
383 名前:login:Penguin mailto:sage [2007/12/12(水) 11:25:06 ID:ytRjAEEx] >Shift_JISで書いて2バイト目に ▼ が含まれるとコメントが継続しちまうかな、 sjis だろうが何だろうがコメントの継続なんてありません。 >しかし使ってよいか使わざるべきかというと、一般にスクリプトって >どのロケールで実行されるかわからないよとかの問題が出てくる。 コメントにロケールなんて関係ありません。
384 名前:login:Penguin mailto:sage [2007/12/12(水) 11:32:57 ID:11rQvfIz] 英語くらい書けよ。
385 名前:login:Penguin mailto:sage [2007/12/12(水) 12:33:25 ID:5zz/Y7Bm] っつか、どういう環境(=人間環境)だか知らないけど、 そんな雰囲気だと、頑張って英語でコメントを書いても、 肝心の「他の人」が、それを理解出来ない、 ということが容易に想像出来てしまうわけで、 だったらローマ字でいいじゃん、と思う。
386 名前:login:Penguin mailto:sage [2007/12/15(土) 11:57:10 ID:FOfJjZuV] >>383 コメントってのは実行されるときはロケール関係ないけど 元々読むものだから、ロケールばらばらと読みにくくて困るよね って意味だよ。たぶんね。
387 名前:login:Penguin mailto:sage [2007/12/19(水) 22:19:06 ID:qeHYVBDH] #!/bin/bash for i in *.txt で、'*.txt' で展開されるリストの長さに制限はある? ls: argument list too long になる長さでも処理できるようだが、他に何か別の制限はある?
388 名前:login:Penguin [2007/12/20(木) 18:50:14 ID:Qtkk7tpx] sedについての質問です aaa bbb ccc という出力を、sedコマンドで一行にしたいのです。 aaa bbb ccc このように。 どうしたらよいですか。 逆の、sed -e 's/\ /\n/g' はできるのですが。
389 名前:login:Penguin mailto:sage [2007/12/20(木) 21:20:24 ID:1r8qT2Sh] awkなら $ (出力するコマンド) | awk '{printf("%s ", $0)}' でできるんだけどなぁ
390 名前:login:Penguin mailto:sage [2007/12/20(木) 21:47:48 ID:p9kMPhFx] $ cat input aaa bbb ccc $ sed -n 'H;${g;s/¥n/ /g;s/^ //p;}' input なんか無様だ。きっともっとスマートに出来るに違いない。
391 名前:login:Penguin mailto:sage [2007/12/20(木) 21:49:27 ID:p9kMPhFx] もし各行が空白文字を含まないなら、 echo `cat 元テキスト` > 新テキスト でいいな。
392 名前:login:Penguin mailto:sage [2007/12/20(木) 22:14:22 ID:IRXLh3Ok] >>388 sed ':loop; N; s/\n/\ /g ;$!b loop' hoge
393 名前:login:Penguin mailto:sage [2007/12/20(木) 22:19:20 ID:UDgG5/dT] sedにこだわらなければ tr -s '\n' ' ' < input とか
394 名前:login:Penguin mailto:sage [2007/12/20(木) 22:28:20 ID:p9kMPhFx] 目的によっては、 $ fmt input fmtってUNIX標準?
395 名前:login:Penguin mailto:sage [2007/12/20(木) 22:39:06 ID:Qtkk7tpx] >>389-393 こんなにレスが来るとは。 皆さんありがとうございます。 すべて試してすべてで出来ました。 echoとtrはなるほどという感じです。 他は知りませんでした。レベル1アップですね。
396 名前:login:Penguin mailto:sage [2007/12/20(木) 22:43:02 ID:Qtkk7tpx] >>394 更新遅れた。 できました。オプションすらいらないとは。