トップページunix
1001コメント312KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001シェルスクリプトライター2011/12/10(土) 20:06:40.38
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。

□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
  http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/
  http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
 (理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

前スレ
シェルスクリプト総合 その18
http://hibari.2ch.net/test/read.cgi/unix/1308195527/

次スレは >>970 で。
0002名無しさん@お腹いっぱい。2011/12/10(土) 22:26:58.70
シェラーの皆さんこんにちは。
今日も元気にワンタイマーしてますか?
0003名無しさん@お腹いっぱい。2011/12/10(土) 23:02:37.12
>>2
マジ質問ですいません。ワンタイマーって何ですか?
0004名無しさん@お腹いっぱい。2011/12/10(土) 23:18:47.00
ワンライナーかな、とも思ったがシェルでワンライナーはそれほど重視されないしな…
0005名無しさん@お腹いっぱい。2011/12/11(日) 00:11:26.91
相手すんなよ。
0006名無しさん@お腹いっぱい。2011/12/11(日) 16:42:39.40

1000 :名無しさん@お腹いっぱい。 :sage :2011/12/11(日) 16:41:38.19
-z って変数が空か入ってるかぢゃ無いのかよ
0007名無しさん@お腹いっぱい。2011/12/11(日) 16:51:14.38
>>6
変数が未設定か設定済みかをテストしたい時は、

test -z "${var+X}"

を使う。varに空文字列がセットされていても「設定済み」と判定する。
0008名無しさん@お腹いっぱい。2011/12/11(日) 16:59:56.87
なるほどぉ。ためになるなぁ。
でもさ、スクリプトの場合あらかじめunsetで初期化しない?

unsetを初期化と呼ぶのかどうかさえ知らんのだけど……。
0009名無しさん@お腹いっぱい。2011/12/13(火) 15:30:20.06
冷やすとリングはワンタイマーだよね?
0010名無しさん@お腹いっぱい。2011/12/13(火) 17:16:35.40
here string は PowerShell用語だったという記憶。
0011名無しさん@お腹いっぱい。2011/12/13(火) 18:30:59.09
bashのmanにも記載はあるが、何処のどいつが言い出したのかは分からんね
辿っていけば時期は分かるだろうが、PowerShellに関しては全く知らん
0012名無しさん@お腹いっぱい。2011/12/13(火) 20:54:11.16
bashのhere string...

へー << じゃなくて <<< を使うんだな。

$ cat <<<XXX
XXX
0013名無しさん@お腹いっぱい。2011/12/16(金) 10:58:47.04
つまりドザか
0014名無しさん@お腹いっぱい。2011/12/17(土) 12:28:51.47
Powershellより昔の用語じゃないか?
ヒアストリングっていまいち使いどころがわからんけど。
0015名無しさん@お腹いっぱい。2011/12/19(月) 00:03:04.76
ブロックコメントアウトには常用するよ
#!bash
:<<'#COMMENT'
echo $PATH
#COMMENT
0016名無しさん@お腹いっぱい。2011/12/19(月) 00:05:06.81
それはhere stringじゃなくてhere documentじゃねーの?
0017名無しさん@お腹いっぱい。2011/12/19(月) 00:10:56.53
ごめん、ヒアストか。たしかに使いどころがないというか、これくらいしか用例知らない。

awk <<< "$*" '{
for (i = 1; i <= NF; i++) {
print $i
}
}'

0018名無しさん@お腹いっぱい。2011/12/19(月) 06:48:52.85
>>15
それはシェル内部で添付ファイル作られるから動作が無駄だな
0019名無しさん@お腹いっぱい。2011/12/19(月) 08:25:18.78
grep -q 'pattern' <<< 'string'
とか使えると思うけど
0020名無しさん@お腹いっぱい。2011/12/19(月) 08:36:39.21
>>18
その添付ファイル名を知る方法ってない?
終了時に自動で美しく消されるなら使い捨てのawkやsedを埋め込むのに使いたい。
mktempとか面倒だし本題からずれて見難いしさ。
0021名無しさん@お腹いっぱい。2011/12/19(月) 09:20:27.18
>>20

exec 3<< EOF
hoge
EOF

cat /dev/fd/3

とか?
0022名無しさん@お腹いっぱい。2011/12/19(月) 10:14:15.89
「無駄だな」マンw
0023名無しさん@お腹いっぱい。2011/12/19(月) 15:54:24.34
シェルスクリプトライターなら、ソースで語れよ
無駄無駄だけじゃ、何も進まないぜ(キリッ
0024名無しさん@お腹いっぱい。2011/12/19(月) 16:09:37.29
>>15 については、コメントアウトのつもりでも
実際には内部でtmpファイルが作られるという動作が実行され、
コメントになっていない、ということを >>18 が言ってるんだろ?
単に書き方が無駄だということじゃなくて、
根本的にコメントになっていないということ。
0025名無しさん@お腹いっぱい。2011/12/19(月) 17:25:20.99
csh, commdnd.comでさえgotoがあるのにね。
cshの非実行部は構文解析されるんだっけ?
0026名無しさん@お腹いっぱい。2011/12/22(木) 23:31:09.41
eucのサーバにおいて、sjisのファイルをcatすると文字化けするのですが、
対処方法としてはどうすればいいでしょうか?
0027名無しさん@お腹いっぱい。2011/12/22(木) 23:37:38.88
nkf -e
0028名無しさん@お腹いっぱい。2011/12/23(金) 01:09:38.83
>>27
iconv使えよ・・・
0029名無しさん@お腹いっぱい。2011/12/23(金) 09:09:05.64
iconvはエラーで中途終了しちゃうからnkfの方が推奨。
(まあ、-sもあるとは言え)
0030名無しさん@お腹いっぱい。2011/12/23(金) 10:17:10.53
>>29
つiconv -c オプション
0031名無しさん@お腹いっぱい。2011/12/23(金) 11:13:30.90
半角文字とか記号とかが混じったデータだと、iconvじゃ変換できないってことがあった

日本語ならnkfの方がまだ分があるって気がする
0032名無しさん@お腹いっぱい。2011/12/23(金) 11:32:03.95
sjisじゃなくてcp932でもそうなるならiconvのバグ臭いが
0033名無しさん@お腹いっぱい。2011/12/23(金) 12:23:33.56
>>30
-c オプションでも解決はしないので nkfお勧め
0034名無しさん@お腹いっぱい。2011/12/23(金) 18:10:27.10
-cのないiconvもあるよな…cygwinだっけか…(死亡フラグ
0035名無しさん@お腹いっぱい。2011/12/24(土) 02:09:13.88
そもそもcygwinじゃデフォルトで入らないしnkfのパッケージもないから
入れてたpythonでフィルタ書いて使ってる
0036名無しさん@お腹いっぱい。2011/12/24(土) 02:52:14.20
初歩的な質問なのですが、>>26の「eucのサーバ」ってどういう意味ですか?
サーバーの設定で文字コードって指定できるんですか?

0037名無しさん@お腹いっぱい。2011/12/24(土) 03:18:19.75
サーバーのロケール設定が euc ってことじゃね?
0038名無しさん@お腹いっぱい。2011/12/24(土) 03:33:21.59
別に i18n で euc を指定していようと、Terminal で sjis を指定してれば
文字化けだけは防げると思うよ。
文字化けだけは。
0039名無しさん@お腹いっぱい。2011/12/24(土) 08:59:26.03
>>35
make一発でコンパイルできるやん

# Makefileにinstall targetがないけどw
0040名無しさん@お腹いっぱい。2011/12/24(土) 09:07:08.00
iconvは自動判別してくれないよね?
0041名無しさん@お腹いっぱい。2011/12/25(日) 00:54:50.02
>>38 が正解
間違っています >>39
0042名無しさん@お腹いっぱい。2011/12/25(日) 01:07:20.68
>>41
えっ!?
0043名無しさん@お腹いっぱい。2011/12/26(月) 01:28:47.74
ちょっとスクリプトを初めてちゃんと書いてみたので評価して欲しい。特にループ部分は他のやり方があると思う。

内容は天気表示スクリプトで使いかたは第1引数に、
http://weather.yahoo.co.jp/weather/jp/13/4410/13101.html
などのYahooのかなり限定されたURLを打ち込んで使う。

[Bash] weather_yahoo - Pastebin.com
http://pastebin.com/BxfbhQFd

curlじゃなくてaria2cは好みで使ってみた。
一部文字もユニコードで絵文字部分を使っているのでフォントや文字コードによっては文字化けが発生多発する思います。
最初のHTMLからの行の抜き出しはハードコーディングしないほうがいいと思うけど、構造自体変わったら元も子もないし、面倒でやめてしまった。
0044名無しさん@お腹いっぱい。2011/12/26(月) 07:58:45.68
後で使うなら別だけど、
いちいち変数に入れずに、そのままアウトプットしちゃえばいいんじゃないの?
0045名無しさん@お腹いっぱい。2011/12/26(月) 08:52:51.00
>>43
> #! /bin/bash
出直しな。
0046名無しさん@お腹いっぱい。2011/12/26(月) 09:05:07.67
そういえばむかし圧縮形式ごとのオプションが面倒で全部kaitoってスクリプトにしてカレントにディレクトリつくって解凍するようにしたらいいんじゃないかと思ったけど、結局オプションを覚えてしまった
0047名無しさん@お腹いっぱい。2011/12/26(月) 09:48:59.59
>>43
#! /bin/sh

wget -O - --quiet "$1" \
    | sed -n '149,163p' \
    | sed -r '0~2d
s/.*>([^<]+)<.*/\1/
s/晴れ/ /
s/曇り/ /
s/弱雨/ /
s/湿雪|乾雪|みぞれ/ /' \
    | tr '\n' ' ' \
    | awk '{ if ($7 == $8) $8 = "〃"
if ($7 == $8) $8 = "〃"
if ($6 == $7) $7 = "〃"
if ($5 == $6) $6 = "〃"
if ($4 == $5) $5 = "〃"
if ($3 == $4) $4 = "〃"
if ($2 == $3) $3 = "〃"
if ($1 == $2) $2 = "〃"
printf "|--+--+--+--+--+--+--+--|\n\
|00|03|06|09|12|15|18|21|\n\
|--+--+--+--+--+--+--+--|\n\
|%s|%s|%s|%s|%s|%s|%s|%s|\n\
|--+--+--+--+--+--+--+--|\n", $1, $2, $3, $4, $5, $6, $7, $8}'
0048名無しさん@お腹いっぱい。2011/12/26(月) 10:29:15.47
>>46
7zがそんな感じになってるね。
0049名無しさん@お腹いっぱい。2011/12/26(月) 11:44:34.94
そしてlibarchive化された FreeBSD の tar もそんな感じになんでもツールに
0050名無しさん@お腹いっぱい。2011/12/26(月) 11:52:54.12
最近のlinuxのtarもzやjやJなしで解凍してくれるよな。
まあ圧縮するときにどうせ付けないといけないから結局覚えてしまうんだけど。
0051名無しさん@お腹いっぱい。2011/12/26(月) 23:59:53.81
>>47
前時刻と同じかどうかのチェックと出力はまとめて
|awk '{for (i=1;i<9;i++){printf "|%s",$i==tmp?"〃":$i;tmp=$i};print "|"}'
としたい気分、スレ違い失礼
0052名無しさん@お腹いっぱい。2011/12/27(火) 02:06:11.94
あれこれ覚えられない俺的には、tarが自動で何でも伸長して展開してくれる方がありがたい
0053ss2011/12/27(火) 06:20:47.96
http://www.nicovideo.jp/watch/sm16529183
0054名無しさん@お腹いっぱい。2011/12/30(金) 18:26:14.20
引数のうち、-で始まるものを除いた個数を数えるにはどうすればいいでしょうか?
a.sh -a -b c d e
=> 3
0055名無しさん@お腹いっぱい。2011/12/30(金) 18:39:18.15
>>54
#! /bin/sh

manko=0
for chinko in $@
do
if [ `echo $chinko | grep -v ^-` ] ; then
manko=`expr $manko + 1`
fi
done
echo $manko
0056名無しさん@お腹いっぱい。2011/12/30(金) 18:52:22.91
>>55
"$@" の中に特殊記号とかスペースとか入ってたら駄目。

forとかでループしたりせずに一発でできる方法を想定してます。
0057名無しさん@お腹いっぱい。2011/12/30(金) 18:57:38.49
n=0
for a in "$@";do
case "$a" in
-*)
;;
*)
n=`expr $n + 1`
;;
esac
done
echo $n
0058名無しさん@お腹いっぱい。2011/12/30(金) 18:58:18.36
> forとかでループしたりせずに一発でできる方法を想定してます。
ねーよ。
0059名無しさん@お腹いっぱい。2011/12/30(金) 18:59:04.62
何でfor文周りたらいかんのかその理由を詳しく。
sedで一文でできたとしても下のレイヤではいくらでもfor文回ってるだろうに。
0060名無しさん@お腹いっぱい。2011/12/30(金) 20:54:28.27
>>56
そういうのはUNIX系OSとは非常に相性が悪いので、至れり尽くせりのMFCとかを使うほうが捗るよ
0061542011/12/30(金) 21:07:19.02
>>57さんのを使わせてもらいます。ありがとうございます。
ちなみに>>56は別人なので。
0062名無しさん@お腹いっぱい。2011/12/30(金) 21:09:20.57
むう。ID表示しない板ってのはややこしいな。
0063名無しさん@お腹いっぱい。2011/12/30(金) 21:14:09.51
ていうかウンコとかチンコとかマンコとかオッパイとか、やらないか
0064名無しさん@お腹いっぱい。2011/12/30(金) 23:59:08.23
>>56 を上司に提出したら殴られました。
なんで…
0065名無しさん@お腹いっぱい。2011/12/31(土) 00:09:53.64
それは暴力事件かパワハラだから警察に通報したらいいと思うぞ。
0066名無しさん@お腹いっぱい。2011/12/31(土) 06:39:40.52
なぜgetoptsを誰も利用せんの?
0067名無しさん@お腹いっぱい。2011/12/31(土) 08:53:32.92
>>66
俺は単純なものとか、拡張する予定が無いときはつかわないなぁ
それに複雑な処理をするならば、RubyなりPerl使った方が簡単とかさ
■ このスレッドは過去ログ倉庫に格納されています