トップページunix
987コメント278KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2012/11/15(木) 18:57:33.11
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 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でそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
 「そういうのはperl使いましょう」と回答するのはやめましょう。
 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その20
http://toro.2ch.net/test/read.cgi/unix/1339083351/
0715名無しさん@お腹いっぱい。2013/06/25(火) 17:39:37.87
ご教授ってネタなの?
0716名無しさん@お腹いっぱい。2013/06/25(火) 17:42:01.74
>>715
別にネタじゃ無いだろ
懇切丁寧に教えろって意味だ
0717名無しさん@お腹いっぱい。2013/06/25(火) 17:44:59.43
素で間違えてる人多いよ。
0718名無しさん@お腹いっぱい。2013/06/25(火) 17:47:52.88
素で間違えました。女教授ください。
0719名無しさん@お腹いっぱい。2013/06/25(火) 17:57:32.66
>>714
list はファイルでIPアドレスと型番的な情報(ex. Summit48si)が一行に一つ入ってるのでしょうか?

IPアドレスが後から出ているのが気に入らないなら
print "echo "$1"" を print "snmpget -v ..."の前に持ってくる。
でもってIPアドレスの後で改行が入るのがいやなら echo -n

SNMPv2-SMI::enterprises.1916.1.1.1.16.0 = STRING: が出力されるのがいやなら
これはsnmpgetが出力しているものでしょうか?それならsnmpgetで出力しないようにできるかどうか調べて
出力を抑制できないなら sed とかで削除すればいいんじゃないでしょうか。

教授はできないので教示させていただきました。
0720名無しさん@お腹いっぱい。2013/06/25(火) 18:02:46.48
>>715
・学問や技芸、専門知識を教え授けること
・児童・学生に知識・技能を授け、心意作用の発達を助けること
0721名無しさん@お腹いっぱい。2013/06/25(火) 18:03:21.06
わざわざ書かんでも知ってるでしょ。
0722名無しさん@お腹いっぱい。2013/06/25(火) 18:07:43.68
>>717
間違いじゃないw
他には「ご教授賜りたい」という用法もある。
0723名無しさん@お腹いっぱい。2013/06/25(火) 18:11:53.02
>>721
素で間違えてると思い込んでる人多いよ。
0724名無しさん@お腹いっぱい。2013/06/25(火) 18:16:22.41
この話おわり。
0725名無しさん@お腹いっぱい。2013/06/25(火) 18:22:55.40
女教師ください。
0726名無しさん@お腹いっぱい。2013/06/25(火) 18:38:55.10
>>722
「ご教示賜りたい」は聞いたことがあるが、
「ご教授賜りたい」なんて聞いたことがないw
0727名無しさん@お腹いっぱい。2013/06/25(火) 18:46:10.14
>>726
俺は聞いたことあるよ

この話おわり。
0728名無しさん@お腹いっぱい。2013/06/25(火) 19:01:50.38
ご教授も間違ってないけど、
見ず知らずの人に使うには図々しい感じがするわ。

とはいえ、時間が経てば、違いなんか無くなるだろうし
突っ込んだら負けだと思ってる。
0729名無しさん@お腹いっぱい。2013/06/25(火) 19:03:14.36
もうその話おわったよ。
0730名無しさん@お腹いっぱい。2013/06/25(火) 19:12:41.15
女享受ください。
0731名無しさん@お腹いっぱい。2013/06/25(火) 19:25:51.38
間違い方としては、役不足ににてるのだけどな。

>>714
awkって、-F'[ :]'とか区切り文字に正規表現つかなかった?
0732名無しさん@お腹いっぱい。2013/06/25(火) 19:32:38.31
この誤用は昔からあるね。
文末の定型だと勘違いしてる人が多い感じ
で「ご教授ください」「あなたのような弟子を取った覚えはありません」が繰り返されるという
0733名無しさん@お腹いっぱい。2013/06/25(火) 19:37:22.59
見飽きた話だ。
0734名無しさん@お腹いっぱい。2013/06/25(火) 19:39:57.27
「女教授股触りたい」
0735名無しさん@お腹いっぱい。2013/06/25(火) 19:46:02.01
>>728
図々しいやつだ、という批判なら尤もだし正しい指摘だよ
0736名無しさん@お腹いっぱい。2013/06/25(火) 20:16:32.09
教員をしてるわけではないけど専門知識のある知人に
ものを尋ねる時、「これ教えてくださいよ、先生!」みたいに比喩で
言うことは普通にある。それと一緒。問題なし。
0737名無しさん@お腹いっぱい。2013/06/25(火) 20:26:37.92
>>734
いいよ。今から研究室においで。
0738名無しさん@お腹いっぱい。2013/06/25(火) 20:33:48.36
↓738先生、持ち時間を使い切りましたので1手30秒以内でお願いします。
0739名無しさん@お腹いっぱい。2013/06/25(火) 21:14:54.32
738には失望した
0740名無しさん@お腹いっぱい。2013/06/25(火) 21:29:23.24
詳しいHP教えてください

ヒューレットパッカードがどうしたのですか?
0741名無しさん@お腹いっぱい。2013/06/25(火) 21:31:50.15
プラスチック容器なのに「レンジOK」って書いてあるよ
0742名無しさん@お腹いっぱい。2013/06/25(火) 22:19:29.93
>>726
アホだから
07437142013/06/26(水) 08:50:35.25
>>719
ありがとうございました。

大変助かりました。
0744名無しさん@お腹いっぱい。2013/06/26(水) 14:42:05.63
>>741
オチがわかりません
0745名無しさん@お腹いっぱい。2013/07/11(木) NY:AN:NY.AN
並列処理みたいなことをしたいです
*マークをつけた次の行です
ただこのままだと、配列に結果が代入されません
当然バックグウランドにしないと処理速度が落ちます

バックグラウンドにして、かつ結果を得る方法はありますか?

func_test ()
{
# 実際はこの関数の処理に時間がかかる、結果をメイン処理に渡したい
echo "${1}"
}

array=()
for i in `seq 1 5`
do
# この関数の処理を並列化したい *
array[${i}]=`func_test ${i}` &
done

wait

for i in ${array[@]}
do
echo ${i}
done
0746名無しさん@お腹いっぱい。2013/07/11(木) NY:AN:NY.AN
ファイルに結果を出力しておいて後で読み込むのが無難じゃないかな
直前に生成した子プロセスのPIDは$!でとれたはず。
配列にPID保管→PIDに対応するファイルから結果取得みたいな
0747名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
あとfunc_testはシェルスクリプトとして独立させてバックグラウンド実行
0748名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
すみませんが詳しい方のみ回答をお願いします
0749名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
>>748
自閉症
http://autism.flop.jp/characteristic/not_tired.html
07507452013/07/12(金) NY:AN:NY.AN
みなさんありがとうございます。

>>746
例ではループを「seq 1 5」としていますが、実際は数千あります。
(数千をいっきにバックグラウンドで走らせる訳ではなく分割する予定です)
数千のファイルを作って消すことはhddの寿命に対して大丈夫なものですか?
関数の出力は1行なので、数千でも容量はとらないのでメモリ上に一時ファイルを作る方法があれば助かりますが。

>>747
初心者なもので、関数と別のシェルスクリプトとして独立させることの違いが
あまりわからないので、もう少し詳しく教えていただけますか?
0751名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
>>750
>>747 は知ったかの誤回答。
関数を別のシェルスクリプトにしてもバックグラウンドの出力は
そのまま取り込めないから解決にならない。
0752名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
Cかpopen系が使える他のスクリプト言語で書いた方がいいんじゃないか?
0753名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
>>745
func_test() の出力行数が決まってるなら
その行の頭にでもindexの識別子を付けて
全部標準出力に出して、数字でソートすればいいよ

func_test ()
{
echo "${1} : ${1}の出力"
}

for i in `seq 1 5`
do
func_test ${i} &
done | sort -n
0754名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
>>750
> 数千のファイルを作って消すことはhddの寿命に対して大丈夫なものですか?

HDDの寿命的には問題にならない。
SSDでも最近のはウェアレベリングしてるはずなので、
1行程度のファイルを数千個作ったところで影響なし。

どうしても気になるなら、直列に動かす複数のプロセスで1個のファイルを共有したら?
0755名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
>>751
名前付きパイプを作って、それに通すのは?
0756名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
シェルスクリプトの方で出力先も切り替えればいいだけの話。

#! /bin/sh
echo "${1} : ${1}の出力" > "${DIR}/file${1}.out"

そしてwaitで全てのシェルスクリプトが終了するまで待つ。
0757名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
処理中に何か不具合が出て、プロセスがいつまでも終わらなかったらどうすんの?
0758名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
それはどうやっても同じでは?
0759名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
>>756 >>755
それはシェル関数を使ってできる。
わざわざ「別シェルスクリプト」に分ける意味がない。
0760名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
759みたいのが会社にいると、可読性が悪くなって迷惑。
0761名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
一時ファイルとか、名前付きパイプ使えばできるのは当然なので、
一時ファイルも名前付きパイプも使わずにエレガントにやる方法誰か答えてよ。
(もちろんスクリプトは1つだけでw)
0762名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
>>758
同じで済ますとか無責任だな
0763名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
func_test ()
{
sleep 1
echo "array[${1}]=${1}"
}

array=()

eval `
for i in \`seq 1 5\`
do
func_test ${i} &
done
wait
`

for i in ${array[@]}
do
echo ${i}
done
0764名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
>>761
なんか実行結果をファイルっぽく扱う技があったやろ
アレ使え
0765名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
>>763
すごい!
代入文自体を文字列として返して
実際の代入はフォアグラウンドのシェル側にevalさせるのね。
0766名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
eval使うとquoteしないといけない時にややこしくなるねえ。
0767名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
その手の、全部stdoutに出しちゃえ方式って、行の出力途中で分断される恐れとかないんか?
0768名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
>>767
ない
0769名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
なんで?1回分のechoはwrite(2)一発で出力されるって決まってるの?
0770名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
>>769
ちょっと違うな
恐れはあるが、恐れる理由が無い
分断されてもなにも困らないから
0771名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
>>748 のおかげで "詳しい方" が出てきてくれて良かったよ。
なんかすごい新しいノウハウ。

>>749 がつまらんトボケたこと書き込んでるけどw

これからも "詳しい方"のみ回答をお願いしますね
0772名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
>>748がなくても出てきたよ。
0773名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
自身では何もできないのに要求レベルを高くする屑ですね
07747452013/07/12(金) NY:AN:NY.AN
皆さんありがとうございます。
私が元々の質問者ですが、違う方が催促もしてくれているようでw

別の言語も考えたのですが別の言語を使う能力がないのと
引き継いだものをできるだけ生かしたいと思いました。
(シェルもそもそも出来ません・・・)

たくさんのアドバイスをいただきましたが
ぱっと見では分からないので動かしてみてから、また書きます。
0775名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
能力がないんじゃなく能力を身につけようとしてないんだろ。
試しに勉強してみなよ。シェルで無理するより楽かもよ。
07767452013/07/12(金) NY:AN:NY.AN
>>753 >>763
お二人のアドバイス、両方ともやりたい事が出来ました。
どうもありがとうございました。

>>775
以前cとjavaは少し勉強した事があるのですが
ポインタでつまずき、オブジェクト指向でつまずきました。
プログラミングが専門ではないので許して下さい・・・
07777452013/07/12(金) NY:AN:NY.AN
>>764
今回は解決しましたが、そのやり方気になります。
もう少し詳しくお願いします。
07787452013/07/12(金) NY:AN:NY.AN
>>757
リトライとかタイムアウトでメッセージを出す仕組みってありますか?

1:****
2:****
・・・
のようなかたちの出力にして結果が得られたかを検証して
抜けているのがあれば手動でそれだけやりなおします。
止まった場合は、ctrl+cですw
0779名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
>>776
PerlとかRubyでいいじゃん。
ポインタ知らんでもそれなりに使えるよ。
0780名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
ルータのファームいじりだと、PerlもRubyも使えないので、
このスレのやりとりは、横で見てるだけでもけっこう参考になる
0781名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
シェルスクリプトは使えるルータ?
0782名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
>>779
perlとrubyもhello worldと少しは勉強しました。。
どうもその先が理解出来ず挫折するようです。
逆になんで理解できるんですか!?

linuxにはいろいろツールがそろっているし、ファイルも楽ちん
manとかネットが充実してるからついついシェルでやっています。
ネックは速度くらいですかね。
javaとかでさくっと書けたらかっこいいだろうなと思いつつ。。
0783名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
ぶっちゃけシェルスクリプト使いの方が希少
0784名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
できない言い訳を書いてる暇があったら勉強しろよタコ
0785名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
自分は大規模なことはやってないからですかね。
他の言語を覚えるのに身が入らないのは。
シェルも皆さんほどには理解出来ていないですけど。

学生のころfortran(当時はこれしか知らなかった)で文字処理しようとしてあきらめ
シェル(grep、sed)でやって便利さに気づきました。
0786名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
もう雑談スレだな。
0787名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
夜食でも食うかな
0788名無しさん@お腹いっぱい。2013/07/12(金) NY:AN:NY.AN
>>781
野良電波が出ていないか定期的にチェックして、野良が出現したら
暗号化なしで繋ぎに行き、即VPNセッション張って暗号化させて、
完了したらルータのあんま使わないLEDを点灯させるスクリプトを走らせてる。
0789名無しさん@お腹いっぱい。2013/07/13(土) NY:AN:NY.AN
わけわかめ
0790名無しさん@お腹いっぱい。2013/07/13(土) NY:AN:NY.AN
触らない方がよさげ。
0791名無しさん@お腹いっぱい。2013/07/28(日) NY:AN:NY.AN
Ubuntu Linuxなのですが、Linux板にシェルスクリプトスレがないのでお邪魔しました。
Linuxを始めたばかりで、無謀にもソースからのアプリコンパイルにチャレンジしており
シェルスクリプトのエラーに悩まされています。

/opt/bitnami/common/build-1/libtool: 3215: /opt/bitnami/common/build-1/libtool:
install_prog+=install: not found
/opt/bitnami/common/build-1/libtool: 3235: /opt/bitnami/common/build-1/libtool:
files+=mod_dav_svn.la: not found

この「install_prog+=」「files+=」という箇所をエディタで探して「+=」を「=」に書き換えると
エラーなく通るようになります。
後続で別のエラーが出て結局止まるのですが、それはまた別の話としまして
このnof foundという表示はどういう意味で、どう対処すべきなのでしょうか。
0792名無しさん@お腹いっぱい。2013/07/28(日) NY:AN:NY.AN
+=はlist appendです。
shの実体がdashとかashになっていて+=理解しないんじゃない?
bashで実行してみれば?
0793名無しさん@お腹いっぱい。2013/07/28(日) NY:AN:NY.AN
>>792
/binディレクトリを見てみたら、sh -> dash*
とリンクが張られていました。Ubuntuはdashが標準なんですね。
スクリプト先頭の /bin/sh を、/bin/bash に変更したら通りました。
一週間苦しんだのであっけなく解決して魂が抜けましたが、これも勉強ですね。
0794名無しさん@お腹いっぱい。2013/07/29(月) NY:AN:NY.AN
>>793
まぁ、そうなんだけど、bashのつもりでshとスクリプトに書く方が悪いと思う。
そのアプリのメンテナにバグレポートを送ってもよいと思う。
0795名無しさん@お腹いっぱい。2013/07/29(月) NY:AN:NY.AN
>>791
↓で聞けばいいよ。

くだらねえ質問はここに書き込め! Part 206
http://engawa.2ch.net/test/read.cgi/linux/1370948130/
0796名無しさん@お腹いっぱい。2013/07/29(月) NY:AN:NY.AN
何でこのスレって排除傾向なの
0797名無しさん@お腹いっぱい。2013/07/29(月) NY:AN:NY.AN
>>796
円満に終わった話を蒸し返そうとする>>795がアホなだけ
0798名無しさん@お腹いっぱい。2013/07/29(月) NY:AN:NY.AN
しかも誘導先がくだ質って、悪質そのもの
0799名無しさん@お腹いっぱい。2013/07/29(月) NY:AN:NY.AN
なんでそうなんのw
0800名無しさん@お腹いっぱい。2013/07/29(月) NY:AN:NY.AN
>>796
一部のバカのレスをスレ全体の傾向に敷衍するのは、荒らすのが目的ですか?
0801名無しさん@お腹いっぱい。2013/07/29(月) NY:AN:NY.AN
すでに荒れきってるんですが・・・
0802名無しさん@お腹いっぱい。2013/07/29(月) NY:AN:NY.AN
たいした理由もなくアホだのバカだの悪質だの言う方が荒らしだよなぁ。
0803名無しさん@お腹いっぱい。2013/07/29(月) NY:AN:NY.AN
>>802には理由が見えてないってこと?
0804名無しさん@お腹いっぱい。2013/07/29(月) NY:AN:NY.AN
もうそのくらいにしとけ。
雰囲気悪くするだけだ。
0805名無しさん@お腹いっぱい。2013/07/29(月) NY:AN:NY.AN
dashとbash比較した時
クライアンス運用ならdashのが劣っている点はなんですか?
0806名無しさん@お腹いっぱい。2013/07/30(火) NY:AN:NY.AN
クライアンス?
0807名無しさん@お腹いっぱい。2013/07/30(火) NY:AN:NY.AN
"クライアンス運用" でぐぐってみ。
0808名無しさん@お腹いっぱい。2013/07/30(火) NY:AN:NY.AN
勿論ググりましたが、当方馬鹿なのでわかりません
サルでも分かるような回答を強く期待します
0809名無しさん@お腹いっぱい。2013/07/30(火) NY:AN:NY.AN
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13110942143
についてどう思いますか?
要は本に載ってたサンプルに

eval echo $"$VAR2"

というのがあって bash では動かないという話ですが
クォートすればいいのにしないというのは
普通のことだったんでしょうか。
0810名無しさん@お腹いっぱい。2013/07/30(火) NY:AN:NY.AN
普通か、って聞かれても答えにくいな。
0811名無しさん@お腹いっぱい。2013/07/30(火) NY:AN:NY.AN
warning 出してほしいとかいう話がちょっと前にあったみたいだけど
これは warning 出せるかも。
いや、bash ではどうすんだ?
0812名無しさん@お腹いっぱい。2013/07/31(水) NY:AN:NY.AN
LinuxとBSDで開業コード違いますよね。
Linuxは0xnで改行、BSDは0xrで改行しますよね。
どうしてこういう違いができたんでしょう?
シェルで簡単に返還する方法はありますか?
0813名無しさん@お腹いっぱい。2013/07/31(水) NY:AN:NY.AN
だったらこの改行コード変換して読めるようにしてくれよ!
N・K・F! N・K・F!
0814名無しさん@お腹いっぱい。2013/08/01(木) NY:AN:NY.AN
>>812
> LinuxとBSDで開業コード違いますよね。

違いません
だから変換する方法も必要ないです
■ このスレッドは過去ログ倉庫に格納されています