シェルスクリプト総合 その24©5ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net
2014/11/11(火) 00:54:03.43□お約束
・特記なき場合は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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その23
http://peace.2ch.net/test/read.cgi/unix/1404204950/
0790名無しさん@お腹いっぱい。
2015/06/27(土) 07:41:59.250791名無しさん@お腹いっぱい。
2015/06/27(土) 08:10:57.63おじいちゃんの頃はステップ関数は比例って習ったの?
今はちがうんだよ。
0792名無しさん@お腹いっぱい。
2015/06/27(土) 13:57:24.860793名無しさん@お腹いっぱい。
2015/06/27(土) 18:01:58.60限定的な条件でxargsの方がファイル数/MAX_ARGSだけプロセス数が少ないから勝ちなの?
はいはい、えらいえらい。
0794名無しさん@お腹いっぱい。
2015/06/27(土) 19:42:45.43+は使い物にならんとか親切に教えてあげたら、
shとか持ち出す本末転倒ぶりを晒してるだけじゃん。
いい加減逆ギレはみっともないよ。
0795名無しさん@お腹いっぱい。
2015/06/27(土) 20:48:29.92おじいちゃんの世代って、わかりやすくて楽だね。
0796名無しさん@お腹いっぱい。
2015/06/27(土) 22:37:52.630797名無しさん@お腹いっぱい。
2015/06/28(日) 07:24:37.85↑で解決。不要プロセスなし。
0798名無しさん@お腹いっぱい。
2015/06/28(日) 16:41:15.990799名無しさん@お腹いっぱい。
2015/06/28(日) 17:03:28.700800名無しさん@お腹いっぱい。
2015/06/28(日) 22:54:42.250801名無しさん@お腹いっぱい。
2015/06/29(月) 11:33:48.48sed -e 's/[a-z][0-9]/.00./g' やsed -e 's/[a-z][0-9]/[a-z]AA[0-9]/g' を
試しましたがうまくいきませんでした。
どのようにすればよいのでしょうか?sed以外でできるのでしょうか?
0802名無しさん@お腹いっぱい。
2015/06/29(月) 12:03:55.860803名無しさん@お腹いっぱい。
2015/06/29(月) 12:06:03.81sed -e 's/\([a-z]+\)\([0-9]+\)/\1AA\2/g'
0804名無しさん@お腹いっぱい。
2015/06/29(月) 12:21:46.28をやってみましたがだめでした。なんでだろう。
manをみると2005年のものでした。
0805名無しさん@お腹いっぱい。
2015/06/29(月) 13:47:40.61バージョンのせいかな
勉強になりました
ありがとうございました
0806名無しさん@お腹いっぱい。
2015/06/29(月) 13:57:57.10どのmanを読んでるのかわからん
0807名無しさん@お腹いっぱい。
2015/06/29(月) 14:26:49.95GNU sed では + が使える」というオチの予感がします。
# 今ちょっと調べてみるまで GNU sed で + が使えるとは知らなかった……
0808名無しさん@お腹いっぱい。
2015/06/29(月) 14:40:06.660809名無しさん@お腹いっぱい。
2015/06/29(月) 19:01:07.47使ってるコマンドのオプションが違ってて使えなかったなあ
まあ最新のパッケージ落とせばよかったんだろうけど皆はどうしてる?
0810名無しさん@お腹いっぱい。
2015/06/29(月) 20:34:14.84+ じゃなくて \+ ではどうよ?
echo abc123 | sed -e 's/\([a-z]\+\)\([0-9]\+\)/\1AA\2/g'
0811名無しさん@お腹いっぱい。
2015/06/29(月) 21:17:14.01シェルスクリプトで株の発注のようなことはできませんかね?
証券会社にログインしフォーム入力して発注ボタン押すような・・
そんな言語じゃないと思うのですができたら人気出るかなあと
0812名無しさん@お腹いっぱい。
2015/06/29(月) 21:20:48.700813名無しさん@お腹いっぱい。
2015/06/29(月) 21:26:58.240814名無しさん@お腹いっぱい。
2015/06/29(月) 21:38:54.990815名無しさん@お腹いっぱい。
2015/06/29(月) 21:41:19.11昔、シェルスクリプトでロト6の番号を出していたのはいい思い出
一度も当たらなかったけどな・・・
0816名無しさん@お腹いっぱい。
2015/06/29(月) 21:53:20.99できるし、発想はわかるが
アルゴリズム取引の時代にシェルスクリプトではだぶん勝負にならない
0817名無しさん@お腹いっぱい。
2015/06/29(月) 22:08:23.46>>348とか>>370は知ってる?
0818名無しさん@お腹いっぱい。
2015/06/29(月) 23:36:01.62ロト6、わたしも時々やっています。シェルスクリプトで番号を出すのは考えもしませんでしたw
>>813
>>816
>>817
ご親切にありがとうございました
grepとかのパイプ並列化されてると聞いたので、もしかしてなにかしら分からない理由で発注も早いのかなと
思って聞いてみました。
>>348や>>370は知りませんでした。勝手にシェルスクリプトっていうとブラウザレスのワンライナーをイメージしていました。
教えていただいた348や370を触ってみようと思います
0819名無しさん@お腹いっぱい。
2015/06/30(火) 00:21:38.400820名無しさん@お腹いっぱい。
2015/06/30(火) 00:51:21.320821名無しさん@お腹いっぱい。
2015/06/30(火) 06:02:29.85JavaScriptとか使われてたらwgetでは無理
0822名無しさん@お腹いっぱい。
2015/06/30(火) 07:54:44.40GNU sedでも+は使えないと思っていたけど\+なんて拡張があるんだね。
知らなかった。今後は便利に使わせてもらおう…
0823名無しさん@お腹いっぱい。
2015/06/30(火) 10:54:23.76ソースを保存してgrepで試したのですがうまくいきませんでした。
なにかいい方法ありますか。
0824名無しさん@お腹いっぱい。
2015/06/30(火) 11:12:25.500825名無しさん@お腹いっぱい。
2015/06/30(火) 12:12:09.26wgetでも切った貼ったすればURLは作れる
まあそれでカバーできないのもあるだろうから100%じゃないけど
自分はフレームが分かれてるページで挫折したというか対応をやめた
0826名無しさん@お腹いっぱい。
2015/06/30(火) 12:24:48.15firefoxのアドオンで使えるseleniumが便利なんじゃないかな
0827名無しさん@お腹いっぱい。
2015/06/30(火) 13:49:39.600828名無しさん@お腹いっぱい。
2015/06/30(火) 13:50:38.460829名無しさん@お腹いっぱい。
2015/06/30(火) 19:21:47.66しらべてみる
ありがとう
0830名無しさん@お腹いっぱい。
2015/07/01(水) 00:58:33.93おじいちゃん。-exec .... +を知らなかった事を必死にごまかそうとしてもダメだよ。
765 名無しさん@お腹いっぱい。[sage] 2015/06/24(水) 15:44:35.63
-execだと見つかったファイルの数だけプロセスつくるんだよね?
xargsだとexecシステムコールの引数個数制限までは1個のプロセス作ってその引数に見つかったファイル全部渡すのかな?
0831名無しさん@お腹いっぱい。
2015/07/01(水) 01:13:29.530832名無しさん@お腹いっぱい。
2015/07/01(水) 07:46:12.63つけなくても+が使えるみたいだ。
0833名無しさん@お腹いっぱい。
2015/07/01(水) 13:58:10.280834名無しさん@お腹いっぱい。
2015/07/01(水) 14:36:35.810835名無しさん@お腹いっぱい。
2015/07/01(水) 15:04:35.61あんまり相手しちゃいけない
0836名無しさん@お腹いっぱい。
2015/07/02(木) 08:18:40.41動いてしまうのはどうなのかな?と思ったんだ。
0837名無しさん@お腹いっぱい。
2015/07/02(木) 18:33:26.44JSなページもいけるらしいが、実際やってみたら、サイトを開く、
ボタン押すなどは記録してくれるが、スクロールするとか、細かい
事は記録されなかった。画像をキャプチャしたいんだが無理の模様。
シェルスクリプトで書こうとして、LinksをJava対応とかにしてみた
ものの、努力実らず。。。
0838名無しさん@お腹いっぱい。
2015/07/02(木) 18:41:44.19もしかして、ローカルマシンでの話か?
0839名無しさん@お腹いっぱい。
2015/07/02(木) 19:10:07.26最初はバカばかしく思えた、たとえばpythonでの
import re
のほうが、思想としては正しいような気がしてきた。
0840名無しさん@お腹いっぱい。
2015/07/02(木) 23:42:14.95aaa=$(( bbb + ccc ))
という表記の仕方と
aaa=$(( $bbb + $ccc ))
という表記の仕方、どちらも同じ計算結果が得られるんですが
どちらが正しいんでしょうか?どちらで書いても良い仕様なんでしょうか?
0841名無しさん@お腹いっぱい。
2015/07/03(金) 00:54:37.65yes
function add() # 引数の$1と$2を足す
{
ANSWER=$(( $1 + $2 ))
}
こういうのは $は取れないけどね
0842名無しさん@お腹いっぱい。
2015/07/03(金) 05:34:00.18((aaa = bbb + ccc))
って書いた方がいい。この方が数値計算らしいね。
0843名無しさん@お腹いっぱい。
2015/07/03(金) 09:48:26.010844名無しさん@お腹いっぱい。
2015/07/03(金) 14:16:50.302回目以降に出てきた重複行をカットして出力です。それ以外はsortしないで元の順のまま出力。
0845名無しさん@お腹いっぱい。
2015/07/03(金) 14:44:25.08http://www.linuxquestions.org/questions/linux-newbie-8/uniq-values-in-unsorted-file-4175471813/#post5001429
0846名無しさん@お腹いっぱい。
2015/07/03(金) 14:55:42.55その方法しかありませんか?
頭に数値付ける方法は知ってましたがエレガントじゃないです
0847名無しさん@お腹いっぱい。
2015/07/03(金) 15:20:13.810848名無しさん@お腹いっぱい。
2015/07/03(金) 18:44:31.13if (count[$0] == 0) {
count[$0]++
}
}
0849名無しさん@お腹いっぱい。
2015/07/03(金) 19:39:34.120850名無しさん@お腹いっぱい。
2015/07/03(金) 19:41:35.860851名無しさん@お腹いっぱい。
2015/07/03(金) 20:13:46.43何も考えずにVBで同じようにやったらクソ遅かった
0852名無しさん@お腹いっぱい。
2015/07/03(金) 21:11:40.930853名無しさん@お腹いっぱい。
2015/07/04(土) 20:45:32.11をやると、リダイレクト先のファイル名で保存されずにbarで保存されてしまう
リダイレクト先のファイル名で保存するにはどうすればできますか?
0854名無しさん@お腹いっぱい。
2015/07/04(土) 21:03:45.470855名無しさん@お腹いっぱい。
2015/07/04(土) 22:57:10.62-Iで情報取得してgrep、sed、展開で抽出
0856名無しさん@お腹いっぱい。
2015/07/04(土) 23:36:06.98解決法はわからない
0857名無しさん@お腹いっぱい。
2015/07/04(土) 23:37:41.83curl -L -J http://www.foo.com/bar > foo
じゃだめなん?
0858名無しさん@お腹いっぱい。
2015/07/05(日) 00:24:31.19sedはめんどくさい
0859名無しさん@お腹いっぱい。
2015/07/05(日) 06:16:53.250860名無しさん@お腹いっぱい。
2015/07/05(日) 08:51:57.760861名無しさん@お腹いっぱい。
2015/07/05(日) 09:11:05.08リダイレクト先のファイル名を取得したいのに決め打ちしてどうするw
0862名無しさん@お腹いっぱい。
2015/07/05(日) 11:13:12.10nl | sort -k 2 | uniq -f 1 | sort | cut -f 2-
>>853
http://stackoverflow.com/questions/6881034/curl-to-grab-remote-filename-after-following-location
何か違和感が有るが、まあいいか
0863名無しさん@お腹いっぱい。
2015/07/07(火) 01:55:38.74予定よりも相当早いペースで突き進んでるよ
ギリシャのこと笑ってられないかもしれない
潰れる会社も出るだろうし、失業者も出るかもしれない
アウシュビッツレベルのネタだからオリンピックどころじゃないかもしれない
私の勝手な想像だけどね
でもバレテルよと何年も前から言ってるのに今日もバカの一つ覚えの電気通信で嫌がらせ
だからみんながそれが答えなのね、世界中に暴露して聞いてみろってことなのね
ということで動きが止まらない方向になっている
揉み消すとか臭いものにふたをする犯罪者の心理行動しか取れないクズは終わりかもしれない
観光客がちょっと増えたと喜んでいる場合じゃないよ、知っている人間は日本なんかに来てないよ
事実は言った人間が悪いんじゃないよ、作った人間が悪いんだよ
知ってる人間は後悔しないためにも正しい行動をしたほうがいいよ
ダメなものは世界中誰が見てもダメなんだからね
0864名無しさん@お腹いっぱい。
2015/07/07(火) 17:07:44.73barって、ディレクトリ? ファイル?
0865名無しさん@お腹いっぱい。
2015/07/11(土) 02:16:43.69${var#pattern}
みたいな使い方はできないのですか?
0866名無しさん@お腹いっぱい。
2015/07/11(土) 05:21:37.10できるけど。
${var#$pattern}
patternに$が必要
0867名無しさん@お腹いっぱい。
2015/07/12(日) 06:30:34.52すみません、$ が抜けていました
どうやら zsh のデフォルトの仕様のせいで、
GLOB_SUBST オプションを有効にするか、${var#$~pattern} で望みどおりになりました
0868名無しさん@お腹いっぱい。
2015/07/12(日) 23:45:48.390869名無しさん@お腹いっぱい。
2015/07/13(月) 03:08:28.34とか
0870名無しさん@お腹いっぱい。
2015/07/13(月) 04:53:41.61sed '/aaa/,$s/'"$f"'/bbbb/g'
0871名無しさん@お腹いっぱい。
2015/07/13(月) 13:45:08.39for f in
do
file_name="${f##*/}"
sed -e 's/foo/foo_$f/g' /hoge/hoge.txt> ${count}_hoge.txt
mv $f ${par_dir2}/${file_name}
count=$(($count + 1))
done
これはダメ
sed -e 's/foo/foo_"$f"/g'
もだめでした
なんでだろう?
0872名無しさん@お腹いっぱい。
2015/07/13(月) 13:50:39.03クォートの対応、良く見ろよ
sed -e 's/foo/foo_"$f"/g' ←じゃなくて
sed -e 's/foo/foo_'"$f"'/g'
な。' 'を一回閉じてから" "を開き直す。スペースを空けずに。
0873名無しさん@お腹いっぱい。
2015/07/13(月) 16:07:08.780874名無しさん@お腹いっぱい。
2015/07/13(月) 17:05:32.16というか$fだけをダブルクォートでも問題ないのかな?
0875名無しさん@お腹いっぱい。
2015/07/13(月) 20:53:18.320876名無しさん@お腹いっぱい。
2015/07/13(月) 23:15:54.08全部ダブルでええやん
0877名無しさん@お腹いっぱい。
2015/07/13(月) 23:41:43.94/aaa/,$ 文字列aaaとマッチする行から行末まで次のコマンドを適用
s/"$f"/bbbb/g シェル変数$fとマッチした文字列をbbbbに置き換えるコマンド
全体をダブルクォートしたら$sがシェル変数として解釈されちゃうからいやん
0878名無しさん@お腹いっぱい。
2015/07/13(月) 23:50:57.720879名無しさん@お腹いっぱい。
2015/07/14(火) 03:14:11.34sed -e 's/foo/foo_'"$f"'/g'
でいけました。
クォートの挙動の勉強になりました。
ありとうございます。
0880名無しさん@お腹いっぱい。
2015/07/18(土) 11:58:15.66何故でしょう。わかる方いますか
$ postmulti -i hogehoge -e destroy
postmulti: fatal: No instance named hogehoge
上のように、Noという文字列が出力されたら処理をしたいので
$ postmulti -i hogehoge -e destroy 2>&1 | grep No
$
とするが、ヒットしない。
0881名無しさん@お腹いっぱい。
2015/07/18(土) 12:10:12.95* 何か間違えている。
前者は
$ postmulti -i hogehoge -e destroy >/dev/null
$ postmulti -i hogehoge -e destroy 2>/dev/null
で確認すれば良い。
0882名無しさん@お腹いっぱい。
2015/07/18(土) 12:21:00.88fdの1,2以外とか/dev/tty直接に出力されてるなら素通りの表示はされるはず。
なので、postmultiが出力がパイプの場合は出力を自分で抑制してるのかも。
0883名無しさん@お腹いっぱい。
2015/07/18(土) 12:29:23.710884880
2015/07/18(土) 13:58:51.80>>882
$ postmulti -i hogehoge -e destroy >/dev/null
postmulti: fatal: No instance named hogehoge
$ postmulti -i hogehoge -e destroy 2>/dev/null
$
確認すると、こんな感じ
なので確実に2番ですよね
だが、ファイルに書き出しても
$ postmulti -i hogehoge -e destroy 2>output
$ cat output
なにもでない。
>>883
そうなんですか。
ちょっと調べてみます
0885名無しさん@お腹いっぱい。
2015/07/18(土) 14:55:40.11Linux で以下を実行すると output ファイルにエラーメッセージが
書き込まれている。
$ echo 'int isatty(int fd) { return 1; }' | gcc -xc -shared -o isatty.so -
$ LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH LD_PRELOAD=isatty.so postmulti -v -i hogehoge -e destroy 2>output
0886名無しさん@お腹いっぱい。
2015/07/18(土) 17:24:55.19ありがとうございます!
上のコード理解してきました。そういうことなのですね。
一応ソースも確認したけど、その通りでした
postfix-3.0.1: ./src/postmulti/postmulti.c
1684 if (isatty(STDERR_FILENO))
1685 msg_vstream_init(argv[0], VSTREAM_ERR);
1686 msg_syslog_init(argv[0], LOG_PID, LOG_FACILITY);
isatty()を外から騙せるか試行錯誤してますが、だめならそのまま
利用させていただきます!
0887名無しさん@お腹いっぱい。
2015/07/18(土) 23:59:07.25で実行すればいいかも。
expect -c 'spawn pstmulti -i hogehoge -e destroy ; expect eof' | grep No
0888名無しさん@お腹いっぱい。
2015/07/19(日) 00:06:30.73例文の方は正しいです。
0889880
2015/07/19(日) 11:47:38.55まことに感謝です
■ このスレッドは過去ログ倉庫に格納されています