シェルスクリプト総合 その25©5ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net
2015/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/
0773名無しさん@お腹いっぱい。
2016/10/16(日) 10:27:03.83ワイルドカードが展開されて「find /tmp -name AABB」となってしまいますが、
これを「find /tmp -name
0774名無しさん@お腹いっぱい。
2016/10/16(日) 10:36:38.42以下のスクリプトはカレントディレクトリに「AABB」というファイルがあると
ワイルドカードが展開されて「find /tmp -name AABB」となってしまいますが、
これを「find /tmp -name "AA*"」とさせるにはどうすればいいのでしょうか?
#!/bin/sh
name="AA*"
option="-name $name"
find /tmp $option
---------------------------
$ ls
AABB test.sh
$ ls /tmp
AACC
$ sh -x test.sh
+ name=AA*
+ option=-name AA*
+ find /tmp -name AABB
/tmp/AACC をヒットさせたくて
下のように変数の書き方を色々変えてみましたが、うまくいかず
悩んでます。
name="AA"*""
name="AA\*"
name="AA\"*\""
option="-name "${name}""
option="-name \${name}"
0775名無しさん@お腹いっぱい。
2016/10/16(日) 10:45:33.830776名無しさん@お腹いっぱい。
2016/10/16(日) 10:53:11.25全角にするけど
option=”-name \”$name\””
とすればよろし
0777名無しさん@お腹いっぱい。
2016/10/16(日) 11:06:04.27ウェブブラウザで書いてて、書き込んでいいですかの確認画面を経由して書き込むと切れちゃう
俺調べ
0778名無しさん@お腹いっぱい。
2016/10/16(日) 13:48:12.77#!/bin/sh
name="AA*"
find /tmp -name "$name"
ってやればいいのに
0779名無しさん@お腹いっぱい。
2016/10/16(日) 13:54:36.43option="$option 他のオプション"
とかやりたいんじゃないの
0780名無しさん@お腹いっぱい。
2016/10/16(日) 17:25:04.68まさにそれだったわ。情報ありがとう
0781名無しさん@お腹いっぱい。
2016/10/16(日) 18:08:50.16find の検索パスにワイルドカード使ってたらだめ
0782名無しさん@お腹いっぱい。
2016/10/16(日) 19:22:23.01# name=
0783名無しさん@お腹いっぱい。
2016/10/16(日) 19:25:37.68スクリプトソース貼るのに致命的だな
0784名無しさん@お腹いっぱい。
2016/10/16(日) 19:40:18.840785名無しさん@お腹いっぱい。
2016/10/26(水) 22:58:52.490786名無しさん@お腹いっぱい。
2016/10/26(水) 23:40:35.700787名無しさん@お腹いっぱい。
2016/10/29(土) 21:05:55.08むかしリダイレクトとtailでやったらうまく行かなかった覚えがあってやめた気がする
0788名無しさん@お腹いっぱい。
2016/10/29(土) 21:22:36.46cmd > >(tee stdout.log) 2> >(tee stderr.log)
0789名無しさん@お腹いっぱい。
2016/10/29(土) 22:19:49.670790名無しさん@お腹いっぱい。
2016/10/30(日) 09:23:07.74で出来ないか?
0791名無しさん@お腹いっぱい。
2016/10/30(日) 21:41:34.72{ { cmd | tee stdout.log 1>&3; } 2>&1 | tee stderr.log 1>&2; } 3>&1
・bash: 標準出力、標準エラー出力をファイル、画面それぞれに出力する方法 - Qiita
http://qiita.com/laikuaut/items/e1cc312ffc7ec2c872fc
0792名無しさん@お腹いっぱい。
2016/11/04(金) 12:24:35.95この時ファイル名とmp3タグにはCDDBから読み込んで来る。
これをやるのに手っ取り早い方法ってなんだろ
0793名無しさん@お腹いっぱい。
2016/11/04(金) 12:26:20.170794名無しさん@お腹いっぱい。
2016/11/04(金) 12:31:52.740795名無しさん@お腹いっぱい。
2016/11/17(木) 04:52:04.55curl でhttp の応答をチェックしたいのですが
下記みたいにしてもちゃんと判定できないのですが何が原因でしょうか?
test $(curl -XHEAD -s -i https://www.google.co.jp | awk NR=1) = 'HTTP/1.1 200 OK';echo $?
0796名無しさん@お腹いっぱい。
2016/11/17(木) 06:02:01.01$ [ $(curl -I http://localhost/ 2>&- | head -n 1) = 'HTTP/1.1 200 OK' ]; echo $?
bash: [: too many arguments
2
$ [ "$(curl -I http://localhost/ 2>&- | head -n 1)" = 'HTTP/1.1 200 OK' ]; echo $?
0
$ [ "$(curl -I http://localhost/dummy 2>&- | head -n 1)" = 'HTTP/1.1 200 OK' ]; echo $?
1
っとちょっと色々違うけど、うちでは之でなんとかなってる
0797名無しさん@お腹いっぱい。
2016/11/17(木) 06:27:40.740798名無しさん@お腹いっぱい。
2016/11/17(木) 08:38:26.65test "$(curl -I -s -o /dev/null -w '%{http_code}' https://www.google.co.jp/)" = 200
HTTPステータス行の Reason-Phrase ("OK" や "Not Found" の部分) は送出者が自由に書けるし
HTTPバージョンも当然固定じゃない
# HTTP2を有効にしてビルドしたcurlの場合:
$ curl -I -s https://www.google.co.jp/ | head -n 1
HTTP/2 200
$
0799名無しさん@お腹いっぱい。
2016/11/17(木) 08:49:14.72訂正
ウェブブラウザで表示すると余分なセミコロンが混じってしまう
test "$( curl -I -s -o /dev/null -w '%{http_code}' https://www.google.co.jp/ )" = 200
0800名無しさん@お腹いっぱい。
2016/11/17(木) 12:19:57.15いいお(´・ω・`)
0801名無しさん@お腹いっぱい。
2016/11/17(木) 12:21:26.17-XHEAD を外してみた
-bash: test: too many argumentsになった
$()を""で括った
awkが効いてなさそう
NR==1 にした
まだ一致しない
行末がCRLFだった
$'\r'を付けた
とりあえず
test $(curl -XHEAD -s -i https://www.google.co.jp | awk NR=1) = 'HTTP/1.1 200 OK';echo $?
はこう
test "$(curl -s -i https://www.google.co.jp | awk NR==1)" = 'HTTP/1.1 200 OK'$'\r';echo $?
なった
0802名無しさん@お腹いっぱい。
2016/11/17(木) 12:47:25.00test "$(curl -I -w "%{http_code}" http://example.com/ 2>&- |tail -1)" = 200; echo $?
0803名無しさん@お腹いっぱい。
2016/11/17(木) 14:56:39.30取得したレスポンスをtestする操作を一度にしようとするのか理解不能
0804名無しさん@お腹いっぱい。
2016/11/17(木) 16:51:11.77まあ何でも一度にやってみたくなる衝動は理解できなくもない。
そこに山があるから、的な何か。
0805名無しさん@お腹いっぱい。
2016/11/17(木) 17:02:47.580806名無しさん@お腹いっぱい。
2016/12/07(水) 08:00:32.91ttp://www.peeep.us/4a5535c5
なんかあの界隈よく揉めてるな… 👀
Rock54: Caution(BBR-MD5:f4da0c707200fe35c49b788174082785)
0807名無しさん@お腹いっぱい。
2016/12/07(水) 09:27:19.820808名無しさん@お腹いっぱい。
2016/12/07(水) 10:58:10.890809名無しさん@お腹いっぱい。
2016/12/07(水) 12:13:29.28とはいうもののオタクのコミュニティって、どこでもちんぽ騎士団ぽいのがいるよね……
ぼっち最高やで。
0810名無しさん@お腹いっぱい。
2016/12/07(水) 15:49:11.13ifの条件を、動作テストのため、いくつか使い分けたくて、thenより上の行で、テストで使い終わった判定を
コメント化しました。実際の判定が、コメント化したものが活かされたりと、おかしくなりました。
以下の、1分ごとに呼び出されるコードで、毎時40分だけ動いて貰いたいのに、10分おきに条件成立となりました。
#1hour
if [ `date '+%M'` -eq "40" ]
#10min
# if [ `date '+%M' | tail -c 2` -eq 0 ]
#all
# if [ true ]
then
echo 処理
fi
0811名無しさん@お腹いっぱい。
2016/12/07(水) 16:18:47.23あそこで役に立つ記事あるか?
自己満のゴミ情報が大部分だからgoogole personal blockの対象だわ
0812名無しさん@お腹いっぱい。
2016/12/07(水) 16:49:19.730813名無しさん@お腹いっぱい。
2016/12/07(水) 19:49:58.99わかる。盛大な勘違い書いててドャァしてる感がすごい
0814名無しさん@お腹いっぱい。
2016/12/07(水) 21:31:23.080815名無しさん@お腹いっぱい。
2016/12/07(水) 23:23:03.71素直にcrontab使った方が良いんじゃね
0816名無しさん@お腹いっぱい。
2016/12/08(木) 09:58:48.36そんなこと起きないはず
ほんとにそのコード?
0817名無しさん@お腹いっぱい。
2016/12/10(土) 20:22:24.90色んなネットーワーク機器のログをsedでズバッとマスキングかけたいんだけど、URLと、IPアドレスの正規表現を教えて下さい。
0818名無しさん@お腹いっぱい。
2016/12/10(土) 20:25:17.660819名無しさん@お腹いっぱい。
2016/12/14(水) 16:17:30.58det dritte folkemn
0820名無しさん@お腹いっぱい。
2016/12/21(水) 04:35:52.23testCmd="なんかのコマンド"
result=$(eval testCmd)
この後の$0はevalの返り値なのかtestCmdの帰りなのかよくわからんのですが
0821名無しさん@お腹いっぱい。
2016/12/21(水) 05:11:40.55$0 ってどういうこと?
$? の間違いなら man bash の eval に書いてある。
0822名無しさん@お腹いっぱい。
2016/12/21(水) 06:35:22.65export testCmd="コマンド"
$testCmd > ログファイル
戻り値=$?
0823名無しさん@お腹いっぱい。
2016/12/21(水) 06:47:35.19result=`$testCmd`
で標準出力が入って
$?でも戻り値は取れるけど
標準エラー出力は取れないね
0824名無しさん@お腹いっぱい。
2016/12/21(水) 11:34:52.01testCmd="なんかのコマンド"
result=$(eval $testCmd)
returncode=$?
標準エラーはいらんのですが
プロセス置換?とかでできるのかな
0825名無しさん@お腹いっぱい。
2016/12/22(木) 09:27:10.08$?はevalの終了ステータスが設定される。evalの終了ステータスはtestCmdの終了ステータスが設定される
0826名無しさん@お腹いっぱい。
2016/12/22(木) 12:40:53.01マニュアル読んでわかんなきゃ試してどうなるか調べないと
正常終了するコマンドだけじゃなくてそれ以外もね
0827名無しさん@お腹いっぱい。
2017/01/15(日) 17:41:24.20でしょうか?
0828名無しさん@お腹いっぱい。
2017/01/15(日) 18:20:34.24#!/bin/bash
opts=“-f $file”
hoge $opts
これだと hogeコマンドが unrecognized option エラーになってしまう。
初歩的な質問ですまん
0829828
2017/01/15(日) 18:27:02.19$fileが不正だっただけやん
0830名無しさん@お腹いっぱい。
2017/01/16(月) 21:28:07.13http://mywiki.wooledge.org/Bashism#Conditionals
> [[ is not defined by POSIX, originated in ksh and is also present in zsh
0831名無しさん@お腹いっぱい。
2017/01/17(火) 21:34:40.69if [ $a = "ok" ]; then
echo hoge
else
echo fuga
fi
の様にしているのですが"ok"が入っていても別の文字列が入っていてもfugaが出力されてしまいます
0832名無しさん@お腹いっぱい。
2017/01/17(火) 21:59:37.47ok
ならば真になるはず
0833名無しさん@お腹いっぱい。
2017/01/17(火) 22:02:25.13cutかなんかで事前に削るしかないですかね?
0834名無しさん@お腹いっぱい。
2017/01/17(火) 22:14:16.110835名無しさん@お腹いっぱい。
2017/01/18(水) 09:13:18.950836名無しさん@お腹いっぱい。
2017/01/18(水) 11:40:24.29\"でうまく行きました
ありがとうございます
>>835
そうです
"ok"か"error"、またはそれ以外の文字列(引用符なし)が入ってる
0837名無しさん@お腹いっぱい。
2017/01/21(土) 12:38:14.000838名無しさん@お腹いっぱい。
2017/01/21(土) 16:06:57.660839.
2017/01/21(土) 20:26:15.12http://gihyo.jp/magazine/wdpress/plus/978-4-7741-8694-8
0840名無しさん@お腹いっぱい。
2017/01/21(土) 21:16:52.050841名無しさん@お腹いっぱい。
2017/01/23(月) 23:25:46.350842名無しさん@お腹いっぱい。
2017/01/23(月) 23:40:12.970843名無しさん@お腹いっぱい。
2017/01/23(月) 23:46:44.500844名無しさん@お腹いっぱい。
2017/02/05(日) 17:07:27.34for i in {1..3}
do
echo $i
done
で
1
2
3
ではなく{1..3}が出力されます。どうして?
0845名無しさん@お腹いっぱい。
2017/02/05(日) 17:13:16.910846名無しさん@お腹いっぱい。
2017/02/05(日) 17:15:56.58ありがとう・・・ありがとう・・・
0847名無しさん@お腹いっぱい。
2017/02/05(日) 19:26:02.43testを
1
2
3
というファイルだとして、
cat test|while read line; do sed -e "s/.*/a/"; done
をやると
a
a
a
ではなく
a
a
となるのはなぜですか?
0848名無しさん@お腹いっぱい。
2017/02/05(日) 20:04:29.97cat test|while read line; do echo "$line" | sed -e 's/.*/a/'; done
ってしたいんじゃない?
cat test|while read line; do sed -e "s/.*/a/"; done
だと、1行目を read が喰って、2行目以降は全て sed に入力される
ことになるよ。
0849名無しさん@お腹いっぱい。
2017/02/05(日) 20:26:43.25ありがとう・・・。そういう仕組みになってるのは知らなかった。
0850名無しさん@お腹いっぱい。
2017/02/08(水) 13:58:57.76これに送信前と送信後のmd5を比較して、一致しなかったら再送させるにはどうすればいいですか?
http://pastebin.com/aXucBuHW
0851名無しさん@お腹いっぱい。
2017/02/08(水) 23:14:15.740852名無しさん@お腹いっぱい。
2017/02/09(木) 12:54:00.09$ cat file1.txt
1
2
3
4
$ cat file2.txt
3
4
5
5
6
センスない自分としてはheadとtailを使って逐一チェックしながら
マージすると言うプログラミング的な方法しか思いつかなかった・・・
0853名無しさん@お腹いっぱい。
2017/02/09(木) 13:09:23.15あくまでも中には数字しかないならばの話で。
0854名無しさん@お腹いっぱい。
2017/02/09(木) 13:17:38.410855名無しさん@お腹いっぱい。
2017/02/09(木) 13:35:43.26ありがとうございます
数字を使ったのは単なるサンプルなので・・・実際は文字列が入っています
今はcatで単純マージしたあとにviで重複箇所を削っていて
かつそのファイルを利用する時にsortしてuniqしています
できればファイルサイズとかも気にしたいので
パイプとかで簡単かつ堅実に出来ないかなと思ったのです
0856名無しさん@お腹いっぱい。
2017/02/09(木) 13:40:12.55そうじゃないんなら、ありうる最大限一般的な例を出さないのがだめ
0857名無しさん@お腹いっぱい。
2017/02/09(木) 16:02:59.69$ cat file1.txt file2.txt | awk '{if(!u[$0]){u[$0]=1;print;}}'
0858名無しさん@お腹いっぱい。
2017/02/09(木) 19:01:56.530859名無しさん@お腹いっぱい。
2017/02/09(木) 19:13:20.28ソートキーの値がある範囲内(例えばプラスマイナス100)にある場合は同じ値とみなすみたいなことできますか?
入力イメージ
0001 31 149
0002 21 156
0003 11 145
0004 52 344
0005 42 356
0005 12 353
0006 53 594
0007 13 613
出力イメージ
0003 11 145
0002 21 156
0001 31 149
0005 12 353
0005 42 356
0004 52 344
0007 13 613
0006 53 594
比較ロジック(0はa=b、-1はa<b, 1はa>b)
function compare (a, b) {
if (a.y < b.y - 100) return -1
if (a.y > b.y + 100) return 1
if (a.x < b.x - 100) return -1
if (a.x > b.x + 100) return 1
return 0
}
0860名無しさん@お腹いっぱい。
2017/02/09(木) 19:14:30.15入力イメージは(id, x, y)で
3カラム目がy座標、2カラム目がx座標です
0861名無しさん@お腹いっぱい。
2017/02/09(木) 19:50:30.95その比較関数をきっちり実装するのは無理があるね
awkかそれ以上のスクリプト言語使うくらいかな
0862名無しさん@お腹いっぱい。
2017/02/09(木) 20:07:21.71四捨五入で丸めるなら分かるけど
0863名無しさん@お腹いっぱい。
2017/02/09(木) 21:01:26.790864859
2017/02/09(木) 21:46:47.59>>862
入力イメージの値にあるみたいに丸めだと欲しい結果が得られないのでスクリプト言語使ってみます
ありがとうございます
>>863
stableかどうかはあんまり考えてませんでした
1カラム目のユニークな値でソート済みなところからの処理なので
stableじゃないsortの場合は比較ロジックに1カラム目を追加して対応します
0865名無しさん@お腹いっぱい。
2017/02/09(木) 22:44:27.460866名無しさん@お腹いっぱい。
2017/02/09(木) 23:31:32.77このスレで言うべきでは無い気はするけど
Excelとかの表計算ソフトを使った方が良さそうな気が
0867859
2017/02/10(金) 00:45:19.33ユニークなキーも比較条件に追加すれば並び順は一意に決まるので誤ることはないかと
>>866
シェルスクリプトでいろいろ処理する途中の処理なんです
0868名無しさん@お腹いっぱい。
2017/02/10(金) 01:36:54.52qsortを仮定して、たまたまピボットが560になったときと
620になったときで結果が変わるよ
誤るというか、結果が一意でない
0869名無しさん@お腹いっぱい。
2017/02/10(金) 02:16:12.75各行の比較で必ず上下関係が明確になるのでqsortでも大丈夫じゃないでしょうか
001 620
002 560
003 500
0870名無しさん@お腹いっぱい。
2017/02/10(金) 05:48:37.28ループ処理しながら選択ソートするしかないね
まあまずシェルで〜とかじゃなくて
ExcelでもJavaでも何でもいいから簡単に実装できる方法を調べてみて
シェルに落としこめるかを調べた方がいいと思う
例えば偏差とか一般的で誰でも使うから統計処理なんてawkで楽に出来るんだけど
>>859がやりたいのって特殊だから独自実装が必要になると思うよ
茶化してるわけじゃないけど
はじめに自分がやりたいことは何なんでしょうって聞くのが早いと思う
0871名無しさん@お腹いっぱい。
2017/02/10(金) 06:15:23.45前後のデータの単純比較じゃなくて
全データとの比較が必要になるから
コマンド1発じゃ無理だね(10発くらいでも無理だけど)
キーを追加するにしてもデータ数-1分のキーが必要になるし(xとyでさらに2倍か)
キーが別だからそこからソートする方法が浮かばない
スクリプトでもプログラムでもいいけど
プラマイ100を同値とするソートのロジック組むしかないと思う
0872名無しさん@お腹いっぱい。
2017/02/10(金) 08:25:47.98qsortの中身知ってる?
パーティショニングしたらあとはブロック内の入れ替えしかしないよ
0873名無しさん@お腹いっぱい。
2017/02/10(金) 08:29:02.88データ数-1とか2倍とか意味わからん
■ このスレッドは過去ログ倉庫に格納されています