1 名前:login:Penguin mailto:sage [2008/05/17(土) 13:44:57 ID:9hFWtCOD] UNIX板のスレを見ている方も多数おられるかと思いますが、 まあそれはそれとして、BASHウゼーとか言われる心配なく 平和にLINUX的スクリプト談義しましょうよ。 初めての自作スクリプト、自信ないから見てください。な初心者から トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで いろいろな人に参加して頂けると嬉しいです。 perlやらPythonやらの話が混ざっても良いんでない? Part3 : pc11.2ch.net/test/read.cgi/linux/1184077033/ Part2 : pc11.2ch.net/test/read.cgi/linux/1154578200/ Part1 : pc8.2ch.net/test/read.cgi/linux/1121994321/ >>2-5 あたりに色々と。
929 名前:922 mailto:sage [2009/03/10(火) 23:39:56 ID:ZRv0wOpe] >>924 コマンドの結果がファイル名として認識されました。 >>928 xargsなしで今はやっています。 メイク時の出力内容をVC方式に変換するために文字列を以下のように変換しています。 make debug 2>&1 | sed -e "s/:\([0-9][0-9]*\):/(\1):/g" | sed "s/[/]/\\\/g" | sed "s/^/c:\\\cygwin\\\home\\\\${USER}\\\\${PROJNAME}\\\source\\\/g" ただし、今の状態だとメイクが完了するまで出力がされないため、 メイクがどの程度進んでいるかの確認や、エラー/ワーニングにすぐ対応できないのです。 また、できれば2の出力だけをパイプに流したいのですが、方法はありますか? (1は普通に画面表示) イメージは make debug 2>( xargs -n 1 echo|sed 〜) です。 ちなみに コマンド|xargs -i echo {}|sed -e "s/〜 は c:\cygwin\home\ユーザ名\プロジェクト名\source\{} 出力された文字列 となり、うまくいきませんでした。 # echo "{} 文字列" と認識された?
930 名前:login:Penguin mailto:sage [2009/03/11(水) 02:34:25 ID:LOMFWb0Z] >>929 xargs -iの後の{}は'{}'みたくエスケープしないとダメなんじゃないの?
931 名前:login:Penguin [2009/03/11(水) 08:59:36 ID:DFgGOxJ9] Windows PowerShellはOOなのに シェルスクリプトはOOじゃないんだよね 時代遅れだね
932 名前:login:Penguin mailto:sage [2009/03/11(水) 14:33:02 ID:Z5TO7Bpy] >>929 >211 sed -u 〜
933 名前:login:Penguin mailto:sage [2009/03/11(水) 21:43:30 ID:bm/c4JTk] >>931 死ぬほど使いにくいけどな。WindowsPowerShell。
934 名前:login:Penguin mailto:sage [2009/03/11(水) 22:32:39 ID:q2e6tqEw] つか、オブジェクト指向が反省されている今になって、何を時代錯誤な事を言ってる人なんだ。
935 名前:login:Penguin mailto:sage [2009/03/13(金) 11:15:15 ID:6BZk1deA] c++やjavaのoopはあまり良いものではないからね。 特にjavaでしかoopを知らない人って、なんでもかんでもオブジェクト にしてしまうだろうし、あれは非効率的なんだよね。 oopも使えるというならそれはそれでいいけどシェルスクリプトの延長線上 にrubyやperlがあるから、oopに拘るならばそっちを使えばいいだけのはなしだよね。
936 名前:login:Penguin mailto:sage [2009/03/18(水) 18:33:49 ID:RWYXndAF] くだ質の763に、du -hの結果をサイズ順にソートしたいってのがあった。 $ df -h 20K ./foo 8.0K ./bar 5.1M ./hoge 元質問者は勘違いってことで解決してるんだけど、これをカッコよく1 linerで実現する方法はあるんだろうか? 置換して〜ソートして〜とか、泥臭い方法しか思いつかない...
937 名前:login:Penguin mailto:sage [2009/03/19(木) 00:49:00 ID:Ex8kaKKQ] >>936 -h外して後で1024の倍数掛ければいい
938 名前:login:Penguin mailto:sage [2009/03/19(木) 01:30:46 ID:1vjKEAU9] 俺もそう思うけど、 >>936 が話題にしているのは、たぶんdfに限らず、単位を接尾辞とした小数数字を如何にsortするかじゃないかな。
939 名前:login:Penguin mailto:sage [2009/03/19(木) 01:33:02 ID:VEb9NHr7] そーじゃなくて>>936 の出力をソートするスクリプトがあるか、だろう おれも置換したりしないと出来値
940 名前:login:Penguin mailto:sage [2009/03/19(木) 01:34:48 ID:gobNSPAB] >>937 -hは前提条件でお願い。します。
941 名前:login:Penguin mailto:sage [2009/03/19(木) 01:36:54 ID:dcED7bZL] しかしdu -h も微妙なコマンドだな KつきMつきで見たいやつが大半だろうにソートもできるようにしてくれよって気が
942 名前:login:Penguin mailto:sage [2009/03/19(木) 03:20:47 ID:yCb470li] bashで引数が0-9の間ならダンプレベルに設定しようとしています if [ -n $1 ]; then if [ $1 -ge 0 -a $1 -le 9 ]; then dlevel=$1 fi fi これを実行すると引数が無いときと 引数が数字以外のときにエラーメッセージが出てしまいます 引数が数値かどうかチェックする方法がないでしょうか? よろしくおねがいします $ ./dump.sh ./dump.sh: line 22: [: too many arguments $ ./dump.sh 3 dlevel=3 期待通りの動き $ ./dump.sh fufufu ./dump.sh: line 22: [: fufufu: integer expression expected
943 名前:login:Penguin mailto:sage [2009/03/19(木) 04:02:43 ID:3RRVnfG+] if [ -n "$1" ]; then if expr "$1" : '[0-9][0-9]*$'; then
944 名前:login:Penguin mailto:sage [2009/03/19(木) 04:04:43 ID:M6oJqh1N] case "$1" in [0-9]) dlevel="$1" ;; esac
945 名前:login:Penguin mailto:sage [2009/03/19(木) 04:57:28 ID:yCb470li] >>943 , 944 どうもありがとうございます caseの方を採用させていただきました
946 名前:login:Penguin mailto:sage [2009/03/19(木) 13:59:30 ID:KDP/tv8i] >>937-941 やぱしそれなりに泥臭いやり方しかないですかね? 最初、sortはバッファサイズ変更時に GBとかMBとか見てくれるんだからきっと、とか思ったのに。
947 名前:login:Penguin mailto:sage [2009/03/19(木) 14:48:56 ID:+WS3QA7Q] -h 外せば済む話なのに 苦労してスクリプト書く意味がわからん。
948 名前:login:Penguin mailto:sage [2009/03/19(木) 15:44:21 ID:VEb9NHr7] 目的が「duの結果をソートしたい」じゃなくて「このテキストを(意味を考えて)ソートしたい」だと何度(ry
949 名前:login:Penguin mailto:sage [2009/03/19(木) 15:54:38 ID:QnAt/IUj] >>948 dfかduかはっきりしてくれ。duならxduをつかっとけ。MやGよりも視覚的にサイズを 表現してくれた方が分かりやすい。もちろんソートできる。
950 名前:login:Penguin mailto:sage [2009/03/19(木) 19:05:34 ID:KDP/tv8i] >>949 元質問はオレなんだが、>>948 のとおり、別にduでもdfでもなく、GとかMとかのサイズ指定で かつ小数点付きのを、どうソートするか、というのが意図だったわけで。 質問の仕方がまずいのは認める。すまん。
951 名前:login:Penguin [2009/03/20(金) 10:34:47 ID:OD1Bm4W7] シェルスクリプトで開発したツールをshcでコンパイルしたとして、 それがシェルスクリプトだとバレることってありますか? もちろん調べればわかるでしょうけど 一般的なエンドユーザの能力ではどうでしょうか?
952 名前:login:Penguin mailto:sage [2009/03/20(金) 11:49:16 ID:vtofDqpI] >>951 つ chmod 311 a.out
953 名前:login:Penguin mailto:sage [2009/03/20(金) 21:45:28 ID:Pky/qqR2] tar
954 名前:login:Penguin mailto:sage [2009/03/20(金) 21:46:03 ID:Pky/qqR2] tar tvf filename.tar の結果をファイル名順にソートするにはどうすればいいでしょうか?
955 名前:login:Penguin mailto:sage [2009/03/20(金) 21:54:15 ID:vtofDqpI] sort -k 6
956 名前:login:Penguin mailto:sage [2009/03/20(金) 22:29:18 ID:Pky/qqR2] >>955 ありがとうございます。以下で出来たと思います。 tar tvf filename.tar | sort -k 6 ファイル名が9番目に来ることがあるのは、OSによるものでしょうか?
957 名前:login:Penguin mailto:sage [2009/03/20(金) 22:30:46 ID:vtofDqpI] ロケール依存じゃね? 日付の表示
958 名前:login:Penguin mailto:sage [2009/03/20(金) 22:45:25 ID:Pky/qqR2] >>957 なるほど、ありがとうございます。 当初の質問とズレますが ls -lRのディレクトリ名が 職場の環境では temp: となり 自宅では ./temp: となるのもロケール依存の問題でしょうか?
959 名前:login:Penguin mailto:sage [2009/03/20(金) 23:54:41 ID:vtofDqpI] ls -lR temp ls -lR の違いって事はない?
960 名前:login:Penguin mailto:sage [2009/03/21(土) 10:08:06 ID:/JVnxKfV] >>959 引数にディレクトリを指定せずに>>958 の違いがでます。 OSは職場がAIXで、自宅がCentOSです。 結果のリストをテキストファイルに出力してプログラムで利用しているので、 フォーマットが違うと問題があるのですが、 行末に「:」があればディレクトリと認識したり、リストのフォーマットに応じたプログラムを 書けばいいのかなと思います。 親切にありがとうございました。
961 名前:login:Penguin mailto:sage [2009/03/21(土) 13:39:10 ID:ZdP11rWE] AIXならコードベースが違うから、細かい書式も違うだろうね。 find . -printあるいはfind . -lsの結果を利用した方がいいかもね。 こっちは加工されることを前提とした出力だから。 ls -lRはそうじゃない。
962 名前:login:Penguin [2009/03/24(火) 21:43:58 ID:vhkRQKv/] bash で、複数の戻り値を返すにはどうやる? func foo() { return VAL1 VAL2 } (VAL1, VAL2)=$(foo) こんなのがやりたいんだけど。 今まで思いついた例では、 1、ファイル経由で帰す。 echo $VAL1 >/tmp/$PID.val1 echo $VAL2 >/tmp/$PID.val2 可能だけどちょっと無駄。 2、readをつかう。 #!/bin/bash $(foo) | read VAL1 VAL2 やってみたけど、動かない。なんとかしてくれ!。
963 名前:login:Penguin mailto:sage [2009/03/24(火) 22:07:39 ID:fdZEc0lM] returnで返すことにこだわる意味があるん? VAL1 VAL2 に関数内で値つっこめばいいだけじゃないの? グローバル変数がどうのとか、シェルで気にする必要ないだろと個人的に思うし。
964 名前:login:Penguin mailto:sage [2009/03/24(火) 22:13:47 ID:JcSO3hFa] >>962 ttp://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html >関数ローカルの変数は、組み込みコマンド local で宣言できます。 >普通は、変数とその値は関数とその呼び出し側で共有されます。
965 名前:962 [2009/03/24(火) 23:09:01 ID:vhkRQKv/] グローバル変数で受け渡し? んまあそうなんですけど、 なんでもグローバルという、BASIC言語みたいなのは生理的にイヤ。 可能な限り普段から全部 local 宣言つけてますので。 なんとか、return VAL_A VAL_B とかムリっすか?
966 名前:login:Penguin [2009/03/24(火) 23:27:22 ID:JcSO3hFa] >>965 無理 > return [n] > 指定した返り値 n で関数を終了させます。 > n を省略すると、返却ステータスは関数内で最後に実行したコマンドの返却ステータスになります。 スクリプトを分けて標準入出力で受け渡すくらいしか思いつかん
967 名前:login:Penguin mailto:sage [2009/03/24(火) 23:31:50 ID:elKnmt6d] 俺も昔戻り値二つ返したかったが諦めたことがある。 泣く泣くグローバルにした。
968 名前:login:Penguin mailto:sage [2009/03/24(火) 23:32:20 ID:LPmFGK87] >>965 無理矢理だけどこんなことは出来る。 foo () { echo "$VAL1 $VAL2" } VALS=(`foo`) VAL1=${VALS[0]} VAL2=${VALS[1]}
969 名前:login:Penguin mailto:sage [2009/03/25(水) 12:00:35 ID:ZZ2mmRGj] グローバル変数がイヤならばそもそも sh じゃなくて別のスクリプト言語で書け。 そういう言語なんだからあきらめて受け入れろ。 無理に技巧をこらしたところで逆に可読性を落とすだけ。
970 名前:login:Penguin mailto:sage [2009/03/25(水) 12:15:44 ID:NaCjRRoe] >>969 そうおもう。perlでもrubyでもgaucheでもいいから。 でも、延長線上で使えるrubyのほうが馴染みやすいかも
971 名前:login:Penguin mailto:sage [2009/03/25(水) 12:23:07 ID:uD+uLQB8] >>962 > return VAL1 VAL2 < echo VAL1 VAL2 してreadしる
972 名前:login:Penguin mailto:sage [2009/03/25(水) 17:28:54 ID:GtIifwrA] /tmpに書け
973 名前:login:Penguin mailto:sage [2009/03/26(木) 15:32:50 ID:3e22XvSN] シェルスクリプトを始めて勉強するのですが、 入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界(www.amazon.co.jp/dp/4797321946 ) と UNIXシェルスクリプトコマンドブック(www.amazon.co.jp/dp/4797330635 ) どちらで勉強するのが良いでしょうか?
974 名前:973 mailto:sage [2009/03/26(木) 15:33:45 ID:3e22XvSN] ×始めて ○初めて orz
975 名前:login:Penguin mailto:sage [2009/03/26(木) 16:30:55 ID:5RpvIQgk] 入門bashがオヌヌメ
976 名前:login:Penguin mailto:sage [2009/03/27(金) 00:19:45 ID:hx4pY+SP] どれでもいっしょでヌメヌメ
977 名前:login:Penguin mailto:sage [2009/03/27(金) 01:38:27 ID:SSuQKmC1] >>976 >>975 ありがとうございます。 まずは>>975 さんにヌメヌメして頂いた入門Bashから勉強していきたいと思います。
978 名前:login:Penguin mailto:sage [2009/03/27(金) 02:32:52 ID:3RSixa0K] つ「全部」
979 名前:login:Penguin mailto:sage [2009/03/29(日) 04:23:46 ID:k6vYgSJE] とあるディレクトリ以下に存在する 特定の拡張子のファイルのみについてファイルサイズの合計を知りたい場合、 最もマシンに負荷を与えずに結果を出すにはどの方法が適しているでしょうか? ・ duコマンドだと除外パターンのパラメータしかない ・ lsの結果の拡張子でgrepした後、ファイルサイズ部分をawkしてexprで足し算だと負荷が結構かかる という感じで、もっとサクっと結果を軽い処理で出せるような気がするんですが・・・。
980 名前:login:Penguin mailto:sage [2009/03/29(日) 05:38:56 ID:RIZc4nP9] findとawkで
981 名前:login:Penguin mailto:sage [2009/03/29(日) 07:07:03 ID:HsEQt0tU] >・ lsの結果の拡張子でgrepした後、ファイルサイズ部分をawkしてexprで足し算だと負荷が結構かかる expr要るのか? ls -Rl | grep "\.suffix" | awk '{size += $5} END {print "total " size}' find -name \.suffix -printf "%s\n" | awk '{size += $1} END {print "total " size}'
982 名前:login:Penguin mailto:sage [2009/03/29(日) 15:49:16 ID:HhnBqalt] >-name \.suffix o... rz
983 名前:login:Penguin mailto:sage [2009/03/30(月) 08:01:30 ID:4/oTu4d/] 10台くらいサーバセットアップする必要があり、 それぞれのapacheの設定ファイルのIP部分だけ変えたいのですが、 何かシンプルで良い方法ってあるでしょうか? 環境変数設定kono_server_no_ipを設定して、 sedあたりで設定ファイルのIP部分をkono_server_no_ipに置換処理、 みたいな感じをぱっと思いついたのですが、 もっとベターな方法ってあるでしょうか?
984 名前:login:Penguin mailto:sage [2009/03/30(月) 10:33:16 ID:rBZKWvDE] >>983 まずサーバ毎の環境変数(kono_server_no_ip)の設定はどうやるの? 環境変数の設定をエディタでやったら本末転倒だよね? 「このIP」が自分自身のipアドレスでいいなら、ifconfigで取得してsedで置換。 あと、シンプルじゃなくていいならPuppetとか。