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


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

シェルスクリプト総合@LINUX Part4



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あたりに色々と。

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とか。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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