トップページunix
1002コメント330KB

シェルスクリプト総合 その25©5ch.net

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net2015/08/14(金) 23:42:01.51
シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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.illumos.org/source/xref/illumos-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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その24
http://peace.2ch.net/test/read.cgi/unix/1415634843/
0239名無しさん@お腹いっぱい。2015/12/01(火) 17:09:19.19
sed で $-3 とか書いてるプログラマorシス管見つけたら社史編纂室に異動させるわ
0240名無しさん@お腹いっぱい。2015/12/01(火) 17:18:23.69
面白そうじゃないか
0241名無しさん@お腹いっぱい。2015/12/01(火) 18:23:49.12
> 全部パッファしなきゃ実装できない
最後に切る行数分だけバッファーすれば良い
0242名無しさん@お腹いっぱい。2015/12/01(火) 21:49:07.76
そんなことしか思いつかないところが壊滅的にセンス悪い
1,$-3s/hoge/hage/
0243名無しさん@お腹いっぱい。2015/12/01(火) 22:53:36.24
なんだまた一人で自演だったか
0244not 2382015/12/02(水) 07:07:15.41
>>242 でも、4行分バッファして4行分処理を遅延すればできるが。

それとは別に、sedではそういう処理には向かないというのは同意。
0245名無しさん@お腹いっぱい。2015/12/02(水) 23:21:03.30
バッファーした後は、N;P;D のループで済むから、比較的単純。結構 sed 向きじゃない?
sed -ne ':Lp; N; 1,4b Lp; P; D'

cutTail()
{
 sed -ne '
  :LoopToFillBuffer
  N
  1, '"$1"' b LoopToFillBuffer
  
  P
  D
 '
}
0246名無しさん@お腹いっぱい。2015/12/04(金) 00:22:12.57
# delete the last 10 lines of a file
sed -e :a -e '$d;N;2,10ba' -e 'P;D' # method 1
sed -n -e :a -e '1,10!{P;N;D;};N;ba' # method 2

http://sed.sourceforge.net/sed1line.txt
0247名無しさん@お腹いっぱい。2015/12/04(金) 06:04:34.02
>>246
-e オプションで複数に分ける意味ないだろ。

sed ':a;$d;N;2,10ba;P;D'
または
sed -n ':a;1,10!{P;N;D;};N;ba'
だけで行ける。
0248名無しさん@お腹いっぱい。2015/12/04(金) 06:26:55.09
シェルスクリプトでオブジェクト指向ってできないんですか?
0249名無しさん@お腹いっぱい。2015/12/04(金) 07:53:54.11
>>248
つ 『Unix Shell Objects』
http://www.amazon.co.jp/dp/toc/0764570048
0250名無しさん@お腹いっぱい。2015/12/07(月) 10:28:27.33
httpsでファイル入手するスクリプトで一番汎用的な書き方ってなんだろう?
0251名無しさん@お腹いっぱい。2015/12/07(月) 10:33:45.35
wget
0252名無しさん@お腹いっぱい。2015/12/07(月) 10:48:19.19
curl
0253名無しさん@お腹いっぱい。2015/12/07(月) 11:21:08.52
古い環境だと結局ブラウザ使うのが一番確実だったりするのだろうか?
0254名無しさん@お腹いっぱい。2015/12/07(月) 13:20:40.25
>>253
スクリプトからブラウザ呼ぶの?
0255名無しさん@お腹いっぱい。2015/12/07(月) 16:31:25.34
シェルスクリプトで宅内監視カメラの静止画を1分ごとにDLして保存してるけど、
うちではcurlが鉄板だわ
0256名無しさん@お腹いっぱい。2015/12/07(月) 21:08:34.28
linux - Is wget or similar programs always available on POSIX systems? - Stack Overflow
http://stackoverflow.com/questions/9490872/is-wget-or-similar-programs-always-available-on-posix-systems

まあ、wget curl が普通だろうけど、汎用的って言う事で考えるに telnet を追加

{ sleep 1; printf 'open home.mcom.com 80\n'; sleep 3; printf 'GET /home/welcome.html HTTP/1.0\n\n'; sleep 3; } | telnet -8
0257名無しさん@お腹いっぱい。2015/12/07(月) 21:20:56.81
監視カメラの時間別映像ファイルを上書きで消すのをトリックに使ったミステリがあったなあ
0258名無しさん@お腹いっぱい。2015/12/07(月) 21:27:45.23
httpsってsslかなんかだっけ?
0259名無しさん@お腹いっぱい。2015/12/07(月) 22:42:59.47
当然>>256はそれで終わりじゃないよな?
SSL/TLSのためにもうひと工夫あるんだよな?
ボケ回答のウケ狙いじゃないよな?
0260名無しさん@お腹いっぱい。2015/12/07(月) 23:08:08.80
https telnet で検索
0261名無しさん@お腹いっぱい。2015/12/07(月) 23:43:57.13
流石にSSL部分を前スレ716みたいなコードで置き換えるというのは無茶だろうか?
0262名無しさん@お腹いっぱい。2015/12/07(月) 23:52:00.25
検索したらそういう変態技サイトでもあるのかなと思ったけど見つけられなかったわ
>>260に期待する
0263名無しさん@お腹いっぱい。2015/12/07(月) 23:53:10.50
s_clientつーのがある
0264名無しさん@お腹いっぱい。2015/12/08(火) 00:09:05.97
telnetとoepnsslの区別が出来ない人がいるな
0265名無しさん@お腹いっぱい。2015/12/08(火) 00:54:46.22
256のように標準入力からコマンド流しこめる奴って話だろ。アスペ。
0266名無しさん@お腹いっぱい。2015/12/08(火) 07:04:54.30
同様に扱える

{
sleep 1
printf 's_client -connect www.example.com:443\n'
sleep 3
printf 'GET / HTTP/1.1\nHost: www.example.com\n\n'
sleep 3
} | openssl
0267名無しさん@お腹いっぱい。2015/12/08(火) 07:25:22.83
>>250

perlのモジュール使う
0268名無しさん@お腹いっぱい。2015/12/08(火) 10:24:12.12
>>267
それこそ環境選ばないか?
0269名無しさん@お腹いっぱい。2015/12/08(火) 11:28:41.95
perl入ってない環境使う機会なんて
もうほとんどなくなったなぁ
0270名無しさん@お腹いっぱい。2015/12/08(火) 11:50:28.49
perl入ってる環境使う機会なんて
もうほとんどなくなったなぁ
0271名無しさん@お腹いっぱい。2015/12/08(火) 12:05:03.09
初版から標準対応しているものでないと使いにくいよね。
0272名無しさん@お腹いっぱい。2015/12/08(火) 14:20:28.02
入ってなくて、入れていいなら入れるもの
0273名無しさん@お腹いっぱい。2015/12/08(火) 14:29:50.01
入れ替えるのはどこかで不都合があるかわかったもんじゃないからな。
0274名無しさん@お腹いっぱい。2015/12/08(火) 15:13:44.93
本体ロム領域4MBのルーターのtelnet接続で動く技でお願いします。
>>256は動きそうなので合格だけどssl非対応なので不合格。
>>266はopensslコマンドがないので落第です。

もっと頑張ってくださいよ。
0275名無しさん@お腹いっぱい。2015/12/08(火) 16:28:48.50
条件後出し北w
0276名無しさん@お腹いっぱい。2015/12/08(火) 17:44:47.81
そもそも前出ししてないけどな
>>250の条件は一番汎用的ということで完結しているので、それより解きやすい派生のお題だろう。
0277名無しさん@お腹いっぱい。2015/12/08(火) 17:49:54.77
じゃ、その4MBのROMの中身、開示しないとだめだろ。
つーか、なんか白けてきた。。。
0278名無しさん@お腹いっぱい。2015/12/08(火) 17:50:49.65
それは>>274に聞いてくれ
0279名無しさん@お腹いっぱい。2015/12/08(火) 17:55:37.06
>>277
root# busybox
BusyBox v1.22.1 (2014-09-20 22:01:35 CEST) multi-call binary.
BusyBox is copyrighted by many authors between 1998-2012.
Licensed under GPLv2. See source distribution for detailed
copyright notices.

Currently defined functions:
[, [[, arping, ash, awk, basename, brctl, bunzip2, bzcat, cat, chgrp,
chmod, chown, chroot, clear, cmp, cp, crond, crontab, cut, date, dd,
devmem, df, dirname, dmesg, du, echo, egrep, env, expr, false, fgrep,
find, free, fsync, grep, gunzip, gzip, halt, head, hexdump, hostid,
hwclock, id, ifconfig, kill, killall, less, ln, lock, logger, ls,
md5sum, mkdir, mkfifo, mknod, mkswap, mktemp, mount, mv, nc, netmsg,
netstat, nice, nslookup, ntpd, passwd, pgrep, pidof, ping, ping6,
pivot_root, poweroff, printf, ps, pwd, readlink, reboot, reset, rm,
rmdir, route, sed, seq, sh, sleep, sort, start-stop-daemon, strings,
switch_root, sync, sysctl, tail, tar, tee, telnet, telnetd, test, time,
top, touch, tr, traceroute, true, udhcpc, umount, uname, uniq, uptime,
vconfig, vi, wc, wget, which, xargs, yes, zcat
0280名無しさん@お腹いっぱい。2015/12/08(火) 18:25:47.79
wget使えんのか?
0281名無しさん@お腹いっぱい。2015/12/08(火) 18:28:57.45
busyboxでwgetは使えるが、httpsには対応してない。(httpとftpのみ)
0282名無しさん@お腹いっぱい。2015/12/08(火) 19:30:56.44
最近はスクリプトと言えばbusyboxの仕事ばかり。
perl使いは社史編纂室に送られたw
0283名無しさん@お腹いっぱい。2015/12/08(火) 19:31:25.90
条件を増やしても減らしても後出し

元々の条件
httpsでファイル入手するスクリプトで一番汎用的な書き方ってなんだろう?

後出し条件
4MBのルーターのtelnet接続で動く技で
0284名無しさん@お腹いっぱい。2015/12/08(火) 20:02:22.82
>>283
前者は汎用的、後者はカスタムで、条件が正反対だろうが
0285名無しさん@お腹いっぱい。2015/12/08(火) 20:08:32.27
条件は部分集合だろ?
0286名無しさん@お腹いっぱい。2015/12/08(火) 20:11:56.40
いまどきだとtelnetがなくてsshだけだったりするのもあるのだろうか?
0287名無しさん@お腹いっぱい。2015/12/08(火) 20:25:44.06
>>285
違うからブランチだと言ってるんだろう。そもそも別人なので後出しも前田氏もない。
0288名無しさん@お腹いっぱい。2015/12/08(火) 20:52:44.89
へぇ〜別人ねぇ〜
別人が横から条件変えてるのか

何故に言い切るの?
あほらし。相手して損した
0289名無しさん@お腹いっぱい。2015/12/08(火) 21:01:10.94
>>288
250だけど何か質問ある?
0290名無しさん@お腹いっぱい。2015/12/08(火) 21:16:23.39
grepを破壊的に使うことってできます?
あればおしえてください
他のフィルタ系コマンドでも応用できるものだとよりよいです
0291名無しさん@お腹いっぱい。2015/12/08(火) 21:38:58.20
>>288
リテラシー低いよ
0292名無しさん@お腹いっぱい。2015/12/08(火) 21:44:05.23
>>290
(rm file; grep hoge >file) <file
Cygwinじゃ無理かも
0293名無しさん@お腹いっぱい。2015/12/08(火) 21:47:39.67
あとファイルシステムの容量が不足したら
元ファイルまで失われるという欠陥もある
0294名無しさん@お腹いっぱい。2015/12/08(火) 21:48:19.00
>>288
>>279で条件提示したんだから、この中のコマンドで完結できる案を出しなさいよ
0295名無しさん@お腹いっぱい。2015/12/08(火) 21:49:52.56
>>292
できました(Cygwin64でも
ありがとうございます!
0296名無しさん@お腹いっぱい。2015/12/10(木) 05:48:14.80
初歩的な質問ですみません。
find . -type f -name '*.txt' と
find . -name '*.txt' -type f は、どっち良いとかありますか?
0297名無しさん@お腹いっぱい。2015/12/10(木) 07:16:13.77
>>282

まじかw 
ワロタ
0298名無しさん@お腹いっぱい。2015/12/10(木) 07:31:45.64
>>296
どっちでもいいよ
ほとんどプレーンファイルっていう普通の状況なら、
名前を先に判定したほうが計測できないレベルで速いかもしれない
0299名無しさん@お腹いっぱい。2015/12/10(木) 08:02:20.09
wget、通常ならHTTPS (SSL/TLS) Optionsがあって、オプション指定できるが
busybox組み込みのwgetは、軽くするため、httpsオプションなしでコンパイルされ
てるのかな。
0300名無しさん@お腹いっぱい。2015/12/10(木) 08:48:45.97
コンソールから、2chのスレ(たとえばココ)に投稿するような
スクリプト使ってる人いますか?
0301名無しさん@お腹いっぱい。2015/12/10(木) 09:01:58.85
>>296
レギュラーファイル以外のディレクトリとかが1000万個あるなら、名前を比較しないで済む前者の方が良いかもしれない
0302名無しさん@お腹いっぱい。2015/12/10(木) 12:39:47.97
>>299
wgetがhttps対応したのは後出しなんじゃないか?
busyboxが登場した頃のwgetでは標準では無かったと思われ
0303名無しさん@お腹いっぱい。2015/12/10(木) 12:53:18.77
そもそも軽くするのにashなんて必要だろうか?
0304名無しさん@お腹いっぱい。2015/12/10(木) 13:12:18.13
>>303
他の選択肢は?
0305名無しさん@お腹いっぱい。2015/12/10(木) 13:38:24.81
2001年からHTTPSサポートしてるんだぜ
それ以上古い環境なんて考慮する必要ないよ
0306名無しさん@お腹いっぱい。2015/12/10(木) 14:03:30.45
そんな事言ってる奴はbashとopensslの穴に落ちるがいい。
なんと言われようとshが標準
0307名無しさん@お腹いっぱい。2015/12/10(木) 15:56:58.29
>>298>>301
ありがとうございます、実質変わらないんですね。
気にしないことにします。
0308名無しさん@お腹いっぱい。2015/12/11(金) 00:02:46.91
https://git.busybox.net/busybox/log/networking/wget.c
wget: add support for https using "openssl s_client" as a helper Denys Vlasenko 2014-02-22
0309名無しさん@お腹いっぱい。2015/12/11(金) 00:30:35.95
>>296
そういう時は time コマンドを使って CPU 時間計測するというのも手だぞ。
0310名無しさん@お腹いっぱい。2015/12/11(金) 01:31:31.62
ROMが4MBの余ったbuffalo製ルータにopenwrt1505入れてみたわ

root@OpenWrt:/# wget https://192.168.1.1/
Connecting to 192.168.1.1 (192.168.1.1:443)
wget: can't execute 'openssl': No such file or directory
wget: error getting response: Connection reset by peer

root@OpenWrt:/# df
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 448 232 216 52% /
/dev/root 2304 2304 0 100% /rom
tmpfs 14368 524 13844 4% /tmp
/dev/mtdblock5 448 232 216 52% /overlay
overlayfs:/overlay 448 232 216 52% /
tmpfs 512 0 512 0% /dev

初期状態ですでにfilesystemの空き容量216KB こりゃムリゲーだわ
0311名無しさん@お腹いっぱい。2015/12/11(金) 13:13:34.04
>>310

おつかれちゃん。
というわけで、4MB ROMで、httpsの話題は糸冬了とさせていただきます。w
0312名無しさん@お腹いっぱい。2015/12/12(土) 02:38:13.55
>>309
ありがとうございます。
15000個のディレクトリと120000個のファイルが入ったディレクトリで
何度かやってみましたが特に違いはありませんでした。
0313名無しさん@お腹いっぱい。2015/12/12(土) 12:37:42.64
>>310-311
ちょっと待った、216KBあればスクリプト何行書けるよ?
前スレのRSA暗号のスクリプトの10倍程度に膨れたとしても余裕で入らないか?
0314名無しさん@お腹いっぱい。2015/12/12(土) 14:30:14.68
>>313
エラーメッセージ読めないなら黙ってなよ
0315名無しさん@お腹いっぱい。2015/12/12(土) 14:35:22.38
openssl相当をシェルスクリプトで書くっていう
意味だと読み取れないなら黙ってろよ
0316名無しさん@お腹いっぱい。2015/12/12(土) 16:50:31.02
vagrantで仮想サーバー環境を作っていて
provisioning.shというファイルを作りvagrantを立ち上げたときの初期動作を指定しているのですが
sudo yum install postfix -y としたあと
sudo alternatives --config mta
とすると番号を聞かれるのですが、1番のpostfixを選びたい場合どう書けばいいのですか?
sudo yum install -yと書くと途中のyes/noをyにしてくれる、というようなことがしたいのですが
0317名無しさん@お腹いっぱい。2015/12/12(土) 20:01:02.92
>>315
ぷぷぷぷ、RSAの他に最低でも
楕円曲線暗号、メッセージダイジェスト、asn1デコーダ、エンコーダ、pemエンコーダ、デコーダー
作ってから言ってね。
0318名無しさん@お腹いっぱい。2015/12/12(土) 20:44:59.01
楕円曲線暗号、メッセージダイジェスト、asn1デコーダ、エンコーダ、pemエンコーダ、デコーダーが
シェルスクリプトだけで作れない証明は?
0319名無しさん@お腹いっぱい。2015/12/12(土) 21:06:08.70
>>318
作って公開したら全員黙るよ
0320名無しさん@お腹いっぱい。2015/12/13(日) 01:42:09.87
後、共通鍵暗号も要るね
ワクワク
0321名無しさん@お腹いっぱい。2015/12/13(日) 02:03:11.75
なんかガキが出てきて凄そうなキーワード上げてるって感じにしか見えん
0322名無しさん@お腹いっぱい。2015/12/13(日) 02:21:22.86
x509って知ってる?
楕円曲線暗号は必須じゃないけど他は全部必要だよ。
0323名無しさん@お腹いっぱい。2015/12/13(日) 03:26:03.62
っていうか、作り方わかってるなら組めるだろ
自分で作れないものを挙げろよ
0324名無しさん@お腹いっぱい。2015/12/13(日) 07:04:17.98
>>316
man alternatives
man update-alternatives
か何かで調べると --config 以外の非対話的オプションが有るが
それは使えない?
0325名無しさん@お腹いっぱい。2015/12/13(日) 07:30:11.14
>>323
キミが全部作って>>266相当を実証して見せれば、みんな黙るよ
0326名無しさん@お腹いっぱい。2015/12/13(日) 08:06:26.59
他の解決方法でなく
シェルスクリプトで openssl を実現しようと云う発想をする時点で、
しかも条件を提示したんだから解決方法を出せとか

(別の意味で)黙るよね
0327名無しさん@お腹いっぱい。2015/12/13(日) 09:08:35.94
実現不能な提案は妄想って言うんだよ
で、お前は実装できるの?
0328名無しさん@お腹いっぱい。2015/12/13(日) 11:05:38.72
できるよ。無意味だからしないけど。
黙らなくていいよ。グズグズ言い続けて。
0329名無しさん@お腹いっぱい。2015/12/13(日) 11:19:13.11
世界初だから全然無意味じゃない。
0330名無しさん@お腹いっぱい。2015/12/13(日) 13:45:47.64
bashでOSを判別しようと思ってて、シェル変数OSTYPEで判別するのがいいのかなと
思ってるんですが、もっとよい方法ありますか?

あとHP-UX 11iのbashでシェル変数OSTYPEは何になっているか、わかる方はいますか?
0331名無しさん@お腹いっぱい。2015/12/13(日) 13:57:10.41
uname
0332名無しさん@お腹いっぱい。2015/12/18(金) 20:07:27.08
telnet で季節ものを。
telnet ネタコードにネタを重ねています
GNU sleep を使っています

ワンライナー
i=-1; while [ $(( i += 1 )) -le 9 ]; do { sleep 1; printf 'open vt100.net 80\n';\
sleep 3; printf 'GET /animation/xmas'"$i"'.txt HTTP/1.0\n\n'; sleep 3; } | telnet -8\
| while IFS= read -r line; do echo "$line"; sleep 0.08; done; printf \
'Watch More? ( Yes / No ): '; read ans; case "$ans" in n|N|no|NO) i=99;; esac; done

視線が...さ、寒い
良いお年を

そういえばこんなのも
telnet nyancat.dakko.us
0333名無しさん@お腹いっぱい。2015/12/18(金) 20:08:17.92
スクリプト
#!/bin/sh
i=-1
while
 [ $(( i += 1 )) -le 9 ]
do
 {
  sleep 1
  printf 'open vt100.net 80\n'
  sleep 3
  printf 'GET /animation/xmas'"$i"'.txt HTTP/1.0\n\n'
  sleep 3
 } |
  telnet -8 |
  while IFS= read -r line
  do
   echo "$line"
   sleep 0.08
  done
 
 printf 'Watch More? ( Yes / No ): '
 read ans
 case "$ans" in
 n|N|no|NO) i=99;;
 esac
done
0334名無しさん@お腹いっぱい。2015/12/19(土) 01:54:54.83
328が来年のusenixでopenssl相当のシェルスクリプトの実装を発表する
0335名無しさん@お腹いっぱい。2015/12/20(日) 02:31:00.77
それは宣言ですか?絶対当たらなそうな予言ですか?
とりあえずopenssl相当の処理なんて必要かな?
課題的には鯖から落とせればその相手が本物かどうかなんてどうでもいいんじゃない?
と言っても鍵は送る方が指定するみたいから肝心な暗号処理で手抜きは効かなそうだな。
処理自体は計算式で表現できたりする程度のものだけど、数がバカでかいからそのまま丸投げだと無理かも?
0336名無しさん@お腹いっぱい。2015/12/20(日) 16:46:55.74
>>300です。
やっと、コンソールから2chにかきこできるようになりました。
ま、Perl使ってですが。。。
改行ちゃんと入るかな?
0337名無しさん@お腹いっぱい。2015/12/20(日) 18:14:25.11
前スレで質問して、
「UNIXでもメモリクリーニングはできる」と回答をもらった者です。
そこで早速perlを使って、perl -e 'while (1) { fork; }'
を実行してみました。
で、メモリクリーニングはいつ終るのでしょうか?
念のため、PCケースを開けてみましたが、
メモリ表面の汚れは取れていませんでした。
やはりUNIXはメモリクリーニングに対応していないのでしょうか?
0338名無しさん@お腹いっぱい。2015/12/20(日) 19:12:40.94
perl -e "fork while fork" &
0339名無しさん@お腹いっぱい。2015/12/20(日) 21:35:35.99
>>336
cpanのどれ利用した?
それとも使ってない
■ このスレッドは過去ログ倉庫に格納されています