10/11/20 08:29:39
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
URLリンク(src.opensolaris.org)
URLリンク(heirloom.sourceforge.net)
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
前スレ
シェルスクリプト総合 その16
スレリンク(unix板)
2:名無しさん@お腹いっぱい。
10/11/20 08:34:51
□関連スレ:
sed
スレリンク(unix板)
正規表現
スレリンク(unix板)
おまえら! shell は何を使っているんですか?
スレリンク(unix板)
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
スレリンク(unix板)
□初心者向けリンク
「誰にでも」シリーズ
URLリンク(kanji.zinbun.kyoto-u.ac.jp)
/bin/shプログラミング入門
URLリンク(freebooks.info.nara-k.ac.jp)
シェルを使おう - 導入からプログラミングまで -
URLリンク(www.netfort.gr.jp)
□入門者向け書籍:
プロフェショナルシェルプログラミング
URLリンク(www.amazon.co.jp)
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
URLリンク(www.amazon.co.jp)
UNIXシェルプログラミング徹底解説
URLリンク(www.amazon.co.jp)
入門Kornシェル
URLリンク(www.amazon.co.jp)
入門bash
URLリンク(www.amazon.co.jp)
3:名無しさん@お腹いっぱい。
10/11/20 08:35:23
□参考リンク:
UNIXの部屋 (沢山のコマンドの簡単な紹介など)
URLリンク(x68000.q-e-d.net)
POSIX: Shell & Utilities (標準規格)
URLリンク(www.opengroup.org)
□最近のシェルスクリプト本(1)
(2004/03) UNIXシェルスクリプトハンドブック 関根 達夫 (著)
URLリンク(amazon.co.jp)
(2004/10) UNIXシェルスクリプト逆引き大全333の極意 中橋 一朗 (著)
URLリンク(amazon.co.jp)
(2004/11) 仕事に使えるLinuxシェルスクリプト 千葉 真人 (著)
URLリンク(amazon.co.jp)
(2004/12) UNIXシェルスクリプトサンプルブック デイブ・テイラー (著)
URLリンク(amazon.co.jp)
(2005/02) シェルスクリプト基本リファレンス 山森 丈範 (著)
URLリンク(amazon.co.jp)
(2005/04) LinuxWorldスクリプト 月刊リナックス・ワールド総集編 月刊LinuxWorld特別 (著)
URLリンク(amazon.co.jp)
(2005/05) UNIXシェルスクリプトコマンドブック 山下 哲典 (著)
URLリンク(amazon.co.jp)
(2005/05) わかる&使える UNIX基礎講座 シェルスクリプト編 中井 獏 (著)
URLリンク(amazon.co.jp)
4:名無しさん@お腹いっぱい。
10/11/20 08:35:37
□最近のシェルスクリプト本(2)
(2005/07) UNIX シェルスクリプト辞典 川井 義治 (著)
URLリンク(amazon.co.jp)
(2005/08) シェルスクリプト ポケットリファレンス bash編 宮原 徹 (著), 川原 龍人 (著)
URLリンク(www.amazon.co.jp)
(2005/12) 図解でわかるLinuxシェルスクリプト・正規表現 小泉 修 (著)
URLリンク(www.amazon.co.jp)
(2006/01)詳解 シェルスクリプト アーノルド ロビンス (著), ネルソン・H.F. ベーブ(著), Arnold Robbins (原著), Nelson H.F. Beebe (原著), 日向 あおい (翻訳)
URLリンク(www.amazon.co.jp)
(2007/3) Linuxシェルスクリプトユーザー便利帳―bash2/bash3対応 伊藤 幸夫 (著), 寒川 陽美(著)
URLリンク(www.amazon.co.jp)
(2007/9) ゲームで極める シェルスクリプトスーパーテクニック 山森 丈範
URLリンク(www.amazon.co.jp)
(2007/10) UNIX/Linuxシェルスクリプトマスタリングハンドブック 野川 准子
URLリンク(www.amazon.co.jp)
5:1
10/11/20 08:37:45
テンプレ貼り終了。
関連スレのURL変わってたんで、付け替えますた。
6:名無しさん@お腹いっぱい。
10/11/20 09:32:01
乙
最近本出てないのかねぇ。
まぁ新しい話題があるわけじゃないのでコンスタントに出るはずはないのだが。
7:名無しさん@お腹いっぱい。
10/11/20 14:37:39
exec >>1乙
8:名無しさん@お腹いっぱい。
10/11/21 03:26:17
ls -a
.otsu
9:名無しさん@お腹いっぱい。
10/11/23 17:01:26
killしたいプロセスのIDが書かれたファイルaho.txtがあります。
%cat aho.txt
123
456
789
012
このプロセスを順にkillする場合、どのようなシェルスクリプトを書いたらいいでしょうか?
10:名無しさん@お腹いっぱい。
10/11/23 17:09:59
>>9
for i in `cat aho.txt`; do kill $i; done
または
kill `cat aho.txt`
11:名無しさん@お腹いっぱい。
10/11/23 21:23:09
>>10
素早いレスありがとうございます!
12:名無しさん@お腹いっぱい。
10/11/24 00:15:20
何らかの同じ文字が連続していれば、その行を表示したいです。
AABB
ABCD
AADD
だったら AABB と AADD
grepの正規表現でそういうことはできますでしょうか?
13:名無しさん@お腹いっぱい。
10/11/24 00:21:59
grep '\(.\)\1'
14:12
10/11/27 23:15:19
grepでも後方参照できるのか
まだ未確認だけどありがとう
15:名無しさん@お腹いっぱい。
10/11/27 23:26:43
正規表現の話題はスレチなので専用スレへ
↓
スレリンク(unix板)
16:名無しさん@お腹いっぱい。
10/11/28 01:48:40
grepとegrepとfgrepの違いは把握しておく方がいい。
17:名無しさん@お腹いっぱい。
10/11/29 16:00:02
いまでは古典?と言えるが、「UNIXプログラミング環境」も手元に
置いてほしい本。最近の本では、より難しいことも書かれているがこの
本の内容を知らないがために繰り返される基本的質問があまりにも多い。
18:名無しさん@お腹いっぱい。
10/12/12 07:55:55
>>17
20年近く前に自分が読んだ時点でも既に古さを感じたが、今読むとどう感じるんだろうか
逆に古さを感じないのかもね。当時は UNIX USER が創刊されたばかりで、太田純さんの
連載がシェルスクリプトとの出会いだったなあ
19:名無しさん@お腹いっぱい。
10/12/14 14:05:48
grepをfgrepに置き換えただけで何10倍も捗ることがあるから
侮れない。「正規表現ってなに?」ってレベルでUnix弄ってるのなら、
grep→fgrepに全部置き換えてしまえばいい
20:名無しさん@お腹いっぱい。
10/12/14 14:31:21
あとawkとかperlに巨大テキストを食べさせるときも、
前段でfgrepしておくと捗るよ
21:名無しさん@お腹いっぱい。
10/12/14 17:54:49
20年以上昔には成り立っていたバッドノウハウだな。
今は grepもfgrepも速度はほとんど変わらない。
(むしろfgrepは速そうな名前の割りに遅いことで有名だったんだが)
パイプ前段でfgrepで前処理するのも不要。
昔の常識がいつまでも通用すると思わないことだな。
22:名無しさん@お腹いっぱい。
10/12/14 18:23:59
Solaris 9 の fgrep(1)
URLリンク(docs.sun.com)
> The fgrep (fast grep) utility ...
Solaris 10 の fgrep(1)
URLリンク(docs.sun.com)
> The fgrep (fixed grep) utility ...
修正されてる(笑)
23:名無しさん@お腹いっぱい。
10/12/14 19:14:16
>>21
バッドノウハウ(笑)
ちょっと手を動かしてみればすぐに実感できるお
24:名無しさん@お腹いっぱい。
10/12/14 19:19:55
ちょっと手を動かしてみた。
$ time for i in {1..5000}; do grep localhost /etc/hosts >/dev/null; done
real 0m15.299s
user 0m3.004s
sys 0m5.896s
$ time for i in {1..5000}; do fgrep localhost /etc/hosts >/dev/null; done
real 0m18.646s
user 0m4.784s
sys 0m6.616s
$
実感できなかった。
25:名無しさん@お腹いっぱい。
10/12/14 19:26:22
速度に関しては、
fgrep < grep < egrep (左ほど遅い)
が常識。
fgrepの存在意義は、^ とか $ とかをエスケープなしで普通の文字列として使えるという
仕様の違いのみ。fgrepよりも egrep使った方が速い。
26:名無しさん@お腹いっぱい。
10/12/14 19:32:18
>>23
最後に何か言いたいことはあるかね?
27:名無しさん@お腹いっぱい。
10/12/14 20:02:46
% gzip -dc /var/log/messages.72 | wc -l
204269
% time gzip -dc /var/log/messages.72 | egrep Jan | wc -l
55
real 0m3.424s
user 0m3.712s
sys 0m0.025s
% time gzip -dc /var/log/messages.72 | fgrep Jan | wc -l
55
real 0m3.402s
user 0m3.684s
sys 0m0.036s
% time gzip -dc /var/log/messages.72 | awk /Jan/ | wc -l
55
real 0m0.417s ←ワロス
user 0m0.663s
sys 0m0.050s
% time gzip -dc /var/log/messages.72 | perl -nle '/Jan/&&print' | wc -l
55
real 0m0.392s ←ワロス
user 0m0.675s
sys 0m0.042s
結論 .?grepはウンコ
28:名無しさん@お腹いっぱい。
10/12/14 20:32:51
>>27
おまえが測ってるのは gzip -dc の時間だ
29:名無しさん@お腹いっぱい。
10/12/14 20:35:57
>>28
それは /usr/bin/timeとかの外部コマンドを使った場合の話。
timeは外部コマンドじゃなくて、シェルが直接管理して動くもので、
パイプライン全体の時間を計るようにできてる。
30:名無しさん@お腹いっぱい。
10/12/14 20:45:28
$ time sh -c 'echo hoge; sleep 1'| sh -c 'cat; sleep 1'
hoge
1.01 real 0.00 user 0.01 sys
sh 一般の話じゃなくて、また bash 固有の動作?
31:名無しさん@お腹いっぱい。
10/12/14 20:54:26
>>30
bashだけじゃなくて kshや zshでもそうだよ。
$ time sh -c 'echo hoge; sleep 1'| sh -c 'cat; sleep 1'
hoge
real 0m2.014s
user 0m0.003s
sys 0m0.007s
32:名無しさん@お腹いっぱい。
10/12/14 21:00:14
ここまで、まとめると、
fgrepが速いと言われていたのは大昔で、今ではgrepより遅い。
さらに、fgrep/grep/egrepよりも awkやperlの方が速い。
よく、grepで前処理してからパイプでawkかperlに食わせてる例を見かけるが、
あれはgrepの処理をawkやperlのプログラム中に吸収して grepをカットした方が速くなる。
33:名無しさん@お腹いっぱい。
10/12/14 21:03:23
昔から、fgrepが速いなんてのは神話だ、と言われてたと思うけど
34:名無しさん@お腹いっぱい。
10/12/14 22:10:21
grep系をawkかperlに渡すwrapperスクリプトで置き換えたほうが10倍捗るってことだな。
ちなみにうちのLinuxは
# file /usr/bin/{e,f,}grep
/usr/bin/egrep: Bourne shell script text executable
/usr/bin/fgrep: Bourne shell script text executable
/usr/bin/grep: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), stripped
#
# cat /usr/bin/egrep
#!/bin/sh
exec grep -E ${1+"$@"}
#
# cat /usr/bin/fgrep
#!/bin/sh
exec grep -F ${1+"$@"}
#
最初からスクリプトに置き換えられていますた(´・ω・`)
35:名無しさん@お腹いっぱい。
10/12/14 22:42:57
>>32
> fgrepが速いと言われていたのは大昔で、今ではgrepより遅い。
いや、大昔こそfgrepは遅い。
理由は実装が、fgrepは文字列比較、egrepはDFAだったから。
今はどちらもDFAにしているのが多い。
昔のUNIXのソース読んでみて。URLリンク(minnie.tuhs.org)
36:名無しさん@お腹いっぱい。
10/12/14 22:46:43
>>34
psedってのがほとんどのperl配布に入ってるから、
psed -n '/ /p'すればいい。
37:名無しさん@お腹いっぱい。
10/12/15 12:58:57
grep一族の速度差はふーんて感じだが、awkやperlの一行プルグラムの方が10倍も速いって
にわかには信じ難い話しだな。検索しか能のないgrep使う意味ねーじゃんw
使ったgrepの方がバージョンが旧すぎて実装がショボかったとか、そういう落ちなんじゃないの?
38:名無しさん@お腹いっぱい。
10/12/15 20:44:32
awk の方が grep より早いのが信じれないのでやってみた
$ cat /etc/debian_version
5.0.6
$ echo $SHELL
/bin/bash
$ uname -svrm
Linux 2.6.26.5 #2 SMP Mon Sep 29 14:17:40 JST 2008 i686
$ wc -l testlog
100000 testlog
$ time grep 1 testlog |wc -l
40952
real 0m0.013s
user 0m0.008s
sys 0m0.004s
$ time fgrep 1 testlog |wc -l
40952
real 0m0.012s
user 0m0.012s
sys 0m0.000s
$ time perl -lne '/1/&&print' testlog |wc -l
40952
real 0m0.061s
user 0m0.056s
sys 0m0.004s
$ time awk /1/ testlog |wc -l
40952
real 0m0.142s
user 0m0.132s
sys 0m0.008s
awk 遅いんだが..。対象ファイルや条件次第でここまで変わるのかな~
39:名無しさん@お腹いっぱい。
10/12/15 21:32:58
お、まだやってたのか。
>>38
>>27の各バージョンはこうね。
% grep --version
grep (GNU grep) 2.5.1
% awk --version
GNU Awk 3.1.3
Copyright (C) 1989, 1991-2003 Free Software Foundation.
% perl -v
This is perl, v5.8.7 built for i686-linux
Copyright 1987-2005, Larry Wall
% ldd `which grep`
linux-gate.so.1 => (0xffffe000)
libc.so.6 => /lib/libc.so.6 (0xb7e31000)
/lib/ld-linux.so.2 (0xb7f50000)
% ldd `which awk`
linux-gate.so.1 => (0xffffe000)
libdl.so.2 => /lib/libdl.so.2 (0xb7f5b000)
libm.so.6 => /lib/libm.so.6 (0xb7f37000)
libc.so.6 => /lib/libc.so.6 (0xb7e23000)
/lib/ld-linux.so.2 (0xb7f6a000)
・gzipを外して time grep Jan messages | wc -l のように変えても結果は同じ
・検索条件を Jan → J に変えても結果は同じ。*grepよりもawk,perlの方が10倍速い
・timeが何を測っているかが云々されていたが、体感ではっきり差がわかるレベル。
*grepは待たされるがawk,perlは瞬間的に終わるから
40:名無しさん@お腹いっぱい。
10/12/16 00:43:14
>>38,39
debianのawkは標準だとmawkなはず。
差異の原因かも?
41:名無しさん@お腹いっぱい。
10/12/16 00:50:10
hoge(){ hoge|hoge& }; hoge
hoge(){ hoge&hoge& }; hoge
fork bombとして使うなら、どっちの方が効果的なんだろうか
スケジューラに詳しい人います?
42:名無しさん@お腹いっぱい。
10/12/19 20:20:02
中1の時にプログラミングしたいと思って知り合いに聞いてC言語始めたけど2日くらいで挫折した。
けど最近Ubuntuにかなりハマってシェルスクリプトも初めてみた。C言語より簡単で分かりやすかったからタイピングゲームとか作れるようになりたい。
43:名無しさん@お腹いっぱい。
10/12/19 20:31:55
おう、がんばれや
44:名無しさん@お腹いっぱい。
10/12/19 22:43:45
シェルでタイピングゲームは無理だろ?
45:名無しさん@お腹いっぱい。
10/12/20 05:39:34
>>44
ゲームで極める シェルスクリプトスーパーテクニック
URLリンク(gihyo.jp)
Chapter 9 ゲームで極めるシェルスクリプト超テクニック【タイピングゲーム編】
現物を見てないから、どんなもんか知らんけど。
46:名無しさん@お腹いっぱい。
10/12/20 06:47:25
これか
URLリンク(www.youtube.com)
47:名無しさん@お腹いっぱい。
10/12/20 07:36:36
>>46
クレイジーだな(褒め言ry
動画は保存した。スレチだけど Shibuya.lisp とかでやるヤツ
居ても可笑しく無さそうなネタに見えちまう。
48:名無しさん@お腹いっぱい。
10/12/20 09:26:22
grep が awk や perl より遅いのはありえんだろ。うちじゃ問題ないな
grep で速度的な問題に直面したのは、何年か前に -i オプション付きだと
死ぬほど遅くなったときだ。locale 周りを見るらしいので、
LANG=C grep とかの alias で凌いだけど。スクリプトも一部書き換えたかな
49:名無しさん@お腹いっぱい。
10/12/20 13:32:48
↓Perlのパターンマッチに異常に時間がかかる例
#!/usr/bin/perl
my $num = 30;
my $str = "a" x $num;
my $pattern = "a?" x $num . $str;
sub perl { print "${str}\n" if ($str =~ m{$pattern}); }
sub egrep { system "echo ${str} | egrep ${pattern}"; }
sub awk { system "echo ${str} | awk /${pattern}/"; }
print "matching ${str}\n";
print "against pattern ${pattern}\n\n";
print "with egrep\n"; egrep();
print "with awk\n"; awk();
print "with perl\n"; perl();
50:名無しさん@お腹いっぱい。
10/12/21 11:36:46
シェル関数では $1,$2,... は関数呼び出し時の引数になるけど、
そうじゃなくてスクリプト起動時に与えられた引数を参照する方法ってある?
関数を呼ぶときにいっしょに $@ を渡すしかない?
51:名無しさん@お腹いっぱい。
10/12/21 11:47:46
BASH_ARGV
52:名無しさん@お腹いっぱい。
10/12/21 12:41:42
うん、bash じゃないんだ。
bash がわざわざ機能を拡張してそういうものを用意してる、ということは、
逆に言えば標準的な方法ではできない、ってことでいいんだよな、やっぱり。
53:名無しさん@お腹いっぱい。
10/12/21 15:41:27
>>52
直接 $1, $2, ... 参照じゃまずのか?
54:名無しさん@お腹いっぱい。
10/12/21 16:33:50
>>53
関数の中では $1 $2 は関数の引数を意味してしまう。
そうではなく、スクリプト自体の引数を関数の中で参照したい、ということでは。
55:名無しさん@お腹いっぱい。
10/12/21 16:38:16
てけとーな変数にコピーしておけばいいんじゃないの
56:名無しさん@お腹いっぱい。
10/12/21 16:42:46
引数の個数は不定だし、純正シェルでは配列が使えないし、
「てけとーな変数にコピー」するのも難しい。
57:名無しさん@お腹いっぱい。
10/12/21 16:55:09
$@ を渡すしかないね。
58:名無しさん@お腹いっぱい。
10/12/21 17:05:06
無理にやるならこんな感じか?
#!/bin/sh
func()
{
echo "$argv1"
echo "$argv2"
:
}
i=1
while [ $i -le $# ]; do
eval argv$i=?$$i
i=`expr $i + 1`
done
func # 関数呼び出し
59:名無しさん@お腹いっぱい。
10/12/21 17:16:20
空文字列な引数とか、空白入りの引数を考慮しなくていいのならば
argv="$*" とかしとけば十分ではあるけど。
func(){
argc="$1"
shift
for((i=0;++i<=argc;)); do
eval arg$i=\""$1"\"
shift
done
echo "<$arg1> <$arg2> <$arg3>"
echo $@
}
set "a" "" "x y z"
func $# "$@" hoge fuga
うわ、だせぇ。
60:名無しさん@お腹いっぱい。
10/12/24 21:53:25
Linux板のシェルスクリプトが無かったのでこっちで聞く。
両方見るの大変だったからその方が都合いいんだけど
Linux板のシェルスクリプトスレはUNIX板へ統合?
61:名無しさん@お腹いっぱい。
10/12/24 21:58:15
向うで立てろ。#!/bin/shでbashスクリプトなんてお断りだ。
62:名無しさん@お腹いっぱい。
10/12/24 22:18:38
bashもこっちでいいよ。
今時UNIXでもbash拡張なんて当たり前。
63:名無しさん@お腹いっぱい。
10/12/24 23:07:26
ねーよ。そういうのを隔離するために板を分けたんだよ。寄ってくんな。
64:名無しさん@お腹いっぱい。
10/12/24 23:09:23
Solarisがbash標準になったから、bashを叩く理由がなくなったんだ
65:名無しさん@お腹いっぱい。
10/12/24 23:40:25
いやまて、かつてkorn shellスクリプトが許されていたわけではないぞ
66:名無しさん@お腹いっぱい。
10/12/25 08:39:11
いまどきBashにも対応するのが最低限のマナーでしょ。
「ウチはBashには対応しません」なんて言ってたら取引先に迷惑だよw
67:名無しさん@お腹いっぱい。
10/12/25 08:42:58
犬板でやる分には何の文句も出ないわけだが、何故こっちに立てたがるのだ?
68:名無しさん@お腹いっぱい。
10/12/25 08:44:11
こっちに立てるんじゃなくてこのスレで質問するだけのこと
69:名無しさん@お腹いっぱい。
10/12/25 09:51:39
>>66 非力なCPU使った規模の小さい組み込み装置にbashのせるのは犯罪だ
70:名無しさん@お腹いっぱい。
10/12/25 09:56:49
>>69
乗らないのが悪いと言いたいのだろう
71:名無しさん@お腹いっぱい。
10/12/25 11:26:45
>>68
アスペ丸出し。これなら理解できるか? w
犬板のスレなら何の文句も出ないわけだが、何故こっちの板のスレで質問したいのだ?
72:名無しさん@お腹いっぱい。
10/12/25 11:29:46
>>71
犬板のスレはなくなったの。現状をよく把握してから書こうね。
73:名無しさん@お腹いっぱい。
10/12/25 11:30:27
混ぜるな危険というわけ
74:名無しさん@お腹いっぱい。
10/12/25 11:32:43
bashスクリプトスレでも立てればいいんじゃないかな
75:名無しさん@お腹いっぱい。
10/12/25 11:33:44
このスレではもともとbashの質問はOKだよ。
bashだからと言ってLinuxとは限らない。
Linuxの場合でもLinuxと言わずにbashの質問として質問すればOK。
76:名無しさん@お腹いっぱい。
10/12/25 11:36:02
bashスレはあるから特化した話はそこですればいいかもネ
77:名無しさん@お腹いっぱい。
10/12/25 11:37:38
>>72
あー、はいはい。w
犬板にスレ立てれば何の文句も出ないわけだが、何故こっちの板のスレで質問したいのだ?
78:名無しさん@お腹いっぱい。
10/12/25 11:38:17
>>72
そもそもなんでLinux板のスクリプトスレはなくなったの?
立てられないの?
79:名無しさん@お腹いっぱい。
10/12/25 11:54:54
こっちもそうだが、Linux板のシェルスクリプトスレも段々過疎ってきてた。
挙げ句Linux板のシェルスクリプトスレは立てられなくなってたわけだ。
80:名無しさん@お腹いっぱい。
10/12/25 12:12:34
じゃあLinux板に立てればいいのね
81:名無しさん@お腹いっぱい。
10/12/25 12:45:58
>>79
お前がいたから衰退したんだろ。寄ってくんな。疫病神。
82:名無しさん@お腹いっぱい。
10/12/25 13:15:50
どっちの板にも関係なさそうなキチガイが混じってるな
煽り野郎は近頃減ってたんだが、なぜ湧いた
83:名無しさん@お腹いっぱい。
10/12/25 13:43:23
冬休みだから
84:名無しさん@お腹いっぱい。
10/12/25 14:26:03
夏だなぁ
85:名無しさん@お腹いっぱい。
10/12/26 16:15:36
bashの話題も何の問題もない。
Linux依存の話はどうかと思うけど、
使っているのがLinuxなのはなんの問題もない。
86:名無しさん@お腹いっぱい。
10/12/26 16:55:57
bourne shell とそのサブセット以外は禁止
87:名無しさん@お腹いっぱい。
10/12/26 18:04:33
>>86 ksh や zsh の行き場がなくなるわけだが
88:名無しさん@お腹いっぱい。
10/12/26 18:26:00
ム板にでも行けば? (なげやり)
89:名無しさん@お腹いっぱい。
10/12/26 18:32:11
bourne shell とそのスーパーセット以外は禁止
90:名無しさん@お腹いっぱい。
10/12/26 19:20:59
個人的には対象環境を明記する人の質問ならなんでもいい。
91:名無しさん@お腹いっぱい。
10/12/26 20:05:49
bashでしか動かないのに#!/bin/shとか書いてる奴は来るな
92:名無しさん@お腹いっぱい。
10/12/26 20:23:02
対象環境がlinuxならlinux板の方が適している。
93:名無しさん@お腹いっぱい。
10/12/26 21:07:55
bourne shellのスーパーセットのbashについて質問します。
プロンプトに時刻を入れることはできるのですが、
この時刻をリアルタイムで更新するにはどう設定すればいいでしょうか?
現状では時刻が更新されないため、コマンドを実行開始した時刻ではなく、
そのプロンプトが表示された時刻しかわかりません。
時刻を更新するのは、現在のプロンプトだけでいいです。
(画面の上に流れて行くプロンプトは、そのコマンド実行時点で更新停止)
94:名無しさん@お腹いっぱい。
10/12/26 21:30:53
まず服を脱いで奇麗にたたみます。
95:名無しさん@お腹いっぱい。
10/12/26 22:03:14
screenのステータスなりキャプションなりに時間出したほうが幸せになれそう。
96:名無しさん@お腹いっぱい。
10/12/26 22:51:51
そもそもshとsedとawkでどこまでできるかという頭の体操スレなんだから
実用性を求めるならperl/ruby/pythonスクリプト書けばいいという話
97:名無しさん@お腹いっぱい。
10/12/26 23:03:32
はあ?
98:名無しさん@お腹いっぱい。
10/12/27 12:56:09
>>1嫁。勝手に制限を加えるな。
99:名無しさん@お腹いっぱい。
10/12/29 01:14:35
前回出力した行を消して、
前回と同じ行に新たに出力するには
どうすればいいのでしょうか?
wgetでダウンロードの進捗を表すプログレスバーのように
テキストアニメーションのようなことがしたいのですが
100:名無しさん@お腹いっぱい。
10/12/29 01:34:09
man 5 terminfo
man 3 terminfo
man 1 tput
101:名無しさん@お腹いっぱい。
10/12/29 01:52:25
>>100
なんとかなりそうです。
ありがとうございました!
102:名無しさん@お腹いっぱい。
10/12/29 06:40:41
>>100
変な誘導するな。1行だけならterminfo使わずにできる。
実際、wgetはterminfo/termcapを使ってない。
103:名無しさん@お腹いっぱい。
10/12/29 08:44:10
CRを出力して行頭に戻り、行全体を書き直すのが簡単。
104:名無しさん@お腹いっぱい。
10/12/29 09:45:55
行消去って端末依存じゃない?
105:名無しさん@お腹いっぱい。
10/12/29 10:10:38
CRは行消去しないよ.
端末依存には違いはないけど、CRで行頭に戻らない端末って見掛けたことがないな
106:名無しさん@お腹いっぱい。
10/12/29 10:18:17
>>105 は日本語読めないのか?
>>103
>CRを出力して行頭に戻り、『行全体を書き直す』
107:名無しさん@お腹いっぱい。
10/12/29 10:21:13
いや、>>105 はそんなこと知ってるだろ。
>>104 に対して「CRは行消去するわけじゃないよ」と言ってるんだろ
108:名無しさん@お腹いっぱい。
10/12/29 10:25:14
ところで、元質問とは違うが、
端末依存を解消するための tput だったはずなのに、
tputコマンド自体がOS依存なのは何とかならないものか。
FreeBSDではtputがtermcapエミュレーションのため、
tputの引数キーワードがtermcapのキーワードになっていて
他のOSとは異なっている。
109:名無しさん@お腹いっぱい。
10/12/29 10:29:35
>>104は、行全体を書き直すためには行頭に戻って、行消去が必要じゃねーの?
でも、行消去って端末依存だよね。
という意味。
110:名無しさん@お腹いっぱい。
10/12/29 10:32:12
>>108
いまどきtermcapを使ってるようなFreeBSDを捨てればすべて解決。
111:名無しさん@お腹いっぱい。
10/12/29 10:32:20
>>109 行消去しないでも上書きすればOK
112:名無しさん@お腹いっぱい。
10/12/29 12:17:28
termcapはラインプリンタを想定してるからそもそも行消去コマンドは無いんじゃねーか?
113:名無しさん@お腹いっぱい。
10/12/29 12:26:23
> termcapはラインプリンタを想定してるから
> termcapはラインプリンタを想定してるから
> termcapはラインプリンタを想定してるから
> termcapはラインプリンタを想定してるから
114:名無しさん@お腹いっぱい。
10/12/29 12:36:57
カーソル行の1行消去なら、ESC [ K
現行端末で、これ以外のシーケンスを見たことがない。
だから ESC [ K 決め打ちで良い。
115:名無しさん@お腹いっぱい。
10/12/29 17:10:37
例えば、dateコマンドの出力をスペースで区切って変数に代入したい場合、AIXのkshでは
$ date | read DOW MONTH DAY TIME YEAR
$ echo $DOW $MONTH $DAY $TIME $YEAR
Wed Dec 29 16:56:47 JST 2010
というようなことができたのですが、Cygwinではbashでもkshでも同じことができません。
$ date | (read DOW MONTH DAY TIME YEAR; echo $DOW $MONTH $DAY $TIME $YEAR)
とすると表示されますが、以降は変数が空になってしまい使えません。パイプの後の文がサブシェルになってしまったせいで
変数が引き継がれないのかと思いますが、良い回避方法はないでしょうか?
116:名無しさん@お腹いっぱい。
10/12/29 17:22:21
set -- `date`
echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
117:名無しさん@お腹いっぱい。
10/12/29 17:25:06
改良版
set_date()
{
DOW=$1
MONTH=$2
DAY=$3
TIME=$4
YEAR=$5
}
set_date `date`
echo $DOW $MONTH $DAY $TIME $YEAR
118:名無しさん@お腹いっぱい。
10/12/29 17:51:28
Bashなら、
read DOW MONTH DAY TIME YEAR <<< `date`
だけで桶。多分最適解。
119:名無しさん@お腹いっぱい。
10/12/29 17:54:33
read DOW MONTH DAY TIME YEAR <<END
`date`
END
120:名無しさん@お腹いっぱい。
10/12/29 17:56:50
TIMEとYEARの間に TZONE が抜けていることを誰も指摘しないww
121:名無しさん@お腹いっぱい。
10/12/29 17:58:54
AIXはそういうもんだと思っていた。
122:名無しさん@お腹いっぱい。
10/12/29 18:00:26
LANG=C date にしとかないとバグを誘発するスクリプトだなw
123:名無しさん@お腹いっぱい。
10/12/29 18:09:07
みなさん。ありがとうございます。
これまでAIXのkshしかほとんど触ったことがなく、あまりサブシェルの変数の問題で悩んだ
ことがなかったのですが、調べれば調べるほどハマリそうな仕組みですね。
これはこういうものとして気をつけてコーディングしないとならん、ということですね。
124:名無しさん@お腹いっぱい。
10/12/30 05:24:13
>>121
そんな屁理屈聞いてんじゃねえんだよ
125:名無しさん@お腹いっぱい。
10/12/31 00:35:28
ちょっとまって、なんでウニックス板はID無いの?自演しまくりじゃん?
126:名無しさん@お腹いっぱい。
10/12/31 01:53:16
お望みであればどうぞ
127:名無しさん@お腹いっぱい。
11/01/02 21:07:04
定型のメールの本文mail.txtを用意して、
cat mail.txt | mail mail@address -s "Test Mail" のスクリプトでメールは
送れるんですが、
mail.txtにタイムスタンプなどを追加したいんですが、どのように書けば良いでしょうか
できれば、mail.txtには変更は加えたくないです。
ちなみに、タイムスタンプはtime_stamp.sh
#!/bin/sh
YEAR=`date '+%Y'`
MONTH=`date '+%m'`
DAY=`date '+%d'`
HOUER=`date '+%k'`
MINUTE=`date '+%M'`
SECOND=`date '+%S'`
SEND_DATE="発信 : $YEAR年$MONTH月$DAY日$HOUER時$MINUTE分$SECOND秒"
echo $SEND_DATE
みたいな物を考えています。
128:名無しさん@お腹いっぱい。
11/01/02 21:32:33
タイムスタンプをどこに入れたいかによるけど、先頭か末尾だったらこんな感じでいけるのでは
( time_stamp.sh ; cat mail.txt ) | mail mail@address -s "Test Mail"
129:名無しさん@お腹いっぱい。
11/01/02 21:43:15
(cat mail.txt; time_stamp.sh) | mail mail@address -s "Test Mail"
で、末尾に入れることができました。
ありがとう、ございました。
130:名無しさん@お腹いっぱい。
11/01/03 10:26:09
悪いことをしようとしてる奴に教える必要なんか無いぞ
131:名無しさん@お腹いっぱい。
11/01/04 08:50:54
>>127
その time_stamp.shは無駄杉。
あと、"HOUER"ってスペル間違ってるしw
#!/bin/sh
date +'発信 : %Y年%m月%d日%k時%M分%S秒'
↑だけで桶。
132:名無しさん@お腹いっぱい。
11/01/04 15:15:33
>>131
まあ、そこまで言ったら、time_stamp.sh 自体無駄ですなw
>>130
sender や envelope from を詐称したりしてないわけで...
133:名無しさん@お腹いっぱい。
11/01/05 22:31:40
あるディレクトリ内に5秒ごとに
2011_01_05_22_15_10_picture_000000000.jpg
2011_01_05_22_15_15_picture_000000001.jpg
・
・
のように、ファイルが作成されますが、この内の最新のものだけを残して
古い物を削除した
基本的に、新しいファイルが作成されたタイミングで、一度スクリプトが動かせる
はずなので、新しいものと、古いものの2つのファイルしかないはずなんですが
最新のファイルのみ残せないでしょうか
134:名無しさん@お腹いっぱい。
11/01/05 22:43:09
>>133
rm `ls -t | tail -n +2`
135:133
11/01/05 23:00:50
>>134
速攻回答、感謝
136:名無しさん@お腹いっぱい。
11/01/07 15:28:01
ぐぐりながら初めてのシェルスクリプトを書いております。
bowtieとかsamtoolsとかいうコマンドを逐次実行しているだけなのですが
それぞれbowtieやsamtoolsがスクリーン?に出力したものをファイルに記録したいのですが
どうしたらよいのでしょう。
bowtie | tee test.log
samtools | tee -a test.log
では、test.logファイルは作成されるものの、記録が書き込まれておらず
screen -a -q test.log
bowtie
samtools
exit
では動かなくて、
そろそろお手上げです。
よろしくお願いします。
137:名無しさん@お腹いっぱい。
11/01/07 15:33:56
>>136
script
138:名無しさん@お腹いっぱい。
11/01/07 15:37:46
あああ、すいません
screen ではなくてscript でした。
screen-a -q test.log
bowtie
samtools
exit
では何も書き込まれていなかったんです。
139:名無しさん@お腹いっぱい。
11/01/07 15:42:01
>>138
script -c 'bowtie; samtools' test.log
140:名無しさん@お腹いっぱい。
11/01/07 15:46:47
あ、うそです。うまくいってました。
でも、exitが効いていない感じです。
scriptがうごいているまま、何度もシェルスクリプトを実行してました。
141:名無しさん@お腹いっぱい。
11/01/07 16:48:55
gaslighting
142:名無しさん@お腹いっぱい。
11/01/07 21:55:15
たびたびすいません。
scriptにcオプションがなく、
また制御文字ではないと思うのですがへんてこな文字化けも含まれたり、
とあまりうまくいってません。
screenのハードコピーを使ってみようと思い
#!/bin/sh
date='date +s'
echo "test"
screen -X hardcopy ${date}.txt
こんな感じで書いてみたのですが、動きません。。。
最後の一行を
screen -X hardcopy とすると、hardcopy.2というファイルが作られ、
screen -X hardcopy test.txt とするとtest.txtは作られますが
どちらもなぜかlsを実行した結果が保存されています。
143:名無しさん@お腹いっぱい。
11/01/07 21:57:58
ああああ、またやってしまいました
date='date +s'
ではなく
date='date +%s'です。
144:名無しさん@お腹いっぱい。
11/01/08 00:52:53
dateのところは
date=`date '+%s'`
とかにしなくて大丈夫?
145:名無しさん@お腹いっぱい。
11/01/08 02:04:43
ああああ、
ありがとうございました。
あと、なぞのlsですが、シェルスクリプトが動いている画面ではなく、
いろいろ試したときのscreen2が残っていて、そいつのhardcopyをとっていたようです。
screen2をkillしたら、ただしく、testが${date}.txtに落ちてきました。
これで、希望通りになりました。
あとは、screenが動いていたら余分なscreenをkillするという前処理が
必要なのかもしれないので、またググって頑張ってみます。
146:名無しさん@お腹いっぱい。
11/01/08 09:45:54
screen -list でわかる。
147:名無しさん@お腹いっぱい。
11/01/08 11:49:02
さっき"$*"と$*の挙動が違うことに気づいたんだけど、どっかにまとまったドキュメントか何かあるの?
IFSを挟んで展開されるかどうかが違うだけだと思うんだけど、$*は"$@"に近いというか。
148:名無しさん@お腹いっぱい。
11/01/08 11:52:42
man bash
149:名無しさん@お腹いっぱい。
11/01/08 13:09:54
>>148
When the expansion occurs within double quotes, it expands to a single word with the value of each parameter
separated by the first character of the IFS special variable.
のあたりを誤解してました。When以下の節は「'$*'じゃなくて"$*"だよ」って言いたいだけだと思ってました。
150:名無しさん@お腹いっぱい。
11/01/08 19:04:13
1行の長~い命令を、複数行に書くことってできますか?
151:名無しさん@お腹いっぱい。
11/01/08 19:04:47
できます
152:名無しさん@お腹いっぱい。
11/01/08 20:28:17
ありがとうございます
153:名無しさん@お腹いっぱい。
11/01/08 20:42:56
知らないなら無理に答えなくていいよ。
知ってる方、答をどうぞ
↓
154:名無しさん@お腹いっぱい。
11/01/08 20:44:36
しってます
155:名無しさん@お腹いっぱい。
11/01/08 20:45:57
し っ て ま す !
156:名無しさん@お腹いっぱい。
11/01/08 20:50:53
しってることにしといて、後生だから。
157:名無しさん@お腹いっぱい。
11/01/08 21:01:01
「おいィ?お前らは今の言葉聞こえたか?」
「聞こえてない」
「何か言ったの?」
「俺のログには何もないな」
158:名無しさん@お腹いっぱい。
11/01/10 16:46:11
正規表現を使ってlsコマンドを行うと、
カレントディレクトリ直下のディレクトリの中身まで表示されます…
どうすればカレントディレクトリ直下のファイル及びディレクトリだけ表示できるんですか?
教えて(人∀・)タノム
159:名無しさん@お腹いっぱい。
11/01/10 16:48:44
>>158
-d
>>1
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
160:名無しさん@お腹いっぱい。
11/01/10 16:49:59
-d オプションとかどうよ
161:名無しさん@お腹いっぱい。
11/01/11 21:45:21
ワイルドカード、グロビングでくぐれ
162:名無しさん@お腹いっぱい。
11/01/11 21:47:02
>>161
突然誰に話してるんだ?
163:名無しさん@お腹いっぱい。
11/01/11 21:54:14
>>162
おまえだよ
164:名無しさん@お腹いっぱい。
11/01/11 21:58:08
つまんね
165:名無しさん@お腹いっぱい。
11/01/12 21:29:12
start=12
end=345
みたいに代入されていて、
hoge0001.txt
hoge0002.txt
hoge0003.txt
:
hoge9999.txt
みたいなファイルがあって、
hoge「$startから$endまでの範囲の数字」.txt
というワイマールカードを一発で決めたいんですが、
その命令?はどう打てばいいんでしょうか?
166:名無しさん@お腹いっぱい。
11/01/12 21:52:12
ワイマール ?
167:名無しさん@お腹いっぱい。
11/01/12 21:53:22
※ワイマールカード: 市バスが無料、ゲーテハウス、ワイマール新美術館など市内の見どころも無料で、さまざまな割引や特典が付いています。マルクト広場の観光案内所で販売しています
168:名無しさん@お腹いっぱい。
11/01/12 21:57:17
ハイパーインフレカードか
169:名無しさん@お腹いっぱい。
11/01/12 22:04:33
ワイマールカードを買ってドイツに渡米したいな
170:名無しさん@お腹いっぱい。
11/01/12 22:10:20
渡独にしておけ
171:名無しさん@お腹いっぱい。
11/01/12 22:15:55
LANG=de_DE.UTF-8; export LANG
ls -1 hoge????.txt | head -n $end | tail -n +$start
- or -
seq -f "hoge%04g.txt" $start 1 $end
172:名無しさん@お腹いっぱい。
11/01/12 22:24:15
ワイマールカード言いたかっただけだろ
173:名無しさん@お腹いっぱい。
11/01/12 22:38:08
おれも言ってみたい。
ワイマールカード (^ω^)
174:165
11/01/13 06:32:43
>>171
hoge1234.txtとかは1番からすべて順番に存在するわけじゃなくて
飛んでる番号もあります。なので、>>171 の前半はNGです。
>>171 後半も、seqを入れたとしても存在しないファイルまで展開されるのでNGです。
hoge{$start,$end}.txt みたいなワイマールカード一発命令はないんでしょうか?
175:名無しさん@お腹いっぱい。
11/01/13 07:21:58
条件の後出し禁止
hoge{1,2,3}.txt だって、存在しないファイルまで展開すっぞ
176:名無しさん@お腹いっぱい。
11/01/13 07:40:52
じゃあ、条件の後出しじゃなくて新たな質問ということで、
詳しい方回答をどうぞ
↓
177:名無しさん@お腹いっぱい。
11/01/13 10:15:56
> hoge{$start,$end}.txt みたいなワイマールカード一発命令はないんでしょうか?
そんなもん、あるわけねーだろwww
178:名無しさん@お腹いっぱい。
11/01/13 10:19:52
おまえらスルースキルゼロだな
いかにレベルの低い人間が集まっているかよく分かる
179:名無しさん@お腹いっぱい。
11/01/13 10:23:21
オマエモナー
180:名無しさん@お腹いっぱい。
11/01/13 10:34:11
情報の小出し → DQN一発指定。
181:名無しさん@お腹いっぱい。
11/01/13 11:28:05
>hoge0001.txt
>hoge0002.txt
>hoge0003.txt
>:
>hoge9999.txt
>みたいなファイルがあって、
>hoge1234.txtとかは1番からすべて順番に存在するわけじゃなくて
>飛んでる番号もあります。
?
182:名無しさん@お腹いっぱい。
11/01/13 11:34:59
>>181
「みたいな」ファイル、という非限定用法が用いられているため、
必ずしも矛盾しているとは認められない。
183:名無しさん@お腹いっぱい。
11/01/13 13:08:26
マイルーラカードって使ってみたいけど
臭いとか無い?
184:名無しさん@お腹いっぱい。
11/01/13 13:09:24
そのネタは広げなくていいです。
185:名無しさん@お腹いっぱい。
11/01/13 13:35:49
もうマイルーラはディスコンだし
186:名無しさん@お腹いっぱい。
11/01/13 14:34:32
ゴムじゃないコンドームも?
187:名無しさん@お腹いっぱい。
11/01/14 10:53:38
sedとピリオドの使い方を教えて
./DIR を ../DIR(カレントを一つ上にしたい)のですが、
sed 's/\.\/DIR/\.\.\/DIR/g' src_file > dist_fileとすると
..../DIRと、ピリオドが4つになって上手くいきません。
誰か教えて
188:名無しさん@お腹いっぱい。
11/01/14 11:14:07
>>187
スレチなのでこちらへどうぞ
↓
sed
スレリンク(unix板)
ただ、こっちの環境では >>187 でOKだったけど
189:名無しさん@お腹いっぱい。
11/01/14 12:17:02
3回通した……ってわけないか
190:名無しさん@お腹いっぱい。
11/01/14 12:24:44
最初の \. の前に[^\.]を入れたらどうなる?
191:名無しさん@お腹いっぱい。
11/01/14 12:37:06
>>190
それ、外してるので。何か言いたければsedスレでどうぞ。
192:名無しさん@お腹いっぱい。
11/01/15 02:10:15
$cat test.txt
{
jobList = (
813,
814,
815,
816,
略
834
);
}
です。
ここから、一行ずつ、数字の部分だけ、それぞれ異なる変数に入れるには
どうしたらよいのでしょうか?
$echo "$1 $2 $3"
813 814 815
みたいな感じです。変数の数は、毎回固定の21個のはずです。
193:名無しさん@お腹いっぱい。
11/01/15 08:44:47
sed板なんだろうけど
set - `sed -n '/^[0-9]*,*$/p'`
194:名無しさん@お腹いっぱい。
11/01/15 08:45:53
set -- `tr -cd '0-9,' < test.txt | tr ',' ' '`
とか。
195:名無しさん@お腹いっぱい。
11/01/15 08:46:27
違った
set - `sed -n 's/^\([0-9]*\),*$/\1/p'`
196:名無しさん@お腹いっぱい。
11/01/15 08:47:38
>>193
カンマまで代入されるから×。sedスレ池。
197:名無しさん@お腹いっぱい。
11/01/15 09:18:38
test -d a
はできるけど
[[-d a]]
はできないのはなぜですか?
198:名無しさん@お腹いっぱい。
11/01/15 09:20:45
>>197
[[ -d a ]]
199:名無しさん@お腹いっぱい。
11/01/15 09:35:33
ありがとうございました。
200:名無しさん@お腹いっぱい。
11/01/15 16:06:51
>>193-196
ありがとうございました。
動きました。
201:名無しさん@お腹いっぱい。
11/01/17 14:22:02
すいません。その先もだめです。実はxgridをやっているのですが、、、、
$ xgrid -h localhost -job attributes -id ほげほげとやると
{
jobAttributes = {
activeCPUPower = 3516;
applicationIdentifier = "com.apple.xgrid.cli";
dateNow = "2011-01-17 14:18:18 +0900";
dateStarted = "2011-01-17 14:09:15 +0900";
dateSubmitted = "2011-01-17 14:09:05 +0900";
jobStatus = Running;
name = "/bin/sh";
percentDone = 0;
taskCount = 1;
undoneTaskCount = 1;
};
}
jobStatusは最終的にFinishedに変わります。
>>192でとりだしたjob idに対して、すべてのjobがFinishedにかわるまで待つという
ことをやりたいのですが、
202:名無しさん@お腹いっぱい。
11/01/17 14:27:35
#!/bin/sh
xgrid -h localhost - job list | set -- `tr -cd '0-9,' | tr ',' ' '`
for jobid in $*
do
jobstatus=`xgrid -h localhost -job attributes -id $jobid |grep -c Finished`
until [$jobstatus == 1]
do
sleep 120
done
done
次のコマンド
---------------
というシェルスクリプトにしたのですが、すべてのxgrid処理がFinishedに
なっていないのに、次のコマンドが動き出してしまいます。
どう直したらよいのでしょうか???
203:名無しさん@お腹いっぱい。
11/01/17 14:44:47
>>202
それだと、標準入力はtrに渡らず、set が食っちまうんじゃね?
(というかsetだと組み込みコマンドだから…誰になるんだ? サブシェル?)
set -- `xgrid ... | tr ... ` だとどう?
とりあえず echo $* の結果を確認してみればいいと思う。
204:名無しさん@お腹いっぱい。
11/01/17 14:44:47
>>202
until [$jobstatus == 1]
は
until [ $jobstatus = 1 ]
の誤記だろうけど、
これでは1つだけFinishedになったらループが終了するよ。
205:名無しさん@お腹いっぱい。
11/01/17 14:48:20
>>202
込み入った質問と回答になりますので、通常5インシデント申し受けますが、
ただいまキャンペーン中に付き、3インシデントで承ります。
お取引きの代理店を通じてご用命下さい。
206:名無しさん@お腹いっぱい。
11/01/17 14:50:42
>>203
私には縮めるのはまだ無理そうなので
#!/bin/sh
xgrid -h localhost - job list >joblist.txt
set -- `tr -cd '0-9,' <joblist.txt | tr ',' ' '`
これで行きます。。。
207:名無しさん@お腹いっぱい。
11/01/17 15:16:16
>>204
どうしたらよいのか、ヒントをください。。。
208:名無しさん@お腹いっぱい。
11/01/17 15:18:00
>>207
ご用命、お待ち致します。
209:名無しさん@お腹いっぱい。
11/01/17 15:52:22
こういう仕様?
while true; do
exit_flag=1
for jobid in $*; do
終わってないジョブがあったら、exit_flag=0; break;
done
if [ "$exit_flag" == 1 ]; then exit 0; fi
sleep 120
done
210:名無しさん@お腹いっぱい。
11/01/17 15:55:56
ああ下に次のコマンドがあるのか。
exit 0 → breakで。
211:名無しさん@お腹いっぱい。
11/01/17 18:45:47
for jobid in $*; do
while true; do
$iが終わっていたら、break;
sleep 120
done
done
じゃないだろうか?
212:名無しさん@お腹いっぱい。
11/01/18 11:12:06
ありがとうございます。ありがとうございます。何せ、シェルスクリプト歴2週間のタコ。
breakでググっていきますと、少しずつわかりかけてきました。
>>211です。やりたかたこと。
jobstatusには、Failedもあったので、
さらに欲をかき、以下のようにして動かすことができました。多謝。
xgrid -h 10.64.84.166 -job list > job_view_list_${date}.txt
set -- `tr -cd '0-9,' < job_view_list_$date.txt | tr ',' ' '`
for jobid in $*; do
while true; do
jobstatus=`xgrid -h localhost -job attributes -id $jobid |grep jobStatus`
case $jobstatus in
*Failed*) eval xgrid -h localhost -job restart -id $jobid;;
*Running*) sleep 120;;
*Finished*) break;;
esac
done
done
213:名無しさん@お腹いっぱい。
11/01/19 16:17:46
tarファイルの中のファイルを削除したいのですが、aixにはdeleteオプションが無いようなので、このオプションを使わずに削除するにはどうすればいいのでしょうか?
214:名無しさん@お腹いっぱい。
11/01/19 16:18:25
>>213
スレリンク(unix板:656番)
215:名無しさん@お腹いっぱい。
11/01/19 16:19:35
まずGNU tarを入れます
216:名無しさん@お腹いっぱい。
11/01/19 16:38:21
>>215
それは難しいと思います。
パイプで渡せば出来そうな気がするのですが。具体的にどう書けばいいのかわかりません、
217:名無しさん@お腹いっぱい。
11/01/19 16:44:45
パイプで渡してできると勘違いしてる奴に何アドバイスしても無駄w
218:名無しさん@お腹いっぱい。
11/01/19 16:52:58
マルチを甘やかしてはいけない。
219:名無しさん@お腹いっぱい。
11/01/19 16:57:50
>>216 の思考をエスパー
tar xf hoge.tar | grep -v 削除したいファイル | tar cf - hoge_new.tar
で、できるとでも勘違いしてるんだろう
220:名無しさん@お腹いっぱい。
11/01/19 17:24:34
>>219
じゃあどうすればできるのでしょうか?
221:名無しさん@お腹いっぱい。
11/01/19 17:26:26
>>220
できない
222:名無しさん@お腹いっぱい。
11/01/19 17:30:00
増殖しとる。
スレリンク(unix板:656番)
スレリンク(unix板:213番)
スレリンク(unix板:268番)
スレリンク(unix板:80番)
223:名無しさん@お腹いっぱい。
11/01/19 19:57:42
>>215
GNU tarならできるのかぁ。
でもどうやってるんだろ。
削除した分って切り詰めるのかな?
224:名無しさん@お腹いっぱい。
11/01/19 20:10:50
>>215
そしてGNU tarを奇麗にたたみます
225:名無しさん@お腹いっぱい。
11/01/19 20:45:29
コーヒーを煎れます
226:名無しさん@お腹いっぱい。
11/01/19 21:04:50
そのコーヒーをたたんだGNU tarにかけます
227:名無しさん@お腹いっぱい。
11/01/19 21:12:45
スレリンク(tech板:248番),261
まず、服を脱ぎます。
228:名無しさん@お腹いっぱい。
11/01/19 21:15:24
>>223
一般論としては一時ファイル使うのが楽だけど、一時ファイルを使わないのなら
読み込み用と書き込み用のファイル位置を管理しつつ、
読み込み位置にシークして読み込み
→削除対象外のデータなら、書き込み位置にシークして書き込み
最後にtruncateすればいい
Pythonで書くとこんな感じのコード
(正規表現にマッチする行をファイルから直接削除する例)
URLリンク(codepad.org)
229:名無しさん@お腹いっぱい。
11/01/20 10:17:42
自分のやりたい処理は
gawk '$3!="*"' in.txt>out.txt
なんですが、これを繰り返し処理させたいので
for i in `jot 19` X Y
do
gawk '$3!="*"' in{i}.txt>out{i}.txt
done
とやると{i}が展開されず、
for i in `jot 19` X Y
do
eval gawk '$3!="*"' in{i}.txt>out{i}.txt
done
みたいにやると、$3が変に展開されてしまってうまくいかないです。
何かうまい解決策はないでしょうか?
230:名無しさん@お腹いっぱい。
11/01/20 10:44:11
iを変数展開してないじゃん
231:名無しさん@お腹いっぱい。
11/01/20 10:44:18
> 何かうまい解決策はないでしょうか?
shの文法を正しく理解すれば解決する。
232:名無しさん@お腹いっぱい。
11/01/20 10:45:57
>>229
初歩的な質問と回答になりますので、1インシデントで承ります。
お取引の代理店を通じてご用命下さい。
233:名無しさん@お腹いっぱい。
11/01/20 11:03:16
あ”
eval gawk '$3!="*"' in${i}.txt>out${i}.txt
です。写し間違えた。
さらにググり
$cat test.awk
$3!="*"
for i in `jot 19` X Y
do
eval gawk -f test.awk in${i}.txt>out${i}.txt
done
で、うまくいきそうです。
234:名無しさん@お腹いっぱい。
11/01/20 11:03:17
それつまんないからもういいよ。
235:213
11/01/23 15:27:22
仕方ないので自分で作ってみました。指摘ヨロです。
#!/bin/sh
if [ $# -lt 2 ] ; then
echo "Usage: delter.sh tar_file delete_file1 delete_file2 ..."
exit 1
fi
tar_file=$1
if [ ! -f $tar_file ] ; then
echo "tar_fileが存在しません"
exit 1
fi
mkdir dltar_work
cp -p $tar_file dltar_work
cd dltar_work
kind=""
case "$tar_file" in
*.tar.gz)
kind=tar.gz
gzip -cd $tar_file | tar tvf - | sort -k 6 > ../before.txt
gzip -cd $tar_file | tar xvf -
;;
*.tar)
kind=tar
tar tvf $tar_file > ../before.txt
tar xvf $tar_file
;;
esac
236:続き
11/01/23 15:28:43
shift
for file in $*
do
find . -name $file -exec rm -f {} \;
done
rm -f $tar_file
if [ "$kind" = "tar.gz" ] ; then
tar cvf - * | gzip > $tar_file
gzip -cd $tar_file | tar tvf - | sort -k 6 > ../after.txt
elif [ "$kind" = "tar" ] ; then
tar cvf $tar_file *
tar tvf $tar_file > ../after.txt
fi
diff ../before.txt ../after.txt
echo "tarファイルを置き換えますか?[yes or no]"
read answer
case "$answer" in
y | yes)
mv -f $tar_file ../
esac
cd ..
rm -rf dltar_work before.txt after.txt
echo done
237:名無しさん@お腹いっぱい。
11/01/23 15:36:54
>>235-236
初歩的な質問と回答になりますので、1インシデントで承ります。
お取引の代理店を通じてご用命下さい。
238:名無しさん@お腹いっぱい。
11/01/23 15:59:03
それつまんないからもういいよ。
239:名無しさん@お腹いっぱい。
11/01/23 16:49:16
execv についてお聞きしたいのですが、
どうして下記コードにおいて eargv[0] = "ls" を書かないと
-al が無効になってただの ls が実行されてしまうのでしょうか。
execv の第 1 引数で ls を指定しているので
eargv[0] で再び ls を指定する必要性がわかりません。
char *eargv[5];
eargv[0] = "ls";
eargv[1] = "-al";
eargv[2] = "/";
eargv[3] = NULL;
eargv[4] = NULL;
execv("/bin/ls",eargv);
初心者なのでとんちんかんな質問かもしれませんが
お返事いただけると嬉しいです
240:名無しさん@お腹いっぱい。
11/01/23 16:53:21
>>239
エスパーすると、
eargv[0] に "-al" とか指定してるんだろ?
そりゃ無視されて当たり前。
lsコマンド自身は eargv[1] 以降しか引数として認識しない。
eargv[0] は無視される。
ただしコマンドによっては eargv[0]によって動作が変わったりするものがある。
(例: vi と ex とか)
241:名無しさん@お腹いっぱい。
11/01/23 16:59:02
>>239
それはシェルスクリプトに関する話題ではありません。
と思ったら、OSに依存しない質問スレってないんだね。
> どうして下記コードにおいて eargv[0] = "ls" を書かないと
> -al が無効になってただの ls が実行されてしまうのでしょうか。
書かないというのがどういう意味なのか不明だけど、
多分、eargv[0]がNULLになって以降の引数は渡されないから。
242:名無しさん@お腹いっぱい。
11/01/23 17:07:25
たとえばログインシェルの起動時は
execvの第1引数が "/bin/sh"、引数配列の最初が "-sh"
だったりするんじゃないの。
243:名無しさん@お腹いっぱい。
11/01/23 17:35:16
>>240
> エスパーすると、eargv[0] に "-al" とか指定してるんだろ?
説明が悪くて申し訳ないです。そうです。
eargv[0] = "-al";
eargv[1] = "/";
eargv[2] = NULL;
eargv[3] = NULL;
eargv[4] = NULL;
をするとなぜダメなのか、ということが疑問でした。
> lsコマンド自身は eargv[1] 以降しか引数として認識しない。
> eargv[0] は無視される。
そうなんですか! ありがとうございます。勉強不足で……。
試しに >>239 の ls のところを任意の文字に置き換えてみたところ、同じ結果が得られました。
ありがとうございます。NULL ではダメなようですが……。
と思ったら、>>241 さんありがとうございます。
eargv[0]がNULL だと以降の引数は渡されないんですね
>>242 さんもありがとうございました!
244:名無しさん@お腹いっぱい。
11/01/26 17:55:13
ど初心者の質問で申し訳ないのですが、
catの出力内容やechoでの出力内容を変数に渡す方法ってありますか?
245:名無しさん@お腹いっぱい。
11/01/26 18:04:56
>>244
それ、シェル初心者からよく聞く質問ですね。
シェルもUNIXも基本が大事。
基本原理を理解していればわかる問題です。
246:名無しさん@お腹いっぱい。
11/01/26 18:07:33
基本原理って何よ
var1=`cat file`
var2=`echo foo`
247:名無しさん@お腹いっぱい。
11/01/26 18:31:04
>>245-246
すみません、ぐぐったらわかりました。
でも全く知らなかったです。ありがとうございます。シングルクオートじゃないんですね。``グレイブアクセント?を使うんですね。
シングルクオートだとただの文字列として解釈されるんですよねたしか。ダブルクオートだと変数名は解釈されるんですよね。
それにグレイブアクセントまたはバッククオートですね、わかりました。ありがとうございます。
でもたしかに基本原理ってなんですか。
248:名無しさん@お腹いっぱい。
11/01/26 18:45:37
「グレイブアクセント」とはあんまり言わんけどね。
まぁ、まずはシェルスクリプトの本でも読みなよ。
249:名無しさん@お腹いっぱい。
11/01/26 18:54:06
だよな。言うなら「アクサングラベ」だよな。
250:名無しさん@お腹いっぱい。
11/01/26 19:00:05
「アクサングラベ」ともあんまり言わないよ。この辺界隈では。
251:名無しさん@お腹いっぱい。
11/01/26 19:08:56
だよな。言うなら「オープニングクォート」だよな。
252:名無しさん@お腹いっぱい。
11/01/26 19:24:24
「オープニングクォート」とはもっと言わないよ。この辺界隈では。
253:名無しさん@お腹いっぱい。
11/01/26 19:25:19
つまんないからもういいよ。
254:名無しさん@お腹いっぱい。
11/01/26 19:31:41
だよな。言うなら「インバースクォート」だよな。
255:名無しさん@お腹いっぱい。
11/01/26 19:39:09
それ全部unicodeでは違う文字になってるという落ちか
256:名無しさん@お腹いっぱい。
11/01/26 19:50:03
アクサングラーベとグレイブアクセントは同じじゃないの。
257:名無しさん@お腹いっぱい。
11/01/26 19:54:24
でも本当はbacktickって呼ぶんだろ?
258:名無しさん@お腹いっぱい。
11/01/26 20:07:39
A-dev, B-dev....とdevのつくディレクトリがあり
さらに各ディレクトリにpublicディレクトリがあるのですが
全てのpublicディレクトリ内にtest.xml(空ファイルで良い)を置きたいのですが
ls | grep dev
259:名無しさん@お腹いっぱい。
11/01/26 20:08:39
それが、彼の最期の言葉だった。
260:名無しさん@お腹いっぱい。
11/01/26 20:09:50
touch *dev/public/test.xml
261:名無しさん@お腹いっぱい。
11/01/26 20:13:01
すいません..途中で送信してしまいましたorz
ls | grep dev | xargs
と対象のディレクトリ(~dev)のリストは入手できたのですが
ここからpublicディレクトリ内にtouchでファイルを作成するところがうまくいきません
対象ディレクトリを引数にして
touch 引数/public/text.xml
のようにできればよいかと考えているのですが
ご教授願います
262:名無しさん@お腹いっぱい。
11/01/26 20:14:23
>>260
やってみたか?
263:名無しさん@お腹いっぱい。
11/01/26 20:14:32
>>261
それ、シェル初心者からよく聞く質問ですね。
シェルもUNIXも基本が大事。
基本原理を理解していればわかる問題です。
264:名無しさん@お腹いっぱい。
11/01/26 20:16:24
>>262
あーごめん、ぼけてた。
for i in *dev/public; do touch $i/test.xml; done
とかか。
いろいろ穴はあるが。
265:名無しさん@お腹いっぱい。
11/01/26 20:18:55
>>263
つまんないネタ繰り返すのもうやめない?
266:名無しさん@お腹いっぱい。
11/01/26 20:43:01
>>260 で一発でできるのを無視してまで
>>264 でforループにしたい理由は?
267:名無しさん@お腹いっぱい。
11/01/26 20:52:45
>>266
一発でできなくね?
シェルによるのかな?
268:名無しさん@お腹いっぱい。
11/01/26 20:55:50
皆様アドバイスありがとうございます
残念ながら私の環境(CentOS bash)だと
>>260はそんなディレクトリないよと怒られます
269:名無しさん@お腹いっぱい。
11/01/26 21:03:55
touch {A,B,C,D}-dev/public/test.xml
270:名無しさん@お腹いっぱい。
11/01/26 21:15:06
初心者な質問ですみません。
ローカルの/path/以下のファイルを全てをリモートの「/hogehoge/」以下にファイル名変えずアップロードしたいと思いますがうまくいかないので、教えてください。
#!/bin/sh
FDIR=/path
ftp -ivn ftp.exsample.com << _EOF
user username password
bin
passive
cd /hogehoge
for fname in *
do
put $FDIR/$fname $fname
done
bye
_EOF
exit 0
シェルで上記のようにFTPを用いてアップロードする構文を作ったのですが、うまくアップされません。
put $FDIR/$fname $fname
の行を、↓のようにファイル名を直接指定するとうまくいきます。
put $FDIR/test.txt test.txt
271:名無しさん@お腹いっぱい。
11/01/26 21:16:29
>>270
初歩的な質問と回答になりますので、1インシデントで承ります。
お取引の代理店を通じてご用命下さい。
272:名無しさん@お腹いっぱい。
11/01/26 21:18:49
>>270
ヒアドキュメントの中で * は展開されない
273:名無しさん@お腹いっぱい。
11/01/26 21:21:44
>>270
for fname in `echo *`
274:名無しさん@お腹いっぱい。
11/01/26 21:44:26
>>270
そのftpクライアントって、シェルみたいなfor文を本当に認識するの?
275:名無しさん@お腹いっぱい。
11/01/26 21:48:10
インシデント見積り有効期限は24時間以内とさせていただいております。
早めにご用命いただきますよう、お願い致します。
276:名無しさん@お腹いっぱい。
11/01/26 21:51:55
>>270
(略)
`for fname in *
do
echo put $FDIR/$fname $fname
done`
277:名無しさん@お腹いっぱい。
11/01/26 21:57:59
最終行に改行の含まれていないファイルに改行を付け足して出力するスマートな方法はなんだと思いますか?
最初はこう書いてみたんですけど、
cat ~/file; echo ""
さっき習ったこっちのほうがいいかなと思って下にしてみました。
echo `cat ~/file`
こういう書き方も出来るみたいですが。
echo $(cat ~/file)
好きにしろって言われるのはわかりますが、どういうのがかっこいいですか。俺ならこう格好良く書くってのを教えてください。
278:名無しさん@お腹いっぱい。
11/01/26 21:59:25
>>277
echo >> file
279:名無しさん@お腹いっぱい。
11/01/26 22:03:24
>>277
echo `cat file` だと、fileの中の改行や複数のスペースとかがカットされて
表示内容が変わってしまうだろw
cat file; echo
だけでよろし。echoの引数に "" は要らない。
280:名無しさん@お腹いっぱい。
11/01/26 22:14:20
>>278-279
ありがとうございます。echoの引数が要らないってのは勉強と共に改善点になりました。表示内容が変わってしまうのは気づきませんでした。サンクス。
ファイルに変更は加えたくなかったためcat file; echoでいきます。
281:名無しさん@お腹いっぱい。
11/01/26 22:18:31
似たような処理で、末尾にl空行がある場合はそのまま、
末尾に空行がない場合だけ空行を付け加えるって、
シェルスクリプトで書こうとすると結構面倒だよね
(たとえば mbox 形式のファイルを処理するときなど)
282:名無しさん@お腹いっぱい。
11/01/26 22:35:18
そうか?
tacして1行目取ってきて判定→最後に追加だけじゃね?
全行読み込む必要もないし。
283:名無しさん@お腹いっぱい。
11/01/26 22:54:03
tacってLinux以外では入ってないじゃん。
tail -n 1 で判定でしょ。
284:名無しさん@お腹いっぱい。
11/01/26 22:56:39
末尾が空行ではなくて、その行の最後に改行がない場合は?
そういう場合に空行を1行入れるには、改行を2つ追加してやらないといけないが
tacで判定するだけで可能かな?
285:名無しさん@お腹いっぱい。
11/01/26 22:57:23
すまん、かぶった。284は >>282 ね
286:名無しさん@お腹いっぱい。
11/01/26 23:02:54
最終行に改行がないファイルをtacすると、
最終行とその1つ前の行が結合されて1行目に来てしまう。
それでも空行追加が必要なことは判定できるが、
もともと改行がなかったかどうかは判定できない。
いずれにしても、最終改行がなければ改行追加、の前処理をしてから、
tail -n 1 で判定すれば問題ない。
287:名無しさん@お腹いっぱい。
11/01/26 23:04:17
if (ファイルサイズが0バイト) {
ファイルにLFを1つ追加;
return;
}
if (ファイルの最後がLFでない) {
ファイルにLFを2つ追加;
return;
}
if (ファイルの最後からひとつ前がLFでない ) {
ファイルにLFを1つ追加;
}
return;
/* 文字コードはlatin1を仮定(キリッ */
288:281
11/01/26 23:17:25
>>286,287
ありがとう。やはり条件判定は複数必要だよね。
なんとなく自信なかったんだけど、これでスッキリした。
> if (ファイルサイズが0バイト) {
なかなかここまで気が回らない。さすがです
289:名無しさん@お腹いっぱい。
11/01/26 23:21:57
FILE=file
case `tail -c 2 "$FILE" | wc -l` in
0) echo;;
1) cat "$FILE"; echo;;
*) cat "$FILE";;
esac
ただし、wc -l で頭に余分なスペースが付かない GNU wcを使用のこと。
290:名無しさん@お腹いっぱい。
11/01/26 23:42:03
>>289
それちょっとおかしいよ。GNU以外のwcでも使えるように修正してみた。
↓
FILE=file
test ! -s "$FILE" && { echo; exit;}
n=`tail -c 2 "$FILE" | wc -l`
n=`echo $n`
case $n in
0) cat "$FILE"; echo; echo;;
1) cat "$FILE"; echo;;
*) cat "$FILE";;
esac
291:名無しさん@お腹いっぱい。
11/01/26 23:49:18
>>287
ファイルサイズが1バイトでLFのみの場合誤動作する。
>>290
最終行が1文字で改行なしの場合誤動作する。
292:名無しさん@お腹いっぱい。
11/01/26 23:54:29
そこまで要求シビアなのかな。
293:名無しさん@お腹いっぱい。
11/01/27 00:09:15
まぁ、当座の課題を解決できればいい質問に
汎用性を求めるのはこのスレの常。
294:名無しさん@お腹いっぱい。
11/01/27 00:55:59
分岐とか醜いことせず末尾のブランク行全部消してからひとつ付け足した方がスマートに思える。
cat "$FILE" | sed -e :a -e '/^\n*$/{$d;N;ba' -e '}'; echo
295:名無しさん@お腹いっぱい。
11/01/27 01:14:19
それもありかもだけど、そうすると元のファイルを改変することになる
296:名無しさん@お腹いっぱい。
11/01/27 01:31:29
操作前のデータの末尾にブランク行があったか無かったか判別できなくなってる時点で、元データの保存に意味があるとは思えないが…
297:名無しさん@お腹いっぱい。
11/01/27 01:32:35
まぁそれだと
cat -s
でいーやという話になるかもしれんが。
298:名無しさん@お腹いっぱい。
11/01/27 13:18:23
sed '' でどうかな
$ cat /dev/null | sed ''
$ echo | sed ''
$ echo -n a | sed ''
a
$ { echo a; echo b; } | sed ''
a
b
$ { echo a; echo -n b; } | sed ''
a
b
$
299:名無しさん@お腹いっぱい。
11/01/27 13:23:55
>>298
全然駄目じゃん。空行追加するというお題だぞ
300:名無しさん@お腹いっぱい。
11/01/27 14:20:28
$mojiretsuに「hogehogefugafuga」が入ってる時
MOJI=`$mojiretsu | sed 's/fugafuga//'`
echo $MOJI
で「hogehoge」が取り出せます。
ところが、訳有りで「`」が使えない場合、どのようにしたら上記と同じ動作が可能でしょうか?
301:名無しさん@お腹いっぱい。
11/01/27 14:26:47
>>300
echo ${mojiretsu%fugafuga}
302:300
11/01/27 14:36:32
>>301
回答ありがとうございます。
書き忘れましたが、MOJIに代入してください。
※代入がうまくいかず困ってます
303:名無しさん@お腹いっぱい。
11/01/27 14:40:19
>>300
>訳有りで「`」が使えない場合
これを具体的に言ったほうがいいよ
304:名無しさん@お腹いっぱい。
11/01/27 14:41:14
>>302
MOJI=${mojiretsu%fugafuga}
305:名無しさん@お腹いっぱい。
11/01/27 14:42:04
そんなくだらない「訳有り」な事情を潰す方が健全だと思う
306:名無しさん@お腹いっぱい。
11/01/27 14:50:47
>>300
どんな訳があるの?
307:名無しさん@お腹いっぱい。
11/01/27 14:52:11
>>304
できました、ありがとう。
他の煽りの方は放置して失礼します♪
308:300
11/01/27 15:00:15
>>304
ありがとうございました!
>>306
理由を書くと長くなりますが
大きな「`」の中ですので
309:名無しさん@お腹いっぱい。
11/01/27 16:04:59
つまり $() で済む話か。やっぱりくだらない理由だったな。
310:名無しさん@お腹いっぱい。
11/01/27 16:10:58
>>309
解決後の後出し見苦しい
311:名無しさん@お腹いっぱい。
11/01/27 16:12:25
`` の中なら>>304も無理じゃね?
312:名無しさん@お腹いっぱい。
11/01/27 16:18:29
>>309
だな。やっぱりだ
313:名無しさん@お腹いっぱい。
11/01/27 16:30:50
わざわざ外部コマンドのsed呼び出すより >>304 の方がエレガント
314:名無しさん@お腹いっぱい。
11/01/27 19:53:55
``の中でも\`\`で使えるよな?
315:名無しさん@お腹いっぱい。
11/01/27 21:15:27
それをさらに入れ子にすると
¥¥` ¥¥`なの?
316:名無しさん@お腹いっぱい。
11/01/27 21:24:47
>>315
いいえ、3重目のネストは、¥¥¥`¥¥¥` になります。
317:315
11/01/27 21:29:44
>>316
おぉ、言われてみればその通りだ。
ありがとう。4重目は
¥¥¥¥¥¥¥` ¥¥¥¥¥¥¥`
だね。
318:名無しさん@お腹いっぱい。
11/01/27 21:36:12
問題: ` ` のn重目のネストに必要な¥の数をnを使って表せ。
319:名無しさん@お腹いっぱい。
11/01/28 12:08:19
>>289,290
case文って何げに使えるよね
320:名無しさん@お腹いっぱい。
11/01/28 16:13:39
すいません、二つのファイルの比較をして、共通する要素を抽出するのは
どういうコマンドを使ってスクリプトを作ればよいのでしょうか?
ファイル形式はタブ区切りで
一つ目のファイル(リファレンス)には
chr1 20513060 T C
という4つの要素が縦にずらずらっと並んでいます。
二つの目ファイルは
もっと要素も多いです。
やりたい処理は
一つ目と二つ目の要素が完全に一致するものを抽出しファイルに出力する。
出力ファイルの形式は
一つ目のファイルの4つの要素をならべ
その横に二つ目のファイルの3番目以降の要素を並べる、です。
盛りだくさんで書いてしまいましたが、
まずはファイルの要素を比較し、一致した要素を取り出すコマンドが
あれば教えてください。
321:名無しさん@お腹いっぱい。
11/01/28 16:16:30
>>320
とりあえず一致した要素を取り出すコマンドは
comm
322:名無しさん@お腹いっぱい。
11/01/28 16:18:49
>>320
盛りだくさんな質問と回答になりますので、2インシデントで承ります。
お取引の代理店を通じてご用命下さい。
323:名無しさん@お腹いっぱい。
11/01/28 16:19:13
読み返すと意味不明ですね。
一つ目のファイルの要素の例
chr1 20513060 T C
二つ目のファイルの要素の例
chr1 3522454 G R 109 109 60
です。
それぞれのファイルの1番目と2番目の要素を比較する。←知りたいコマンド1
この場合、
chr1 20513060とchr1 3522454は一致しない、となります。
仮に一致した場合
一つ目のファイルの要素の例
chr1 3522454 G A
二つ目のファイルの要素の例
chr1 3522454 G R 109 109 60
出力したいファイルの要素の例←知りたいコマンド2
chr1 3522454 G A G R 109 109 60
です。検索するキーワードでも教えてもらうだけでも一歩前進です。
よろしくお願いします。
324:名無しさん@お腹いっぱい。
11/01/28 16:24:38
>>323
そういう処理は awk使った方が楽だが、
あえてシェルでやるなら、
2つのファイルをreadコマンドで1行ずつ読みながら
最初の2つのフィールドのみ比較して
一致していたら要素を並べて echoする。
・・という処理をwhileでループする。
外部コマンドは使わない。
325:名無しさん@お腹いっぱい。
11/01/28 16:25:26
perlか何かで書いた方が楽じゃね。
326:名無しさん@お腹いっぱい。
11/01/28 16:34:53
>>323
ほれ、これでどう?
↓
#!/bin/sh
while read a1 a2 ax
do
while read b1 b2 bx
do
if [ "$a1" = "$b1" ] && [ "$a2" = "$b2" ]; then
echo "$a1" "$a2" "$ax" "$bx"
fi
done < file2
done < file1
327:名無しさん@お腹いっぱい。
11/01/28 16:46:56
ありがとうございます。ありがとうございます。
>>326は私でも理解できます。
似たようなサンプルがないかawkの解説ページを調べてみます。
perlはやったことがないので今回はやめておきます。
328:名無しさん@お腹いっぱい。
11/01/28 17:19:28
LLは何か身に付けといた方がいいよ。
シェルスクリプトで苦労してたのがあっさり書けることもある。
329:名無しさん@お腹いっぱい。
11/01/28 23:04:44
最近、なんでもpythonだわ。
330:名無しさん@お腹いっぱい。
11/01/28 23:07:04
pythonってワンライナーどうやんの?
331:名無しさん@お腹いっぱい。
11/01/29 01:34:34
>>330
while( life != end ){ do( enjoy ); }
332:名無しさん@お腹いっぱい。
11/01/29 02:00:57
>>330
ワンライナーは暗黒面。
333:名無しさん@お腹いっぱい。
11/01/29 08:10:01
どなたか、鼻毛チェックスクリプトをワンライナーで書いて!
334:名無しさん@お腹いっぱい。
11/01/29 16:07:56
while : ; do echo "鼻毛をチェキしてください!" ; sleep 86400 ; done
335:名無しさん@お腹いっぱい。
11/01/30 02:12:16
標準出力の結果をスクリプトで使うにはどうすればいいのでしょうか?
例えば、
telnet (サーバ) 110
stat
とやって、その結果標準出力で出力されるメール数を値として保持しておいて、
その値を元に必要な数だけメールを取得するようにしたいのです。
336:名無しさん@お腹いっぱい。
11/01/30 06:46:06
それ、標準出力やない
337:名無しさん@お腹いっぱい。
11/01/30 10:00:18
標準的なものではないんだが、telnetじゃなくてnc(netcat)とかがあれば、それで。
338:名無しさん@お腹いっぱい。
11/01/30 10:14:09
perlか何かで書いた方が楽じゃね。
339:名無しさん@お腹いっぱい。
11/01/30 10:17:13
bashなら、/dev/tcp(笑)使ってできるよ。
340:名無しさん@お腹いっぱい。
11/01/30 10:17:19
はいはいexpect expect
ところでexpect以外のtclって生き残っているのだろうか
341:名無しさん@お腹いっぱい。
11/01/30 10:25:17
pyとかrbとかのexpectもあるはず。
zshならソケット作って自分でやりとりもできると思うけどね。
342:名無しさん@お腹いっぱい。
11/01/30 10:28:56
tcl以外のexpectじゃなくて、
expect以外のtcl
っておっしゃってますが・・
343:名無しさん@お腹いっぱい。
11/01/30 10:43:18
zsh の zpty というのもある
344:名無しさん@お腹いっぱい。
11/01/30 10:52:55
macports の port コマンドは tcl で書かれてるな。
345:名無しさん@お腹いっぱい。
11/01/30 10:53:16
>>342
>>340の質問に答えたわけじゃなくて、expectのお題を広げただけなので。
346:名無しさん@お腹いっぱい。
11/01/30 11:02:42
そういえばtcl版のtimidity最近動かしてない
347:名無しさん@お腹いっぱい。
11/01/30 11:22:56
perl で NIFTY に telnet 接続してメールや未読記事を取ってくるという
一世を風靡 nifty4u があったね。>>335 が perl でもいいというのなら
参考になるかも。
でも、ふつうに POP クライアントでメール取ってきて、それを
加工すればいいと思うのだけれど、そうじゃなくてわざわざ
POP プロトコルのやりとりをスクリプトでやりたいというのがよくわらかない。
348:名無しさん@お腹いっぱい。
11/01/30 11:26:56
エスパーすると迷惑メールをPOPで取り込まずにDELEで削除したいとかだろ
STATだけじゃなくてTOPコマンドも併用すると便利
349:335
11/01/31 01:44:48
みなさんありがとうございます。
与えてくださったヒントを参考にがんばってみます。
迷惑メールとかでは無くて、メーラーを使わずに自分でスクリプトを組んでメールの送受信をできればいいなあ・・・と思ったのです。
350:名無しさん@お腹いっぱい。
11/01/31 02:11:48
>>330
$ python -c 's="hoge";print s'
hoge
最近、いままで perl で書いていたサーバ監視スクリプトなどを
どんどん python にしてる。
perl だと人によって書き方が大きく異なるからメンテナンス性が
悪いな~と言う事で。
あと、ipython が神。
シェルスクリプトもメンテナンス性でいえば Perl と
似たような感じだけど、十数行のものはシェルスクリプトでも
メンテナンス性をそれほど気にしなくていいし、linuxrc などで
使うことを考えると簡単には捨てることはできない..
351:名無しさん@お腹いっぱい。
11/02/01 15:02:28
>>350
ループとかifとかどう書くのか知りたいのよ。
352:名無しさん@お腹いっぱい。
11/02/01 17:02:09
いい加減スレ違いだが……
Pythonはコマンドライン引数だの標準入力だのにアクセスするだけで
import sys
が必要になる時点でワンライナーにはぜんぜん向いてない
向き不向きを無視して可能不可能でいえば、書ける
ただしcompound statement(if, while, for, try, with, defなど)は
セミコロンで区切って一行に書けないので、そうしたものは使えない
もっともifに関しては2.5以降ならif式が使える(それ以前ではand/orで代用)し
ループはmap(), reduce(), 内包表記, ジェネレータ式で代用できる
例外処理はどうにもならないので無理
たとえば
seq 10
をPythonで書くと↓のような感じだ
python -c 'print "\n".join(str(n) for n in range(1, 11))'
353:名無しさん@お腹いっぱい。
11/02/01 17:37:15
相当なエキスパートじゃないと無理そうだな。使いこなせる人は
すげーわ。
354:名無しさん@お腹いっぱい。
11/02/01 17:41:40
べつにそんなことはないよ
向いてないのにワンライナーで書こうとすると無理がある、というだけの話
355:名無しさん@お腹いっぱい。
11/02/01 17:45:31
URLリンク(www.nishiohirokazu.org)
こんなんか。
356:名無しさん@お腹いっぱい。
11/02/01 17:47:40
ワンライナーの書きやすさとしてはこんな感じでおk?
Perl>>Ruby>>>Python
357:名無しさん@お腹いっぱい。
11/02/01 17:52:20
>>355
全般に笑えるが、特に例外処理が涙ぐましい&無理やりすぎてワロタw
358:名無しさん@お腹いっぱい。
11/02/01 17:55:57
ワンライナーで書ける程度の複雑さならawk,sed,sortあたりを
組み合わせた方が楽なことも多いな。
359:名無しさん@お腹いっぱい。
11/02/01 18:34:30
interfacesなどの設定ファイルの内容を書き換えるスクリプトを作りたいんですが
例えば
address 192.168.10.100
netmask 255.255.255.0
gateway 192.168.10.1
となっていたとして、各項目を置換するにはどういったコマンドを使えば
いいですか?
360:名無しさん@お腹いっぱい。
11/02/01 18:44:05
こりゃまたずいぶんゆるふわな要求だな。
361:名無しさん@お腹いっぱい。
11/02/01 18:52:37
>>359
それ、シェル初心者からよく聞く質問ですね。
シェルもUNIXも基本が大事。
基本原理を理解していればわかる問題です。
362:名無しさん@お腹いっぱい。
11/02/01 19:43:52
>>359
/etc 以下のシェルスクリプトを探してみると
たいていそういう処理をしてるスクリプトが見つかる
363:名無しさん@お腹いっぱい。
11/02/01 20:09:31
>>361
> それ、シェル初心者からよく聞く質問ですね。
一般的にシェルを作る粋狂なやつはあまりいないから
ほとんどの人がシェル初心者じゃないか?
364:名無しさん@お腹いっぱい。
11/02/01 20:11:58
おれ、シェル始めて2週間の初心者だけど、
ハローワールド程度のシェルなら10種類以上作ったよ。
365:名無しさん@お腹いっぱい。
11/02/01 20:15:43
まぁな
#include <stdio.h>
main ()
{
printf("hello world\n");
}
とか, 書いておいて getty から起動できるようにしておけばシェルだよな
366:名無しさん@お腹いっぱい。
11/02/01 20:16:36
それはシェルとは言えないのでは
367:名無しさん@お腹いっぱい。
11/02/01 20:16:41
> とか, 書いておいて
コンパイルされたものを <<<< この部分が抜けてた
> getty から起動できるようにしておけばシェルだよな
368:名無しさん@お腹いっぱい。
11/02/01 20:18:25
>>366 /sbin/nologin もシェルだと思ってるから
369:名無しさん@お腹いっぱい。
11/02/01 20:21:17
それするなら eliza 起動しときましょ
370:名無しさん@お腹いっぱい。
11/02/01 20:58:30
ショートコーディング的ワンライナーシェル
↓
s[64];main(){while(printf("> "),gets(s))system(s);}
371:名無しさん@お腹いっぱい。
11/02/01 21:41:16
system()で/bin/sh利用するぐらいなら↓でよくね
main(c,v){execvp("sh",v);}
372:名無しさん@お腹いっぱい。
11/02/01 22:05:09
/bin/sh利用しないで最低限のシェルにするとこうか? もっと短くならないかな
s[64];main(){while(printf("> "),gets(s))fork()?wait(0):(execlp(s,s,0),exit(1));}
373:名無しさん@お腹いっぱい。
11/02/01 22:10:01
4文字短くした
s[64];main(){while(printf("> "),gets(s))fork()?wait(0):exit(execlp(s,s,0));}
374:359
11/02/02 21:56:44
>362
具体的に、どんなスクリプトがありますか?
375:359
11/02/03 11:46:48
分からないままに、書いてみたんですが、添削してください。
#! /bin/sh
# if_rdwr.sh -r address /etc/network/interfaces
# if_rdwr.sh -w address 192.168.12.100 /etc/network/interfaces
if [ $1 != "-r" -a $1 != "-w" ]; then
echo "Second parameter error!"; exit 1
fi
# 引数チェック
if [ $1 = "-r" -a $# -ne 3 ]; then
echo "Wrong parameter"; exit 1
fi
if [ $1 = "-w" -a $# -ne 4 ]; then
echo "Wrong parameter"; exit 1
fi
case $1 in
# Read処理
-r) DATA=(`grep $2 $3`)
VALE=${DATA[1]}
echo $VALE ;;
# Write処理
-w) DATA=(`grep $2 $4`)
VALE=${DATA[1]}
echo -e "%s/$VALE/$3/g\nw" | ed - $4 ;;
esac
376:名無しさん@お腹いっぱい。
11/02/03 11:50:25
Debian系の/etc/network/interfacesの話なら
書き換えスクリプト自作するより
mappingでも使った方がいいんじゃないの。
377:名無しさん@お腹いっぱい。
11/02/03 11:52:21
それか
URLリンク(www.debian.org)
とか。
378:359
11/02/03 16:54:46
組込みの、uC-Linuxなんです
379:名無しさん@お腹いっぱい。
11/02/03 17:55:44
本題と違うけど、引数とパラメータのチェックはcase文のところでまとめて
case $1/$# in
-r/3) ごにょごにょ ;;
-w/4) ごにょごにょ ;;
*) usage ;;
esac
などとやる手がある
380:名無しさん@お腹いっぱい。
11/02/03 18:07:03
>>359
仕事は自分でやれ
381:359
11/02/04 07:25:28
遊びなんです
382:名無しさん@お腹いっぱい。
11/02/04 07:53:58
遊びは自分でやれ
383:名無しさん@お腹いっぱい。
11/02/05 00:52:48
まぁいっぱい飲もうや。
384:名無しさん@お腹いっぱい。
11/02/11 13:27:49
飲めないんです
385:名無しさん@お腹いっぱい。
11/02/11 16:36:15
シェルは自分で書け
386:名無しさん@お腹いっぱい。
11/02/19 01:18:14
環境はMacなんですが,HandBrakeCLIを使って,あるディレクトリより下(複数階層)の全部のm2tsファイルを違うディレクトリに変換したいです.
その時に,出力先にあるファイルは変換しないようにしたいのです.変換先のファイルは拡張子mp4です.
URLリンク(cl.ly)
どこだめ?
387:名無しさん@お腹いっぱい。
11/02/19 06:30:32
イタチguy
388:名無しさん@お腹いっぱい。
11/02/19 11:11:12
板違いでもないと思うが途中ごとに意図した結果になっているか
echoなりcatなりしてみればいいと思う。
sh-bangがzshになってるけどzshの機能はぜんぜん使ってないこととか、
バッチなのに、対話環境用の.zshrcをわざわざ読み込んでいるとことか、
気になった。
389:名無しさん@お腹いっぱい。
11/02/19 11:44:09
>>388
にゃるほどー・・・zshの機能は全然わかんないですorz
**/*くらいしかw
390:名無しさん@お腹いっぱい。
11/02/19 12:05:25
ああ、**使ってたか(滝汗
391:名無しさん@お腹いっぱい。
11/02/20 11:46:06.85
>>386
> その時に,出力先にあるファイルは変換しないようにしたいのです.
if [ ! -f mp4のパス名 ]; then
処理
fi
392:名無しさん@お腹いっぱい。
11/02/22 18:26:12.82
>>391
さすが!!それを聞きたかったのです!!
URLリンク(cl.ly)
かなり短く出来ますたありがとう!!
393:名無しさん@お腹いっぱい。
11/02/22 22:23:35.29
あとはfind使うようにしてzshへの依存を無くせば良いね
394:名無しさん@お腹いっぱい。
11/02/26 09:20:18.93
cat * | grep "xxxx"
でファイル内のxxxx文字列を探したいんですが、ディレクトリやバイナリーを
除外するってできますか
395:名無しさん@お腹いっぱい。
11/02/26 09:29:00.61
>>394
grep 'xxxx' *
とすれば、ディレクトリやバイナリでも問題ないようにgrepが対応してくれるので、
そもそもディレクトリやバイナリを除外する必要がない。
あと、cat * | grep "xxxx" では、見つかった文字列のファイル名がわからないし、
catが無駄。
396:名無しさん@お腹いっぱい。
11/02/26 09:31:18.69
>>394
ディレクトリは自動的に除外されるでしょう
バイナリーファイルの除外はGNU grepなら--binary-files=TYPEオプションを使えば可能かと
grep --binary-files=without-match "xxxx" *
397:394
11/02/26 10:04:56.76
ありがとう
398:名無しさん@お腹いっぱい。
11/02/27 19:39:14.53
find でがんばる、とか。
399:名無しさん@お腹いっぱい。
11/03/07 18:51:48.92
bashで書いたスクリプトを、PHPの中からsystemで呼出してたとき、
文字列変数の内容を戻り値として渡すなんて事はできないですよね
400:名無しさん@お腹いっぱい。
11/03/07 19:04:59.19
UNIXではプログラムの返り値はintです。(ほとんどの場合0-127)
PHPで文字列を受け取りたければ、popenを使いましょう。
401:399
11/03/07 21:50:03.91
>400
ありがとう、ございます。
スクリプトをsample.shとして
FILE *fd = popen("sample.sh", "r");
while(fgets(str,1024,fp)!=NULL){
printf("%s\n",str);}
みたいにできるんですね。
402:名無しさん@お腹いっぱい。
11/03/08 14:30:09.29
家族から鯖の電気代でクレームが来たので作ってみた。
クライアントの生死判定をし、鯖をシャットダウン 起動はwolを使用
想定する鯖はsambaを搭載したファイル鯖など
使用方法はcronに登録し、root権限で一定間隔で走らせる
文法はタコなんでかんべんして
#!/bin/sh
NODE=51
LOCKFILE=/var/lock/shutdown
PING_COUNT=2
if test -f ${LOCKFILE}
then
PING_COUNT=`cat ${LOCKFILE}`
fi
while [ ${NODE} -le 200 ]
do
ping -c 1 192.168.1.${NODE} > /dev/null 2>&1
if test $? -eq 0
then
if test -f ${LOCKFILE}
then
rm ${LOCKFILE}
fi
exit 0
else
NODE=`expr ${NODE} + 1`
fi
done
403:402
11/03/08 14:30:42.77
続き
PING_COUNT=`expr ${PING_COUNT} - 1`
if test ${PING_COUNT} -gt 0
then
if test ! -f ${LOCKFILE}
then
touch ${LOCKFILE}
fi
echo ${PING_COUNT} > ${LOCKFILE}
exit 0
fi
if test -f ${LOCKFILE}
then
rm ${LOCKFILE}
fi
shutdown -h now
exit 0
404:名無しさん@お腹いっぱい。
11/03/08 14:40:08.21
一番電気食うのは起動時らしいよ。
405:名無しさん@お腹いっぱい。
11/03/08 14:50:16.64
クレーム来るほどの電気代ってペン4でも使ってるのか?
鼻毛あたりに交換すれば24時間通電でも省エネだよ。
406:名無しさん@お腹いっぱい。
11/03/08 15:27:33.67
>>405
犯人はST31000340NS*2だよ。(ワットチェッカー読み)
ママンはD945GCFL2 2GB
あと電源、アクセスランプがうざいと
407:名無しさん@お腹いっぱい。
11/03/08 15:40:10.31
>>402
俺もエコワット調べでDellのE2180あたりの石が入った
サーバで月に2500円くらい掛かっていたが、5万ほどのI5のノートを
サーバにしたら、月に350円程度になったよ。
当然24時間での話だけどね、W7でファイルサーバを使い
夜半から深夜の遊びようのクライアントにも使い
抱かせたvmwareで稼働したLinuxでファイルサーバやWebサーバに他
昼間は会社からリモートデスクトップとsshで手元に表示させ
為替や株の表示や売買も
他には家屋の周囲の防犯監視カメラ録画ともやってる
電気代は週計測の平均を4倍した感じで誤差はあっても500円程度だろ
そと付けの24インチディスプ2台とか、必要時に随時稼働させる
USBの外付けHDDは勘定だけどね。
下手な小細工より、省エネ機器に交換した方が良いよ
408:名無しさん@お腹いっぱい。
11/03/08 15:47:01.29
わかってるなら2.5inchHDDとに換えればいいんじゃないかな
409:名無しさん@お腹いっぱい。
11/03/08 16:08:55.05
こっちもあるよ。
自宅鯖PCにいくら電気代が掛かってるか晒すスレ
スレリンク(mysv板)
410:402
11/03/08 16:09:51.75
電気代
28日間499kwh@東電
クライアントは
デスクトップ1
E8500+P35 4GB
HD5770
winXP
デスクトップ2(妹所有)
プ530+915P 2GB
9600GT
winXP
ノートPC1
IBM/lenovo
T42p mem 2GB
ノートPC2(使用頻度低)
toshiba E7 418cme
の4台
妹にPC更新しろというが
プーなので3点交換になるので金掛かるので嫌がっている
これが電気食いだろう
411:名無しさん@お腹いっぱい。
11/03/08 16:19:57.94
>>410
つかクライアントの電気代も考えてるの?
なんか構成と目的が見えないわ
サーバって何を目的にしてるんだろう?
ファイル目的なら、ネットワーク対応のドライブでも下げれ
ば良さそうだし。
412:名無しさん@お腹いっぱい。
11/03/08 16:33:13.56
>>411
主に稼働しているデーモンは
apache 2.2
proftpd
squid 2.7
dnsmasq
samba
ntp 4.2.4p4
sshd
snmpd
その他管理ツール
おもにISO倉庫になっている
他にも玄箱があるがsquid走らせるにはきつ過ぎる
プロバイタが*.ap.yournet.ne.jpだから403サイトはIP偽装は必須だし
413:名無しさん@お腹いっぱい。
11/03/08 16:57:29.39
>>412
クライアントの居ないときに消滅させられるなら
クライアントにvmwareでも仕込めば良さそうだがなぁ?
まぁ、いずれにシテもATOM/I3でSSDでいいんじゃねーの?
sambaの用途次第で2.5インチHDD
414:名無しさん@お腹いっぱい。
11/03/08 17:45:52.70
ぜんぜんシェルスクリプトの話じゃないな。
415:名無しさん@お腹いっぱい。
11/03/09 01:00:32.19
>>414
シェルスクリプトの話がじゃまされたくないほど
大量にあるなら、ジャンジャンどうぞ
416:名無しさん@お腹いっぱい。
11/03/09 01:25:58.69
話題がなければ関係ない話をしていいってもんでもないよ。
417:名無しさん@お腹いっぱい。
11/03/09 14:35:33.41
>>416
俺も喪前も含めて、そういう関係ない部分が保守となり
活性化の助けになるんだよ。