シェルスクリプト総合 その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/
0220名無しさん@お腹いっぱい。
2015/01/14(水) 13:55:03.850221名無しさん@お腹いっぱい。
2015/01/14(水) 14:41:45.54多少書き換えてみました
しかし、まだ動きません
clp.sh
do read SEARCH
export SEARCH
awk -f ~/sbin/h_Searher.awk $save_to
done
~/sbin/h_Searher.awk
BEGIN{RF="---"}/$SEARCH/
0222名無しさん@お腹いっぱい。
2015/01/14(水) 17:08:45.99たった1行のためにつまずくとは悔しい
do
perl ~/Perl_instance/clp.pl
done
~/Perl_instance/clp.pl
open FH, '<', '$save_toと同じファイル';
my @LOG = <FH>;
close FH;
my $sentence = join ' ', @LOG;
my @field = split /---/, $sentence;
# my $search = "Ano";
chomp(my $search = <STDIN>);
for my $lines (@field) {
if ( $lines =~ m/${search}/ ) {
print "---\n";
print "$lines\n";
}
}
0223名無しさん@お腹いっぱい。
2015/01/15(木) 10:05:06.27awk 'BEGIN{RF="---"}/'${SEARCH}'/' $save_to
0224名無しさん@お腹いっぱい。
2015/01/15(木) 12:37:55.02thanks!
0225名無しさん@お腹いっぱい。
2015/01/15(木) 13:19:56.100226名無しさん@お腹いっぱい。
2015/01/15(木) 18:30:18.23awk -v SEARCH="$SEARCH" 'BEGIN{RF="---"}/SEARCH/' $save_to
0227名無しさん@お腹いっぱい。
2015/01/20(火) 01:40:59.45なんと月刊で20号以上出ているということにも驚いた。
シェルスクリプトマガジン vol.21
http://www.amazon.co.jp/dp/4904807154/
https://www.usp-lab.com/pub.magazine.html
0228名無しさん@お腹いっぱい。
2015/01/20(火) 05:22:18.170229名無しさん@お腹いっぱい。
2015/01/21(水) 01:45:14.760230名無しさん@お腹いっぱい。
2015/01/22(木) 16:29:19.37数日悩んだ結果。。。原因はLANGだった
0231名無しさん@お腹いっぱい。
2015/01/22(木) 16:32:53.580232名無しさん@お腹いっぱい。
2015/01/22(木) 16:48:29.41まれによくある。
スクリプトの先頭付近でLANGを設定しちゃうことも多いんだけど、Unix的でクールな
ポータビリティのある手法を紹介してくれる偉い人が出てくるのを正座して待ちたい。
0233名無しさん@お腹いっぱい。
2015/01/22(木) 17:14:56.120234名無しさん@お腹いっぱい。
2015/01/23(金) 06:42:51.72共通したものは crontab 先頭で、タスク毎のは env NAME=VALUE COMMAND
と答えるか、もうまるっきり答えないと予想した
0235名無しさん@お腹いっぱい。
2015/01/23(金) 10:00:16.400236名無しさん@お腹いっぱい。
2015/01/23(金) 16:52:05.70自演っぽくて、コメントしづらい輪
0237名無しさん@お腹いっぱい。
2015/01/23(金) 17:30:03.530238名無しさん@お腹いっぱい。
2015/01/24(土) 10:11:24.87的な書き方ってどこまで有効なのかな?
bashだけ?
0239名無しさん@お腹いっぱい。
2015/01/24(土) 10:23:49.81bourne shell でも使える
0240名無しさん@お腹いっぱい。
2015/01/24(土) 15:26:45.880241名無しさん@お腹いっぱい。
2015/01/24(土) 15:41:53.700242240
2015/01/25(日) 04:39:03.74しっくりくる表記法がないんだけど
0243名無しさん@お腹いっぱい。
2015/01/25(日) 05:18:01.830244名無しさん@お腹いっぱい。
2015/01/25(日) 11:18:23.60使わないので規則などない
0245名無しさん@お腹いっぱい。
2015/01/25(日) 11:45:02.72同意
0246名無しさん@お腹いっぱい。
2015/01/25(日) 12:36:31.550247名無しさん@お腹いっぱい。
2015/01/25(日) 13:47:36.00じゃあ代わりにどうすればよいのだ?
まさかコピペ?
0248名無しさん@お腹いっぱい。
2015/01/25(日) 17:38:43.450249名無しさん@お腹いっぱい。
2015/01/25(日) 19:40:14.84> じゃあ代わりにどうすればよいのだ?
> ポインタとか言い出すと見た
いかにも、めんどくさそう
0250名無しさん@お腹いっぱい。
2015/01/25(日) 19:46:57.100251名無しさん@お腹いっぱい。
2015/01/25(日) 21:21:36.60xargsコマンドが好き。無理だと思ってた処理がワンライナーになる
いっそ、powershellみたいにjsonパイプラインみたいなのがあればいいのにって思う
0252名無しさん@お腹いっぱい。
2015/01/25(日) 22:41:49.00他どんな場面で使うっけ
0253名無しさん@お腹いっぱい。
2015/01/25(日) 23:37:38.840254名無しさん@お腹いっぱい。
2015/01/26(月) 12:06:00.33*.*の3行が、headへの標準入力じゃなくて、引数として与えられるのか。
おもしろいなあ。
0255名無しさん@お腹いっぱい。
2015/01/26(月) 20:35:10.75ループになる
xargs loop で検索したら結構見つかるので
珍しくは無いんだろうが、まあ、一応
<<EOF xargs -I i sh -c 'seq 3 | xargs -I j echo i j'
foo bar
baz qux quux
corge
grault
EOF
0256名無しさん@お腹いっぱい。
2015/01/27(火) 02:26:05.37例えば find ... | xargs -P 12 -n 16 gzip とすると12プロセスがファイルの圧縮を行う
0257名無しさん@お腹いっぱい。
2015/01/27(火) 03:09:32.080258名無しさん@お腹いっぱい。
2015/01/27(火) 06:47:01.920259名無しさん@お腹いっぱい。
2015/01/27(火) 07:02:05.920260名無しさん@お腹いっぱい。
2015/01/27(火) 07:38:50.390261名無しさん@お腹いっぱい。
2015/01/27(火) 08:17:49.810262名無しさん@お腹いっぱい。
2015/01/27(火) 08:20:05.07API だと思い付かない
ディスクを直接バイナリ編集すれば可能かも
0263名無しさん@お腹いっぱい。
2015/01/27(火) 08:25:13.28実装によってはないのよ
0264名無しさん@お腹いっぱい。
2015/01/27(火) 08:28:26.160265名無しさん@お腹いっぱい。
2015/01/27(火) 12:18:24.66移植すりゃいいじゃん
0266名無しさん@お腹いっぱい。
2015/01/27(火) 12:56:34.51-exec {} +
で用が足りる
0267名無しさん@お腹いっぱい。
2015/01/27(火) 13:01:19.27カーネル内でもファイル名は0終端で扱ってるから無理だね
実際のサイズと異なる事でカーネルクラッシュなどまずいことが発生する可能性は
あるけど、それは普通にカーネル内バグ
0268名無しさん@お腹いっぱい。
2015/01/27(火) 13:29:38.19そういう話じゃないよ
0269名無しさん@お腹いっぱい。
2015/01/27(火) 13:41:29.10半分冗談だよ、いちいち気にしてたら禿げるぞ
0270名無しさん@お腹いっぱい。
2015/01/27(火) 13:43:51.02冗談だとしても面白くないよ
0271名無しさん@お腹いっぱい。
2015/01/27(火) 15:15:56.23-exec \{\} +
とエスケープなりクォートで囲むなりするのを忘れる
0272名無しさん@お腹いっぱい。
2015/01/27(火) 16:27:07.470273名無しさん@お腹いっぱい。
2015/01/27(火) 21:10:27.07理由はないんだけど
0275DAEMON
2015/01/27(火) 22:02:58.78シ
タッ・・(Φ Φ+)・・・ 例えば、基礎公文で…
while (test) {
open test-file.txt(filehandle) ,
">test-file.pl"
print test-file.txt
close test-file.txt
}
斯様な様にですか…
0276名無しさん@お腹いっぱい。
2015/01/28(水) 00:14:24.97で、{}をクォートする必要があるシェルって何?
0277名無しさん@お腹いっぱい。
2015/01/30(金) 19:56:12.76ゃなくてもいいというので、0.1入れてやってみたら、ほんとに動
作してるっぽい。manには何も書いておらん。つかえねーman
0278名無しさん@お腹いっぱい。
2015/01/30(金) 20:00:01.61Historical implementations of `sleep' have required that NUMBER be
an integer, and only accepted a single argument without a suffix.
However, GNU `sleep' accepts arbitrary floating point numbers (using a
period before any fractional digits).
0279名無しさん@お腹いっぱい。
2015/01/30(金) 21:57:35.82おお、サンクス
0280名無しさん@お腹いっぱい。
2015/01/31(土) 12:09:54.06客先環境での操作なんかだとおおいにある
xargsなら、-pとか-tがあるので安心
0281名無しさん@お腹いっぱい。
2015/01/31(土) 13:19:36.31同意が得られて異端じゃないと安心出来た
尚就職してから今まで客先環境でしか働いたことがない模様
0282名無しさん@お腹いっぱい。
2015/01/31(土) 17:47:20.57v=${v:-default}
こうでしょ
: ${w:=default}
っていうの有りますか?皆さんの、そういうの教えて下さい
0283名無しさん@お腹いっぱい。
2015/02/01(日) 00:46:16.74echo -e 'hoge\nfuga'
こうでしょ
printf 'hoge\nfuga\n'
0284名無しさん@お腹いっぱい。
2015/02/01(日) 00:47:04.510285名無しさん@お腹いっぱい。
2015/02/01(日) 07:05:52.050286名無しさん@お腹いっぱい。
2015/02/01(日) 13:49:52.79OSX の /bin/sh は bash だけど、同じ bash のはずなのに
bash -c "echo -e 'hoge\nfuga'" と sh -c "echo -e 'hoge\nfuga'" で
結果が違うとかめんどくさすぎる。
0287名無しさん@お腹いっぱい。
2015/02/01(日) 18:28:40.97こうじゃなくて
function f () {
echo hoge hoge
}
こうでしょ
f () {
echo hoge hoge
}
0288名無しさん@お腹いっぱい。
2015/02/01(日) 19:10:32.63最近やってるのがjavascriptだからかな
0289名無しさん@お腹いっぱい。
2015/02/02(月) 10:43:19.51個人的には環境変数と区別するために小文字なんだけど、
社内の他の人が書いたのを見ると大文字ばっかりなんだよな。
0290名無しさん@お腹いっぱい。
2015/02/02(月) 12:18:06.010291名無しさん@お腹いっぱい。
2015/02/02(月) 21:56:58.79linux mint 17.1 でコマンドの練習してるのですが、
% ls -l
だと色々ずらーっと出るんですけど、本に書いてあるとおり、
ソートコマンドを練習しようとして
% ls -l | sort +4
と打ち込んでファイルサイズで降順ソートしたかったのですが
sort: cannot read: +4: そのようなファイルやディレクトリはありません
と出てしまいます。
bashですが、シェルの種類によってはこのオプション使えないんでしょうか。
-r等は正常に動作します。
0292名無しさん@お腹いっぱい。
2015/02/02(月) 22:04:13.81sort -k4r
0293名無しさん@お腹いっぱい。
2015/02/02(月) 22:34:00.270294名無しさん@お腹いっぱい。
2015/02/03(火) 03:09:11.93sort +4と同じ指定はsort -k5
たぶんls -lでファイルの所有者が全て同じで、できたと勘違いしてる
--debugオプションをつけるとわかりやすい
https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html
> On older systems, sort supports an obsolete origin-zero syntax ‘+pos1 [-pos2]’ for specifying sort keys.
> The obsolete sequence ‘sort +a.x -b.y’ is equivalent to ‘sort -k a+1.x+1,b’ if y is ‘0’ or absent,
> otherwise it is equivalent to ‘sort -k a+1.x+1,b+1.y’.
sort +4という古いオプションの扱いはPOSIXのバージョンによるってことかな
https://www.gnu.org/software/coreutils/manual/html_node/Standards-conformance.html#Standards-conformance
0295名無しさん@お腹いっぱい。
2015/02/03(火) 06:48:02.67$ ls -l --sort=size
or
$ ls -lS
でええじゃまいか
0296名無しさん@お腹いっぱい。
2015/02/03(火) 08:37:05.99http://linuxjm.sourceforge.jp/info/GNU_coreutils/coreutils-ja.html
http://linuxjm.sourceforge.jp/info/GNU_coreutils/coreutils-ja_15.html#Standards-conformance
0297確認不足だった orz
2015/02/03(火) 08:40:20.78( 検索結果で上位に上がると期待して ) 日本語訳を貼り付けておきます
http://linuxjm.sourceforge.jp/info/GNU_coreutils/coreutils-ja_15.html#Standards-conformance
http://linuxjm.sourceforge.jp/info/GNU_coreutils/coreutils-ja_43.html#sort-invocation
0298名無しさん@お腹いっぱい。
2015/02/04(水) 22:55:20.92おお、infoの日本語訳できたんだ
man on WWWのように検索できるとさらにいいね
0299名無しさん@お腹いっぱい。
2015/02/08(日) 15:04:24.54何か簡単に管理する方法がありませんかね?
0300名無しさん@お腹いっぱい。
2015/02/08(日) 15:06:57.37vimのUnite historyの様なgrep効くから、それで呼ぶか
編集して完成させる
0301名無しさん@お腹いっぱい。
2015/02/08(日) 16:40:17.45anything.elみたいなヒストリーサーチみたいですね。
bashなのでどうしたものか。
0302名無しさん@お腹いっぱい。
2015/02/09(月) 09:34:08.43aliasじゃないの?
0303名無しさん@お腹いっぱい。
2015/02/09(月) 10:04:38.990304名無しさん@お腹いっぱい。
2015/02/09(月) 18:00:27.27ぼくの書いたスクリプトが動かないなんてけしからん(´・ω・`)
シェルの方を治したまえ
0305名無しさん@お腹いっぱい。
2015/02/09(月) 18:21:02.80declare -A URL
URL=(
["Vim_part24"]="http://peace.2ch.net/test/read.cgi/unix/1413122189/"
["vim_part5"]="http://anago.2ch.net/test/read.cgi/software/1379912425/"
)
# ping for download
ping_error=0
for i in ${!URL[@]}
do
# ping ${URL[$i]} > /dev/null
ping -n 1 `echo ${URL[$i]} | awk -F"/" '/http/{print $3}'` > /dev/null
if [ "$?" -ne 0 ]; then
echo "${i} : can not contact ${URL[$i]}"
ping_error=1
fi
done
0306名無しさん@お腹いっぱい。
2015/02/09(月) 18:41:13.94pingのコマンドオプションって統一されてないよなぁ
0307名無しさん@お腹いっぱい。
2015/02/09(月) 19:27:08.45#!/bin/sh
url_list='
Vim_part24 http://peace.2ch.net/test/read.cgi/unix/1413122189/
vim_part5 http://anago.2ch.net/test/read.cgi/software/1379912425/
'
ping="ping -w 3 -c 1"
echo "$url_list" | while read thr url __; do
case "$url" in
https?://*)
host=`echo $url | cut -d/ -f3`
if ! $ping $host >/dev/null; then
echo "$thr: cannot contact $url"
err=1
fi
;;
esac
done
exit $err
0308名無しさん@お腹いっぱい。
2015/02/09(月) 19:28:49.19http://*|https://*|ftp://*)
だな。
0309名無しさん@お腹いっぱい。
2015/02/09(月) 19:33:01.270310名無しさん@お腹いっぱい。
2015/02/09(月) 19:34:49.220311名無しさん@お腹いっぱい。
2015/02/09(月) 19:39:42.45これって、どこかに由来する文化なのかな?
(cronを「くーろん」と呼ぶみたいな?いや、これは違うかな……)
0312名無しさん@お腹いっぱい。
2015/02/09(月) 19:43:34.71サンキュー
windowsのsystem32/ping.exeが呼ばれてた
そりゃ移植性がないわけだ
>>307-308
コードありがとう
>>310
-Tオプションなんてあったのか
>>309
pingで鯖落ちてないか検査した後w3mで複数のURLから取ってきて
スレの上下の不要な広告など取り除いてから git commit して
その差分見るから
全部安全に通信できるか見てからやらないと、差分の時にちょっと問題になる
通信できなかったスレがマイナス差分で大量表示されたり、
次回は大量追加されたり
git reset hard HEAD~ するぐらいならあらかじめ通信検査してからやろうと思った
0313名無しさん@お腹いっぱい。
2015/02/09(月) 19:45:19.02それもあるし、どれかひとつでもエラーでping_error=1だからサーバの状態を確認してる感じがしない
0314名無しさん@お腹いっぱい。
2015/02/09(月) 19:47:43.57echo ... | {
while read ... do
...
done
exit $err
}
0315名無しさん@お腹いっぱい。
2015/02/09(月) 20:32:51.35> -Tオプションなんてあったのか
通信系のコマンドで、タイムアウトが指定できないものはスクリプトからは利用しないとか、
そういうことは考えないで作っちゃうタイプの方ですか?
ちなみに、大抵の通信系コマンドはタイムアウトが指定できるような気がする。
0316名無しさん@お腹いっぱい。
2015/02/09(月) 20:46:31.700317名無しさん@お腹いっぱい。
2015/02/09(月) 21:22:03.82> >>299
> aliasじゃないの?
長いワンライナーは場面ごとに手直しする必要のあることが多いから、
それだと融通がきかないことがありませんか?
0318名無しさん@お腹いっぱい。
2015/02/09(月) 22:07:20.56いろいろやり方はあるだろうけど、自分の場合は
libwww-perl(debian系)に入ってるHEADコマンドで.datファイルのLast-Modifiedフィールドみたいなのを見てる
0319名無しさん@お腹いっぱい。
2015/02/10(火) 06:45:24.43ここに書いてる奴本人じゃね?w
■ このスレッドは過去ログ倉庫に格納されています