シェルスクリプト総合 その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/
0758名無しさん@お腹いっぱい。
2016/09/15(木) 13:09:35.23シングルコア/シングルプロセッサだと確実にヒアストリングの後者の方が速い
0759名無しさん@お腹いっぱい。
2016/09/15(木) 19:15:16.79解説d
ヒアストリングという言葉自体初めて知りました。
<<はヒアドキュメントということも知らずに使っていました。
環境によっては、<<<は速くなるんですね。
いい勉強になりました。
0760名無しさん@お腹いっぱい。
2016/09/24(土) 18:27:52.80Macのファイルシステムって、ファイル名を UTF-8 で保存してるかと思いきや
独自の正規化がされてまして (UTF8-MAC) 例えば、
find . -name "*ドイツ*"
とかやってもあるはずのファイルが出てこないわけです。(内部的に ド の字を ト+[濁点] みたいな格納をしてるせいです)
そこで .bash_profile に以下のように コマンドもどきの find2 を定義してやります。これで万事解決です。
# find に渡す引数を全て UTF8-MAC に変換してしてます
find2(){
eval "find "$(echo "$@" | iconv -f UTF-8 -t UTF8-MAC)
}
0761名無しさん@お腹いっぱい。
2016/09/24(土) 18:38:10.62他文字コードにも応用できそうだね
0762名無しさん@お腹いっぱい。
2016/09/24(土) 18:47:05.28-execで他のプログラムに渡すUTF-8をUTF8-MACに変換されていやーんになる
汎用的にするなら要ブラッシュアップ
0763名無しさん@お腹いっぱい。
2016/09/24(土) 21:51:49.29ただ -exec の方は 問題は別にあって
終端を表す \; の \(バックスラッシュ)
が消えちゃうんですね。そもそもiconv変換する前の時点で。
一応対応できたと思うんですが、
長くなったので貼るのはやめときます。
0764名無しさん@お腹いっぱい。
2016/09/24(土) 22:10:40.49;じゃないと困るのはかなり特殊なケース
0765名無しさん@お腹いっぱい。
2016/09/24(土) 22:13:36.64どっかで読んだ内容だなぁと思ったら、これ↓のパクリか!
「新・OS X ハッキング! (169) Terminal上で「ダ」や「パ」が付くファイルを検索できない理由と対策 | マイナビニュース」
http://news.mynavi.jp/column/osxhack/169/index.html
0766名無しさん@お腹いっぱい。
2016/09/24(土) 23:20:43.06ただ現実に必要になってみると
find . -name `echo "オランダ.png" | iconv -f UTF8 -t UTF8-MAC`
これ毎回打ち込むの面倒だなと思ってコマンド化してみた次第です。
0767名無しさん@お腹いっぱい。
2016/09/24(土) 23:54:36.900768名無しさん@お腹いっぱい。
2016/09/24(土) 23:56:11.170769名無しさん@お腹いっぱい。
2016/09/25(日) 00:01:20.090770名無しさん@お腹いっぱい。
2016/09/25(日) 02:09:32.85>>終端を表す \; の \(バックスラッシュ) が消えちゃうんですね。
普通にfindするときもfindに渡る前に¥は消えるでしょ
find2(){
find $(echo "$@" | iconv -f UTF-8 -t UTF8-MAC)
}
じゃダメなの?
0771名無しさん@お腹いっぱい。
2016/09/26(月) 14:04:28.330772名無しさん@お腹いっぱい。
2016/09/26(月) 23:31:45.320773名無しさん@お腹いっぱい。
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;}}'
■ このスレッドは過去ログ倉庫に格納されています