シェルスクリプト総合 その18

このエントリーをはてなブックマークに追加
952名無しさん@お腹いっぱい。:2011/12/10(土) 07:57:45.11
gawkのexampleにあったな。gawk限定だが
というかちょっとしたデータベースもどきにCSVは使うけど
やっぱりシェルスクリプトでもSQL使った方がいいのか?
別にSQLでなくてもいいけど、SQLiteくらいしか思いつかない
953名無しさん@お腹いっぱい。:2011/12/10(土) 09:10:35.73
>>952
シェルスクリプトで、ってんなら
cutやawkで使える形式がいいなー
何にしろcsvよりは空白区切りでやると思う
954名無しさん@お腹いっぱい。:2011/12/10(土) 09:33:06.82
csvならexcelに食わせろよ。色々と捗るぞ。
955名無しさん@お腹いっぱい。:2011/12/10(土) 09:50:18.17
中級者シェラーによくある無駄

(1)空文字列の代入に無駄なクォート
HOGE="" → HOGE= だけで桶

(2)変数展開等がないのにダブルクォート
HOGE="hage boke" → HOGE='hage boke' シングルクォートで桶

(3)変数の条件展開等がないのにブレース
hoge "${var}" → hoge "$var" で桶
956名無しさん@お腹いっぱい。:2011/12/10(土) 11:53:49.05
シエラって何かあったよな?
なんだっけ、ブラウザだったかな……。
957名無しさん@お腹いっぱい。:2011/12/10(土) 12:20:37.97
>>952
CSVなら他のスクリプト言語使う。
大抵読み込みライブラリあるから。
958名無しさん@お腹いっぱい。:2011/12/10(土) 13:58:15.94
>>955
(3) は、もしかして
hoge "${var}boo"
と後で変更するかもと考えると悪くないと思う。
959名無しさん@お腹いっぱい。:2011/12/10(土) 14:18:43.32
>>958
そう変更するなら

hoge "${var}"boo

とするべきで、だったら

hoge "$var"boo

とした方がいいので、やはり { } は無駄。
960名無しさん@お腹いっぱい。:2011/12/10(土) 14:24:49.13
diff -q ${var}{_old,} || ...
とかふつうに { } 使わない?
で、こういうとこだけ { } 使ってるのやだから、全部 ${var} にしとこ、とか?
まあ、元のスクリプトの使い方が単純なケースだから、{ } 不要じゃねと言われればそれまでだけど
961名無しさん@お腹いっぱい。:2011/12/10(土) 14:45:58.29
無駄とかそういう理由で省略するもんじゃないから。
962名無しさん@お腹いっぱい。:2011/12/10(土) 15:01:05.57
>>960
それは

diff -q "$var"{_old,} || ...

だな。${var}だと、varの中身にスペースがあった時に誤動作するから。
963名無しさん@お腹いっぱい。:2011/12/10(土) 15:04:52.03
{}が要る場所とか要らない場所とか考えるの面倒だから俺は全部省略せずに${hoo} って書くことにしてる
${hoo}って変数名を${bar}に一括置換したくなった時にも便利だしね。
964名無しさん@お腹いっぱい。:2011/12/10(土) 15:08:23.35
>>963
だったら全部 "$hoo" って書けば良い。タイプ数は同じ。
"$hoo" って変数名を "$bar" に一括置換するのも同じこと。

問題なのは、${hoo} って書いて、それがスペースを含んでいた場合に誤動作する
ということを知らないで書いている人。
{ } で囲んでもスペース問題は解決しない。
。囲む時はダブルクォートを徹底すること。
965名無しさん@お腹いっぱい。:2011/12/10(土) 15:42:50.52
なんでそんなに${hoo}の表記法を憎むのか理解出来ない。
もしかしてソースに${hoo}って書いたせいで親が殺されたり恋人に振られたりした経験でもあるのか?
966948:2011/12/10(土) 16:28:58.88
>>955
中級者に格上げありがとう。

正直 EXEC_OPTS="" 自体も要らないんだけど、Excel マクロとかも使ってて
クセになってるんですよね。気をつけます。

TARGET の中身に入れてる内容がどういう意味なのか説明していただけると、
とてもうれしいです。初心者を自覚してたのでわかりません…
967名無しさん@お腹いっぱい。:2011/12/10(土) 16:35:27.61
968名無しさん@お腹いっぱい。:2011/12/10(土) 16:43:21.45
>>967
ありがとう。

TARGET=${TARGET:-"/var/tmp/test"}

TARGET の中で、未定義の $TARGET が展開されてる理由は
たぶんシェルスクリプト実行前に環境変数へ入れてるんだろうな〜
というのだけは分りました。
969名無しさん@お腹いっぱい。:2011/12/10(土) 17:04:30.12
俺も${var}はできるだけ使わない派だけど、
{}使ってるスクリプト見ても無駄だから省略しろとは思わない。
970名無しさん@お腹いっぱい。:2011/12/10(土) 17:17:29.57
>>968
TARGET=${TARGET:-"/var/tmp/test"}

よりも、

: ${TARGET:=/var/tmp/test}

の方がいい。
971名無しさん@お腹いっぱい。:2011/12/10(土) 19:28:05.23
>>959
boo などが引用符に囲まれてないと、ちょっといやだ。

自分は * や ~ などパターンマッチをしたいときだけ引用符なし、
それ以外は基本引用符で囲むことにしてる。
972名無しさん@お腹いっぱい。:2011/12/10(土) 19:31:53.87
シェルスクリプトのパイプの受け取り方わかんない(´・ω・`)

Path通してコマンド化しようとしてる2つのシェルスクリプトA,B。
例だからNRで1行でできるとかは、なんせんすな

A:Gen (file名).dat なんか適当な数字を発生させる 
B:Ave (file名).dat 平均を求める

B:
#Average of Time-series

#Ave ***.dat
line=`wc -l $1 | awk '{print $1}'` ←行数読む

awk '{a+=$1/'$line'}END{print a}' $1 ←平均出す

たとえばAで発生させた数字列をパイプで Gen (file名).dat | Ave で
つないで平均もとめようとするとと空出力。Ave単体だとちゃんと動く。

大規模計算だからできればawk使いたい。おじさんたちたすけて。
973名無しさん@お腹いっぱい。:2011/12/10(土) 20:15:28.22
何を聞きたいのか全然わからない。一見日本語のようだが日本語と異なる言語のようだ。
974名無しさん@お腹いっぱい。:2011/12/10(土) 20:22:05.58
>>973
Aveがこの内容だとパイプ受け取れない(´・ω・`)
どうすればいいですか?

975名無しさん@お腹いっぱい。:2011/12/10(土) 20:29:03.68
>>972 awk スレで聞いたほうがいいんじゃ?

とりあえず次スレ。
http://hibari.2ch.net/test/read.cgi/unix/1323515200/
976名無しさん@お腹いっぱい。:2011/12/10(土) 20:35:47.78
awkスレ以前だろ。引数でファイル渡すようにスクリプト書いてるのに
それにパイプでデータを渡したいって話だろ?書き直せ
977名無しさん@お腹いっぱい。:2011/12/10(土) 20:39:23.91
/dev/stdin w
978名無しさん@お腹いっぱい。:2011/12/10(土) 20:52:55.03
スクリプトの中で標準入力の内容を何度も処理したい場合は、とりあえず
cat > $tmpfile
しておく。んでもって
line=`wc -l < $tmpfile`
awk ... $tmpfile
とかかしらん。
ファイルも引数に取れるようにするには、最初の部分を
cat "$@" > $tmpfile
にしておけばいいし
979名無しさん@お腹いっぱい。:2011/12/10(土) 21:00:49.19
ファイルに出力するのと標準出力に出力するのは別だってのを
理解していないように思えるが?

#!/bin/sh
# --- GEN.sh version 2.0 ---
OF=$1
if [ "$OF" = "" ] ; then OF=rand.txt ; fi

echo 10 > $OF
echo 20 > $OF
echo 30 > $OF
echo 40 > $OF

echo 100
echo 200
echo 600

exit 0
980名無しさん@お腹いっぱい。:2011/12/10(土) 21:06:38.43
>>980 なら次スレ行ってみます。
981名無しさん@お腹いっぱい。:2011/12/10(土) 21:10:23.67
すまん、重複してしまった...
削除依頼出してきます。
982名無しさん@お腹いっぱい。:2011/12/10(土) 21:29:33.51
>>979
if [ "$OF" = "" ] ; then OF=rand.txt ; fi

無駄

: ${OF:=rand.txt}
983名無しさん@お腹いっぱい。:2011/12/10(土) 21:39:07.89
独りよがりもいい加減にしとけ。な。
984名無しさん@お腹いっぱい。:2011/12/10(土) 21:52:42.52
>>979

if [ "$OF" = "" ] は無駄だな。ifで書くとしても、
せめて if [ -z "$OF" ] だな。
985名無しさん@お腹いっぱい。:2011/12/10(土) 22:02:04.40
しつこいねぇ。
$ fgrep -1 ' = ""' /usr/bin/xmkmf

if [ "$topdir" = "" ]; then
args="-DUseInstalled "$configdirspec
$ head -n 7 /usr/bin/xmkmf
#!/bin/sh

# $XFree86: xc/config/util/xmkmf.cpp,v 1.3 2000/11/06 21:57:10 dawes Exp $
#
# make a Makefile from an Imakefile from inside or outside the sources
#
# $Xorg: xmkmf.cpp,v 1.3 2000/08/17 19:41:53 cpqbld Exp $
986名無しさん@お腹いっぱい。:2011/12/10(土) 22:04:20.48
>>985
Xの付属のシェルスクって無駄な書き方多いよ。
全然参考にならないし、その例挙げても反証にならない。
987名無しさん@お腹いっぱい。:2011/12/10(土) 22:13:36.04
>>978のやりかたでできた。
ありがとうございました。
988名無しさん@お腹いっぱい。:2011/12/10(土) 22:31:22.50
-z って、どっちだっけってわからなくなるんだよね。
だから自分はいつも
if [ "$args" = "" ]; then
って書くよ。-n もあるしね(-zと-nはどっちがどっちだっけってなる)。
989名無しさん@お腹いっぱい。:2011/12/10(土) 22:35:36.88
>>988
シェルによっては、
if [ "$arg" = "" ];
という書き方だと argが -f とかの特殊な値だと誤動作するんだよ。
だから、if [ X"$arg" = X ]; みたいなバッドノウハウもあった。

それを避ける意味でも if [ -z "$arg" ] の方が良い。
990名無しさん@お腹いっぱい。:2011/12/11(日) 03:24:48.74
-z とか -n ってどういう意味なん
毎回覚えられなくて調べるんだけど
991名無しさん@お腹いっぱい。:2011/12/11(日) 03:59:41.24
>>990
$ man test
992名無しさん@お腹いっぱい。:2011/12/11(日) 08:33:08.10
zeroとnonzero
これが覚えられないなら頭を使う仕事はやめた方がいい。
993名無しさん@お腹いっぱい。:2011/12/11(日) 11:21:55.47
ああ一番肝心なの調べてなかったのかthx
覚えられないのは普段使わないからだよ
994名無しさん@お腹いっぱい。:2011/12/11(日) 11:44:00.77
こんな覚えやすいのに…
995名無しさん@お腹いっぱい。:2011/12/11(日) 11:48:46.85
-s "$var" もあるから紛らわしいんだよね。
その場でちょこっとスクリプト書いてささっと作業済ませたいときにmanとかかったるい
996名無しさん@お腹いっぱい。:2011/12/11(日) 13:22:04.62
>>993
頭は普段から使うようにした方がいいぞ。
997名無しさん@お腹いっぱい。:2011/12/11(日) 13:34:44.99
ブロック壊したり、アイテム出したりするのにいつも頭を使っているから、凄く頭はいいと思うんだが
なぜか毎回姫を攫われてしまう。何かいいアイデアはない?
998名無しさん@お腹いっぱい。:2011/12/11(日) 14:40:10.86
>>992
大木金太郎やボボブラジルみたいな使い方もあるしー
君が勝てるかなあ?その頭で。
999名無しさん@お腹いっぱい。:2011/12/11(日) 16:27:00.77
bash で waf つくるよ
1000名無しさん@お腹いっぱい。:2011/12/11(日) 16:41:38.19
-z って変数が空か入ってるかぢゃ無いのかよ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。