シェルスクリプト総合 その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/
0691名無しさん@お腹いっぱい。
2013/06/20(木) 11:41:17.87スルーでいいと思う人はスルーしてればいいじゃない。
0692名無しさん@お腹いっぱい。
2013/06/20(木) 11:50:41.37普通に「&」でバックグランドジョブにしてもダメなのかな。
0693名無しさん@お腹いっぱい。
2013/06/20(木) 12:35:01.18お前少し黙ってろよ
0695名無しさん@お腹いっぱい。
2013/06/20(木) 13:11:52.63んで結局解決した?
0696名無しさん@お腹いっぱい。
2013/06/20(木) 14:22:58.180697名無しさん@お腹いっぱい。
2013/06/20(木) 14:41:16.75実行ファイルに読み込ませる方法が分かりません」だろ?
シェルスクリプトでもバックグランド「&」は使えるから、
お前が書いている内容をスクリプトにコピペして実行してみろ。
0698名無しさん@お腹いっぱい。
2013/06/20(木) 14:50:30.70それだと、inputというファイル名(FIFO)が衝突して正常動作しない。
>>686 が言うバックグラウンドでの実行というのは、
同じスクリプトを複数同時に(バックグラウンド)で起動するという意味を含んでいる
と解釈できる。
まあ、その件は >>689 が回答済みだけどね。
0699名無しさん@お腹いっぱい。
2013/06/20(木) 17:27:55.780700名無しさん@お腹いっぱい。
2013/06/20(木) 17:31:36.030701名無しさん@お腹いっぱい。
2013/06/20(木) 17:43:13.21BASHは、電解コンデンサがライトアップしやすいって聞きましたけど、
ユーザーの多いシェルなのに何故ですか?
0702名無しさん@お腹いっぱい。
2013/06/20(木) 17:54:54.11シェルが・・・
考えなおします。
0703名無しさん@お腹いっぱい。
2013/06/23(日) 17:52:58.66dry upじゃないの? ケミコンをライトアップしてどうすんだよw スカイツリーかよww
0704名無しさん@お腹いっぱい。
2013/06/24(月) 12:35:58.41どんなテクノロジーなの?
0705名無しさん@お腹いっぱい。
2013/06/24(月) 12:43:45.59あながち間違いでもない。
0706名無しさん@お腹いっぱい。
2013/06/24(月) 13:42:31.380707名無しさん@お腹いっぱい。
2013/06/24(月) 14:37:12.05そんなこともあったのか
奥が深いな
0708名無しさん@お腹いっぱい。
2013/06/24(月) 14:59:38.890709名無しさん@お腹いっぱい。
2013/06/24(月) 19:12:51.68過去のコマンド実行履歴もこっそり覚えてる
0710名無しさん@お腹いっぱい。
2013/06/24(月) 23:56:06.32くらしをみつめる bash
0711名無しさん@お腹いっぱい。
2013/06/25(火) 09:37:13.20$ echo $HISTFILESIZE
0
何か?
0712名無しさん@お腹いっぱい。
2013/06/25(火) 09:42:59.41readonly HISTFILESIZE=1000000
0713名無しさん@お腹いっぱい。
2013/06/25(火) 10:14:06.900714名無しさん@お腹いっぱい。
2013/06/25(火) 17:24:02.91#!/bin/sh
awk '/Summit48si/ { print "snmpget -v 2c -c hbl-snmp "$1" SNMPv2-SMI::enterprises.1916.1.1.1.16.0 " ; print "echo "$1"" }' list | sh
を実行すると、
SNMPv2-SMI::enterprises.1916.1.1.1.16.0 = STRING: "シリアル番号"
IPアドレス
という風に出力されます。
これを、
IPアドレス シリアル番号
という風に出力させたいのですが、どのように記述すれば良いのでしょうか?
どなたか、お知恵を貸して頂けないでしょうか。
0715名無しさん@お腹いっぱい。
2013/06/25(火) 17:39:37.870716名無しさん@お腹いっぱい。
2013/06/25(火) 17:42:01.74別にネタじゃ無いだろ
懇切丁寧に教えろって意味だ
0717名無しさん@お腹いっぱい。
2013/06/25(火) 17:44:59.430718名無しさん@お腹いっぱい。
2013/06/25(火) 17:47:52.880719名無しさん@お腹いっぱい。
2013/06/25(火) 17:57:32.66list はファイルで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・学問や技芸、専門知識を教え授けること
・児童・学生に知識・技能を授け、心意作用の発達を助けること
0721名無しさん@お腹いっぱい。
2013/06/25(火) 18:03:21.060722名無しさん@お腹いっぱい。
2013/06/25(火) 18:07:43.68間違いじゃないw
他には「ご教授賜りたい」という用法もある。
0723名無しさん@お腹いっぱい。
2013/06/25(火) 18:11:53.02素で間違えてると思い込んでる人多いよ。
0724名無しさん@お腹いっぱい。
2013/06/25(火) 18:16:22.410725名無しさん@お腹いっぱい。
2013/06/25(火) 18:22:55.400726名無しさん@お腹いっぱい。
2013/06/25(火) 18:38:55.10「ご教示賜りたい」は聞いたことがあるが、
「ご教授賜りたい」なんて聞いたことがないw
0727名無しさん@お腹いっぱい。
2013/06/25(火) 18:46:10.14俺は聞いたことあるよ
この話おわり。
0728名無しさん@お腹いっぱい。
2013/06/25(火) 19:01:50.38見ず知らずの人に使うには図々しい感じがするわ。
とはいえ、時間が経てば、違いなんか無くなるだろうし
突っ込んだら負けだと思ってる。
0729名無しさん@お腹いっぱい。
2013/06/25(火) 19:03:14.360730名無しさん@お腹いっぱい。
2013/06/25(火) 19:12:41.150731名無しさん@お腹いっぱい。
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.590734名無しさん@お腹いっぱい。
2013/06/25(火) 19:39:57.270735名無しさん@お腹いっぱい。
2013/06/25(火) 19:46:02.01図々しいやつだ、という批判なら尤もだし正しい指摘だよ
0736名無しさん@お腹いっぱい。
2013/06/25(火) 20:16:32.09ものを尋ねる時、「これ教えてくださいよ、先生!」みたいに比喩で
言うことは普通にある。それと一緒。問題なし。
0737名無しさん@お腹いっぱい。
2013/06/25(火) 20:26:37.92いいよ。今から研究室においで。
0738名無しさん@お腹いっぱい。
2013/06/25(火) 20:33:48.360739名無しさん@お腹いっぱい。
2013/06/25(火) 21:14:54.320740名無しさん@お腹いっぱい。
2013/06/25(火) 21:29:23.24↓
ヒューレットパッカードがどうしたのですか?
0741名無しさん@お腹いっぱい。
2013/06/25(火) 21:31:50.150742名無しさん@お腹いっぱい。
2013/06/25(火) 22:19:29.93アホだから
0744名無しさん@お腹いっぱい。
2013/06/26(水) 14:42:05.63オチがわかりません
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.AN0748名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0749名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN自閉症
http://autism.flop.jp/characteristic/not_tired.html
0750745
2013/07/12(金) NY:AN:NY.AN>>746
例ではループを「seq 1 5」としていますが、実際は数千あります。
(数千をいっきにバックグラウンドで走らせる訳ではなく分割する予定です)
数千のファイルを作って消すことはhddの寿命に対して大丈夫なものですか?
関数の出力は1行なので、数千でも容量はとらないのでメモリ上に一時ファイルを作る方法があれば助かりますが。
>>747
初心者なもので、関数と別のシェルスクリプトとして独立させることの違いが
あまりわからないので、もう少し詳しく教えていただけますか?
0751名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN>>747 は知ったかの誤回答。
関数を別のシェルスクリプトにしてもバックグラウンドの出力は
そのまま取り込めないから解決にならない。
0752名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0753名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANfunc_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> 数千のファイルを作って消すことはhddの寿命に対して大丈夫なものですか?
HDDの寿命的には問題にならない。
SSDでも最近のはウェアレベリングしてるはずなので、
1行程度のファイルを数千個作ったところで影響なし。
どうしても気になるなら、直列に動かす複数のプロセスで1個のファイルを共有したら?
0755名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN名前付きパイプを作って、それに通すのは?
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.AN0758名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0759名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANそれはシェル関数を使ってできる。
わざわざ「別シェルスクリプト」に分ける意味がない。
0760名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0761名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN一時ファイルも名前付きパイプも使わずにエレガントにやる方法誰か答えてよ。
(もちろんスクリプトは1つだけでw)
0762名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN同じで済ますとか無責任だな
0763名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN{
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なんか実行結果をファイルっぽく扱う技があったやろ
アレ使え
0765名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANすごい!
代入文自体を文字列として返して
実際の代入はフォアグラウンドのシェル側にevalさせるのね。
0766名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0767名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0768名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANない
0769名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0770名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANちょっと違うな
恐れはあるが、恐れる理由が無い
分断されてもなにも困らないから
0771名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANなんかすごい新しいノウハウ。
>>749 がつまらんトボケたこと書き込んでるけどw
これからも "詳しい方"のみ回答をお願いしますね
0772名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0773名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0774745
2013/07/12(金) NY:AN:NY.AN私が元々の質問者ですが、違う方が催促もしてくれているようでw
別の言語も考えたのですが別の言語を使う能力がないのと
引き継いだものをできるだけ生かしたいと思いました。
(シェルもそもそも出来ません・・・)
たくさんのアドバイスをいただきましたが
ぱっと見では分からないので動かしてみてから、また書きます。
0775名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN試しに勉強してみなよ。シェルで無理するより楽かもよ。
0776745
2013/07/12(金) NY:AN:NY.ANお二人のアドバイス、両方ともやりたい事が出来ました。
どうもありがとうございました。
>>775
以前cとjavaは少し勉強した事があるのですが
ポインタでつまずき、オブジェクト指向でつまずきました。
プログラミングが専門ではないので許して下さい・・・
0778745
2013/07/12(金) NY:AN:NY.ANリトライとかタイムアウトでメッセージを出す仕組みってありますか?
1:****
2:****
・・・
のようなかたちの出力にして結果が得られたかを検証して
抜けているのがあれば手動でそれだけやりなおします。
止まった場合は、ctrl+cですw
0779名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANPerlとかRubyでいいじゃん。
ポインタ知らんでもそれなりに使えるよ。
0780名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANこのスレのやりとりは、横で見てるだけでもけっこう参考になる
0781名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0782名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANperlとrubyもhello worldと少しは勉強しました。。
どうもその先が理解出来ず挫折するようです。
逆になんで理解できるんですか!?
linuxにはいろいろツールがそろっているし、ファイルも楽ちん
manとかネットが充実してるからついついシェルでやっています。
ネックは速度くらいですかね。
javaとかでさくっと書けたらかっこいいだろうなと思いつつ。。
0783名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0784名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0785名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN他の言語を覚えるのに身が入らないのは。
シェルも皆さんほどには理解出来ていないですけど。
学生のころfortran(当時はこれしか知らなかった)で文字処理しようとしてあきらめ
シェル(grep、sed)でやって便利さに気づきました。
0786名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0787名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0788名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN野良電波が出ていないか定期的にチェックして、野良が出現したら
暗号化なしで繋ぎに行き、即VPNセッション張って暗号化させて、
完了したらルータのあんま使わないLEDを点灯させるスクリプトを走らせてる。
0789名無しさん@お腹いっぱい。
2013/07/13(土) NY:AN:NY.AN0790名無しさん@お腹いっぱい。
2013/07/13(土) NY:AN:NY.AN■ このスレッドは過去ログ倉庫に格納されています