トップページ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/
0274名無しさん@お腹いっぱい。2013/03/13(水) 22:25:37.58
それわざわざ書き込むほどのことか?
0275名無しさん@お腹いっぱい。2013/03/14(木) 11:50:50.62
>>270
-n でチェックしてるときは出してほしいな
0276名無しさん@お腹いっぱい。2013/03/14(木) 11:51:35.63
>>273
まじか。そんなかっこいい小説だったのか。
0277名無しさん@お腹いっぱい。2013/03/14(木) 16:17:13.28
お尋ねします。
list.txtに
a 111
b 222
c 333
といった各行二つの要素のデータを格納しています。
それぞれの行について、一つ目の要素をファイル名に、二つ目の要素をファイルの中身に
しようと思います。
a.txtの中身は111
b.txtの中身は222
c.txtの中身は333
といったたぐいです。

書いたスクリプトは
#!/bin/bash
for a in `awk '{print $0}' list.txt`
do
for b in `awk '{print $1}' list.txt`
do
echo $a >$b.txt
done
done

とした結果全てのファイルの中身が111となってしまいました。
for文を理解出来ていないように思います。

どなたか救いの手をよろしくお願いします。
0278名無しさん@お腹いっぱい。2013/03/14(木) 16:29:15.04
while read filename data; do
echo "$data" > "$filename"
done < list.txt
0279名無しさん@お腹いっぱい。2013/03/14(木) 16:40:39.76
動きました。
readのあとに変数を並べればその順番に読み込むことを
教えていただきありがとうございました。

一行ずつデータを読むreadと
無限ループのwhileの組み合わせを用いると。
多謝
0280名無しさん@お腹いっぱい。2013/03/14(木) 16:56:50.18
いや無限ループじゃねーよ?
0281名無しさん@お腹いっぱい。2013/03/15(金) 10:43:03.35
もしもデータが無限なら?
0282名無しさん@お腹いっぱい。2013/03/15(金) 12:07:01.54
それは>>279がnamed pipeを知っている場合に限られる。
0283名無しさん@お腹いっぱい。2013/03/15(金) 12:14:48.15
思いのすべてをデータにして
0284名無しさん@お腹いっぱい。2013/03/16(土) 00:36:18.61
シェルとバッチって、癖の回避的に、どっちがクソ?
0285名無しさん@お腹いっぱい。2013/03/16(土) 00:48:46.58
>>282
いつかはマシンがお亡くなりになって終わるんじゃね?
0286名無しさん@お腹いっぱい。2013/03/16(土) 01:40:44.77
>>284
対話と一括を比較されても。
0287名無しさん@お腹いっぱい。2013/03/16(土) 01:54:23.55
シェルスクリプトとバッチって、癖の回避的に、どっちがクソ?
0288名無しさん@お腹いっぱい。2013/03/16(土) 02:24:05.98
何言ってるかさっぱり分からん。
癖の回避?
0289名無しさん@お腹いっぱい。2013/03/16(土) 02:51:57.34
>>287
シェルスクリプトでバッチ処理書けよ。
0290名無しさん@お腹いっぱい。2013/03/16(土) 02:57:24.95
燃料を投下したのにあっさり流された
0291名無しさん@お腹いっぱい。2013/03/16(土) 03:27:10.82
>>289
仕様の提示をお願いします
0292名無しさん@お腹いっぱい。2013/03/18(月) 10:03:03.01
対話型しか選べないコマンドってクソだと思うわ
0293名無しさん@お腹いっぱい。2013/03/18(月) 11:16:27.60
expectやptyがあれば怖いものはないです。
0294名無しさん@お腹いっぱい。2013/03/18(月) 12:18:58.23
expectやpty通さなきゃならないコマンドってクソだと思うわ
0295名無しさん@お腹いっぱい。2013/03/18(月) 12:47:55.91
ヒアドキュメントで良いじゃん
0296名無しさん@お腹いっぱい。2013/03/18(月) 14:06:22.94
>>295
おまえヒアドキュメントでsshのパスワード入力できんのかよ
0297名無しさん@お腹いっぱい。2013/03/18(月) 14:40:08.45
じゃあ冷やすとリングで
0298名無しさん@お腹いっぱい。2013/03/20(水) 09:12:19.32
>>296
ssh 自動化させるならパスフレーズ設定しない公開鍵作成しろよ。
0299名無しさん@お腹いっぱい。2013/03/20(水) 10:01:53.76
>>296
公開鍵使えよ。
0300名無しさん@お腹いっぱい。2013/03/20(水) 13:11:02.19
>>298
できないサーバがあるんだよ
0301名無しさん@お腹いっぱい。2013/03/20(水) 13:30:49.45
公開鍵とパスフレーズ両方使うよ (震え声)
03022402013/03/20(水) 14:17:01.94
manが壊れて真っ白なんだけどどうしたらいいですか
0303名無しさん@お腹いっぱい。2013/03/20(水) 14:47:31.51
何言ってんだ。
0304名無しさん@お腹いっぱい。2013/03/20(水) 14:56:14.39
>>303
manのDBがぶっ壊れたんじゃねーの?
mandb -c
でもやっときゃ治るんじゃね?
0305名無しさん@お腹いっぱい。2013/03/20(水) 15:54:26.54
roffソースは見えるのか?
nroff -man とか -mandoc とかでは見えるのか?
0306名無しさん@お腹いっぱい。2013/03/20(水) 16:29:00.10
>>300
それは自動化するなってポリシーだろ。
0307名無しさん@お腹いっぱい。2013/03/20(水) 16:34:18.88
>>302
スレ違い
0308名無しさん@お腹いっぱい。2013/03/20(水) 16:50:03.97
>>306
そんなポリシー知ったことか
0309名無しさん@お腹いっぱい。2013/03/20(水) 18:25:40.65
>>308
ならヒアドキュメントに書けよ。
0310名無しさん@お腹いっぱい。2013/03/20(水) 18:47:24.36
元々は>>292
で、>>308 サーバーがクソだという結論(sshの場合は)
対話が必要ってことは人間(>>308)にも使い道があるってことだよ。
なるべく減らした方が良いのは言うまでもないけど難しいね。

すれ違いだけどsshにはssh-agentとかagent forwardとかあるから
そういうことにも配慮されてる。agent forwardするとbackgroundで
動かしつつlogoutすると新規に接続できなくなるけど。
0311名無しさん@お腹いっぱい。2013/03/20(水) 18:54:36.87
>>309
ヒアドキュメントじゃ動かないよ・・・
0312名無しさん@お腹いっぱい。2013/03/20(水) 18:56:53.20
パスワードでのrloginはできるけどssh/rshは使っちゃダメな会社はあるらしいね
リモートでシェルコマンド実行したいときは仕方なくexpect+rlogin使ってるらしい
何を考えてそういうポリシーになってるのかは謎
0313名無しさん@お腹いっぱい。2013/03/20(水) 19:48:21.83
>>311
expectの中に書くってことだよ。
0314名無しさん@お腹いっぱい。2013/03/20(水) 21:20:00.49
>>300
どうやってサーバーサイドで公開鍵のパスフレーズ必須にできるんだよ。
0315名無しさん@お腹いっぱい。2013/03/20(水) 21:40:52.89
できないと思いこんでる情弱だらけだな
0316名無しさん@お腹いっぱい。2013/03/20(水) 21:45:17.55
ssh1,ssh2ともにプロトコル上パスフレーズ送らないんだから、制限なんか出来るわけがない。
0317名無しさん@お腹いっぱい。2013/03/20(水) 21:46:23.08
そもそもパスフレーズは秘密鍵側に設定するものであってだね。
0318名無しさん@お腹いっぱい。2013/03/20(水) 21:47:36.65
「長いログインパスワード」だと思ってるんじゃねーの。
0319名無しさん@お腹いっぱい。2013/03/20(水) 21:58:29.79
「鍵認証を禁止してパスワード認証のみ許す」なら
出来るから、それと混同してるんじゃないかな。
0320名無しさん@お腹いっぱい。2013/03/20(水) 22:46:51.79
expectって古くない?それ専用でスクリプト書かないといけないし、tclが要るし。emptyってどうよ
0321名無しさん@お腹いっぱい。2013/03/20(水) 22:58:21.11
>>316
もう1つ方法があるだろ、知らないのか?
0322名無しさん@お腹いっぱい。2013/03/20(水) 23:33:19.79
>>321
ないよ。
0323名無しさん@お腹いっぱい。2013/03/20(水) 23:40:01.59
>>321
バカに教えておいてやる。rfc4252で定義されている認証方式は
7. Public Key Authentication Method: "publickey"
8. Password Authentication Method: "password"
9. Host-Based Authentication: "hostbased"
の三種類。このうち公開鍵を利用した認証方式は7と9
7,9のどちらもパスフレーズは送らない。
0324名無しさん@お腹いっぱい。2013/03/21(木) 00:14:14.88
あきらかに間違ったことを書いて適当に煽ると正しい情報が出てくる。
2chの情強視点の正しい使い方。
0325名無しさん@お腹いっぱい。2013/03/21(木) 00:44:29.26
何という高等テクニック
0326名無しさん@お腹いっぱい。2013/03/21(木) 01:09:02.59
>>324
たださらに間違いを重ねてくる場合も。微妙に間違える場合も。自分で確認しろってことやね
0327名無しさん@お腹いっぱい。2013/03/21(木) 01:29:06.00
>>314
サーバサイドってか、会社のポリシーで強制してんじゃないの。
03282402013/03/21(木) 07:35:03.32
流れ無視してわるいけど
303、304、305、307さんありがとね
ちょっと試してみます
0329名無しさん@お腹いっぱい。2013/03/21(木) 11:34:13.49
うちのサーバは秘密鍵使えない仕様になってる
0330名無しさん@お腹いっぱい。2013/03/21(木) 19:29:52.66
>>327
「会社の方針」を↓このように説明する奴は会社員失格

> From: [300] 名無しさん@お腹いっぱい。 <sage>
> Date: 2013/03/20(水) 13:11:02.19
>
> >>298
> できないサーバがあるんだよ
0331名無しさん@お腹いっぱい。2013/03/21(木) 19:34:05.87
いつまでやってんだ。
0332名無しさん@お腹いっぱい。2013/03/21(木) 20:07:34.29
>>300が「できないサーバ」を解説すれば終了するんじゃないかな。
0333名無しさん@お腹いっぱい。2013/03/21(木) 23:24:51.13
商用で使ってるから sendmail に設定入れちゃダメだけど、
メールで毎日ヘルスチェックレポートをメールで飛ばしたい。
SW側で smtp も pop も閉じてる。
とか、意味の分かんない要望を満たすスクリプトを組んだことがある。

世の中、変態が多いと思ったよ。
0334名無しさん@お腹いっぱい。2013/03/22(金) 11:22:35.11
>>332
鍵を使わせてもらえない
0335名無しさん@お腹いっぱい。2013/03/22(金) 11:32:33.35
ここ何のスレだっけ。
0336 忍法帖【Lv=8,xxxP】(1+0:8) 2013/03/23(土) 19:42:31.83
[[ ! -d hoge ]] && mkdir hoge
[ ! -d hoge ] && mkdir hoge
これってどっちも同じ?
0337名無しさん@お腹いっぱい。2013/03/23(土) 20:05:46.61
[[ ]] は bashの機能!

わざわざtestしなくても mkdir hoge 2> /dev/null でいいよ。
test方式だとクリティカルパスになるから不完全だし。
0338名無しさん@お腹いっぱい。2013/03/23(土) 20:13:10.91
>>336
[[ ! -d hoge ]] の場合、hogeにワイルドカードが含まれていても展開しない。
[ ! -d hoge ] の場合はワイルドカードを展開する、という違いがある。
0339 忍法帖【Lv=8,xxxP】(1+0:8) 2013/03/24(日) 10:14:14.17
>>337,338
なるほど!ありがとう!
0340名無しさん@お腹いっぱい。2013/03/25(月) 00:31:16.37
シエルってやはりプログラム言語として万能では無いね
0341名無しさん@お腹いっぱい。2013/03/25(月) 00:47:35.18
あたりまえー。
0342名無しさん@お腹いっぱい。2013/03/25(月) 04:27:54.82
未だに万能なプログラミング言語に出会ったことがない。
汎用なら使っているが。
0343名無しさん@お腹いっぱい。2013/03/25(月) 09:11:43.16
>>337
[[ は bash じゃなくて ksh 由来。
0344名無しさん@お腹いっぱい。2013/03/25(月) 10:09:29.81
まぁ bash の機能ではあるな。
それ言ったら [ も bash の機能だけど。
0345名無しさん@お腹いっぱい。2013/03/25(月) 10:10:49.35
kshってポジックス()準拠じゃなかったのかよ
0346名無しさん@お腹いっぱい。2013/03/25(月) 10:46:57.85
市販のルータやNASに同梱されてるスクリプトを覗くとき

cd /home/LANDISK/scripts/
cat *.sh

ってやると、バイナリファイルが混じっててビビるんですが、
あれはなんなんですか。
0347名無しさん@お腹いっぱい。2013/03/25(月) 10:57:34.31
自己解凍のtar玉とかじゃないの
ファイル先頭部分のみシェルスクリプトになってて、
ファイル後半にtar玉とかのバイナリが連結されてる。
シェルはバイナリ部分を読む前にexitするし、バイナリ部分をtail -n +XXX とかで
取り出すからこれで動作できる。
0348名無しさん@お腹いっぱい。2013/03/25(月) 11:04:42.92
ただの文字化けじゃないの。
0349名無しさん@お腹いっぱい。2013/03/25(月) 11:23:49.36
どうも。文字化けではなく、でもなぜかしょっぱなからバイナリです。

setuser.sh
ELF

エディタで開くと、こんな感じです。
0350名無しさん@お腹いっぱい。2013/03/25(月) 11:37:57.53
だったら普通のELFのバイナリじゃん。ファイル名の統一上、*.shになってるだけ。
0351名無しさん@お腹いっぱい。2013/03/25(月) 11:43:03.16
牛肉偽装より悪質ですね。失望しました。
0352名無しさん@お腹いっぱい。2013/03/25(月) 11:52:02.76
file setuser.sh
0353名無しさん@お腹いっぱい。2013/03/25(月) 12:06:24.73
>>352
bash$ file
sh: file: command not found
0354名無しさん@お腹いっぱい。2013/03/25(月) 12:09:46.54
>>353
おそらくlddコマンドもないだろうから、

LD_TRACE_LOADED_OBJECTS=1 ./setuser.sh

してみ。動的リンクならライブラリが表示されるし、
静的なら not a dynamic executable ってなる。
0355名無しさん@お腹いっぱい。2013/03/25(月) 12:15:56.58
>>354
ありがとうございます。こうなりました。

# LD_TRACE_LOADED_OBJECTS=1 ./setuser.sh
libc.so.6 => /lib/libc.so.6 (0x2957c000)
libnss_dns.so.2 => /lib/libnss_dns.so.2 (0x296bb000)
libnss_files.so.2 => /lib/libnss_files.so.2 (0x296cf000)
libresolv.so.2 => /lib/libresolv.so.2 (0x296e9000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x29556000)

このようなバイナリファイルが中で何をしているのか可読化するには、
どこまで可能でしょうか。
0356名無しさん@お腹いっぱい。2013/03/25(月) 13:03:19.36
いいかげんスレ違い。
0357名無しさん@お腹いっぱい。2013/03/25(月) 13:14:51.48
LANDISKって玄箱だろ。とっくに解析しつくされてたんじゃねーの。
ソースだって入手可能だった気がするが。
0358名無しさん@お腹いっぱい。2013/03/25(月) 15:23:30.31
>>320
perlで動く expect.pm 使ってね
日本語マニュアル、古いのはあったんだけど公開サーバ無くなちゃったな
どうすっかな…
0359名無しさん@お腹いっぱい。2013/03/29(金) 22:14:00.55
diffでファイルをだーって比較すると相違行が表示されるじゃないですか
その相違行の違う文字の部分だけぱーっと色を付けて表示して欲しいんです
出来ますの?勿論ググりましたが、当方馬鹿なのでわかりません
サルでも分かるようなシェルそのものの回答を強く期待します
さぁどうぞ↓
0360名無しさん@お腹いっぱい。2013/03/29(金) 22:44:19.37
docdiff でぐぐるといいかも。
0361名無しさん@お腹いっぱい。2013/03/29(金) 23:57:55.81
>>359
GNUのsource-highlightとかでもいいの?
0362名無しさん@お腹いっぱい。2013/03/30(土) 21:06:24.18
>>359
二行の文字列の相違部分を目視で比較して認識でいないと
吐露していますか?

猿以下の認識能力しかないのに、猿が理解できるレベルの回答を得ても
無駄でしょうに。
0363名無しさん@お腹いっぱい。2013/03/30(土) 22:06:33.56
>>362
自分の文章(文字列)のtypoを発見できない人に言われても…
やっぱりハイライト表示あった方がいいわな
0364名無しさん@お腹いっぱい。2013/04/01(月) 10:49:45.08
>>362
できる/できない論と、効率化、処理コスト削減を同列に語ったら駄目だよ。
0365名無しさん@お腹いっぱい。2013/04/01(月) 11:25:52.57
>>363-364
弱いものいじめはよせ!
>>362だって一生懸命生きているんだぞ!
0366名無しさん@お腹いっぱい。2013/04/02(火) 00:19:37.72
>>362
涙拭けよ
0367名無しさん@お腹いっぱい。2013/04/07(日) 21:03:01.88
すいません。
教えてください。
sh=${SH:-/bin/bash}
と言う処理の
:-
ってどういう意味でしょうか?
0368名無しさん@お腹いっぱい。2013/04/07(日) 21:20:47.08
>>367
似たのがいろいろあるからman shした方が良い。
:-は「Use Default Values.」$SHだけど$SHがunset or nullなら/bin/bashになる。
0369名無しさん@お腹いっぱい。2013/04/07(日) 21:24:34.44
なるほど、bashの機能でしたか、、
0370名無しさん@お腹いっぱい。2013/04/07(日) 21:24:43.66
>>367
http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html#lbBB
0371名無しさん@お腹いっぱい。2013/04/07(日) 21:25:16.12
>>369
bashに限らない。
0372名無しさん@お腹いっぱい。2013/04/07(日) 21:31:29.01
何を質問しても全部否定的に回答されるスレ
0373名無しさん@お腹いっぱい。2013/04/07(日) 21:36:24.43
んなこたーない。
■ このスレッドは過去ログ倉庫に格納されています