シェルスクリプト総合 その17

このエントリーをはてなブックマークに追加
1名無しさん@お腹いっぱい。
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。

□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
 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でそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

前スレ
シェルスクリプト総合 その16
http://hibari.2ch.net/test/read.cgi/unix/1266642605/
2名無しさん@お腹いっぱい。:2010/11/20(土) 08:34:51
□関連スレ:
sed
http://hibari.2ch.net/test/read.cgi/unix/1085730992/
正規表現
http://hibari.2ch.net/test/read.cgi/unix/1039165754/
おまえら! shell は何を使っているんですか?
http://hibari.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://hibari.2ch.net/test/read.cgi/unix/1102921590/

□初心者向けリンク
「誰にでも」シリーズ
ttp://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/publications/dareUni/
/bin/shプログラミング入門
ttp://freebooks.info.nara-k.ac.jp/archive/ShellProgramming/
シェルを使おう - 導入からプログラミングまで -
ttp://www.netfort.gr.jp/~tomokuni/lms/shell/text/

□入門者向け書籍:
プロフェショナルシェルプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4756116329/
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
http://www.amazon.co.jp/exec/obidos/ASIN/4797321946/
UNIXシェルプログラミング徹底解説
http://www.amazon.co.jp/exec/obidos/ASIN/4822280489/
入門Kornシェル
http://www.amazon.co.jp/exec/obidos/ASIN/4873110149/
入門bash
http://www.amazon.co.jp/exec/obidos/ASIN/4900900788/
3名無しさん@お腹いっぱい。:2010/11/20(土) 08:35:23
□参考リンク:
UNIXの部屋 (沢山のコマンドの簡単な紹介など)
http://x68000.q-e-d.net/~68user/unix/
POSIX: Shell & Utilities (標準規格)
http://www.opengroup.org/onlinepubs/009695399/utilities/contents.html

□最近のシェルスクリプト本(1)

(2004/03) UNIXシェルスクリプトハンドブック 関根 達夫 (著)
http://amazon.co.jp/o/ASIN/4797326522/
(2004/10) UNIXシェルスクリプト逆引き大全333の極意 中橋 一朗 (著)
http://amazon.co.jp/o/ASIN/4798008842/
(2004/11) 仕事に使えるLinuxシェルスクリプト 千葉 真人 (著)
http://amazon.co.jp/o/ASIN/4822282090/
(2004/12) UNIXシェルスクリプトサンプルブック デイブ・テイラー (著)
http://amazon.co.jp/o/ASIN/4797327286/
(2005/02) シェルスクリプト基本リファレンス 山森 丈範 (著)
http://amazon.co.jp/o/ASIN/4774122610/
(2005/04) LinuxWorldスクリプト 月刊リナックス・ワールド総集編 月刊LinuxWorld特別 (著)
http://amazon.co.jp/o/ASIN/4872802349/
(2005/05) UNIXシェルスクリプトコマンドブック 山下 哲典 (著)
http://amazon.co.jp/o/ASIN/4797330635/
(2005/05) わかる&使える UNIX基礎講座 シェルスクリプト編 中井 獏 (著)
http://amazon.co.jp/o/ASIN/4774123625/
4名無しさん@お腹いっぱい。:2010/11/20(土) 08:35:37
□最近のシェルスクリプト本(2)
(2005/07) UNIX シェルスクリプト辞典 川井 義治 (著)
http://amazon.co.jp/o/ASIN/4798109231/
(2005/08) シェルスクリプト ポケットリファレンス bash編 宮原 徹 (著), 川原 龍人 (著)
http://www.amazon.co.jp/o/ASIN/4774124818/
(2005/12) 図解でわかるLinuxシェルスクリプト・正規表現 小泉 修 (著)
http://www.amazon.co.jp/o/ASIN/4534040067/
(2006/01)詳解 シェルスクリプト アーノルド ロビンス (著), ネルソン・H.F. ベーブ(著), Arnold Robbins (原著), Nelson H.F. Beebe (原著), 日向 あおい (翻訳)
http://www.amazon.co.jp/o/ASIN/4873112672/
(2007/3) Linuxシェルスクリプトユーザー便利帳―bash2/bash3対応 伊藤 幸夫 (著), 寒川 陽美(著)
http://www.amazon.co.jp/o/ASIN/4798015954/
(2007/9) ゲームで極める シェルスクリプトスーパーテクニック 山森 丈範
http://www.amazon.co.jp/o/ASIN/4774132020/
(2007/10) UNIX/Linuxシェルスクリプトマスタリングハンドブック 野川 准子
http://www.amazon.co.jp/o/ASIN/4798017957/
51:2010/11/20(土) 08:37:45
テンプレ貼り終了。
関連スレのURL変わってたんで、付け替えますた。
6名無しさん@お腹いっぱい。:2010/11/20(土) 09:32:01


最近本出てないのかねぇ。
まぁ新しい話題があるわけじゃないのでコンスタントに出るはずはないのだが。
7名無しさん@お腹いっぱい。:2010/11/20(土) 14:37:39
exec >>1
8名無しさん@お腹いっぱい。:2010/11/21(日) 03:26:17
ls -a
.otsu
9名無しさん@お腹いっぱい。:2010/11/23(火) 17:01:26
killしたいプロセスのIDが書かれたファイルaho.txtがあります。

%cat aho.txt

123
456
789
012

このプロセスを順にkillする場合、どのようなシェルスクリプトを書いたらいいでしょうか?
10名無しさん@お腹いっぱい。:2010/11/23(火) 17:09:59
>>9
for i in `cat aho.txt`; do kill $i; done

または

kill `cat aho.txt`
11名無しさん@お腹いっぱい。:2010/11/23(火) 21:23:09
>>10
素早いレスありがとうございます!
12名無しさん@お腹いっぱい。:2010/11/24(水) 00:15:20
何らかの同じ文字が連続していれば、その行を表示したいです。

AABB
ABCD
AADD
だったら AABB と AADD

grepの正規表現でそういうことはできますでしょうか?


13名無しさん@お腹いっぱい。:2010/11/24(水) 00:21:59
grep '\(.\)\1'
1412:2010/11/27(土) 23:15:19
grepでも後方参照できるのか
まだ未確認だけどありがとう
15名無しさん@お腹いっぱい。:2010/11/27(土) 23:26:43
正規表現の話題はスレチなので専用スレへ

http://hibari.2ch.net/test/read.cgi/unix/1039165754/
16名無しさん@お腹いっぱい。:2010/11/28(日) 01:48:40
grepとegrepとfgrepの違いは把握しておく方がいい。
17名無しさん@お腹いっぱい。:2010/11/29(月) 16:00:02
いまでは古典?と言えるが、「UNIXプログラミング環境」も手元に
置いてほしい本。最近の本では、より難しいことも書かれているがこの
本の内容を知らないがために繰り返される基本的質問があまりにも多い。
18名無しさん@お腹いっぱい。:2010/12/12(日) 07:55:55
>>17
20年近く前に自分が読んだ時点でも既に古さを感じたが、今読むとどう感じるんだろうか
逆に古さを感じないのかもね。当時は UNIX USER が創刊されたばかりで、太田純さんの
連載がシェルスクリプトとの出会いだったなあ
19名無しさん@お腹いっぱい。:2010/12/14(火) 14:05:48
grepをfgrepに置き換えただけで何10倍も捗ることがあるから
侮れない。「正規表現ってなに?」ってレベルでUnix弄ってるのなら、
grep→fgrepに全部置き換えてしまえばいい
20名無しさん@お腹いっぱい。:2010/12/14(火) 14:31:21
あとawkとかperlに巨大テキストを食べさせるときも、
前段でfgrepしておくと捗るよ
21名無しさん@お腹いっぱい。:2010/12/14(火) 17:54:49
20年以上昔には成り立っていたバッドノウハウだな。
今は grepもfgrepも速度はほとんど変わらない。
(むしろfgrepは速そうな名前の割りに遅いことで有名だったんだが)
パイプ前段でfgrepで前処理するのも不要。

昔の常識がいつまでも通用すると思わないことだな。
22名無しさん@お腹いっぱい。:2010/12/14(火) 18:23:59
Solaris 9 の fgrep(1)
http://docs.sun.com/app/docs/doc/816-5211/6mbcci3bd
> The fgrep (fast grep) utility ...

Solaris 10 の fgrep(1)
http://docs.sun.com/app/docs/doc/821-1461/fgrep-1
> The fgrep (fixed grep) utility ...

修正されてる(笑)
23名無しさん@お腹いっぱい。:2010/12/14(火) 19:14:16
>>21
バッドノウハウ(笑)
ちょっと手を動かしてみればすぐに実感できるお
24名無しさん@お腹いっぱい。:2010/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名無しさん@お腹いっぱい。:2010/12/14(火) 19:26:22
速度に関しては、

fgrep < grep < egrep (左ほど遅い)

が常識。

fgrepの存在意義は、^ とか $ とかをエスケープなしで普通の文字列として使えるという
仕様の違いのみ。fgrepよりも egrep使った方が速い。
26名無しさん@お腹いっぱい。:2010/12/14(火) 19:32:18
>>23
最後に何か言いたいことはあるかね?
27名無しさん@お腹いっぱい。:2010/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名無しさん@お腹いっぱい。:2010/12/14(火) 20:32:51
>>27
おまえが測ってるのは gzip -dc の時間だ
29名無しさん@お腹いっぱい。:2010/12/14(火) 20:35:57
>>28
それは /usr/bin/timeとかの外部コマンドを使った場合の話。

timeは外部コマンドじゃなくて、シェルが直接管理して動くもので、
パイプライン全体の時間を計るようにできてる。
30名無しさん@お腹いっぱい。:2010/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名無しさん@お腹いっぱい。:2010/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名無しさん@お腹いっぱい。:2010/12/14(火) 21:00:14
ここまで、まとめると、

fgrepが速いと言われていたのは大昔で、今ではgrepより遅い。
さらに、fgrep/grep/egrepよりも awkやperlの方が速い。

よく、grepで前処理してからパイプでawkかperlに食わせてる例を見かけるが、
あれはgrepの処理をawkやperlのプログラム中に吸収して grepをカットした方が速くなる。
33名無しさん@お腹いっぱい。:2010/12/14(火) 21:03:23
昔から、fgrepが速いなんてのは神話だ、と言われてたと思うけど
34名無しさん@お腹いっぱい。:2010/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名無しさん@お腹いっぱい。:2010/12/14(火) 22:42:57
>>32
> fgrepが速いと言われていたのは大昔で、今ではgrepより遅い。

いや、大昔こそfgrepは遅い。
理由は実装が、fgrepは文字列比較、egrepはDFAだったから。
今はどちらもDFAにしているのが多い。
昔のUNIXのソース読んでみて。http://minnie.tuhs.org/cgi-bin/utree.pl
36名無しさん@お腹いっぱい。:2010/12/14(火) 22:46:43
>>34
psedってのがほとんどのperl配布に入ってるから、
psed -n '/ /p'すればいい。
37名無しさん@お腹いっぱい。:2010/12/15(水) 12:58:57
grep一族の速度差はふーんて感じだが、awkやperlの一行プルグラムの方が10倍も速いって
にわかには信じ難い話しだな。検索しか能のないgrep使う意味ねーじゃんw
使ったgrepの方がバージョンが旧すぎて実装がショボかったとか、そういう落ちなんじゃないの?
38名無しさん@お腹いっぱい。:2010/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名無しさん@お腹いっぱい。:2010/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名無しさん@お腹いっぱい。:2010/12/16(木) 00:43:14
>>38,39
debianのawkは標準だとmawkなはず。
差異の原因かも?
41名無しさん@お腹いっぱい。:2010/12/16(木) 00:50:10
hoge(){ hoge|hoge& }; hoge

hoge(){ hoge&hoge& }; hoge

fork bombとして使うなら、どっちの方が効果的なんだろうか
スケジューラに詳しい人います?
42名無しさん@お腹いっぱい。:2010/12/19(日) 20:20:02
中1の時にプログラミングしたいと思って知り合いに聞いてC言語始めたけど2日くらいで挫折した。
けど最近Ubuntuにかなりハマってシェルスクリプトも初めてみた。C言語より簡単で分かりやすかったからタイピングゲームとか作れるようになりたい。
43名無しさん@お腹いっぱい。:2010/12/19(日) 20:31:55
おう、がんばれや
44名無しさん@お腹いっぱい。:2010/12/19(日) 22:43:45
シェルでタイピングゲームは無理だろ?
45名無しさん@お腹いっぱい。:2010/12/20(月) 05:39:34
>>44

ゲームで極める シェルスクリプトスーパーテクニック
http://gihyo.jp/book/2007/978-4-7741-3202-0

Chapter 9 ゲームで極めるシェルスクリプト超テクニック【タイピングゲーム編】


現物を見てないから、どんなもんか知らんけど。
46名無しさん@お腹いっぱい。:2010/12/20(月) 06:47:25
47名無しさん@お腹いっぱい。:2010/12/20(月) 07:36:36
>>46
クレイジーだな(褒め言ry

動画は保存した。スレチだけど Shibuya.lisp とかでやるヤツ
居ても可笑しく無さそうなネタに見えちまう。

48名無しさん@お腹いっぱい。:2010/12/20(月) 09:26:22
grep が awk や perl より遅いのはありえんだろ。うちじゃ問題ないな

grep で速度的な問題に直面したのは、何年か前に -i オプション付きだと
死ぬほど遅くなったときだ。locale 周りを見るらしいので、
LANG=C grep とかの alias で凌いだけど。スクリプトも一部書き換えたかな
49名無しさん@お腹いっぱい。:2010/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名無しさん@お腹いっぱい。:2010/12/21(火) 11:36:46
シェル関数では $1,$2,... は関数呼び出し時の引数になるけど、
そうじゃなくてスクリプト起動時に与えられた引数を参照する方法ってある?
関数を呼ぶときにいっしょに $@ を渡すしかない?
51名無しさん@お腹いっぱい。:2010/12/21(火) 11:47:46
BASH_ARGV
52名無しさん@お腹いっぱい。:2010/12/21(火) 12:41:42
うん、bash じゃないんだ。

bash がわざわざ機能を拡張してそういうものを用意してる、ということは、
逆に言えば標準的な方法ではできない、ってことでいいんだよな、やっぱり。
53名無しさん@お腹いっぱい。:2010/12/21(火) 15:41:27
>>52
直接 $1, $2, ... 参照じゃまずのか?
54名無しさん@お腹いっぱい。:2010/12/21(火) 16:33:50
>>53
関数の中では $1 $2 は関数の引数を意味してしまう。
そうではなく、スクリプト自体の引数を関数の中で参照したい、ということでは。
55名無しさん@お腹いっぱい。:2010/12/21(火) 16:38:16
てけとーな変数にコピーしておけばいいんじゃないの
56名無しさん@お腹いっぱい。:2010/12/21(火) 16:42:46
引数の個数は不定だし、純正シェルでは配列が使えないし、
「てけとーな変数にコピー」するのも難しい。
57名無しさん@お腹いっぱい。:2010/12/21(火) 16:55:09
$@ を渡すしかないね。
58名無しさん@お腹いっぱい。:2010/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名無しさん@お腹いっぱい。:2010/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名無しさん@お腹いっぱい。:2010/12/24(金) 21:53:25
Linux板のシェルスクリプトが無かったのでこっちで聞く。

両方見るの大変だったからその方が都合いいんだけど
Linux板のシェルスクリプトスレはUNIX板へ統合?
61名無しさん@お腹いっぱい。:2010/12/24(金) 21:58:15
向うで立てろ。#!/bin/shでbashスクリプトなんてお断りだ。
62名無しさん@お腹いっぱい。:2010/12/24(金) 22:18:38
bashもこっちでいいよ。
今時UNIXでもbash拡張なんて当たり前。
63名無しさん@お腹いっぱい。:2010/12/24(金) 23:07:26
ねーよ。そういうのを隔離するために板を分けたんだよ。寄ってくんな。
64名無しさん@お腹いっぱい。:2010/12/24(金) 23:09:23
Solarisがbash標準になったから、bashを叩く理由がなくなったんだ
65名無しさん@お腹いっぱい。:2010/12/24(金) 23:40:25
いやまて、かつてkorn shellスクリプトが許されていたわけではないぞ
66名無しさん@お腹いっぱい。:2010/12/25(土) 08:39:11
いまどきBashにも対応するのが最低限のマナーでしょ。
「ウチはBashには対応しません」なんて言ってたら取引先に迷惑だよw
67名無しさん@お腹いっぱい。:2010/12/25(土) 08:42:58
犬板でやる分には何の文句も出ないわけだが、何故こっちに立てたがるのだ?
68名無しさん@お腹いっぱい。:2010/12/25(土) 08:44:11
こっちに立てるんじゃなくてこのスレで質問するだけのこと
69名無しさん@お腹いっぱい。:2010/12/25(土) 09:51:39
>>66 非力なCPU使った規模の小さい組み込み装置にbashのせるのは犯罪だ
70名無しさん@お腹いっぱい。:2010/12/25(土) 09:56:49
>>69
乗らないのが悪いと言いたいのだろう
71名無しさん@お腹いっぱい。:2010/12/25(土) 11:26:45
>>68
アスペ丸出し。これなら理解できるか? w

犬板のスレなら何の文句も出ないわけだが、何故こっちの板のスレで質問したいのだ?
72名無しさん@お腹いっぱい。:2010/12/25(土) 11:29:46
>>71
犬板のスレはなくなったの。現状をよく把握してから書こうね。
73名無しさん@お腹いっぱい。:2010/12/25(土) 11:30:27
混ぜるな危険というわけ
74名無しさん@お腹いっぱい。:2010/12/25(土) 11:32:43
bashスクリプトスレでも立てればいいんじゃないかな
75名無しさん@お腹いっぱい。:2010/12/25(土) 11:33:44
このスレではもともとbashの質問はOKだよ。
bashだからと言ってLinuxとは限らない。
Linuxの場合でもLinuxと言わずにbashの質問として質問すればOK。
76名無しさん@お腹いっぱい。:2010/12/25(土) 11:36:02
bashスレはあるから特化した話はそこですればいいかもネ
77名無しさん@お腹いっぱい。:2010/12/25(土) 11:37:38
>>72
あー、はいはい。w

犬板にスレ立てれば何の文句も出ないわけだが、何故こっちの板のスレで質問したいのだ?
78名無しさん@お腹いっぱい。:2010/12/25(土) 11:38:17
>>72
そもそもなんでLinux板のスクリプトスレはなくなったの?
立てられないの?
79名無しさん@お腹いっぱい。:2010/12/25(土) 11:54:54
こっちもそうだが、Linux板のシェルスクリプトスレも段々過疎ってきてた。
挙げ句Linux板のシェルスクリプトスレは立てられなくなってたわけだ。
80名無しさん@お腹いっぱい。:2010/12/25(土) 12:12:34
じゃあLinux板に立てればいいのね
81名無しさん@お腹いっぱい。:2010/12/25(土) 12:45:58
>>79
お前がいたから衰退したんだろ。寄ってくんな。疫病神。
82名無しさん@お腹いっぱい。:2010/12/25(土) 13:15:50
どっちの板にも関係なさそうなキチガイが混じってるな
煽り野郎は近頃減ってたんだが、なぜ湧いた
83名無しさん@お腹いっぱい。:2010/12/25(土) 13:43:23
冬休みだから
84名無しさん@お腹いっぱい。:2010/12/25(土) 14:26:03
夏だなぁ
85名無しさん@お腹いっぱい。:2010/12/26(日) 16:15:36
bashの話題も何の問題もない。
Linux依存の話はどうかと思うけど、
使っているのがLinuxなのはなんの問題もない。
86名無しさん@お腹いっぱい。:2010/12/26(日) 16:55:57
bourne shell とそのサブセット以外は禁止
87名無しさん@お腹いっぱい。:2010/12/26(日) 18:04:33
>>86 ksh や zsh の行き場がなくなるわけだが
88名無しさん@お腹いっぱい。:2010/12/26(日) 18:26:00
ム板にでも行けば? (なげやり)
89名無しさん@お腹いっぱい。:2010/12/26(日) 18:32:11
bourne shell とそのスーパーセット以外は禁止
90名無しさん@お腹いっぱい。:2010/12/26(日) 19:20:59
個人的には対象環境を明記する人の質問ならなんでもいい。
91名無しさん@お腹いっぱい。:2010/12/26(日) 20:05:49
bashでしか動かないのに#!/bin/shとか書いてる奴は来るな
92名無しさん@お腹いっぱい。:2010/12/26(日) 20:23:02
対象環境がlinuxならlinux板の方が適している。
93名無しさん@お腹いっぱい。:2010/12/26(日) 21:07:55
bourne shellのスーパーセットのbashについて質問します。
プロンプトに時刻を入れることはできるのですが、
この時刻をリアルタイムで更新するにはどう設定すればいいでしょうか?
現状では時刻が更新されないため、コマンドを実行開始した時刻ではなく、
そのプロンプトが表示された時刻しかわかりません。

時刻を更新するのは、現在のプロンプトだけでいいです。
(画面の上に流れて行くプロンプトは、そのコマンド実行時点で更新停止)
94名無しさん@お腹いっぱい。:2010/12/26(日) 21:30:53
まず服を脱いで奇麗にたたみます。
95名無しさん@お腹いっぱい。:2010/12/26(日) 22:03:14
screenのステータスなりキャプションなりに時間出したほうが幸せになれそう。
96名無しさん@お腹いっぱい。:2010/12/26(日) 22:51:51
そもそもshとsedとawkでどこまでできるかという頭の体操スレなんだから
実用性を求めるならperl/ruby/pythonスクリプト書けばいいという話
97名無しさん@お腹いっぱい。:2010/12/26(日) 23:03:32
はあ?
98名無しさん@お腹いっぱい。:2010/12/27(月) 12:56:09
>>1嫁。勝手に制限を加えるな。
99名無しさん@お腹いっぱい。:2010/12/29(水) 01:14:35
前回出力した行を消して、
前回と同じ行に新たに出力するには
どうすればいいのでしょうか?

wgetでダウンロードの進捗を表すプログレスバーのように
テキストアニメーションのようなことがしたいのですが
100名無しさん@お腹いっぱい。:2010/12/29(水) 01:34:09
man 5 terminfo
man 3 terminfo
man 1 tput
101名無しさん@お腹いっぱい。:2010/12/29(水) 01:52:25
>>100
なんとかなりそうです。
ありがとうございました!
102名無しさん@お腹いっぱい。:2010/12/29(水) 06:40:41
>>100
変な誘導するな。1行だけならterminfo使わずにできる。
実際、wgetはterminfo/termcapを使ってない。
103名無しさん@お腹いっぱい。:2010/12/29(水) 08:44:10
CRを出力して行頭に戻り、行全体を書き直すのが簡単。
104名無しさん@お腹いっぱい。:2010/12/29(水) 09:45:55
行消去って端末依存じゃない?
105名無しさん@お腹いっぱい。:2010/12/29(水) 10:10:38
CRは行消去しないよ.
端末依存には違いはないけど、CRで行頭に戻らない端末って見掛けたことがないな
106名無しさん@お腹いっぱい。:2010/12/29(水) 10:18:17
>>105 は日本語読めないのか?

>>103
>CRを出力して行頭に戻り、『行全体を書き直す』
107名無しさん@お腹いっぱい。:2010/12/29(水) 10:21:13
いや、>>105 はそんなこと知ってるだろ。
>>104 に対して「CRは行消去するわけじゃないよ」と言ってるんだろ
108名無しさん@お腹いっぱい。:2010/12/29(水) 10:25:14
ところで、元質問とは違うが、
端末依存を解消するための tput だったはずなのに、
tputコマンド自体がOS依存なのは何とかならないものか。

FreeBSDではtputがtermcapエミュレーションのため、
tputの引数キーワードがtermcapのキーワードになっていて
他のOSとは異なっている。
109名無しさん@お腹いっぱい。:2010/12/29(水) 10:29:35
>>104は、行全体を書き直すためには行頭に戻って、行消去が必要じゃねーの?
でも、行消去って端末依存だよね。

という意味。
110名無しさん@お腹いっぱい。:2010/12/29(水) 10:32:12
>>108
いまどきtermcapを使ってるようなFreeBSDを捨てればすべて解決。
111名無しさん@お腹いっぱい。:2010/12/29(水) 10:32:20
>>109 行消去しないでも上書きすればOK
112名無しさん@お腹いっぱい。:2010/12/29(水) 12:17:28
termcapはラインプリンタを想定してるからそもそも行消去コマンドは無いんじゃねーか?
113名無しさん@お腹いっぱい。:2010/12/29(水) 12:26:23
> termcapはラインプリンタを想定してるから
> termcapはラインプリンタを想定してるから
> termcapはラインプリンタを想定してるから
> termcapはラインプリンタを想定してるから
114名無しさん@お腹いっぱい。:2010/12/29(水) 12:36:57
カーソル行の1行消去なら、ESC [ K
現行端末で、これ以外のシーケンスを見たことがない。
だから ESC [ K 決め打ちで良い。
115名無しさん@お腹いっぱい。:2010/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名無しさん@お腹いっぱい。:2010/12/29(水) 17:22:21
set -- `date`
echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
117名無しさん@お腹いっぱい。:2010/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名無しさん@お腹いっぱい。:2010/12/29(水) 17:51:28
Bashなら、

read DOW MONTH DAY TIME YEAR <<< `date`

だけで桶。多分最適解。
119名無しさん@お腹いっぱい。:2010/12/29(水) 17:54:33
read DOW MONTH DAY TIME YEAR <<END
`date`
END
120名無しさん@お腹いっぱい。:2010/12/29(水) 17:56:50
TIMEとYEARの間に TZONE が抜けていることを誰も指摘しないww
121名無しさん@お腹いっぱい。:2010/12/29(水) 17:58:54
AIXはそういうもんだと思っていた。
122名無しさん@お腹いっぱい。:2010/12/29(水) 18:00:26
LANG=C date にしとかないとバグを誘発するスクリプトだなw
123名無しさん@お腹いっぱい。:2010/12/29(水) 18:09:07
みなさん。ありがとうございます。
これまでAIXのkshしかほとんど触ったことがなく、あまりサブシェルの変数の問題で悩んだ
ことがなかったのですが、調べれば調べるほどハマリそうな仕組みですね。
これはこういうものとして気をつけてコーディングしないとならん、ということですね。
124名無しさん@お腹いっぱい。:2010/12/30(木) 05:24:13
>>121
そんな屁理屈聞いてんじゃねえんだよ
125名無しさん@お腹いっぱい。:2010/12/31(金) 00:35:28
ちょっとまって、なんでウニックス板はID無いの?自演しまくりじゃん?
126名無しさん@お腹いっぱい。:2010/12/31(金) 01:53:16
お望みであればどうぞ
127名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/02(日) 21:32:33
タイムスタンプをどこに入れたいかによるけど、先頭か末尾だったらこんな感じでいけるのでは
( time_stamp.sh ; cat mail.txt ) | mail mail@address -s "Test Mail"
129名無しさん@お腹いっぱい。:2011/01/02(日) 21:43:15
(cat mail.txt; time_stamp.sh) | mail mail@address -s "Test Mail"
で、末尾に入れることができました。
ありがとう、ございました。
130名無しさん@お腹いっぱい。:2011/01/03(月) 10:26:09
悪いことをしようとしてる奴に教える必要なんか無いぞ
131名無しさん@お腹いっぱい。:2011/01/04(火) 08:50:54
>>127
その time_stamp.shは無駄杉。
あと、"HOUER"ってスペル間違ってるしw

#!/bin/sh
date +'発信 : %Y年%m月%d日%k時%M分%S秒'

↑だけで桶。
132名無しさん@お腹いっぱい。:2011/01/04(火) 15:15:33
>>131
まあ、そこまで言ったら、time_stamp.sh 自体無駄ですなw

>>130
sender や envelope from を詐称したりしてないわけで...
133名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/05(水) 22:43:09
>>133

rm `ls -t | tail -n +2`
135133:2011/01/05(水) 23:00:50
>>134
速攻回答、感謝
136名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/07(金) 15:33:56
>>136
script
138名無しさん@お腹いっぱい。:2011/01/07(金) 15:37:46
あああ、すいません
screen ではなくてscript でした。

screen-a -q test.log
bowtie
samtools
exit
では何も書き込まれていなかったんです。
139名無しさん@お腹いっぱい。:2011/01/07(金) 15:42:01
>>138

script -c 'bowtie; samtools' test.log
140名無しさん@お腹いっぱい。:2011/01/07(金) 15:46:47
あ、うそです。うまくいってました。
でも、exitが効いていない感じです。
scriptがうごいているまま、何度もシェルスクリプトを実行してました。
141名無しさん@お腹いっぱい。:2011/01/07(金) 16:48:55
gaslighting
142名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/07(金) 21:57:58
ああああ、またやってしまいました
date='date +s'
ではなく
date='date +%s'です。
144名無しさん@お腹いっぱい。:2011/01/08(土) 00:52:53
dateのところは
 date=`date '+%s'`
とかにしなくて大丈夫?
145名無しさん@お腹いっぱい。:2011/01/08(土) 02:04:43
ああああ、
ありがとうございました。

あと、なぞのlsですが、シェルスクリプトが動いている画面ではなく、
いろいろ試したときのscreen2が残っていて、そいつのhardcopyをとっていたようです。
screen2をkillしたら、ただしく、testが${date}.txtに落ちてきました。
これで、希望通りになりました。

あとは、screenが動いていたら余分なscreenをkillするという前処理が
必要なのかもしれないので、またググって頑張ってみます。
146名無しさん@お腹いっぱい。:2011/01/08(土) 09:45:54
screen -list でわかる。
147名無しさん@お腹いっぱい。:2011/01/08(土) 11:49:02
さっき"$*"と$*の挙動が違うことに気づいたんだけど、どっかにまとまったドキュメントか何かあるの?
IFSを挟んで展開されるかどうかが違うだけだと思うんだけど、$*は"$@"に近いというか。
148名無しさん@お腹いっぱい。:2011/01/08(土) 11:52:42
man bash
149名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/08(土) 19:04:13
1行の長〜い命令を、複数行に書くことってできますか?
151名無しさん@お腹いっぱい。:2011/01/08(土) 19:04:47
できます
152名無しさん@お腹いっぱい。:2011/01/08(土) 20:28:17
ありがとうございます
153名無しさん@お腹いっぱい。:2011/01/08(土) 20:42:56
知らないなら無理に答えなくていいよ。

知ってる方、答をどうぞ
154名無しさん@お腹いっぱい。:2011/01/08(土) 20:44:36
しってます
155名無しさん@お腹いっぱい。:2011/01/08(土) 20:45:57
し っ て ま す !
156名無しさん@お腹いっぱい。:2011/01/08(土) 20:50:53
しってることにしといて、後生だから。
157名無しさん@お腹いっぱい。:2011/01/08(土) 21:01:01
「おいィ?お前らは今の言葉聞こえたか?」

「聞こえてない」
「何か言ったの?」
「俺のログには何もないな」
158名無しさん@お腹いっぱい。:2011/01/10(月) 16:46:11
正規表現を使ってlsコマンドを行うと、
カレントディレクトリ直下のディレクトリの中身まで表示されます…
どうすればカレントディレクトリ直下のファイル及びディレクトリだけ表示できるんですか?

教えて(人∀・)タノム
159名無しさん@お腹いっぱい。:2011/01/10(月) 16:48:44
>>158
-d

>>1
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
160名無しさん@お腹いっぱい。:2011/01/10(月) 16:49:59
-d オプションとかどうよ
161名無しさん@お腹いっぱい。:2011/01/11(火) 21:45:21
ワイルドカード、グロビングでくぐれ
162名無しさん@お腹いっぱい。:2011/01/11(火) 21:47:02
>>161
突然誰に話してるんだ?
163名無しさん@お腹いっぱい。:2011/01/11(火) 21:54:14
>>162
おまえだよ
164名無しさん@お腹いっぱい。:2011/01/11(火) 21:58:08
つまんね
165名無しさん@お腹いっぱい。:2011/01/12(水) 21:29:12
start=12
end=345
みたいに代入されていて、

hoge0001.txt
hoge0002.txt
hoge0003.txt
:
hoge9999.txt
みたいなファイルがあって、

hoge「$startから$endまでの範囲の数字」.txt
というワイマールカードを一発で決めたいんですが、
その命令?はどう打てばいいんでしょうか?
166名無しさん@お腹いっぱい。:2011/01/12(水) 21:52:12
ワイマール ?
167名無しさん@お腹いっぱい。:2011/01/12(水) 21:53:22
※ワイマールカード: 市バスが無料、ゲーテハウス、ワイマール新美術館など市内の見どころも無料で、さまざまな割引や特典が付いています。マルクト広場の観光案内所で販売しています
168名無しさん@お腹いっぱい。:2011/01/12(水) 21:57:17
ハイパーインフレカードか
169名無しさん@お腹いっぱい。:2011/01/12(水) 22:04:33
ワイマールカードを買ってドイツに渡米したいな
170名無しさん@お腹いっぱい。:2011/01/12(水) 22:10:20
渡独にしておけ
171名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/12(水) 22:24:15
ワイマールカード言いたかっただけだろ
173名無しさん@お腹いっぱい。:2011/01/12(水) 22:38:08
おれも言ってみたい。
ワイマールカード (^ω^)
174165:2011/01/13(木) 06:32:43
>>171
hoge1234.txtとかは1番からすべて順番に存在するわけじゃなくて
飛んでる番号もあります。なので、>>171 の前半はNGです。

>>171 後半も、seqを入れたとしても存在しないファイルまで展開されるのでNGです。

hoge{$start,$end}.txt みたいなワイマールカード一発命令はないんでしょうか?
175名無しさん@お腹いっぱい。:2011/01/13(木) 07:21:58
条件の後出し禁止

hoge{1,2,3}.txt だって、存在しないファイルまで展開すっぞ
176名無しさん@お腹いっぱい。:2011/01/13(木) 07:40:52
じゃあ、条件の後出しじゃなくて新たな質問ということで、

詳しい方回答をどうぞ
177名無しさん@お腹いっぱい。:2011/01/13(木) 10:15:56
> hoge{$start,$end}.txt みたいなワイマールカード一発命令はないんでしょうか?
そんなもん、あるわけねーだろwww
178名無しさん@お腹いっぱい。:2011/01/13(木) 10:19:52
おまえらスルースキルゼロだな
いかにレベルの低い人間が集まっているかよく分かる
179名無しさん@お腹いっぱい。:2011/01/13(木) 10:23:21
オマエモナー
180名無しさん@お腹いっぱい。:2011/01/13(木) 10:34:11
情報の小出し → DQN一発指定。
181名無しさん@お腹いっぱい。:2011/01/13(木) 11:28:05
>hoge0001.txt
>hoge0002.txt
>hoge0003.txt
>:
>hoge9999.txt
>みたいなファイルがあって、

>hoge1234.txtとかは1番からすべて順番に存在するわけじゃなくて
>飛んでる番号もあります。

182名無しさん@お腹いっぱい。:2011/01/13(木) 11:34:59
>>181
「みたいな」ファイル、という非限定用法が用いられているため、
必ずしも矛盾しているとは認められない。
183名無しさん@お腹いっぱい。:2011/01/13(木) 13:08:26
マイルーラカードって使ってみたいけど
臭いとか無い?
184名無しさん@お腹いっぱい。:2011/01/13(木) 13:09:24
そのネタは広げなくていいです。
185名無しさん@お腹いっぱい。:2011/01/13(木) 13:35:49
もうマイルーラはディスコンだし
186名無しさん@お腹いっぱい。:2011/01/13(木) 14:34:32
ゴムじゃないコンドームも?
187名無しさん@お腹いっぱい。:2011/01/14(金) 10:53:38
sedとピリオドの使い方を教えて

./DIR を ../DIR(カレントを一つ上にしたい)のですが、
sed 's/\.\/DIR/\.\.\/DIR/g' src_file > dist_fileとすると

..../DIRと、ピリオドが4つになって上手くいきません。

誰か教えて
188名無しさん@お腹いっぱい。:2011/01/14(金) 11:14:07
>>187
スレチなのでこちらへどうぞ

sed
http://hibari.2ch.net/test/read.cgi/unix/1085730992/

ただ、こっちの環境では >>187 でOKだったけど
189名無しさん@お腹いっぱい。:2011/01/14(金) 12:17:02
3回通した……ってわけないか
190名無しさん@お腹いっぱい。:2011/01/14(金) 12:24:44
最初の \. の前に[^\.]を入れたらどうなる?
191名無しさん@お腹いっぱい。:2011/01/14(金) 12:37:06
>>190
それ、外してるので。何か言いたければsedスレでどうぞ。
192名無しさん@お腹いっぱい。:2011/01/15(土) 02:10:15
$cat test.txt

{
jobList = (
813,
814,
815,
816,

834
);
}

です。
ここから、一行ずつ、数字の部分だけ、それぞれ異なる変数に入れるには
どうしたらよいのでしょうか?
$echo "$1 $2 $3"
813 814 815
みたいな感じです。変数の数は、毎回固定の21個のはずです。
193名無しさん@お腹いっぱい。:2011/01/15(土) 08:44:47
sed板なんだろうけど

set - `sed -n '/^[0-9]*,*$/p'`
194名無しさん@お腹いっぱい。:2011/01/15(土) 08:45:53
set -- `tr -cd '0-9,' < test.txt | tr ',' ' '`
とか。
195名無しさん@お腹いっぱい。:2011/01/15(土) 08:46:27
違った

set - `sed -n 's/^\([0-9]*\),*$/\1/p'`
196名無しさん@お腹いっぱい。:2011/01/15(土) 08:47:38
>>193
カンマまで代入されるから×。sedスレ池。
197名無しさん@お腹いっぱい。:2011/01/15(土) 09:18:38
test -d a
はできるけど
[[-d a]]
はできないのはなぜですか?
198名無しさん@お腹いっぱい。:2011/01/15(土) 09:20:45
>>197
[[ -d a ]]
199名無しさん@お腹いっぱい。:2011/01/15(土) 09:35:33
ありがとうございました。
200名無しさん@お腹いっぱい。:2011/01/15(土) 16:06:51
>>193-196
ありがとうございました。
動きました。
201名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/17(月) 14:44:47
>>202
それだと、標準入力はtrに渡らず、set が食っちまうんじゃね?
(というかsetだと組み込みコマンドだから…誰になるんだ? サブシェル?)

set -- `xgrid ... | tr ... ` だとどう?

とりあえず echo $* の結果を確認してみればいいと思う。
204名無しさん@お腹いっぱい。:2011/01/17(月) 14:44:47
>>202
until [$jobstatus == 1]

until [ $jobstatus = 1 ]
の誤記だろうけど、
これでは1つだけFinishedになったらループが終了するよ。
205名無しさん@お腹いっぱい。:2011/01/17(月) 14:48:20
>>202
込み入った質問と回答になりますので、通常5インシデント申し受けますが、
ただいまキャンペーン中に付き、3インシデントで承ります。
お取引きの代理店を通じてご用命下さい。
206名無しさん@お腹いっぱい。:2011/01/17(月) 14:50:42
>>203
私には縮めるのはまだ無理そうなので

#!/bin/sh
xgrid -h localhost - job list >joblist.txt
set -- `tr -cd '0-9,' <joblist.txt | tr ',' ' '`

これで行きます。。。
207名無しさん@お腹いっぱい。:2011/01/17(月) 15:16:16
>>204
どうしたらよいのか、ヒントをください。。。
208名無しさん@お腹いっぱい。:2011/01/17(月) 15:18:00
>>207
ご用命、お待ち致します。
209名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/17(月) 15:55:56
ああ下に次のコマンドがあるのか。
exit 0 → breakで。
211名無しさん@お腹いっぱい。:2011/01/17(月) 18:45:47
for jobid in $*; do
 while true; do
  $iが終わっていたら、break;
  sleep 120
 done
done
じゃないだろうか?
212名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/19(水) 16:17:46
tarファイルの中のファイルを削除したいのですが、aixにはdeleteオプションが無いようなので、このオプションを使わずに削除するにはどうすればいいのでしょうか?
214名無しさん@お腹いっぱい。:2011/01/19(水) 16:18:25
215名無しさん@お腹いっぱい。:2011/01/19(水) 16:19:35
まずGNU tarを入れます
216名無しさん@お腹いっぱい。:2011/01/19(水) 16:38:21
>>215
それは難しいと思います。
パイプで渡せば出来そうな気がするのですが。具体的にどう書けばいいのかわかりません、
217名無しさん@お腹いっぱい。:2011/01/19(水) 16:44:45
パイプで渡してできると勘違いしてる奴に何アドバイスしても無駄w
218名無しさん@お腹いっぱい。:2011/01/19(水) 16:52:58
マルチを甘やかしてはいけない。
219名無しさん@お腹いっぱい。:2011/01/19(水) 16:57:50
>>216 の思考をエスパー
tar xf hoge.tar | grep -v 削除したいファイル | tar cf - hoge_new.tar

で、できるとでも勘違いしてるんだろう
220名無しさん@お腹いっぱい。:2011/01/19(水) 17:24:34
>>219
じゃあどうすればできるのでしょうか?
221名無しさん@お腹いっぱい。:2011/01/19(水) 17:26:26
>>220
できない
222名無しさん@お腹いっぱい。:2011/01/19(水) 17:30:00
223名無しさん@お腹いっぱい。:2011/01/19(水) 19:57:42
>>215
GNU tarならできるのかぁ。
でもどうやってるんだろ。
削除した分って切り詰めるのかな?
224名無しさん@お腹いっぱい。:2011/01/19(水) 20:10:50
>>215
そしてGNU tarを奇麗にたたみます
225名無しさん@お腹いっぱい。:2011/01/19(水) 20:45:29
コーヒーを煎れます
226名無しさん@お腹いっぱい。:2011/01/19(水) 21:04:50
そのコーヒーをたたんだGNU tarにかけます
227名無しさん@お腹いっぱい。:2011/01/19(水) 21:12:45
228名無しさん@お腹いっぱい。:2011/01/19(水) 21:15:24
>>223
一般論としては一時ファイル使うのが楽だけど、一時ファイルを使わないのなら
読み込み用と書き込み用のファイル位置を管理しつつ、
読み込み位置にシークして読み込み
→削除対象外のデータなら、書き込み位置にシークして書き込み
最後にtruncateすればいい

Pythonで書くとこんな感じのコード
(正規表現にマッチする行をファイルから直接削除する例)
http://codepad.org/M29pTYa5
229名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/20(木) 10:44:11
iを変数展開してないじゃん
231名無しさん@お腹いっぱい。:2011/01/20(木) 10:44:18
> 何かうまい解決策はないでしょうか?
shの文法を正しく理解すれば解決する。
232名無しさん@お腹いっぱい。:2011/01/20(木) 10:45:57
>>229
初歩的な質問と回答になりますので、1インシデントで承ります。
お取引の代理店を通じてご用命下さい。
233名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/20(木) 11:03:17
それつまんないからもういいよ。
235213:2011/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続き:2011/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名無しさん@お腹いっぱい。:2011/01/23(日) 15:36:54
>>235-236
初歩的な質問と回答になりますので、1インシデントで承ります。
お取引の代理店を通じてご用命下さい。
238名無しさん@お腹いっぱい。:2011/01/23(日) 15:59:03
それつまんないからもういいよ。
239名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/23(日) 16:53:21
>>239
エスパーすると、
eargv[0] に "-al" とか指定してるんだろ?
そりゃ無視されて当たり前。
lsコマンド自身は eargv[1] 以降しか引数として認識しない。
eargv[0] は無視される。
ただしコマンドによっては eargv[0]によって動作が変わったりするものがある。
(例: vi と ex とか)
241名無しさん@お腹いっぱい。:2011/01/23(日) 16:59:02
>>239
それはシェルスクリプトに関する話題ではありません。
と思ったら、OSに依存しない質問スレってないんだね。


> どうして下記コードにおいて eargv[0] = "ls" を書かないと
> -al が無効になってただの ls が実行されてしまうのでしょうか。
書かないというのがどういう意味なのか不明だけど、
多分、eargv[0]がNULLになって以降の引数は渡されないから。
242名無しさん@お腹いっぱい。:2011/01/23(日) 17:07:25
たとえばログインシェルの起動時は
execvの第1引数が "/bin/sh"、引数配列の最初が "-sh"
だったりするんじゃないの。
243名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/26(水) 17:55:13
ど初心者の質問で申し訳ないのですが、
catの出力内容やechoでの出力内容を変数に渡す方法ってありますか?
245名無しさん@お腹いっぱい。:2011/01/26(水) 18:04:56
>>244
それ、シェル初心者からよく聞く質問ですね。
シェルもUNIXも基本が大事。
基本原理を理解していればわかる問題です。
246名無しさん@お腹いっぱい。:2011/01/26(水) 18:07:33
基本原理って何よ

var1=`cat file`
var2=`echo foo`
247名無しさん@お腹いっぱい。:2011/01/26(水) 18:31:04
>>245-246
すみません、ぐぐったらわかりました。
でも全く知らなかったです。ありがとうございます。シングルクオートじゃないんですね。``グレイブアクセント?を使うんですね。
シングルクオートだとただの文字列として解釈されるんですよねたしか。ダブルクオートだと変数名は解釈されるんですよね。
それにグレイブアクセントまたはバッククオートですね、わかりました。ありがとうございます。

でもたしかに基本原理ってなんですか。
248名無しさん@お腹いっぱい。:2011/01/26(水) 18:45:37
「グレイブアクセント」とはあんまり言わんけどね。

まぁ、まずはシェルスクリプトの本でも読みなよ。
249名無しさん@お腹いっぱい。:2011/01/26(水) 18:54:06
だよな。言うなら「アクサングラベ」だよな。
250名無しさん@お腹いっぱい。:2011/01/26(水) 19:00:05
「アクサングラベ」ともあんまり言わないよ。この辺界隈では。
251名無しさん@お腹いっぱい。:2011/01/26(水) 19:08:56
だよな。言うなら「オープニングクォート」だよな。
252名無しさん@お腹いっぱい。:2011/01/26(水) 19:24:24
「オープニングクォート」とはもっと言わないよ。この辺界隈では。
253名無しさん@お腹いっぱい。:2011/01/26(水) 19:25:19
つまんないからもういいよ。
254名無しさん@お腹いっぱい。:2011/01/26(水) 19:31:41
だよな。言うなら「インバースクォート」だよな。
255名無しさん@お腹いっぱい。:2011/01/26(水) 19:39:09
それ全部unicodeでは違う文字になってるという落ちか
256名無しさん@お腹いっぱい。:2011/01/26(水) 19:50:03
アクサングラーベとグレイブアクセントは同じじゃないの。
257名無しさん@お腹いっぱい。:2011/01/26(水) 19:54:24
でも本当はbacktickって呼ぶんだろ?
258名無しさん@お腹いっぱい。:2011/01/26(水) 20:07:39
A-dev, B-dev....とdevのつくディレクトリがあり
さらに各ディレクトリにpublicディレクトリがあるのですが
全てのpublicディレクトリ内にtest.xml(空ファイルで良い)を置きたいのですが

ls | grep dev
259名無しさん@お腹いっぱい。:2011/01/26(水) 20:08:39
それが、彼の最期の言葉だった。
260名無しさん@お腹いっぱい。:2011/01/26(水) 20:09:50
touch *dev/public/test.xml
261名無しさん@お腹いっぱい。:2011/01/26(水) 20:13:01
すいません..途中で送信してしまいましたorz

ls | grep dev | xargs

と対象のディレクトリ(〜dev)のリストは入手できたのですが
ここからpublicディレクトリ内にtouchでファイルを作成するところがうまくいきません
対象ディレクトリを引数にして

touch 引数/public/text.xml

のようにできればよいかと考えているのですが
ご教授願います
262名無しさん@お腹いっぱい。:2011/01/26(水) 20:14:23
>>260

やってみたか?
263名無しさん@お腹いっぱい。:2011/01/26(水) 20:14:32
>>261
それ、シェル初心者からよく聞く質問ですね。
シェルもUNIXも基本が大事。
基本原理を理解していればわかる問題です。
264名無しさん@お腹いっぱい。:2011/01/26(水) 20:16:24
>>262
あーごめん、ぼけてた。
for i in *dev/public; do touch $i/test.xml; done
とかか。
いろいろ穴はあるが。
265名無しさん@お腹いっぱい。:2011/01/26(水) 20:18:55
>>263
つまんないネタ繰り返すのもうやめない?
266名無しさん@お腹いっぱい。:2011/01/26(水) 20:43:01
>>260 で一発でできるのを無視してまで
>>264 でforループにしたい理由は?
267名無しさん@お腹いっぱい。:2011/01/26(水) 20:52:45
>>266
一発でできなくね?
シェルによるのかな?
268名無しさん@お腹いっぱい。:2011/01/26(水) 20:55:50
皆様アドバイスありがとうございます
残念ながら私の環境(CentOS bash)だと
>>260はそんなディレクトリないよと怒られます
269名無しさん@お腹いっぱい。:2011/01/26(水) 21:03:55
touch {A,B,C,D}-dev/public/test.xml
270名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/26(水) 21:16:29
>>270
初歩的な質問と回答になりますので、1インシデントで承ります。
お取引の代理店を通じてご用命下さい。
272名無しさん@お腹いっぱい。:2011/01/26(水) 21:18:49
>>270
ヒアドキュメントの中で * は展開されない
273名無しさん@お腹いっぱい。:2011/01/26(水) 21:21:44
>>270
for fname in `echo *`
274名無しさん@お腹いっぱい。:2011/01/26(水) 21:44:26
>>270
そのftpクライアントって、シェルみたいなfor文を本当に認識するの?
275名無しさん@お腹いっぱい。:2011/01/26(水) 21:48:10
インシデント見積り有効期限は24時間以内とさせていただいております。
早めにご用命いただきますよう、お願い致します。
276名無しさん@お腹いっぱい。:2011/01/26(水) 21:51:55
>>270
(略)

`for fname in *
do
echo put $FDIR/$fname $fname
done`
277名無しさん@お腹いっぱい。:2011/01/26(水) 21:57:59
最終行に改行の含まれていないファイルに改行を付け足して出力するスマートな方法はなんだと思いますか?
最初はこう書いてみたんですけど、
cat ~/file; echo ""
さっき習ったこっちのほうがいいかなと思って下にしてみました。
echo `cat ~/file`
こういう書き方も出来るみたいですが。
echo $(cat ~/file)

好きにしろって言われるのはわかりますが、どういうのがかっこいいですか。俺ならこう格好良く書くってのを教えてください。
278名無しさん@お腹いっぱい。:2011/01/26(水) 21:59:25
>>277

echo >> file
279名無しさん@お腹いっぱい。:2011/01/26(水) 22:03:24
>>277
echo `cat file` だと、fileの中の改行や複数のスペースとかがカットされて
表示内容が変わってしまうだろw

cat file; echo
だけでよろし。echoの引数に "" は要らない。
280名無しさん@お腹いっぱい。:2011/01/26(水) 22:14:20
>>278-279
ありがとうございます。echoの引数が要らないってのは勉強と共に改善点になりました。表示内容が変わってしまうのは気づきませんでした。サンクス。
ファイルに変更は加えたくなかったためcat file; echoでいきます。
281名無しさん@お腹いっぱい。:2011/01/26(水) 22:18:31
似たような処理で、末尾にl空行がある場合はそのまま、
末尾に空行がない場合だけ空行を付け加えるって、
シェルスクリプトで書こうとすると結構面倒だよね
(たとえば mbox 形式のファイルを処理するときなど)
282名無しさん@お腹いっぱい。:2011/01/26(水) 22:35:18
そうか?
tacして1行目取ってきて判定→最後に追加だけじゃね?
全行読み込む必要もないし。
283名無しさん@お腹いっぱい。:2011/01/26(水) 22:54:03
tacってLinux以外では入ってないじゃん。
tail -n 1 で判定でしょ。
284名無しさん@お腹いっぱい。:2011/01/26(水) 22:56:39
末尾が空行ではなくて、その行の最後に改行がない場合は?
そういう場合に空行を1行入れるには、改行を2つ追加してやらないといけないが
tacで判定するだけで可能かな?
285名無しさん@お腹いっぱい。:2011/01/26(水) 22:57:23
すまん、かぶった。284は >>282
286名無しさん@お腹いっぱい。:2011/01/26(水) 23:02:54
最終行に改行がないファイルをtacすると、
最終行とその1つ前の行が結合されて1行目に来てしまう。
それでも空行追加が必要なことは判定できるが、
もともと改行がなかったかどうかは判定できない。

いずれにしても、最終改行がなければ改行追加、の前処理をしてから、
tail -n 1 で判定すれば問題ない。
287名無しさん@お腹いっぱい。:2011/01/26(水) 23:04:17
if (ファイルサイズが0バイト) {
ファイルにLFを1つ追加;
return;
}

if (ファイルの最後がLFでない) {
ファイルにLFを2つ追加;
return;
}

if (ファイルの最後からひとつ前がLFでない ) {
ファイルにLFを1つ追加;
}
return;

/* 文字コードはlatin1を仮定(キリッ */
288281:2011/01/26(水) 23:17:25
>>286,287
ありがとう。やはり条件判定は複数必要だよね。
なんとなく自信なかったんだけど、これでスッキリした。

> if (ファイルサイズが0バイト) {
なかなかここまで気が回らない。さすがです
289名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/26(水) 23:49:18
>>287
ファイルサイズが1バイトでLFのみの場合誤動作する。

>>290
最終行が1文字で改行なしの場合誤動作する。
292名無しさん@お腹いっぱい。:2011/01/26(水) 23:54:29
そこまで要求シビアなのかな。
293名無しさん@お腹いっぱい。:2011/01/27(木) 00:09:15
まぁ、当座の課題を解決できればいい質問に
汎用性を求めるのはこのスレの常。
294名無しさん@お腹いっぱい。:2011/01/27(木) 00:55:59
分岐とか醜いことせず末尾のブランク行全部消してからひとつ付け足した方がスマートに思える。
cat "$FILE" | sed -e :a -e '/^\n*$/{$d;N;ba' -e '}'; echo
295名無しさん@お腹いっぱい。:2011/01/27(木) 01:14:19
それもありかもだけど、そうすると元のファイルを改変することになる
296名無しさん@お腹いっぱい。:2011/01/27(木) 01:31:29
操作前のデータの末尾にブランク行があったか無かったか判別できなくなってる時点で、元データの保存に意味があるとは思えないが…
297名無しさん@お腹いっぱい。:2011/01/27(木) 01:32:35
まぁそれだと
cat -s
でいーやという話になるかもしれんが。
298名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/27(木) 13:23:55
>>298
全然駄目じゃん。空行追加するというお題だぞ
300名無しさん@お腹いっぱい。:2011/01/27(木) 14:20:28
$mojiretsuに「hogehogefugafuga」が入ってる時

MOJI=`$mojiretsu | sed 's/fugafuga//'`
echo $MOJI
で「hogehoge」が取り出せます。
ところが、訳有りで「`」が使えない場合、どのようにしたら上記と同じ動作が可能でしょうか?
301名無しさん@お腹いっぱい。:2011/01/27(木) 14:26:47
>>300
echo ${mojiretsu%fugafuga}
302300:2011/01/27(木) 14:36:32
>>301
回答ありがとうございます。

書き忘れましたが、MOJIに代入してください。
※代入がうまくいかず困ってます
303名無しさん@お腹いっぱい。:2011/01/27(木) 14:40:19
>>300
>訳有りで「`」が使えない場合
これを具体的に言ったほうがいいよ
304名無しさん@お腹いっぱい。:2011/01/27(木) 14:41:14
>>302
MOJI=${mojiretsu%fugafuga}
305名無しさん@お腹いっぱい。:2011/01/27(木) 14:42:04
そんなくだらない「訳有り」な事情を潰す方が健全だと思う
306名無しさん@お腹いっぱい。:2011/01/27(木) 14:50:47
>>300
どんな訳があるの?
307名無しさん@お腹いっぱい。:2011/01/27(木) 14:52:11
>>304
できました、ありがとう。

他の煽りの方は放置して失礼します♪
308300:2011/01/27(木) 15:00:15
>>304
ありがとうございました!

>>306
理由を書くと長くなりますが
大きな「`」の中ですので
309名無しさん@お腹いっぱい。:2011/01/27(木) 16:04:59
つまり $() で済む話か。やっぱりくだらない理由だったな。
310名無しさん@お腹いっぱい。:2011/01/27(木) 16:10:58
>>309
解決後の後出し見苦しい
311名無しさん@お腹いっぱい。:2011/01/27(木) 16:12:25
`` の中なら>>304も無理じゃね?
312名無しさん@お腹いっぱい。:2011/01/27(木) 16:18:29
>>309
だな。やっぱりだ
313名無しさん@お腹いっぱい。:2011/01/27(木) 16:30:50
わざわざ外部コマンドのsed呼び出すより >>304 の方がエレガント
314名無しさん@お腹いっぱい。:2011/01/27(木) 19:53:55
``の中でも\`\`で使えるよな?
315名無しさん@お腹いっぱい。:2011/01/27(木) 21:15:27
それをさらに入れ子にすると
¥¥` ¥¥`なの?
316名無しさん@お腹いっぱい。:2011/01/27(木) 21:24:47
>>315
いいえ、3重目のネストは、¥¥¥`¥¥¥` になります。
317315:2011/01/27(木) 21:29:44
>>316
おぉ、言われてみればその通りだ。
ありがとう。4重目は
¥¥¥¥¥¥¥` ¥¥¥¥¥¥¥`
だね。
318名無しさん@お腹いっぱい。:2011/01/27(木) 21:36:12
問題: ` ` のn重目のネストに必要な¥の数をnを使って表せ。
319名無しさん@お腹いっぱい。:2011/01/28(金) 12:08:19
>>289,290
case文って何げに使えるよね
320名無しさん@お腹いっぱい。:2011/01/28(金) 16:13:39
すいません、二つのファイルの比較をして、共通する要素を抽出するのは
どういうコマンドを使ってスクリプトを作ればよいのでしょうか?

ファイル形式はタブ区切りで
一つ目のファイル(リファレンス)には
chr1 20513060 T C
という4つの要素が縦にずらずらっと並んでいます。
二つの目ファイルは
もっと要素も多いです。

やりたい処理は
一つ目と二つ目の要素が完全に一致するものを抽出しファイルに出力する。
出力ファイルの形式は
一つ目のファイルの4つの要素をならべ
その横に二つ目のファイルの3番目以降の要素を並べる、です。

盛りだくさんで書いてしまいましたが、
まずはファイルの要素を比較し、一致した要素を取り出すコマンドが
あれば教えてください。

321名無しさん@お腹いっぱい。:2011/01/28(金) 16:16:30
>>320
とりあえず一致した要素を取り出すコマンドは
comm
322名無しさん@お腹いっぱい。:2011/01/28(金) 16:18:49
>>320
盛りだくさんな質問と回答になりますので、2インシデントで承ります。
お取引の代理店を通じてご用命下さい。
323名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/28(金) 16:24:38
>>323
そういう処理は awk使った方が楽だが、
あえてシェルでやるなら、
2つのファイルをreadコマンドで1行ずつ読みながら
最初の2つのフィールドのみ比較して
一致していたら要素を並べて echoする。
・・という処理をwhileでループする。
外部コマンドは使わない。
325名無しさん@お腹いっぱい。:2011/01/28(金) 16:25:26
perlか何かで書いた方が楽じゃね。
326名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/01/28(金) 16:46:56
ありがとうございます。ありがとうございます。
>>326は私でも理解できます。
似たようなサンプルがないかawkの解説ページを調べてみます。
perlはやったことがないので今回はやめておきます。
328名無しさん@お腹いっぱい。:2011/01/28(金) 17:19:28
LLは何か身に付けといた方がいいよ。
シェルスクリプトで苦労してたのがあっさり書けることもある。
329名無しさん@お腹いっぱい。:2011/01/28(金) 23:04:44
最近、なんでもpythonだわ。
330名無しさん@お腹いっぱい。:2011/01/28(金) 23:07:04
pythonってワンライナーどうやんの?
331名無しさん@お腹いっぱい。:2011/01/29(土) 01:34:34
>>330
while( life != end ){ do( enjoy ); }
332名無しさん@お腹いっぱい。:2011/01/29(土) 02:00:57
>>330
ワンライナーは暗黒面。
333名無しさん@お腹いっぱい。:2011/01/29(土) 08:10:01
どなたか、鼻毛チェックスクリプトをワンライナーで書いて!
334名無しさん@お腹いっぱい。:2011/01/29(土) 16:07:56
while : ; do echo "鼻毛をチェキしてください!" ; sleep 86400 ; done
335名無しさん@お腹いっぱい。:2011/01/30(日) 02:12:16
標準出力の結果をスクリプトで使うにはどうすればいいのでしょうか?
例えば、
telnet (サーバ) 110
stat
とやって、その結果標準出力で出力されるメール数を値として保持しておいて、
その値を元に必要な数だけメールを取得するようにしたいのです。
336名無しさん@お腹いっぱい。:2011/01/30(日) 06:46:06
それ、標準出力やない
337名無しさん@お腹いっぱい。:2011/01/30(日) 10:00:18
標準的なものではないんだが、telnetじゃなくてnc(netcat)とかがあれば、それで。
338名無しさん@お腹いっぱい。:2011/01/30(日) 10:14:09
perlか何かで書いた方が楽じゃね。
339名無しさん@お腹いっぱい。:2011/01/30(日) 10:17:13
bashなら、/dev/tcp(笑)使ってできるよ。
340名無しさん@お腹いっぱい。:2011/01/30(日) 10:17:19
はいはいexpect expect

ところでexpect以外のtclって生き残っているのだろうか
341名無しさん@お腹いっぱい。:2011/01/30(日) 10:25:17
pyとかrbとかのexpectもあるはず。
zshならソケット作って自分でやりとりもできると思うけどね。
342名無しさん@お腹いっぱい。:2011/01/30(日) 10:28:56
tcl以外のexpectじゃなくて、
expect以外のtcl
っておっしゃってますが・・
343名無しさん@お腹いっぱい。:2011/01/30(日) 10:43:18
zsh の zpty というのもある
344名無しさん@お腹いっぱい。:2011/01/30(日) 10:52:55
macports の port コマンドは tcl で書かれてるな。
345名無しさん@お腹いっぱい。:2011/01/30(日) 10:53:16
>>342
>>340の質問に答えたわけじゃなくて、expectのお題を広げただけなので。
346名無しさん@お腹いっぱい。:2011/01/30(日) 11:02:42
そういえばtcl版のtimidity最近動かしてない
347名無しさん@お腹いっぱい。:2011/01/30(日) 11:22:56
perl で NIFTY に telnet 接続してメールや未読記事を取ってくるという
一世を風靡 nifty4u があったね。>>335 が perl でもいいというのなら
参考になるかも。

でも、ふつうに POP クライアントでメール取ってきて、それを
加工すればいいと思うのだけれど、そうじゃなくてわざわざ
POP プロトコルのやりとりをスクリプトでやりたいというのがよくわらかない。
348名無しさん@お腹いっぱい。:2011/01/30(日) 11:26:56
エスパーすると迷惑メールをPOPで取り込まずにDELEで削除したいとかだろ
STATだけじゃなくてTOPコマンドも併用すると便利
349335:2011/01/31(月) 01:44:48
みなさんありがとうございます。
与えてくださったヒントを参考にがんばってみます。
迷惑メールとかでは無くて、メーラーを使わずに自分でスクリプトを組んでメールの送受信をできればいいなあ・・・と思ったのです。
350名無しさん@お腹いっぱい。:2011/01/31(月) 02:11:48
>>330
$ python -c 's="hoge";print s'
hoge

最近、いままで perl で書いていたサーバ監視スクリプトなどを
どんどん python にしてる。
perl だと人によって書き方が大きく異なるからメンテナンス性が
悪いな〜と言う事で。
あと、ipython が神。

シェルスクリプトもメンテナンス性でいえば Perl と
似たような感じだけど、十数行のものはシェルスクリプトでも
メンテナンス性をそれほど気にしなくていいし、linuxrc などで
使うことを考えると簡単には捨てることはできない..
351名無しさん@お腹いっぱい。:2011/02/01(火) 15:02:28
>>350
ループとかifとかどう書くのか知りたいのよ。
352名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/02/01(火) 17:37:15
相当なエキスパートじゃないと無理そうだな。使いこなせる人は
すげーわ。
354名無しさん@お腹いっぱい。:2011/02/01(火) 17:41:40
べつにそんなことはないよ
向いてないのにワンライナーで書こうとすると無理がある、というだけの話
355名無しさん@お腹いっぱい。:2011/02/01(火) 17:45:31
356名無しさん@お腹いっぱい。:2011/02/01(火) 17:47:40
ワンライナーの書きやすさとしてはこんな感じでおk?
Perl>>Ruby>>>Python
357名無しさん@お腹いっぱい。:2011/02/01(火) 17:52:20
>>355
全般に笑えるが、特に例外処理が涙ぐましい&無理やりすぎてワロタw
358名無しさん@お腹いっぱい。:2011/02/01(火) 17:55:57
ワンライナーで書ける程度の複雑さならawk,sed,sortあたりを
組み合わせた方が楽なことも多いな。
359名無しさん@お腹いっぱい。:2011/02/01(火) 18:34:30
interfacesなどの設定ファイルの内容を書き換えるスクリプトを作りたいんですが
例えば
address 192.168.10.100
netmask 255.255.255.0
gateway 192.168.10.1
となっていたとして、各項目を置換するにはどういったコマンドを使えば
いいですか?
360名無しさん@お腹いっぱい。:2011/02/01(火) 18:44:05
こりゃまたずいぶんゆるふわな要求だな。
361名無しさん@お腹いっぱい。:2011/02/01(火) 18:52:37
>>359
それ、シェル初心者からよく聞く質問ですね。
シェルもUNIXも基本が大事。
基本原理を理解していればわかる問題です。
362名無しさん@お腹いっぱい。:2011/02/01(火) 19:43:52
>>359
/etc 以下のシェルスクリプトを探してみると
たいていそういう処理をしてるスクリプトが見つかる
363名無しさん@お腹いっぱい。:2011/02/01(火) 20:09:31
>>361
> それ、シェル初心者からよく聞く質問ですね。
一般的にシェルを作る粋狂なやつはあまりいないから
ほとんどの人がシェル初心者じゃないか?
364名無しさん@お腹いっぱい。:2011/02/01(火) 20:11:58
おれ、シェル始めて2週間の初心者だけど、
ハローワールド程度のシェルなら10種類以上作ったよ。
365名無しさん@お腹いっぱい。:2011/02/01(火) 20:15:43
まぁな
#include <stdio.h>
main ()
{
printf("hello world\n");
}
とか, 書いておいて getty から起動できるようにしておけばシェルだよな
366名無しさん@お腹いっぱい。:2011/02/01(火) 20:16:36
それはシェルとは言えないのでは
367名無しさん@お腹いっぱい。:2011/02/01(火) 20:16:41
> とか, 書いておいて
コンパイルされたものを <<<< この部分が抜けてた
> getty から起動できるようにしておけばシェルだよな
368名無しさん@お腹いっぱい。:2011/02/01(火) 20:18:25
>>366 /sbin/nologin もシェルだと思ってるから
369名無しさん@お腹いっぱい。:2011/02/01(火) 20:21:17
それするなら eliza 起動しときましょ
370名無しさん@お腹いっぱい。:2011/02/01(火) 20:58:30
ショートコーディング的ワンライナーシェル

s[64];main(){while(printf("> "),gets(s))system(s);}
371名無しさん@お腹いっぱい。:2011/02/01(火) 21:41:16
system()で/bin/sh利用するぐらいなら↓でよくね
main(c,v){execvp("sh",v);}
372名無しさん@お腹いっぱい。:2011/02/01(火) 22:05:09
/bin/sh利用しないで最低限のシェルにするとこうか? もっと短くならないかな

s[64];main(){while(printf("> "),gets(s))fork()?wait(0):(execlp(s,s,0),exit(1));}
373名無しさん@お腹いっぱい。:2011/02/01(火) 22:10:01
4文字短くした

s[64];main(){while(printf("> "),gets(s))fork()?wait(0):exit(execlp(s,s,0));}
374359:2011/02/02(水) 21:56:44
>362
具体的に、どんなスクリプトがありますか?
375359:2011/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名無しさん@お腹いっぱい。:2011/02/03(木) 11:50:25
Debian系の/etc/network/interfacesの話なら
書き換えスクリプト自作するより
mappingでも使った方がいいんじゃないの。
377名無しさん@お腹いっぱい。:2011/02/03(木) 11:52:21
378359:2011/02/03(木) 16:54:46
組込みの、uC-Linuxなんです
379名無しさん@お腹いっぱい。:2011/02/03(木) 17:55:44
本題と違うけど、引数とパラメータのチェックはcase文のところでまとめて
case $1/$# in
-r/3) ごにょごにょ ;;
-w/4) ごにょごにょ ;;
*) usage ;;
esac
などとやる手がある
380名無しさん@お腹いっぱい。:2011/02/03(木) 18:07:03
>>359
仕事は自分でやれ
381359:2011/02/04(金) 07:25:28
遊びなんです
382名無しさん@お腹いっぱい。:2011/02/04(金) 07:53:58
遊びは自分でやれ
383名無しさん@お腹いっぱい。:2011/02/05(土) 00:52:48
まぁいっぱい飲もうや。
384名無しさん@お腹いっぱい。:2011/02/11(金) 13:27:49
飲めないんです
385名無しさん@お腹いっぱい。:2011/02/11(金) 16:36:15
シェルは自分で書け
386名無しさん@お腹いっぱい。:2011/02/19(土) 01:18:14
環境はMacなんですが,HandBrakeCLIを使って,あるディレクトリより下(複数階層)の全部のm2tsファイルを違うディレクトリに変換したいです.
その時に,出力先にあるファイルは変換しないようにしたいのです.変換先のファイルは拡張子mp4です.

http://cl.ly/1d0S1e1D0L16261S1U1C

どこだめ?
387名無しさん@お腹いっぱい。:2011/02/19(土) 06:30:32
イタチguy
388名無しさん@お腹いっぱい。:2011/02/19(土) 11:11:12
板違いでもないと思うが途中ごとに意図した結果になっているか
echoなりcatなりしてみればいいと思う。

sh-bangがzshになってるけどzshの機能はぜんぜん使ってないこととか、
バッチなのに、対話環境用の.zshrcをわざわざ読み込んでいるとことか、
気になった。
389名無しさん@お腹いっぱい。:2011/02/19(土) 11:44:09
>>388
にゃるほどー・・・zshの機能は全然わかんないですorz
**/*くらいしかw
390名無しさん@お腹いっぱい。:2011/02/19(土) 12:05:25
ああ、**使ってたか(滝汗
391名無しさん@お腹いっぱい。:2011/02/20(日) 11:46:06.85
>>386
> その時に,出力先にあるファイルは変換しないようにしたいのです.

if [ ! -f mp4のパス名 ]; then
 処理
fi
392名無しさん@お腹いっぱい。:2011/02/22(火) 18:26:12.82
>>391
さすが!!それを聞きたかったのです!!
http://cl.ly/0m0k0B1u323H2n0g411d
かなり短く出来ますたありがとう!!
393名無しさん@お腹いっぱい。:2011/02/22(火) 22:23:35.29
あとはfind使うようにしてzshへの依存を無くせば良いね
394名無しさん@お腹いっぱい。:2011/02/26(土) 09:20:18.93
cat * | grep "xxxx"
でファイル内のxxxx文字列を探したいんですが、ディレクトリやバイナリーを
除外するってできますか
395名無しさん@お腹いっぱい。:2011/02/26(土) 09:29:00.61
>>394
grep 'xxxx' *
とすれば、ディレクトリやバイナリでも問題ないようにgrepが対応してくれるので、
そもそもディレクトリやバイナリを除外する必要がない。

あと、cat * | grep "xxxx" では、見つかった文字列のファイル名がわからないし、
catが無駄。
396名無しさん@お腹いっぱい。:2011/02/26(土) 09:31:18.69
>>394
ディレクトリは自動的に除外されるでしょう
バイナリーファイルの除外はGNU grepなら--binary-files=TYPEオプションを使えば可能かと
grep --binary-files=without-match "xxxx" *
397394:2011/02/26(土) 10:04:56.76
ありがとう
398名無しさん@お腹いっぱい。:2011/02/27(日) 19:39:14.53
find でがんばる、とか。
399名無しさん@お腹いっぱい。:2011/03/07(月) 18:51:48.92
bashで書いたスクリプトを、PHPの中からsystemで呼出してたとき、
文字列変数の内容を戻り値として渡すなんて事はできないですよね
400名無しさん@お腹いっぱい。:2011/03/07(月) 19:04:59.19
UNIXではプログラムの返り値はintです。(ほとんどの場合0-127)
PHPで文字列を受け取りたければ、popenを使いましょう。
401399:2011/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名無しさん@お腹いっぱい。:2011/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
403402:2011/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名無しさん@お腹いっぱい。:2011/03/08(火) 14:40:08.21
一番電気食うのは起動時らしいよ。
405名無しさん@お腹いっぱい。:2011/03/08(火) 14:50:16.64
クレーム来るほどの電気代ってペン4でも使ってるのか?
鼻毛あたりに交換すれば24時間通電でも省エネだよ。
406名無しさん@お腹いっぱい。:2011/03/08(火) 15:27:33.67
>>405
犯人はST31000340NS*2だよ。(ワットチェッカー読み)
ママンはD945GCFL2 2GB
あと電源、アクセスランプがうざいと
407名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/03/08(火) 15:47:01.29
わかってるなら2.5inchHDDとに換えればいいんじゃないかな
409名無しさん@お腹いっぱい。:2011/03/08(火) 16:08:55.05
こっちもあるよ。

自宅鯖PCにいくら電気代が掛かってるか晒すスレ
http://hibari.2ch.net/test/read.cgi/mysv/1095600824/
410402:2011/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名無しさん@お腹いっぱい。:2011/03/08(火) 16:19:57.94
>>410
つかクライアントの電気代も考えてるの?
なんか構成と目的が見えないわ

サーバって何を目的にしてるんだろう?
ファイル目的なら、ネットワーク対応のドライブでも下げれ
ば良さそうだし。
412名無しさん@お腹いっぱい。:2011/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名無しさん@お腹いっぱい。:2011/03/08(火) 16:57:29.39
>>412
クライアントの居ないときに消滅させられるなら
クライアントにvmwareでも仕込めば良さそうだがなぁ?

まぁ、いずれにシテもATOM/I3でSSDでいいんじゃねーの?
sambaの用途次第で2.5インチHDD
414名無しさん@お腹いっぱい。:2011/03/08(火) 17:45:52.70
ぜんぜんシェルスクリプトの話じゃないな。
415名無しさん@お腹いっぱい。:2011/03/09(水) 01:00:32.19
>>414
シェルスクリプトの話がじゃまされたくないほど
大量にあるなら、ジャンジャンどうぞ
416名無しさん@お腹いっぱい。:2011/03/09(水) 01:25:58.69
話題がなければ関係ない話をしていいってもんでもないよ。
417名無しさん@お腹いっぱい。:2011/03/09(水) 14:35:33.41
>>416
俺も喪前も含めて、そういう関係ない部分が保守となり
活性化の助けになるんだよ。

418名無しさん@お腹いっぱい。:2011/03/11(金) 21:42:37.11
下のようなスクリプトaddress.shをperl/CGIから
$addr = `address.sh -a`
$gate = `address.sh -g` と呼び出すと、-aはデータが得られず、-gはデータが
取得できます。
ターミナルからの実行では、どちらもデータを返しています。
なぜでしょうか?
#!/bin/sh
case $1 in
-a) DATA=$(/sbin/ifconfig eth0 | grep inetアドレス | awk '{print $1}' | awk -F: '{print $2}') ;;
-g) DATA=$(/sbin/route -n | grep UG | awk '{print $2}') ;;
esac
echo $DATA

OSはDebian5 -aはifconfigの出力からIPアドレスを選んでechoします
-gはroute -nの出力からデフォルトゲートウエイを選んでechoします
419名無しさん@お腹いっぱい。:2011/03/11(金) 22:00:56.54
>>418
LANGによって出力メッセージが変化している。
"inetアドレス"の部分はLANG=Cだと"inet addr"
UGはたまたまLANG=jaでも拾えただけ。
スクリプト内で明示したほうが良いね。
420名無しさん@お腹いっぱい。:2011/03/11(金) 22:03:42.57
優先順位的には LC_ALL に設定したほうが確実かな。
421418:2011/03/12(土) 14:09:39.29
>>419 420
原因が分かりました。ありがとうございます
422名無しさん@お腹いっぱい。:2011/03/15(火) 18:20:18.05
シェルで、telnet xxxx 110に接続し、user、passwd、STAT、QUITを
telnetのプロンプトに入力することってできますか?
423名無しさん@お腹いっぱい。:2011/03/15(火) 18:43:41.02
シェルはネットワークストリームを開くことはできません。
424名無しさん@お腹いっぱい。:2011/03/15(火) 19:24:49.82
質問の意図からすると、rshのような感じでできるかどうか訊いているんだろうが、
基本的にはできない。
特別なユーティリティを使って、無理矢理対話させることもできるが、
とてもめんどくさくなるから普通はやらない。
だから、その程度のことをやるときは、Perlなどでソケット通信を使う方が簡単でわかりやすい。
425名無しさん@お腹いっぱい。:2011/03/15(火) 19:51:21.89
expect 使えばいいのかしらね。
426名無しさん@お腹いっぱい。:2011/03/15(火) 20:02:09.16
expectのsampleに似た感じのが付いてるから、
それ見て書けばいいんじゃない?

>>424
たぶんtelnetに対するredirectを駆使して出来ないか聞いたんだと思われ
427名無しさん@お腹いっぱい。:2011/03/15(火) 21:17:22.34
expectって名前くらいしか知らんかったけど、
マニュアル見たら、コネクション維持したまま制御をスクリプトに持ってくるなんてこともできるのか。

>>426
「rshのような感じ」とは、その意味だよ。
428名無しさん@お腹いっぱい。:2011/03/15(火) 21:32:29.03
その意味ですかあ
429名無しさん@お腹いっぱい。:2011/03/15(火) 21:34:53.68
Python + libexpect = Pexpect
Perl + libexpect = expect.pm
430名無しさん@お腹いっぱい。:2011/03/15(火) 23:11:48.87
Pythonだと標準でtelnetlibがあるな
ttp://www.python.jp/doc/2.4/lib/telnet-example.html
こんなん

sshの場合は非標準だがparamikoとか
431名無しさん@お腹いっぱい。:2011/03/16(水) 02:18:52.18
nc
432名無しさん@お腹いっぱい。:2011/03/16(水) 12:22:29.81
telnetじゃないが例えばこんな感じであれば(機能が有効になってたら)可能。
#!/bin/bash

exec 5<>/dev/tcp/localhost/631
echo -en "GET / HTTP/1.1\n\n" >&5
while read line <&5
do {
    echo "$line"
}
done
433名無しさん@お腹いっぱい。:2011/03/16(水) 12:44:40.11
OS依存か
434名無しさん@お腹いっぱい。:2011/03/16(水) 12:51:37.28
>>433
OS依存じゃなくてbash依存。

/dev/tcpネタで恥晒してた回答者が何スレか前にいたの思い出したw
435名無しさん@お腹いっぱい。:2011/03/16(水) 13:01:59.32
なるほど勉強になる
436名無しさん@お腹いっぱい。:2011/03/16(水) 17:22:36.31
でもその方法だと、POPやSMTPなんかでは使えないね。
437名無しさん@お腹いっぱい。:2011/03/16(水) 19:01:31.50
>>436
いや、できるけど?
<&3, >&3すればいいので。
438 忍法帖【Lv=17,xxxPT】 :2011/03/16(水) 19:46:39.72
>>434
どの辺りがbash依存なのか教えて
bangの部分じゃないよね
439名無しさん@お腹いっぱい。:2011/03/16(水) 20:03:57.81
440名無しさん@お腹いっぱい。:2011/03/16(水) 20:13:06.08
>>438
/dev/tcp/とか/dev/udp/は
そういう機能を有効にしたbashであれば利用できる
ってこと

>>439 こっち
http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html
441 忍法帖【Lv=17,xxxPT】 :2011/03/16(水) 20:46:52.61
>>439-440
おぉレス返ってきた!
ありがとう。リンク先読んでじっくり勉強して来ます
442 忍法帖【Lv=17,xxxPT】 :2011/03/16(水) 20:53:11.21
bash は、以下の表にあるようなファイル名がリダイレクトに使用されると、それらを特別に扱います。

/dev/fd/fd
fd が有効な整数ならばファイル・ディスクリプター fd が複製されます。
/dev/stdin
ファイル・ディスクリプター 0 が複製されます。
/dev/stdout
ファイル・ディスクリプター 1 が複製されます。
/dev/stderr
ファイル・ディスクリプター 2 が複製されます。
/dev/tcp/host/port
host が有効なホスト名またはインターネットアドレスで port が整数のポート番号ならば、 bash は対応するソケットに対して TCP 接続のオープンを試みます。
/dev/udp/host/port
host が有効なホスト名またはインターネットアドレスで port が整数のポート番号ならば、 bash は対応するソケットに対して UDP 接続のオープンを試みます。

ファイルのオープンや作成に失敗すると、リダイレクトも失敗します。
---
これか。
>>432試したんだけど自分とこ/dev/tcpが無かった。
443名無しさん@お腹いっぱい。:2011/03/16(水) 21:17:02.00
lsとかでは見えないんじゃね。
444名無しさん@お腹いっぱい。:2011/03/17(木) 04:30:46.33
>>437
セッション維持したまま、応答に対して分岐できるの?
445名無しさん@お腹いっぱい。:2011/03/17(木) 06:16:05.07
>>444
できる。
だからこそ、最初に exec 5<> とかで同じソケット開きっぱなしにしてるんだろ。
446名無しさん@お腹いっぱい。:2011/03/17(木) 11:16:15.68
>>444
シェルスクリプトのファイルI/Oを理解出来てないね。
447名無しさん@お腹いっぱい。:2011/03/18(金) 08:56:39.45
あるディレクトリの一番新しいファイル一個てどうやって抽出できる?
448名無しさん@お腹いっぱい。:2011/03/18(金) 09:03:16.26
ls -lt|head -1
449名無しさん@お腹いっぱい。:2011/03/18(金) 09:25:28.51
`-1'オプションの方が良くない?

ls -1t | head -1
450名無しさん@お腹いっぱい。:2011/03/18(金) 09:42:02.26
出力がパイプだと端末以外になるから-1がデフォなんで
いちいち書かなくても-tだけでいいよ。
451名無しさん@お腹いっぱい。:2011/03/18(金) 10:54:08.46
>>450
$ ls -lt | head -1
total 14116088
$ ls -1t | head -1
gonzui.log

'-l'の結果に笑った

ちなみに
$ ls -lt | head -n3
total 14116088
-rw-r--r-- 1 hoge staff 1132 3 15 22:39 gonzui.log
-rw-r--r-- 1 hoge staff 64 3 12 22:42 k.txt
って感じになっている。
452名無しさん@お腹いっぱい。:2011/03/18(金) 14:01:44.16
明示的に -l つければそりゃそれ使うわ。
ls -t | でいいってこと。
453名無しさん@お腹いっぱい。:2011/03/18(金) 14:07:28.85
-h | --help とオプションつけたいんだけどどうすりゃいい?
外部コマンド使わないと無理?
454名無しさん@お腹いっぱい。:2011/03/18(金) 14:20:24.77
case "$1" in
-h|--help)
なんだかんだ;
;;
esac
455 忍法帖【Lv=18,xxxPT】 :2011/03/18(金) 14:52:36.60
>>454
hoge -v -s -x -g -d -h
hoge -v -s -h -g -d -x
456名無しさん@お腹いっぱい。:2011/03/18(金) 14:55:17.62
whileで囲って、なんだかんだでshiftもする。
定形パターン。
457名無しさん@お腹いっぱい。:2011/03/18(金) 15:31:36.76
え?
458名無しさん@お腹いっぱい。:2011/03/18(金) 16:31:11.79
お?
459名無しさん@お腹いっぱい。:2011/03/18(金) 18:50:54.63
>>453
たぶんbuilt-inでgetoptsがあるはず
POSIX規定の外部コマンドのgetoptもあるんじゃないか?
460名無しさん@お腹いっぱい。:2011/03/18(金) 19:03:31.35
getoptsってbashだけじゃなかったっけ?
461名無しさん@お腹いっぱい。:2011/03/18(金) 19:20:09.48
>>460
SunOSのshにすらある
462名無しさん@お腹いっぱい。:2011/03/18(金) 21:24:03.77
Sunがもう無いけど
463名無しさん@お腹いっぱい。:2011/03/19(土) 01:05:40.03
プロダクト名には残ってるんじゃないかな
464名無しさん@お腹いっぱい。:2011/03/19(土) 08:47:25.04
>>450
ありがと!!
465名無しさん@お腹いっぱい。:2011/03/19(土) 15:27:14.48
>>450
BSD由来の機能だからSVR3とか違うUNIXもあるぞw
466名無しさん@お腹いっぱい。:2011/03/20(日) 19:33:21.00
zshのパス設定はどこで行うべきでしょうか?
bashと同様に、.zprofileで環境設定$PATHに設定すればとりあえず良さそうなのですが、
ネットで調べると、.zshenvでシェル変数pathに設定しているケースをよく見かけます。
それぞれの設定方法の違いや利点などがあれば教えていただけないでしょうか。
467名無しさん@お腹いっぱい。:2011/03/20(日) 20:11:43.50
468名無しさん@お腹いっぱい。:2011/03/25(金) 10:46:26.53
複数のディレクトリを処理していくスクリプトを/bin/shで作っています。
既に処理済みのディレクトリをスキップしたいのですが、処理済みリスト
の保持方法で詰まっています。
ファイルに保存してgrepするというのを考えましたが、ダサいし、削除処
理が面倒なので、オンメモリで保持したい。どのように保持すればよいでしょう?

制約:
該当ディレクトリにcookieファイルを作成することはできません。(リードオンリーの場合もある)
/bin/sh限定です。(配列は使用できません)
その他条件:
ディレクトリ数は高々数百です、1000を大きく超えることはありません。
469名無しさん@お腹いっぱい。:2011/03/25(金) 11:52:45.83
checked_ディレクトリ名=1 とかしときゃいいんじゃねーの?
470名無しさん@お腹いっぱい。:2011/03/25(金) 11:54:58.21
ちゃんとしたLL使った方がいいんじゃないの。
471名無しさん@お腹いっぱい。:2011/03/25(金) 18:01:22.21
>>453
see /usr/bin/autoconf
472名無しさん@お腹いっぱい。:2011/03/25(金) 18:34:39.29
>>468
別の場所にディレクトリ構造のミラーだけつくっといたら

たとえばGNUのdiffなら
diff --brief mirror1 mirror2
でディレクトリ構造の差分が取れると思うので、
LANG=Cで実行して出力をパースすればいいと思う
473名無しさん@お腹いっぱい。:2011/03/26(土) 00:27:58.51
>>468
単純にリストをシェルのパラメータに保存するのはだめなの?
概念的にはこんな感じで。 linux 環境なんで bash の /bin/sh エミュでしか試してないけど。
注1: ディレクトリ名に改行文字が含まれていないことが前提
注2: sed, grep に渡す $1 は、そこに含まれる正規表現メタ文字をエスケープしといて

#!/bin/sh

NL='
'
LIST=''

list_append() {
 LIST="${LIST}${NL}${1}"
}

list_has() {
 echo "$LIST" | grep "^${1}\$" >/dev/null 2>&1
}

list_remove() {
 LIST="$(echo "$LIST" | sed "\:^${1}\$:d")"
}
474名無しさん@お腹いっぱい。:2011/03/26(土) 11:13:25.73
未処理のディレクトリのリストアップだけをする部分と
実際に処理を行う部分をパイプで繋ぐという作りにする。

ことはできないのだろうか。
475468:2011/03/26(土) 11:31:57.59
>>469,473を参考にこうしました。チェックにexprを使ったらarglistの
制限に引っかかったので、caseで逃げました。
# Usage: member elt list
member()
{
local list_name -
list_name="list_$2"
eval case \""\$${list_name}"\" "in *:$1:*) true;; *) false;; esac"
}
# Usage: append_list list elt
append_list()
{
local list_name -
list_name="list_$1"
member "$2" "$1" && return 1 || eval ${list_name}=\"\${${list_name}:-:}$2:\"
}
# Usage: empty_list tag
empty_list()
{
local list_name -
list_name="list_$1"
eval unset "${list_name}"
}
476名無しさん@お腹いっぱい。:2011/04/01(金) 19:42:04.11
ルート権限が必要なスクリプトで、スクリプトを実行してるのが
rootかどうかをチェックするにはどうすれば良いですか?
477名無しさん@お腹いっぱい。:2011/04/01(金) 19:55:40.57
test $UID = `id -u root`
478名無しさん@お腹いっぱい。:2011/04/01(金) 21:49:05.90
>>476
俺は↓こんな感じで動かしてるわ。

if [ ! `whoami` = "root" ]; then
echo "このプログラムはroot権限が必要です。"
exit
fi
479名無しさん@お腹いっぱい。:2011/04/01(金) 22:52:59.52
「ルート権限」と書いてあるのでおそらく superuser かどうかを知りたいのだと思うけど、
その場合それを知る律儀な方法はUID(EUID) が 0 かどうかを調べる。
superuser(UID=0) のユーザ名が必ずしも "root" とは限らないから。(まあ99% root だろうが)

posix sh 互換なら [ ${EUID:-${UID}} = 0 ] あたりが無難だろうか。
480477:2011/04/02(土) 07:10:49.39
ありがとう
481名無しさん@お腹いっぱい。:2011/04/02(土) 13:21:39.17
ルート権限が必要なコマンドでフェイルするからあえて調べない。
必要な場合はスクリプトファイルをchmod go-rxだな。
482sage:2011/04/03(日) 00:58:03.42
コマンドラインにパイプ等で渡して
バイナリ表示した文字列を復元する方法を教えていただけないでしょうか。

$echo 'あいうえお' | od -Ax -tx1
000000 e3 81 82 e3 81 84 e3 81 86 e3 81 88 e3 81 8a 0a
↑上記を「あいうえお」に戻したいです

すみません
483名無しさん@お腹いっぱい。:2011/04/03(日) 01:11:56.48
echo 'あいうえお' | od -Ax -tx1 | awk '{ $1 = ""; for (i=2;i<NF;i++) { print $i }}' | while read i; do printf "\x$i"; done
あいうえお
484名無しさん@お腹いっぱい。:2011/04/03(日) 01:13:07.28
i<=NFの間違い
485名無しさん@お腹いっぱい。:2011/04/03(日) 01:26:11.78
cd "$1"
targets=`find . -name "filename" -type d`

if [ ${#targets[@]} = 0 ] then; do
echo "該当するファイルはありません。"
exit
fi

for tmp in ${targets[@]}; do
echo $tmp
done

こんな感じで文字列に該当するディレクトリの一覧を出力したいのですが、
配列の要素数でファイルがない場合を分岐しようとすると該当ファイルがなくても要素数が1になってしまいます。
良い方法はないでしょうか?
486名無しさん@お腹いっぱい。:2011/04/03(日) 01:36:39.88
if [ -z "${targets[1]}" ]; then
487名無しさん@お腹いっぱい。:2011/04/03(日) 01:47:30.95
>>484
たすかりました
488名無しさん@お腹いっぱい。:2011/04/03(日) 01:59:14.44
>>486
0オリジンだぜ。
489名無しさん@お腹いっぱい。:2011/04/03(日) 21:50:28.46
配列の開始索引番号は zsh が 1、bash が 0。
(zsh は ksh_arrays オプションで変更可能)
490名無しさん@お腹いっぱい。:2011/04/03(日) 22:48:02.12
>>483
awkのみで

awk '{ $1 = ""; for (i=2;i<=NF;i++) { printf("%c", strtonum("0x" $i)); }}'
491名無しさん@お腹いっぱい。:2011/04/09(土) 09:34:35.16
rcs管理してるファイルに昔書いたけど今は削除してしまったキーワードが書いてあった
バージョンだけさっと取り出すようなシェルってできる?
492名無しさん@お腹いっぱい。:2011/04/09(土) 09:42:44.54
シェルってゆうな。クズ。
493名無しさん@お腹いっぱい。:2011/04/09(土) 11:20:35.26
shellを新たに作るとは精力が余っているのですね
ガンバレー
494名無しさん@お腹いっぱい。:2011/04/09(土) 11:36:58.18
おまえら「シェル」に突っ込んでるけど、
「シェルスクリプト」って質問に書いてあったら
答えられないんだろww
495名無しさん@お腹いっぱい。:2011/04/09(土) 11:52:37.00
煽らずに、ごめんなさいして質問しなおせば教えてやったのに。残念だな。
496名無しさん@お腹いっぱい。:2011/04/09(土) 11:59:50.79
用途を限定した簡易版なら、シェルを書くのはそう難しくないんじゃないかな
シェルを作ると言ってる人が一から書き始めるとも限らないし
497名無しさん@お腹いっぱい。:2011/04/09(土) 12:11:51.78
498名無しさん@お腹いっぱい。:2011/04/09(土) 15:59:51.48
>>495
おれ、質問者じゃなくて回答者の立場だけど、
じゃあ、ちなみに >>495 が知ってる回答を先に答えてみ。
(まあ、知ったかだろうから無理だろうけど)

>>495 がギブアップしたら俺が答えるから。
499名無しさん@お腹いっぱい。:2011/04/09(土) 16:08:15.63
>>498
素直にごめんなさいすれば、教えてやったのに残念だな。w
500名無しさん@お腹いっぱい。:2011/04/09(土) 16:12:37.65
>>499
おれ回答者だよ。お前やっぱり知らないんだな。
501名無しさん@お腹いっぱい。:2011/04/09(土) 16:14:41.27
>>498
はいはい。ギブアップ。お前が教えてやれ。www
502名無しさん@お腹いっぱい。:2011/04/09(土) 21:24:05.59
自称回答者はどこに消えたんだ? w
503名無しさん@お腹いっぱい。:2011/04/10(日) 01:16:57.74
消えた自称回答者に代わって、まずは叩き台をばばば

for rev in `rlog FILE | grep '^revision ' | cut -d' ' -f 2-`
do
 if co -p$rev FILE 2>/dev/null | grep KEYWORD > /dev/null; then
  echo "KEYWORD found in $rev"
  break
 fi
done
504名無しさん@お腹いっぱい。:2011/04/10(日) 13:03:24.87
単精度計算を簡単に行う方法について教えてください。
505名無しさん@お腹いっぱい。:2011/04/14(木) 20:39:04.99
>>504
echo "1.1 * 2.2" | bc
みたいな感じとかは?
506名無しさん@お腹いっぱい。:2011/04/14(木) 21:09:28.08
bcって倍制度じゃないの?
507505:2011/04/14(木) 21:39:13.89
いや任意精度ですね。
$ echo "scale=99;1/7" | bc
.1428571428571428571428571428571428571428571428571428571428571428571\
42857142857142857142857142857142

小数演算がしたいのかと勝手に思い込んだ。厳密に「単精度」「倍精度」を期待してたならスマソ。
508名無しさん@お腹いっぱい。:2011/04/15(金) 06:38:20.71
>>505-507
ありがとうございます。
509名無しさん@お腹いっぱい。:2011/04/17(日) 01:23:14.03
引数に渡した文字『あいう』を、『*あ*い*う*』に変換したいのですが、うまくいきません。
スマートに変換できる方法、ありませんでしょうか?
510名無しさん@お腹いっぱい。:2011/04/17(日) 01:45:19.21
echo "あいう" | sed -e 's/\(.\)/*\1/g' -e 's/$/*/'
511名無しさん@お腹いっぱい。:2011/04/17(日) 01:54:37.16
>>510
早速試してみます。ありがとうございます!
512名無しさん@お腹いっぱい。:2011/04/17(日) 03:53:00.70
Taro and Mary having sex.
なんつうテキストがあったときに、awkでandの前後を拾いたい、
ただしandはANDとかAndとかかもしれない、という状況で、以下の事を知りたいです。
・大文字小文字無関係でandを区切りとしたい場合、
awk -F [Aa][Nn][Dd]
で実現はできたのですが、他によい方法はありますか?
区切りとしたい単語が長くなると、指定が厄介だと思ってます
IGNORECASEを設定しても、/〜/の正規表現の箇所でしか有効でないようです
・区切りの前後の単語を拾うとき、例えば区切りの前を拾うときは
awk -F [Aa][Nn][Dd] '{print $1}' | awk '{print $NF}'
としているのですが、awkを二回使ったりしているあたりが
改善の余地があるのではないかと思ってます
他によい方法はありますか?
513名無しさん@お腹いっぱい。:2011/04/17(日) 07:43:14.48
>>512
echo a and b c d And e | awk -v RS=" " -v IGNORECASE=1 '!/and/{b=$0}/and/{print b;geline;print}'
a
b
d
e
514名無しさん@お腹いっぱい。:2011/04/17(日) 13:53:07.68
>>513
なるほど
andでなければ退避、andなら退避したものと次の行を表示、ですね
ありがとうございました
515名無しさん@お腹いっぱい。:2011/04/17(日) 15:21:21.61
しかしなんつう例文だw
516名無しさん@お腹いっぱい。:2011/04/17(日) 23:37:18.81
>>515 plus
否、英文で・・・
517名無しさん@お腹いっぱい。:2011/04/18(月) 00:30:16.46
>>514 plus
awk -v NF = substr([a-A],[^n-N],[^d-D]) '{print $1}' | awk -f ... '{print $NF}'
走査確認はして居りませんが・・・
518511:2011/04/18(月) 23:11:38.09
2バイト文字が入ったら、うまく判定されませんでした。
echo "あいう" | sed -e 's/\(..\)/*\1/g' -e 's/$/*/'
とやると2バイト文字は判定されるんですが、今度は1バイト文字が判定されません。
なにが問題か、ご教授お願い致します。
519名無しさん@お腹いっぱい。:2011/04/18(月) 23:55:29.21
perlで>>510の正規表現使えば?
520名無しさん@お腹いっぱい。:2011/04/19(火) 02:32:27.94
いまどき(マルチバイト)エンコーディングに対応してない sed なんてあるの?
521 忍法帖【Lv=31,xxxPT】 :2011/04/19(火) 04:28:51.01
busybox sed とか?
522名無しさん@お腹いっぱい。:2011/04/19(火) 06:22:14.68
LANG=ja_JP.eucJP sed ...
523名無しさん@お腹いっぱい。:2011/04/19(火) 12:40:22.96
sed 's@/lib\(64\)\?/ld@/tools&@g'
と言うスクリプトの場合、@は何の意味?
524名無しさん@お腹いっぱい。:2011/04/19(火) 12:45:46.59
sed 's#そんなことも知らんのか#あほか#'
と言うスクリプトの場合の、#と同じ意味
>>523
man sed

sed 's/\/lib\(64\)\?\/ld/\/tools&/g'
これより見やすいだろ?

次からはLFSスレで聞けよ
526名無しさん@お腹いっぱい。:2011/04/19(火) 13:05:18.92
sed の正規表現を perl と共通にしといてくれよと
思うことは時々ある

# だったら perl 使えよ
527名無しさん@お腹いっぱい。:2011/04/19(火) 13:09:56.67
perl の方が後だから話が逆じゃね。
528名無しさん@お腹いっぱい。:2011/04/19(火) 13:43:49.70
perl regex の方が高機能だからだろ
529523:2011/04/19(火) 18:41:53.23
そうかs直後の文字が区切り文字として認識されるのね
どうもです

530名無しさん@お腹いっぱい。:2011/04/19(火) 19:45:35.17
ファイルの内容を、そっくりそのまま変数に入れたいと考えてます

AAA=`cat /etc/hosts`とすると、変数echo $AAAで内容が確認できたので
この調子でやればよいかと思っていたのですが、ファイル内に書いてある*が
展開される(?)のか、Cのソースを読ませた時はコメントの/*が/usrだの/etcだのに
展開されたり、*がカレントディレクトリのファイル一覧になったりと、
意図した結果が出ずに悩んでいます

対処法って、ありますか?
531名無しさん@お腹いっぱい。:2011/04/19(火) 19:58:56.42
>>530
echo "$AAA"
532511:2011/04/19(火) 23:23:03.44
sedのバージョンをアップしたら解決しました。
ありがとうございました。
533名無しさん@お腹いっぱい。:2011/04/20(水) 19:30:24.29
テキストで、ある単語以降を削除したいと思ってます

イメージとしては
aaa bbb ccc
ddd eee fff
ggg hhh iii
というファイルについて、eee以降を削除して
aaa bbb ccc
ddd
という結果を得たいです

いったん、sed s/eee/?
eee/ と改行させてから、sed /eee/,$dと行単位の範囲削除やってるのですが
何か無駄な気がしてます
534名無しさん@お腹いっぱい。:2011/04/20(水) 19:39:10.88
/eee/{s/eee.*//;q}

とか?
535名無しさん@お腹いっぱい。:2011/04/20(水) 19:40:58.21
あ、GNU sedだとなくても通ったけど、正しくは、qの後ろにも;がいるかも。
536名無しさん@お腹いっぱい。:2011/04/20(水) 19:45:03.93
>>535
こういうやりかたがあるのですね

当方AIX5のsedですが、試してみます
537 忍法帖【Lv=33,xxxPT】 :2011/04/21(木) 00:17:24.25
$ sed 's/eee/{s/eee.*//;q}' test.txt
sed: bad option in substitution expression

$ sed 's/eee/{s/eee.*//;q;}' test.txt
sed: bad option in substitution expression

こうなった
538 忍法帖【Lv=33,xxxPT】 :2011/04/21(木) 00:20:49.96
sed '/eee/{s/eee.*//;q;}'

できた!
539名無しさん@お腹いっぱい。:2011/04/21(木) 00:50:54.36
質問です。

以下のファイルがあるとします。
----------
$ cat hoge.dat
aaa
bbb
ccc
ddd
eee
----------

このファイルを先頭からよんでゆき、最初に見つかったCCCの行から下全部を表示するにはどうしたらいいでしょうか?

よろしくご教示お願いします。
540名無しさん@お腹いっぱい。:2011/04/21(木) 00:55:23.11
>>539

sed -n '/^ccc/,$p' hoge.dat
541名無しさん@お腹いっぱい。:2011/04/21(木) 01:00:34.54
>>540
できた!
まじ、ありがとうございます!
542 忍法帖【Lv=33,xxxPT】 :2011/04/21(木) 01:07:45.54
forとwhileが浮かんでしまった
これもsedで出来るのかぁ!
543名無しさん@お腹いっぱい。:2011/04/21(木) 02:40:38.43
hold spaceまで駆使して始めてのsed漢
544名無しさん@お腹いっぱい。:2011/04/21(木) 06:17:08.22
sedの話題はsedスレ池。

sed
http://hibari.2ch.net/test/read.cgi/unix/1085730992/
545名無しさん@お腹いっぱい。:2011/04/21(木) 06:22:55.60
>>544
死ね
546名無しさん@お腹いっぱい。:2011/04/21(木) 08:02:47.16
>>545
なんで?
547名無しさん@お腹いっぱい。:2011/04/21(木) 08:11:05.70
鬱陶しいなお前
548名無しさん@お腹いっぱい。:2011/04/21(木) 08:24:13.28
>>537-538
最初の/eee/はsコマンドじゃなくて、アドレス指定だからな。
549名無しさん@お腹いっぱい。:2011/04/21(木) 08:55:44.46
>>544
死ねクズ。
質問者はsed一発で出来ると思わなかったからこのスレで質問した。
なんの問題もない。
550名無しさん@お腹いっぱい。:2011/04/21(木) 09:13:02.17
>>549
>>523

最初からsedで質問されてますが、、
551名無しさん@お腹いっぱい。:2011/04/21(木) 09:33:03.02
>>550
死ねクズ。
直近のsedの話題は>>539-543>>523を追い出したいならアンカー付けろ。
552名無しさん@お腹いっぱい。:2011/04/21(木) 09:37:44.06
>>551
>>533 も最初からsedの質問してるな。
553名無しさん@お腹いっぱい。:2011/04/21(木) 09:40:05.63
なら、それにアンカー打て。カス。
554名無しさん@お腹いっぱい。:2011/04/21(木) 10:27:32.49
>>552
>>533 は自分はsedを使ってやってみた、と書いてるだけで、
必ずしもsedでの解法を求めているわけではないように見える。
555名無しさん@お腹いっぱい。:2011/04/21(木) 14:04:10.51
>>553
涙拭けよ
556名無しさん@お腹いっぱい。:2011/04/21(木) 14:13:13.22
ちょっとsedの話題出たからってすぐ誘導するのはいかがなものか?
心の狭いお方だ
557名無しさん@お腹いっぱい。:2011/04/21(木) 14:15:35.73
俺は検索でもawkっちまう男なんだぜ?
558名無しさん@お腹いっぱい。:2011/04/21(木) 14:24:16.70
ちょっと誘導されただけでなんで荒れるんだ。
559名無しさん@お腹いっぱい。:2011/04/21(木) 14:30:35.47
誘導するなら質問直後にやれば?
回答が出終わってるんだから黙ってたらいいのに
560名無しさん@お腹いっぱい。:2011/04/21(木) 14:33:52.19
たまたまその時見てなかっただけじゃない?
誘導ってそんな怒るほどのことなのかな。
561名無しさん@お腹いっぱい。:2011/04/21(木) 14:46:28.71
粘着誘導だからね。
562名無しさん@お腹いっぱい。:2011/04/21(木) 15:10:46.07
563名無しさん@お腹いっぱい。:2011/04/21(木) 15:38:29.24
お前の行動が意味不明
564名無しさん@お腹いっぱい。:2011/04/21(木) 17:16:21.90
>>560
別に怒ってるわけじゃないよ
ただ鬱陶しいだけ
565名無しさん@お腹いっぱい。:2011/04/22(金) 01:11:15.11
質問です。

以下の形式のファイルを、
----------------------
[2011.04.01]
123
123
[2011.04.02]
333
333
[2011.04.03]
444
444
----------------------

以下のように、3つに分割するシェルスクリプトを書くにはどうしたらよいでしょうか?
----------------------
[2011.04.01]
123
123
----------------------
[2011.04.02]
333
333
----------------------
[2011.04.03]
444
444
----------------------
566名無しさん@お腹いっぱい。:2011/04/22(金) 01:38:57.62
csplit file.txt '/^\[.*\]/' '{*}'
567名無しさん@お腹いっぱい。:2011/04/22(金) 19:42:27.95
$ t1() { echo a; echo b; return; echo c; }
$ t1
a
b
ふむ

$ t2() { echo a; echo b |return; echo c; }
$ t2
a
c
えー!

サブシェル内は別環境って忘れててやられたわ
エラー出ないのは仕様?他のどのシェルもこうなの?

$ bash --version
GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
568名無しさん@お腹いっぱい。:2011/04/22(金) 20:12:15.15
returnはfunction呼び出し内でしか使用できないシェルもあったような気がするけど、
ashでも同じ結果。returnすなわちexitみたいだ。
569名無しさん@お腹いっぱい。:2011/04/22(金) 20:38:30.06
>>568 は、>>567 の意味を理解してないなw
エラー出ないのは、文法的には間違ってないので、それで仕様。
kshやzshだとパイプがサブシェルにならないから、
パイプ中のreturnで関数から抜けられる。
570名無しさん@お腹いっぱい。:2011/04/22(金) 23:59:49.99
>>569
理解してないのはお前。バカは黙ってればいいのに。ww

>>567-568の意味は、bashやashはパイプの尻尾がサブシェルになるから(だから
echo cが実行される)、本来functionからの脱出の構文であるべきreturnは構文
エラーになるべき。でも、bashもashも構文エラーにならない。
571名無しさん@お腹いっぱい。:2011/04/23(土) 00:11:15.91
>>568
ash=dash(Cygwin dash 0.5.6.1-2)のmanには

> The syntax of the return command is

>    return [exitstatus]

> It terminates the currently executing function. Return is implemented as
> a builtin command.

ってあるからfunctionの中限定かと思ったら、確かに終了するね…
だけど

$ return
bash: return: can only `return' from a function or sourced script

普通こうならない?こっちの方がたくさんありそうだが(POSIXモードでもこうなる

>>569
ありがとウサギ! やっぱりサポートしてるシェルもあるんだね
確かに意味的に変な挙動でも、文法的に間違ってない。 そのまま通るから困るんだよなー
こういうときどう書くべきか… 一番いいアイデアをたのむ

# 一時ファイル?パラメータに展開する?場合によるけどいい気がしない
572名無しさん@お腹いっぱい。:2011/04/23(土) 07:54:06.34
>>570
理解してないのはお前。

returnは「構文」ではなくて単なるコマンド。
コマンドとして正しく使われているから「構文エラー」にならない。
$ type return
return is a shell builtin

「構文」なのはifとかwhileとか。
$ type if
if is a shell keyword
573名無しさん@お腹いっぱい。:2011/04/23(土) 08:54:18.85
>>572
言葉の定義に突っ込み始めたお前の負け。ww
構文だろうが、コマンドだろうが、ビルトインコマンドだろうが、>>570の本質は変わらない。

お前、バカなんだから出てくんな。
574名無しさん@お腹いっぱい。:2011/04/23(土) 09:07:26.55
>>573
お前aho w

returnは「コマンド」だから、本来どこで使っても文法エラーにならない。
ただしbashでは、関数外の素のreturnはエラーになる。

それとは別にパイプがサブシェルになる問題があって、
bash/ash等はパイプ中のreturnでは関数を抜けられない。
ksh/zsh等はパイプ右端のreturnでも関数を抜ける。
575574:2011/04/23(土) 09:45:06.14
>>571
エスパると、関数の中で

echo hoge | while ... return ... done
ってやりたいんだろ?

while ... return ... done <<< "$(echo hoge)"
で回避する方法が一応あるけどな。
576名無しさん@お腹いっぱい。:2011/04/23(土) 09:49:58.08
シェルはfunctionを構文として、returnは他のコマンドと同様に処理してたわけか
なるほど、気がつかなかった。思い込んでたわ

returnがコマンドとして実行されるタイミングでは、サブシェルにも
functionの中っていう情報は伝わってるから、>>571みたいなエラーにならない訳ね

でもやっぱり挙動としてはおかしいと思うよ
構文エラーは行き過ぎだと思うが、警告は欲しいところ

# 構文にreturnを組み込むと、エラーを出すのはfunctionの定義のところになりそう
# そのときに、それがサブシェルの中だってエラー出すのは出来なくないけど
# そこまでシェルに判断させるべきか?

仕様なら仕方ないと思わなくないし、互換性のためだって言われそうだが
こんな出鱈目な仕様に依存するスクリプトなんて捨てたほうがいい

なぜ素通りさせるのだろうね、メリットないじゃん
577名無しさん@お腹いっぱい。:2011/04/23(土) 10:09:40.20
>>575
thx!
おお、ヒアドキュメントっぽい
やっぱあるのか、調べ足らなかった

読み返したら必要なこと書いてなかった
その通りで、whileにパイプしようとしてて
挙動おかしくて、削っていったらあの形になったんだった

これも一度展開して読み込ますタイプ?
manには何もないけど制限はあるのかな

パイプだとコンカレントで動いてくれそうなんだよね
CPUいっぱい!が今なんだから、どうにかならないかと思うんだが
578名無しさん@お腹いっぱい。:2011/04/23(土) 10:25:02.00
>>577
bashの場合、ヒアドキュメントは内部で一時ファイル作るから、
コンカレントには動かないな。

mkfifoでFIFO作ってリダイレクトするならコンカレントになるけど、
あまり美しくないのが難点。
579名無しさん@お腹いっぱい。:2011/04/23(土) 10:32:00.45
bash4限定だけどcoprocなんてのがあった

$ coproc {
>  echo x
>  read   # 即終了を防ぐ
> }
[1] 1508

$ while read -u ${COPROC[0]} A; do
>  echo >&${COPROC[1]}   # コプロセスのreadを抜けるため
>  echo $A
> done
a

kshからインスパイアされた機能らしいが
移植性考え出すと難しいな

>>578
これはFIFOと似たようなものかな
bashだけで出来るよっていう以外に差がない
580名無しさん@お腹いっぱい。:2011/04/23(土) 11:09:19.42
>>574
言葉の定義にしか突っ込めなくなったお前の負け。
>>568はパイプの尻尾のサブシェル問題を踏まえた発言だ。

引っ込んでろバカ。
581名無しさん@お腹いっぱい。:2011/04/23(土) 11:18:27.85
>>580
定義を抜きにしても間違ってる

>>568
「returnを関数以外で使えるか」
「returnがexitみたいに動作する」
の点に言及してるだけで
パイプやサブシェル問題には一切触れてない
(多分書き込み時点では知らなかったのだろうw)
582名無しさん@お腹いっぱい。:2011/04/23(土) 11:29:49.63
>>581
お前のようなバカを相手に回答したわけではない。

>>567で既にサブシェルに対する言及がありそれへのレスだ。>>567の質問は
> エラー出ないのは仕様?他のどのシェルもこうなの?
だ。
これはreturnがfunction外でも使えてしまった事への疑問に対する質問に他ならない。
したがって、>>568のように答えた。>>571は回答の意味を理解している。

お前が周回遅れのバカって事だ。
583名無しさん@お腹いっぱい。:2011/04/23(土) 11:41:23.17
>>582

>>567 のreturnはあくまで「関数内のreturn」だよ
なのに>>568 では質問していない「関数外のreturn」について回答してるし
質問のポイントをわかっていない
584名無しさん@お腹いっぱい。:2011/04/23(土) 11:57:26.99
>>583
必死だな。バカ。サブシェルはどこ行ったんだよ。ww

関数内のreturnを「エラー出ないのは仕様?他のどのシェルもこうなの?」と聞くわけないだろ。
>>567はt2のreturnがサブシェルすなわち関数外で実行されてエラーにならなかった事を質問している。
それに対して>>568は適切に答えている。

判ってないのは周回遅れの知恵遅れのお前だけだ。 引っ込んでろ。バカ。
585名無しさん@お腹いっぱい。:2011/04/23(土) 12:07:57.00
>>584
サブシェル自体が関数内にあるから、
サブシェルの中にあっても「関数内」なんだけどw

そうか、>>568 はreturnを「関数外」と思ってたんだなw
それ間違いだからw
586名無しさん@お腹いっぱい。:2011/04/23(土) 12:32:22.02
bashじゃなければいいのかしら?
587名無しさん@お腹いっぱい。:2011/04/23(土) 12:33:14.62
>>585
必死だな、バカ。w

> サブシェルの中にあっても「関数内」なんだけどw
関数内のreturnならば、echo cは実行されない。

周回遅れで知恵遅れは引っ込んでろ。
588名無しさん@お腹いっぱい。:2011/04/23(土) 12:38:28.17
>>587
関数内のreturnだからecho cは実行されない、んじゃなくて、
サブシェルだから関数を抜けずにecho cが実行るんだよ。

お前やっぱりサブシェルを理解してないんだな。
589名無しさん@お腹いっぱい。:2011/04/23(土) 12:42:33.21
>>588
バカ、関数内のreturnじゃなくて、サブシェル内のreturnだからecho cが実行される。
実行結果もその通りだ。元質問者はだからこそ>>567の質問をした。

周回遅れで知恵遅れは引っ込んでろ。w
590名無しさん@お腹いっぱい。:2011/04/23(土) 12:44:32.89
>>589
bashの場合、関数外扱いか関数内か使いかはエラーメッセージで判定できる。

$ return
return: can only `return' from a function
(関数外)

$ f() {(return)}
$ f
エラー無し(関数内扱い)
591 忍法帖【Lv=35,xxxPT】 :2011/04/23(土) 12:50:08.97
kshとzsh
$ t2
a

bashとdashとbusybox ash
$ t2
a
c
592名無しさん@お腹いっぱい。:2011/04/23(土) 12:59:30.55
>>590
それが直感的におかしいから、元質問者は>567の質問をした。
>>568は適切に回答している。

周回遅れで知恵遅れは引っ込んでろ。w
593名無しさん@お腹いっぱい。:2011/04/23(土) 13:11:14.55
適切な回答は
>>569 ←文法の件と、kshやzshの例を挙げて回答
>>575 ←回避方法を回答
だな。どっちも俺だけど

>>568 は的が外れている上に解決方法等の情報量が皆無w
594名無しさん@お腹いっぱい。:2011/04/23(土) 13:31:57.10
>>593
墓穴掘ってるぞ。バカ。
>>569 エラー出ないのは、文法的には間違ってないので、それで仕様。

関数内でreturnが実行されたならば、関数は終了するのが仕様。

Function:
If the builtin command return is executed in a function, the function completes
and execution resumes with the next command after the function call. Any command
associated with the RETURN trap is executed before execution resumes.
When a function completes, the values of the positional parameters and the special
parameter # are restored to the values they had prior to the function's execution.

return [n]
Causes a function to exit with the return value specified by n. If n is omitted,
the return status is that of the last command executed in the function body.
If used outside a function, but during execution of a script by the . (source)
command, it causes the shell to stop executing that script and return either n
or the exit status of the last command executed within the script as the exit
status of the script. If used outside a function and not during execution of a
script by ., the return status is false. Any command associated with the RETURN
trap is executed before execution resumes after the function or script.

周回遅れで知恵遅れは引っ込んでろ。w
595名無しさん@お腹いっぱい。:2011/04/23(土) 14:05:14.21
>>594
>If used outside a function ... the return status is false.

関数外ならエラーステータスになると言ってるが、

$ f() {(return)}
$ f
$ echo $?
0
↑真だね。よって、関数内w
596名無しさん@お腹いっぱい。:2011/04/23(土) 14:17:57.75
>>595
必死だな。バカ。w

関数内なら関数は終了して、関数呼び出しの次コマンドから実行が再開されると書いてある。
関数内であるもかかわらず、関数が終了しないのはバグ。
If the builtin command return is executed in a function, the function
completes and execution resumes with the next command after the function call.

周回遅れで知恵遅れは引っ込んでろ。w
597名無しさん@お腹いっぱい。:2011/04/23(土) 14:19:38.27
仕様だけにしようがないなら、仕方ないとして
bash[version 4.1.10(4)-release (i686-pc-cygwin)]のmanから引用

>COMMAND EXECUTION ENVIRONMENT
>   Command substitution, commands grouped with parentheses, and asynchro-
>   nous commands are invoked in a subshell environment that is a duplicate
>   of the shell environment, except that traps caught by the shell are
>   reset to the values that the shell inherited from its parent at invoca-
>   tion. Builtin commands that are invoked as part of a pipeline are also
>   executed in a subshell environment. Changes made to the subshell envi-
>   ronment cannot affect the shell's execution environment.

サブシェルでは環境は親から複製されるそうだ。>>567>>575はパイプラインに
ビルトインコマンドを混ぜてるから、意識しないうちにサブシェル環境になってしまう訳か
つまりt2の中のパイプラインの解釈は、‘echo b | ( return );’ってなる

親環境が複製されてるんだから、当然サブシェル内もfunctionの中って認識されるわな
でも、意図的にこうは絶対に書かないのに、暗黙的にサブシェルになって警告すらないのは嫌がらせだろ

# 何回もこの糞長いmanpage読むのはきつい
# せめて実行環境とスクリプティングのリファレンスは分割してくれねーかな
598名無しさん@お腹いっぱい。:2011/04/23(土) 14:28:12.15
$ type read
read is a shell builtin

$ type {
{ is a shell keyword

違うか

$ echo | { /usr/bin/echo $BASH_SUBSHELL; }
1

扱いは一緒か

$ type \(
bash: type: (: not found

なんでや!
599名無しさん@お腹いっぱい。:2011/04/23(土) 14:32:12.88
>>596
バグじゃない。関数外のreturnはエラーと言ってるだけで
関数内のreturnが関数を終了するかどうかは別問題

パイプがサブシェルにならないkshやzshでも以下ではreturnしない

f() {(return); echo hoge;}
600名無しさん@お腹いっぱい。:2011/04/23(土) 14:41:31.00
kshとかzshはサブシェルを作らないから、望み通りパイプでreturnできるっぽいが
じゃあ、わざとサブシェル作って、そこからreturnするとbashみたく戻れないのか?
戻れないなら古くからのshの作法なんだろう。それが仕様通り
601名無しさん@お腹いっぱい。:2011/04/23(土) 14:42:31.07
>>599
仕様なのか
これはひどい
602名無しさん@お腹いっぱい。:2011/04/23(土) 15:41:47.46
bashが保守的で、kshとかzshとかが革新的なのか

パイプを特別に扱うことがあるってのは、何か問題があるからなのか
603名無しさん@お腹いっぱい。:2011/04/23(土) 16:24:56.59
POSIX仕様的には決まってないんじゃなかったっけ?
サブシェルにならない方がわかりやすいのは確かだと思うが。
604名無しさん@お腹いっぱい。:2011/04/23(土) 16:42:31.09
>>599
バカ、必死すぎる。ww

関数外ならfalseを返すけど、trueなので関数内というのが>>595の主張だろ。
それなら、関数内であるreturnは、関数から帰らなければいけない。

周回遅れで知恵遅れは引っ込んでろ。w
605名無しさん@お腹いっぱい。:2011/04/23(土) 17:56:03.46
論争そのものには興味ないですが…

The Single UNIX Specification Version 3では、

> 2.12 Shell Execution Environment
> (略)
> Additionally, each command of a multi-command pipeline is in a
> subshell environment; as an extension, however, any or all commands in
> a pipeline may be executed in the current environment.
====
> NAME
> return - return from a function
> (略)
> DESCRIPTION
> The return utility shall cause the shell to stop executing the current
> function or dot script. If the shell is not currently executing a
> function or dot script, the results are unspecified.

です。
要するにどうなっていようが仕様に適合します。
(個別の実装の「仕様」はともかく)
606名無しさん@お腹いっぱい。:2011/04/23(土) 18:41:24.60
> (略) the results are unspecified.
undefinedでなくて、unspecifiedか。実装依存ってことね、たぶん

ユーザとしたら、移植性の高いコード書くときに、return使う場所には気をつけろってこと?

わざわざ、こういうときは実装依存ですって、規格に書くってことは、昔から揉めてたわけか
607名無しさん@お腹いっぱい。:2011/04/23(土) 18:52:01.78
つまりSUS V3的には、サブシェルで実行されている>>567のt2のreturnは関数外での
実行、returnが関数外で実行された時の動作は不定。なので仕様通りという事だね。
bashではmanに書かれている動作(関数外ではfalse)に反するのでバグ。
したがって、>>569>>585も完璧なるウソ。

判ったか? 周回遅れの知恵遅れ。w
バカなんだから黙ってりゃよかったのに。
608名無しさん@お腹いっぱい。:2011/04/23(土) 19:10:32.98
まだやるかww まー、見てる分には面白いから、もっとやれ
でも、バグバグ言うなら、本家に言えよな。向こうはきっと日本語しゃべらないんだから

で、バグ検索したらまんま見つけたww まだ読んでねーけど、似たような香りがする

return from function doesn't work when used in tail of pipeline
ttp://lists.gnu.org/archive/html/bug-bash/2010-08/msg00090.html

誰かまとめてくれんかの
609名無しさん@お腹いっぱい。:2011/04/23(土) 19:12:31.89
つか、何気にインプロセスでパイプ処理するのってすごくねーか?
いくつ繋がってても、ビルトイン・外部コマンドがごちゃ混ぜでも動くのなら

X=0; for I in `seq 1000`; do echo $I; X=`expr $X + 1`; done |sed -ne '1,$ p' |
while read J; do echo $J; X=`expr $X + 1`; done |while read K; do echo $K; X=`expr $X + 1`; done |
while read L; do echo $L; X=`expr $X + 1`; done |while read M; do X=`expr $X + 1`; done

どーなるんだよ、これww
bashだと間違いなくXは0のままだが
610名無しさん@お腹いっぱい。:2011/04/23(土) 19:24:00.05
>>609
> ; as an extension, however, any or all commands in
> a pipeline may be executed in the current environment.

だから、SUSv3的にも「よく頑張ったぜ!」と適合。
611名無しさん@お腹いっぱい。:2011/04/23(土) 19:36:26.92
>>610
kshとか、zshでのことだよな?確かに頑張り過ぎだわ
ちゃんとXに値入るの、これww
612 忍法帖【Lv=35,xxxPT】 :2011/04/23(土) 19:39:40.76
>>607
判ったか? 周回遅れの知恵遅れ。w
バカなんだから黙ってりゃよかったのに。
613>>565:2011/04/24(日) 01:17:07.38
>>566
回答ありがとうございます。
試してみたところ、以下のようにエラーになります。
$ csplit file.txt '/^\[.*\]/' '{*}'
csplit: *}: bad repetition count

当方、freebsd5.4を使っております。
$ uname -a
FreeBSD japan 5.4-RELEASE FreeBSD 5.4-RELEASE #0: Sun May 8 10:21:06 UTC 2005 [email protected]:/usr/obj/usr/src/sys/GENERIC i386

マニュアル見るとfreebsdではnumに*を指定することはできないようです。。。
なにか回避策はありますでしょうか
614名無しさん@お腹いっぱい。:2011/04/24(日) 08:35:06.06
なんでそんな古いの使ってるの?
615名無しさん@お腹いっぱい。:2011/04/24(日) 09:20:33.70
>>613
まず、grep -c "\[.*\]" file.txtで、マッチする数を求める。
その数から2を引いた数を、アスタリスクのかわりに指定する。
616名無しさん@お腹いっぱい。:2011/04/24(日) 10:41:28.69
>>608>>575の他の解決策書いてあるね。

f() {
 while read WD; do
  [ "$WD" = end ] && return # fから戻れる
  echo "$WD"
 done < <(cat "$1")
 echo "all done!" # returnしてたら来ない
}
こんな感じ。ヒアストリングと違って、パイプ使うのと同じようだ。

diff <(sed -ne '/begin/,/end/ p' foo.txt) <(sed -ne '/begin/,/end/ p' bar.txt)
便利だ。

mlの中の人的には>>567は仕様で、そもそもそんな場所のreturn自体禁止しようって人もいるっぽい。
617名無しさん@お腹いっぱい。:2011/04/25(月) 10:41:39.45
>>614
8.2でもできないよ
618名無しさん@お腹いっぱい。:2011/04/25(月) 21:34:16.48
rubyでいうところの
for dir in ENV['PATH'].split(/:/)
 puts dir
end
ということをshellスクリプトでやりたいんだけど、
for dir in `???`; do
 echo $dir
done
ここの ??? の部分がわかりません。どうするの?
619名無しさん@お腹いっぱい。:2011/04/25(月) 21:41:36.46
>>618
echo ${PATH} | sed '/:/s// /g'
620名無しさん@お腹いっぱい。:2011/04/25(月) 21:50:36.23
s/:/ /g じゃなくて?

PATHにスペースあったら知らんけど
621名無しさん@お腹いっぱい。:2011/04/25(月) 22:15:49.84
>>620
どっちでも。

ksh だとこれが出来るのね。

IFS=:; for i in ${PATH}; do echo ${i}; done
622名無しさん@お腹いっぱい。:2011/04/25(月) 22:40:48.12
>619-621
ありがとう。
echo $PATH | sed 's/:/¥n/g'
がなんかうまくいかない。sedは¥nがつかえないのかな。
623名無しさん@お腹いっぱい。:2011/04/25(月) 22:49:04.24
trで充分
624名無しさん@お腹いっぱい。:2011/04/25(月) 22:55:05.98
今まで tr って tr -d しか使ってなかったわ

echo ${PATH} | tr : '¥n'
625名無しさん@お腹いっぱい。:2011/04/25(月) 23:58:42.48
なんで改行したいのよ
626名無しさん@お腹いっぱい。:2011/04/26(火) 01:08:02.79
質問です。
以下を見てください。
----------------------------
japan:~$ cat hoge.dat
aaa
bbb
ccc
----------------------------
japan:~$ cat hoge.sh
#!/bin/sh
IFS='
'
cnt=0
cat hoge.dat | while read -r line
do
cnt=`expr $cnt + 1`
echo "cnt=$cnt"
done
echo "cnt=$cnt"
----------------------------
japan:~$ ./hoge.sh
cnt=1
cnt=2
cnt=3
cnt=0
----------------------------
hoge.sh実行で、最後にcnt=0と表示されていますが、
なんでcnt=3とはならないのでしょうか?
627名無しさん@お腹いっぱい。:2011/04/26(火) 01:21:51.47
>>626
パイプで繋いだために while〜 がサブシェルで実行されるから
ちなみに zsh だと最後も cnt=3 になる
628名無しさん@お腹いっぱい。:2011/04/26(火) 01:58:32.24
おい、周回遅れの知恵遅れ。
大好きなサブシェルの話題だが、お前バカなんだから黙ってろよ。w
629名無しさん@お腹いっぱい。:2011/04/26(火) 07:03:54.52
zsh拡張し過ぎ、そこは記憶されるべきじゃない。
それ前提で書いてたし。移植性()笑
630名無しさん@お腹いっぱい。:2011/04/26(火) 11:45:11.30
> Changes made to the subshell environment shall not affect the shell
> environment. Command substitution, commands that are grouped with
> parentheses, and asynchronous lists shall be executed in a subshell
> environment.

だからSUSv3違反だな。まあzshらしいw

常套句で言わずもがなだと思うが↓

> shall
> For an implementation that conforms to IEEE Std 1003.1-2001, describes
> a feature or behavior that is mandatory. An application can rely on
> the existence of the feature or behavior.
631名無しさん@お腹いっぱい。:2011/04/26(火) 22:44:39.44
>>628
訳の分からんキチガイカキコして荒らしまくってんじゃねえよキチガイ、とっとと今すぐに死んで自殺して死ねwwwwwwwwwwwwwww
年中無休発狂妄想爆裂憤死寸前粘着真性キチガイ包茎池沼病気猿男(狂猿)◆QfF6cO2gD6は今すぐに発狂して自殺して死ねよwwwwwwwwwwwwwww

何でもいいがあちこちにそうやってリンク貼って荒れるのを見て楽しんでいる年中無休発狂粘着真性キチガイ包茎池沼病気猿男(狂猿)◆QfF6cO2gD6(+とそのキチガイ妄想)はマジでウザイ(笑)から、

今すぐに発狂してとっとと自殺して今すぐに死ねwwwwwwwwwwwwwwwwwwwwwwwwwww

こういう救いようのない真性基地外ニートは今すぐにとっとと発狂してビルから飛び降りて自殺して今すぐに死ねwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
632名無しさん@お腹いっぱい。:2011/04/26(火) 23:14:49.76
bashとzshとの挙動の違いで困ってます。
やりたいことは、「/tmp/*.html」のようなパターンに一致するファイル名を取得することと、
そのようなファイル名がなかった場合はそれを検出することです。

で、今困ってるのは、パターンに一致するファイル名がなかった場合の挙動です。
bashの場合は次のようにパターンそのものが出力され、エラーメッセージはでません。

bash> echo /tmp/*.html
/tmp/*.html

これに対し、zshではエラーメッセージがでます。
そしてこのエラーメッセージが、2>/dev/null とか 1>/dev/null とかしても表示されてしまいます。

zsh> echo /tmp/*.html
zsh: no matches found: /tmp/*.html
zsh> echo /tmp/*.html 2>/dev/null
zsh: no matches found: /tmp/*.html
zsh> echo /tmp/*.html >/dev/null
zsh: no matches found: /tmp/*.html

zshで、このエラーメッセージをださずに、パターンに一致するファイル名を取得するにはどういう方法がありますか。
633名無しさん@お腹いっぱい。:2011/04/27(水) 00:01:44.68
>>632
setopt nonomatch
634名無しさん@お腹いっぱい。:2011/04/27(水) 00:53:42.49
>>631
福島一号炉で焼かれてしまえ。粘着キチガイ犬。
635名無しさん@お腹いっぱい。:2011/04/27(水) 01:01:58.50
芝を無駄に生やす奴にろくな人間はいないな・・・
636名無しさん@お腹いっぱい。:2011/04/27(水) 01:04:30.18
>>632
zshはsh/kshコンパチモードってのがある。
637名無しさん@お腹いっぱい。:2011/04/27(水) 07:03:22.99
>>633
ありがとうございました。setopt nonomatchの動作を確認しました。
続いて質問ですが、一時的にnonomatchを設定し、そのあと解除したいのですが、
nonomatchが設定されているかどうかはどうやって確認すればいいでしょうか。
つまり
nonomatch_backup=getopt nonomatch
setopt nonomatch
...シェルスクリプト...
nonomatch=nonomatch_backup
みたいな感じにしたいんですが。
なおgetopt nomatchやgetopt nonomatchを試したのですが、いつも同じ値を返すようなので、期待したものとは違うようです。
638名無しさん@お腹いっぱい。:2011/04/27(水) 07:46:22.54
>>637
サブシェル内で setopt nonomatchすれば、
そもそも状態セーブしたり解除したりする必要ないよ。

あと、getoptは全然違う外部コマンド。
639名無しさん@お腹いっぱい。:2011/04/27(水) 08:10:21.66
>>638
おう、getoptはコマンドラインオプションをパースするコマンドでしたか。紛らわしい・・・
つうかですね、たんに /tmp/*.html のようなパターンに一致するファイルを見つけたいだけなのに、
なんでbashとzshで違う書き方をしなきゃいけないんでしょうか。
bashでもzshでも同じように動作する書き方ってありませんか?
今「zsh」でぐぐって調べてるんですが、わかんないです。
ほんとは ruby とか使いたいけど、使えるのがせいぜいawkぐらいしか期待できない環境で
やらなきゃいけなくて、もう発狂しそうです。
640名無しさん@お腹いっぱい。:2011/04/27(水) 09:01:09.91
bashやzshではなくshを仮定すればまだ違いは少ないのでは?
641名無しさん@お腹いっぱい。:2011/04/27(水) 09:21:04.15
移植性気にするならまずはこの辺読んで勉強しろ。

ttp://www.bookshelf.jp/texi/autoconf-ja/autoconf-ja_10.html#SEC114

やってらんねーと思ったらしれっとbashのみで動作しますと言い切って
しまうという手もw
642名無しさん@お腹いっぱい。:2011/04/27(水) 09:23:05.31
検索するより公式ドキュメントを読んだ方がいい。公式ドキュメントでわからないところを検索する。
そうしないと、沢山あるウソのページに騙されて時間を浪費する。
643名無しさん@お腹いっぱい。:2011/04/27(水) 09:33:05.51
>>641
これは参考になるページ。ありがとうございます。
しかしこのページでも、互換性のある echo "/tmp/*.html" の書き方は載ってないですね。
こんなことすら書けないシェルスクリプトって、何なんですかね。今の時代に必要なんすか?
いやゆとりの愚痴ですけど。
644名無しさん@お腹いっぱい。:2011/04/27(水) 09:42:31.88
>>643
>>636 は無視かよ。
shコンパチモードで起動すれば解決。

zshをshの名前で起動すれば自動的にコンパチ。
645名無しさん@お腹いっぱい。:2011/04/27(水) 09:45:18.57
shが基本だからshで書けばOk。
拡張シェルはshとの互換を取るような仕組みを持っているからそれを使う。
646名無しさん@お腹いっぱい。:2011/04/27(水) 09:52:23.10
シェルスクリプトの互換性というのは暇つぶしの冗談なので真に受けると負け
647名無しさん@お腹いっぱい。:2011/04/27(水) 10:48:12.61
大昔じゃあるまいし、商売でスクリプト書きながら
移植、転用なんてしてるとは思えない
ボーンに拘る必要はなく、自分の環境で希望の動作が問題ないなら
それはbだってcだってかまわねーんだよ。
どの道犬糞、馬糞くれーなもんなんだから。

今では、たかが数行のcシェルスクリプトみて血管切れそうに
非難するバカもいないだろうけどなw
648名無しさん@お腹いっぱい。:2011/04/27(水) 10:57:32.48
cshなんかインストールしてないから、そんなの納品されたら動かない。取引停止だな。
649名無しさん@お腹いっぱい。:2011/04/27(水) 11:05:58.74
事前打ち合わせで確認しましたよ^^
650名無しさん@お腹いっぱい。:2011/04/27(水) 11:07:43.00
購入仕様に「csh不可」って書いてあるでしょ。
651名無しさん@お腹いっぱい。:2011/04/27(水) 11:08:37.26
いいえ?いただいた購入仕様書にはそんなことかいてありませんよほら
652名無しさん@お腹いっぱい。:2011/04/27(水) 11:09:43.41
あっそう。もう帰っていいよ。口座閉鎖な。
653名無しさん@お腹いっぱい。:2011/04/27(水) 11:11:47.94
うふふ
654名無しさん@お腹いっぱい。:2011/04/27(水) 11:32:48.99
cがダメなんていうバカに
「極めて単純で小さなスクリプトなんで、Cの欠陥がある部分は使ってませんよ?」
「具体的に何の処理を指してますか?」
っていうとへの字にして黙るねw
結局センパイにダメって言われて、一切の知識がないんで
「ウナギとウメボシ食べません」みたいなものなんだよ
655名無しさん@お腹いっぱい。:2011/04/27(水) 11:43:32.55
↑こういうバカに、極めて単純なスクリプトならsh使い慣れてなくても楽勝でしょ。
それくらいできないの? っていうと黙っちゃうよね。w
656名無しさん@お腹いっぱい。:2011/04/27(水) 12:19:37.93
というか csh script を使うことの問題点は「お里が知れる」

それだけだ

本当に問題がでるレベルで使えば自然と使わなくなるしな
657名無しさん@お腹いっぱい。:2011/04/27(水) 12:35:41.44
問題出るレベルとか言ったって
echo foo >&2
とか、いまどきcmd.exeですらできることもできない男の人って……
った感じじゃんcshって

そういう初歩のリダイレクトすらしないスクリプトだとしても
後で手を入れるかもしれないんだし
この使用範囲ならたまたまcshでも問題ないからcsh使おうとか
そんな使い分けをする意味がそもそもわからない

658名無しさん@お腹いっぱい。:2011/04/27(水) 15:02:48.28
>>639
逆にシェルスクリプトがbashとzshで動かないといけない意味は何?
#! /bin/sh
と指定したシェルだけ対象にすればいいだけでしょ?
根本的な部分が理解できてないのでは?

それとも各ユーザのシェル環境に取り込まれる関数でも書いているわけ?
659名無しさん@お腹いっぱい。:2011/04/27(水) 15:45:00.73
>>639
globによる ファイル名生成でそのファイルの存在を調べたいなら、nullglob のほうがいいんじゃない?
bash: shopt -s nullglob
zsh: setopt nullglob

合致するファイル名がない場合は「*」を含む引数が空になるよ。
660名無しさん@お腹いっぱい。:2011/04/27(水) 17:15:28.97
>>659
なんとそんな機能が!これはすばらしい。
いままでは
for x in `echo /tmp/*.html`; do
 if [ "$x" != "/tmp/*.html" ]; then
  echo $x
 fi
done
みたいなことをやってたんですけど、nullgrobのおかげですこしコードがすっきりしました。
あとは$BASH_VERSIONと$ZSH_VERSIONを調べて使い分けることにします。
ありがとうがいます。

>>658
実行しておわりというシェルスクリプトではなく、ユーザの.bashrcから読み込まれてshell関数を提供するのが目的のスクリプトなので。
661名無しさん@お腹いっぱい。:2011/04/27(水) 19:26:33.86
質問ですが、bashで簡単なスクリプトを書いています。
バイナリファイルで、ファイル名があればそれを読み、無ければパイプから、パイプもなければ、端末を読みに行き、処理をして、結果をlessで表示しようと思います。
script [files...]

filenamesに何もなければ端末を読みにいくので、これでいいかと思いましたが、lessが付くとダメです。
$ filenames=( "$@" ) # 実際は$@を処理したもの
$ cat "${filenames[@]}" | hexdump -C | less

とか書いている間に、解決法も見つかったのですが、参考までにお聞かせ下さい。
皆さんならどうしますか?
662名無しさん@お腹いっぱい。:2011/04/27(水) 20:40:52.52
やっぱり、標準入力の他に「標準エラー入力」が欲しいよな。
663 忍法帖【Lv=39,xxxPT】 :2011/04/27(水) 21:06:32.68
ashだとshoptが無いな
664名無しさん@お腹いっぱい。:2011/04/27(水) 21:21:45.25
シェルスクリプト冒頭で
#!/bin/sh
と続けて書く人もいれば
#! /bin/sh
と、#!のあとにスペースを入れる人もいるじゃないですか

それぞれの違いとか、狙っている効果とか、何かあるのでしょうか?
665名無しさん@お腹いっぱい。:2011/04/27(水) 21:29:26.86
スペースを入れるのは情弱
666名無しさん@お腹いっぱい。:2011/04/27(水) 21:47:14.97
>>664
>>641のリンクの最初に書いてあるじゃん
667名無しさん@お腹いっぱい。:2011/04/27(水) 22:23:44.50
こんばんは、シェル初心者ですが
ディレクトリ内のaaaのファイル以外を削除する
あるいは、aaa.c bbb.c 以外のファイルを削除するってことは
可能でしょうか
668名無しさん@お腹いっぱい。:2011/04/27(水) 22:27:30.00
もちろん、シェルスクリプトを書けば可能です
669名無しさん@お腹いっぱい。:2011/04/27(水) 22:31:16.19
シェルスクリプト変数で
$HOGE
と書く人もいれば
${HOGE}
と、$のあとに{ と }を入れる人もいるじゃないですか

それぞれの違いとか、狙っている効果とか、何かあるのでしょうか?
670名無しさん@お腹いっぱい。:2011/04/27(水) 22:34:59.28
あるディレクトリがあったとして、それが$PATHに含まれていないときだけ,$PATHに追加するという処理は、どう書くのがいいでしょうか。
671名無しさん@お腹いっぱい。:2011/04/27(水) 22:40:24.42
>>670
for dir in /usr/bin/mh $HOME/bin ; do
if ! echo $PATH | grep $dir > /dev/null; then
[ -d $dir ] && export PATH=$PATH:$dir
fi
done
672名無しさん@お腹いっぱい。:2011/04/27(水) 22:43:09.32
>>670

DIR=/usr/hoge/bin

case :$PATH: in *:"$DIR":*);; *) PATH=$PATH:$DIR;; esac

>>671 はエレガントじゃないねw
673>>626:2011/04/27(水) 23:00:35.02
>>627
ありがとうございます。

参考までに教えていただきたいのですが、サブシェルの変数の値を取得するには、どうしたらよいのでしょうか?
それとも、そのようなことは出来ないのでしょうか?
674名無しさん@お腹いっぱい。:2011/04/27(水) 23:04:51.19
675名無しさん@お腹いっぱい。:2011/04/27(水) 23:32:46.72
>>672
ありがとうございます。caseの引数に、$DIRじゃなくて$PATHを持ってくるんですか。頭いいなあ。
676名無しさん@お腹いっぱい。:2011/04/27(水) 23:36:40.56
>>667
zsh なら
rm *~aaa
rm *~aaa.c~bbb.c
なんてこともできる。
677名無しさん@お腹いっぱい。:2011/04/28(木) 00:15:43.55
autoconfは極端すぎるわな

>>669
$ A=aaa
としたとき、
$ echo $A
aaa
は当然として
$ echo $A.B
aaa.B
となるが、以下の場合は
$ echo $A_B

となる
ここで{}を使うと
$ echo ${A}_B
aaa_B
となる

変数名の区切りと見なされたり見なされなかったりする記号を続ける場合に
うっかり変な解釈をさせない、という効果はあるかな

昔、FreeBSDかなんかで、{}使ってなくてバグってたスクリプトがあるので
よくあるバグなのかもな
678名無しさん@お腹いっぱい。:2011/04/28(木) 00:18:24.04
zshなんて誰も聞いてないんだから引っ込んでろ。カス。
679名無しさん@お腹いっぱい。:2011/04/28(木) 00:20:34.07
>>676
zsh 便利だな
そこまでやるならスクリプト言語を使いたくなるけど
680名無しさん@お腹いっぱい。:2011/04/28(木) 06:26:02.63
>>677
ありがとうございます。では、

"$HOGE"

"${HOGE}"

それぞれの違いとか、狙っている効果とか、何かあるのでしょうか?
681 忍法帖【Lv=39,xxxPT】 :2011/04/28(木) 08:03:07.88
{}で囲むほうが賢そう
682名無しさん@お腹いっぱい。:2011/04/28(木) 12:53:40.19
>>680
{}付けとく方が、変数名を意識させることによる誤りを減らせる効果はあるんじゃね

あとは省略が許されているから省略するのか、それとも省略は許されていても省略はしないのか、
そういう信条に関わる違いじゃね
683名無しさん@お腹いっぱい。:2011/04/28(木) 13:18:36.76
ファイル名のソートについて相談です。
touch ver0.1.jpg
touch ver0.2.jpg
touch ver0.9.jpg
touch ver0.11.jpg
touch ver0.11.2.jpg
touch ver0.11.11.jpg
というファイル名があったとして、これを単純にソートすると
ver0.1.jpg
ver0.11.11.jpg
ver0.11.2.jpg
ver0.11.jpg
ver0.2.jpg
ver0.9.jpg
となってしまいます。しかし希望するのは最初のように番号順にソートされることです。
いちおうsortには -n オプションがありますが、この場合は効かないようです。
このような場合、どうすればいいでしょうか。
684名無しさん@お腹いっぱい。:2011/04/28(木) 13:23:43.91
>>683
ls -v
685名無しさん@お腹いっぱい。:2011/04/28(木) 13:32:54.92
>>684

ver0.1.jpg
ver0.1.1.jpg

というファイルがあると、ls -v でもうまく行きません><
686名無しさん@お腹いっぱい。:2011/04/28(木) 13:39:34.53
$ ls -v1
ver0.1.jpg
ver0.1.1.jpg
ver0.2.jpg
ver0.9.jpg
ver0.11.jpg
ver0.11.2.jpg
ver0.11.11.jpg
$ ls --version
ls (GNU coreutils) 8.5
(略)
687名無しさん@お腹いっぱい。:2011/04/28(木) 13:47:48.93
>>686
GNU版にはそんな機能があるのですか。すごいですね。
残念ながら自分のマシンには入ってませんでした。
いちおうPerlを使うとこんな感じでできそうなんですが、Perlを使わずにできないもんですかねぇ。

perl -e '
%h = map {
$s = $_;
@a = m/(¥d+)/g;
$k = join("_", map { sprintf("%010d", $_) } @a);
$k => $s;
} @ARGV;
for (sort keys %h) {
#print $_, "¥n";
print $h{$_}, "¥n";
}
' ver*
688名無しさん@お腹いっぱい。:2011/04/28(木) 13:49:40.78
netscape-4.79.tar.gz
netscape-4.8.tar.gz

の場合に対応できてないようです。
netscape-4.8の方が新しいんですが。
689名無しさん@お腹いっぱい。:2011/04/28(木) 14:00:41.41
ネスケを知らない人が見たら、4.79 の方が新しいと判断する
690名無しさん@お腹いっぱい。:2011/04/28(木) 14:08:34.02
それはない。
4.9と4.10だったら迷う。
691661:2011/04/28(木) 14:40:31.19
>>683
sort -nt '.' -k 2,2 -k 3,3

だ、だれか私の質問にレスを! lessが付いちゃ(上手く)行けないだけに...

結局3つのコマンドの組み合わせだけで、出来たのですが。
考えるネタとして面白いかなぁと、思うのですが。
692名無しさん@お腹いっぱい。:2011/04/28(木) 15:44:58.13
var = [ -n "$value" ] ? "YES" : "NO"
のように三項演算子が使いたいんですけど、なさそうなので
[ -n "$value" ] && var="YES" || var="NO"
と書いてみました。
この書き方は、ありでしょうか。
互換性が低いからやめたほうがいいとか、アドバイスをお願いします。
693名無しさん@お腹いっぱい。:2011/04/28(木) 16:09:29.49
>>692
普通にアリ。互換性問題なし。

ちなみに、こういう書き方もある。

var=${value:+YES}; var=${var:-NO}
694名無しさん@お腹いっぱい。:2011/04/28(木) 16:10:03.66
普通にif使った方が見やすい気がする
695名無しさん@お腹いっぱい。:2011/04/28(木) 16:20:50.35
var="NO"
[ -n "$value" ] && var="YES"

じゃだめなん?
696名無しさん@お腹いっぱい。:2011/04/28(木) 16:22:35.72
>>694
普通にif使ったら初心者と思われる気がするw

普通に書くとしてもcaseだろ。

case $value in '') var=NO;; *) var=YES;; esac
697名無しさん@お腹いっぱい。:2011/04/28(木) 16:23:24.18
set -eしてると面白い事になるからダメ。
698名無しさん@お腹いっぱい。:2011/04/28(木) 16:25:44.72
ヘンに凝るより読みやすい方がいいなぁ。
699名無しさん@お腹いっぱい。:2011/04/28(木) 16:28:12.48
>>697
set -e に耐えられる合格回答は、

>>693
var=${value:+YES}; var=${var:-NO}

だけだな。
700名無しさん@お腹いっぱい。:2011/04/28(木) 16:40:58.65
set -e なんて前提に置かなくていいだろw
701名無しさん@お腹いっぱい。:2011/04/28(木) 16:46:17.57
set -e だけじゃなく、
set -u も前提におくべきだな。

if [ -n "$value" ]; then
ってやると、
set -u に耐えられない。

>>693 は set -e にも set -u にも耐える。
702名無しさん@お腹いっぱい。:2011/04/28(木) 21:50:04.27
set -fすると、その後はシェルスクリプトにあたえたパラメータについて
ワイルドカードを展開させないようにできるじゃないですか

set -fしてないシェルからシェルスクリプトを起動したときに、同じように
ワイルドカードの展開をさせないように、できますか?

パラメータに*を与えたとき、$1として*そのものを設定させたいのです
703名無しさん@お腹いっぱい。:2011/04/28(木) 21:54:21.39
>>702
'*' で呼び出して、"$1" で受け取る。
704名無しさん@お腹いっぱい。:2011/04/28(木) 22:20:06.16
呼び出す前に(set -fしてないシェルが)展開するするから無理。
705名無しさん@お腹いっぱい。:2011/04/28(木) 23:58:37.23
スレチ覚悟の上だが、
find ./ -name *.txt
とか、カレントディレクトリに*.txtが無い場合はfind側で*.txtへのマッチングをしているように見えるな
あれはどういう仕組みで生*を受け取ってるんだろうか
706名無しさん@お腹いっぱい。:2011/04/29(金) 00:42:09.18
何のひねりもないと思うが。
まず *.txt をシェルが解釈し、合致するファイルがなければ "*.txt" が find に渡され、
find がそれをワイルドカード展開する(試みる)。
(当然 nomatch や nullglob オプションによってシェルの挙動は変わる)
707名無しさん@お腹いっぱい。:2011/04/29(金) 09:21:33.27
>>700
普通に使うぞ。コマンドの終了ステータスを逐一確認するの面倒だろ。
見通しも悪くなるし。
708名無しさん@お腹いっぱい。:2011/04/29(金) 09:53:19.96
>>707
set -e して、すべてのコマンドの後ろに
|| :
を書く癖がついて、本末転倒にw
709名無しさん@お腹いっぱい。:2011/04/29(金) 14:14:07.51
bashで

hogefuga? (Y/N)

のようなプロンプトを出してからreadコマンドで読み込むようにしてるのですが、
このときEnterキー等をいちいち押さずともスクリプト側が判断できるようにするには、どうしたらいいのでしょうか。
この場合、yかnを押下するだけでスクリプトが進行するようにしたいのです。
710名無しさん@お腹いっぱい。:2011/04/29(金) 15:20:26.06
>>709
read -n 1
711661:2011/04/29(金) 23:30:12.80
今日気付いたのですが、`\'(back slash) もダメですね。`&' や `<' だけでは無かった。
`>'もmust be escapedとかって書いてあったような。
zenity --info -text='\'
zenity --info --text='?'

誰も挑戦して頂けない様なので、一応解決法です。
すごい技の披露を期待してましたが残念です。
私はとても悩んだのですが。

最初は、変数や、テンポラリーファイルに入れてみました。
$ cat "${filenames[@]}" | { i="$( hexdump -C )"; echo -n "$i" | less; }
$ cat "${filenames[@]}" | { tmpf="$( tempfile )"; rmtmpf() { rm "${tmpf}"; exit 1; }; trap rmtmpf INT HUP TERM; hexdump -C >"${tmpf}"; less "${tmpf}"; rm "${tmpf}"; }
712661:2011/04/29(金) 23:41:14.24
消えてしまいました。数値参照でいけました。
zenity --info --text='& #92;'

次にヒアストリングスを組み合わせてみました。
$ cat "${filenames[@]}" | hexdump -C | less <<<"$( cat )"
$ cat "${filenames[@]}" | hexdump -C | { read -rd '' i ; less <<<"$i"; }

シンプルなものが見つかりました。
$ less "$( cat "${filenames[@]}" | hexdump -C )
713661:2011/04/29(金) 23:49:45.24
誰も聞いてないのに、連投すみません。

テンポラリーファイルを、fifoに出来ないかと頑張ってみました。
手打ちや、3KB位のだと、動きましたが、
54KBのファイルでも、バッファーがつまるのか、動きません
$ mktmpp_n () { tmpp="/tmp/${0##*/}.$$.$( head -c6 /dev/urandom | base64 )"; };\
rmtmpp() { rm "${tmpp}"; exit 1; };\
trap rmtmpp INT HUP TERM; mktmpp_n; until mkfifo "${tmpp}"; do mktmpp_n; done;\
( sleep 1; cat "${tmpp}" | less; rm "${tmpp}" )& cat "${filenames[@]}" | hexdump -C >"${tmpp}"; fg
714661:2011/04/30(土) 00:23:49.12
シンプルなものは、まったくの勘違いでした。
よく確かめても、これだ。はずかし。
715名無しさん@お腹いっぱい。:2011/04/30(土) 08:46:21.13
>>710
そんなオプションがあっただなんて・・・。
ありがとうございました!
716661:2011/04/30(土) 09:03:03.77
何度も、すみません。あまりにも、連投なので時間を置いてみたのですが...
シンプルなものも、用意してありましたので、
目障りだと思う方もいらっしゃるでしょうが、続けさせてもらいます。こっちでした。

$ cat "${filenames[@]}" | less <<<"$( hexdump -C )"
これも、/tmpにファイル作りますね。

trapとかkillもいじくってみました。
これも使えそうだったのですが、すぐには出来ませんでした。
$ less & pkill -STOP -P $PPID -u $UID less
717名無しさん@お腹いっぱい。:2011/04/30(土) 14:57:28.25
出遅れた感じだが…

$ for I in `seq 30000`; do echo $((RANDOM%2)); done >tmp.txt # テストデータ
$ time while read T; do if [ $T -eq 0 ]; then X=; else X='v'; fi;
> YN="Y"; done <tmp.txt # 1. 代入だけ
real  0m4.051s
user  0m2.521s
sys   0m0.761s

> if [ -n "$X" ]; then YN="Y"; else YN="N"; fi; done <tmp.txt # 2. >>694
real  0m5.316s
user  0m3.478s
sys   0m0.870s

> [ -n "$X" ] && YN="Y" || YN="N"; done <tmp.txt # 3. >>692
real  0m5.447s
user  0m3.681s
sys   0m0.783s

> YN="N"; [ -n "$X" ] && YN="Y"; done <tmp.txt # 4. >>695
real  0m5.554s
user  0m3.622s
sys   0m0.780s

> YN=${X:+Y}; YN=${YN:-N}; done <tmp.txt # 5. >>693
real  0m5.111s
user  0m3.394s
sys   0m0.801s

3. ≒ 4. > 2. > 5. ( > 1. )
時間は5回平均。3.の書き方が一番速そうだから使ってたが、そんなことなかった。
スクリプトのプロファイラみたいなのは、ないのかね??
718名無しさん@お腹いっぱい。:2011/05/02(月) 23:27:03.68
Redhatでこれ動いたんだけど、こんなCASE文([1-5])は昔から有効でした???
それとも他のOSじゃはじかれるかどなたか教えてください

#!/bin/sh
case $1 in
[1-5]) echo OK;;
*) echo NG;;
esac
719名無しさん@お腹いっぱい。:2011/05/02(月) 23:30:24.84
case の条件に書いたものはファイル名のマッチングと同じ規則でマッチする。
720名無しさん@お腹いっぱい。:2011/05/02(月) 23:45:08.92
>>719
なるほど。安心して使います。
感謝です。
721名無しさん@お腹いっぱい。:2011/05/03(火) 02:05:04.52
「パターン」とか「パターンマッチ記法」とか
「シェルパターンマッチ記法」って言ってる。
722名無しさん@お腹いっぱい。:2011/05/03(火) 07:30:00.81
Ubuntuでこれ動いたんだけど、こんなCASE文(hoge) (*)は昔から有効でした???
それとも他のOSじゃはじかれるかどなたか教えてください

#!/bin/sh
case $1 in
(hoge) echo OK;;
(*) echo NG;;
esac
723名無しさん@お腹いっぱい。:2011/05/03(火) 12:03:11.44
v7shではNGですが、SUSv3は問題ないです。
いつからOKからはしらん。
724名無しさん@お腹いっぱい。:2011/05/03(火) 16:49:45.40
>>721
glob
あるいは
globbing
と呼ぶのが正式で誤解が少ないですよ。

パターンでも通じますけど、正規表現のパターンマッチングと容易に混同されちゃうんです。
同じような記号使いますから。(どちらもオートマトン理論の閉包や和に由来するから仕方ない)
725名無しさん@お腹いっぱい。:2011/05/03(火) 17:11:26.89
>>724
パターン(pattern)が正式だよ。

globとかglobbingとかはcsh(笑)の用語。
726724:2011/05/03(火) 17:45:14.31
ああその通り、csh以降でしたね。

で、721に戻ると、「シェルパターンマッチ記法」というのは、不自然ですよね。
マッチ⇒記法のつながり部分が特に。だって、記法(に基づいた表現)に対してマッチをするんだから。
実際、あまり聞く言い方ではないのでは?
727名無しさん@お腹いっぱい。:2011/05/03(火) 18:09:53.53
728724:2011/05/03(火) 18:25:57.67
>>727
ありがとうございます、勉強になりました。
729名無しさん@お腹いっぱい。:2011/05/03(火) 19:43:47.80
言葉なんて、揺れているようだから間違いなく通じれば何でもいいが、
721や724の言っている事の方が、うなずけるなあ。

さわり始めた頃、cshがログインシェルの標準だったからか、cshを笑う時代が来るなんて、時代を感じるなあ。

man shでは、Shell Pattern
The syntax of the case command is
The pattern can actually be one or more patterns (see Shell Patterns
described later)

freeBSDの和訳でも、シェルパターンみたいだね。
http://www.jp.freebsd.org/man-jp/search.html

POSIXでは、パターンマッチング記法で、いいらしいよ

Shell Command Language
http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_13
see Pattern Matching Notation
で、そこ見ると、regular expression notationと使い分けている。
見間違いかもしれないから、確認してくれ。

shはここで、上はその参照先
http://pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html

globingはプログラム用語一般としてより広く用いられている用語。
http://en.wikipedia.org/wiki/Glob_%28programming%29
730名無しさん@お腹いっぱい。:2011/05/03(火) 22:06:39.09
>>729
自分が初めて触ったWS(SunOS4.1.3)がcshだったなぁ…
もう20年近く前になるのか(遠い目)。
731名無しさん@お腹いっぱい。:2011/05/03(火) 23:35:21.88
>>729
> で、そこ見ると、regular expression notationと使い分けている。

当たり前
732名無しさん@お腹いっぱい。:2011/05/04(水) 06:38:13.88
>>731
時間帯的に、よっぱらってんのかな?
文章を見て、短絡的に反応して揚げ足をとってるように見えるが。

724の言葉、"正規表現のパターンマッチングと容易に混同されちゃうんです"をうけて、
混同を避ける為に、Open Groupでは以下の様な言葉で、使い分けている点を、皆さんに報告しているだけですよ。

globing、パターンマッチング記法を、`Pattern Matching Notation' という言葉で、
正規表現記法を、`regular expression notation' という言葉で使い分けている。

そりゃあ、まあ使い分けるの自体は当たり前だろうけど。...答えようが無い。
つくづく、言葉はお互いに理解しようとしなければ、難しいものだなあ。
とにかく、悪意無いからね。

>>730
家のパソコンを、PPPとか使ってtelnetでつないだりしましたよ。少し後だけどNCSA Mosaicがでて、ビートルズの新曲free as a bird聞いたり。
初めはrootの人が大して偉くもないのに、偉い人に見えたりした。そして、sh->csh->tcshが本流だと思ってました。
733名無しさん@お腹いっぱい。:2011/05/04(水) 16:48:56.08
regular expression に対して shell expression (シェル表現) と言ってたのに
いつのまにか少数派になってしまった
734名無しさん@お腹いっぱい。:2011/05/04(水) 22:14:08.42
初歩的な質問ですが、
個人的に楽しむ分にはシェルは合法なんですか?
大手のちゃんとした企業だとシェルは禁止ですよね?
735名無しさん@お腹いっぱい。:2011/05/04(水) 22:49:43.62
すべってるよ。
736名無しさん@お腹いっぱい。:2011/05/04(水) 23:23:54.45
regular expressionはありだけど、shell expressionはなんのこっちゃ? だぞ。
737名無しさん@お腹いっぱい。:2011/05/05(木) 09:43:08.91
>>734
どこで何を聞いてきて、そんな疑問が浮かぶ様になったんだ?
ぜひ、もう少し詳しく、聞かせて下さい。

>>711
zenity で、色が使えるんだな。知らなかった。
Pango Text Attribute Markup Language というのですね?
738名無しさん@お腹いっぱい。:2011/05/05(木) 11:34:36.44
>>734
シェルの単純所持は禁止されてないから、
それだけでは罪には問われないよ
739名無しさん@お腹いっぱい。:2011/05/05(木) 14:41:23.12
かまうなよ。
740名無しさん@お腹いっぱい。:2011/05/06(金) 18:35:26.36
>>733
最初から少数派だろ。
741名無しさん@お腹いっぱい。:2011/05/06(金) 21:36:21.04
>>717
ご存知かもしれませんが、各コマンド毎の、アバウトな時間を測定するアイデアです。
bash特有の変数を変えれば、使いまわせるかと思います。

time を各パイプラインの前に付ける

PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }-$( date "+%s.%N" ) '
set -x

trap 'date +%s.%N' DEBUG

strace -fTtt

ついでにデバッガー
bashdb、kshdb、zshdb
ddd
742名無しさん@お腹いっぱい。:2011/05/07(土) 21:46:16.27
#!/bin/sh

set `echo | od -c`
n=`basename $2 n`

__=11081458154815481578040812781578162815481448012
IFS=8; for _ in $__; do printf %b $n$_; done
743名無しさん@お腹いっぱい。:2011/05/08(日) 16:53:27.90
#!/bin/sh
case $1 in
-e)
echo "$2" | nkf -w8 | od -to1 | sed -re 's/^[0-9]*( |$)//; y/ /8/'
;;

-d)
__="$( echo "$2" | sed -e ':a; N; y/\n/8/; b a;'| sed 's/^8//' )"

set `echo | od -tc`
n=`basename $2 n`

IFS=8
for _ in $__; do printf %b $n$_; done | nkf -W8
;;

-h|*)
echo "usage `basename $0` option\n -h: help\n -e strings: encode strings\n -d string: decode strings"
;;
esac

:<<'#EOT'
# -d "
357827382778343820182128343820282028343820182278343820282158343
201820483438201825283438200820183438201822383438202821483438200
202834782118271834382018253816381458164834382018250814281418163
145815681418155814583438201821483438200820283448275827783438202
217834382018252834382018204834382018240834382028215834382018206
343820182218343820182518343820082028012"
#EOT
744名無しさん@お腹いっぱい。:2011/05/08(日) 18:24:26.29
ちょっとここで聞くようなものじゃないかもしれないけど、
httpsで提供されているファイルをダウンロードするのに何を使えばいいでしょうか。
もちろんシェルスクリプトから使うのが前提で。
wget --no-check-certificate をつかえばいちおう取って来れるんですけど、
これだとhttpsの意味があんまりないような気がします。
745名無しさん@お腹いっぱい。:2011/05/08(日) 18:29:23.42
ふつうにwgetにローカルにあるはずのCAを指定すればいいと思うの。
--ca-certificate, --ca-directory
746名無しさん@お腹いっぱい。:2011/05/08(日) 18:53:10.73
>>745
ありがとうございます。こんなオプションがあるのですか。勉強になります。
自分でぐぐってみたのですが、たとえば--ca-directoryには
> CA のハッシュリストが保持されているディレクトリを指定する
という説明があるんですが、具体的にはどのディレクトリでしょうか。
あるいは、CAのハッシュリストはどのようにして入手するのでしょうか。
ブラウザには最初から組み込まれてると思うので、そっから取り出すんでしょうか。

747名無しさん@お腹いっぱい。:2011/05/08(日) 19:53:41.49
たぶんそのwgetはopensslあたりがリンクされてるはずだから、
そいつが提供しているはず。
748名無しさん@お腹いっぱい。:2011/05/08(日) 22:28:22.08
ubuntuだとca-certificatesってパッケージになってます。
749名無しさん@お腹いっぱい。:2011/05/14(土) 07:59:44.53
ヒアドキュメントで
cat << \END
とするとヒアドキュメント全体がクォートされるのが、よくわからないのですが、
\は直後の一文字をクォートするということから、どう説明すればいいのでしょうか?
普通の\のクォートとは違うのでしょうか?
750名無しさん@お腹いっぱい。:2011/05/14(土) 08:15:53.86
そのように決めたからとしか言いようがない。
ヒアドキュメント全体に何らかの処理を行うフラグを付けるとしたら

<< END
^1 ^2
END
^3
のどれかを使用するしかなくて、2を選んだという事。ちなみに<< 'END'でもok.
751名無しさん@お腹いっぱい。:2011/05/14(土) 08:57:52.48
そういうヒアドキュメントの変なところを改善したのが
ヒアストリングです。

cat <<< 'hoge
hage
boke'

cat <<< "$SHELL
$HOME
$PATH"

これから書くシェルはヒアストリングを使いましょう。
752名無しさん@お腹いっぱい。:2011/05/18(水) 02:06:12.83
>>744に似てるんだけど、HTTPSの待ち受け先へ何個かパラメータとファイルをセットしてリクエスト送信→レスポンス受信って簡単にできないもんかな。
753名無しさん@お腹いっぱい。:2011/05/18(水) 07:57:54.27
>>752
wgetはmultipart/form-dataをサポートしてないけど--headerと
--post-fileを組み合わせればできなくはない。

ttp://blog.goo.ne.jp/ozoz-goo/e/9792b5677f70586bd9befaa412aeb679

簡単に、と言えるかどうかはわからんが。
754名無しさん@お腹いっぱい。:2011/05/19(木) 08:55:19.48
面白いものを見つけました。

Genius sorting algorithm: Sleep sort
http://dis.4chan.org/read/prog/1295544154
Man, am I a genius. Check out this sorting algorithm I just invented.


#!/bin/bash
function f() {
sleep "$1"
echo "$1"
}
while [ -n "$1" ]
do
f "$1" &
shift
done
wait

example usage:
./sleepsort.bash 5 3 6 3 6 3 1 4 7
755名無しさん@お腹いっぱい。:2011/05/19(木) 09:05:54.86
みんな結構本気で突っ込んでるな >>754の中のスレ
それだけ新規性か意外性があったし、面白かったってことか。
756名無しさん@お腹いっぱい。:2011/05/19(木) 09:20:29.24
つっこみどころ満載だしな
757名無しさん@お腹いっぱい。:2011/05/19(木) 09:53:12.20
>>754 をヒントに dd_sortってのを作ってみたよ。

#!/bin/sh

for i
do
echo -n "$i" | dd bs=1 of=tmpfile seek="$i" conv=notrunc 2> /dev/null
done
cat tmpfile; echo
758名無しさん@お腹いっぱい。:2011/05/19(木) 10:36:02.82
基本的にビンソートだからO(n)だが、
重複があるとuniqされちゃうじゃないか。
>>754はキューにつっこむからO(n^2)くらいか。
759名無しさん@お腹いっぱい。:2011/05/19(木) 18:38:14.43
最近forkエラーが連発して、rebaseallしても改善しないんですが
うちだけですかね
760名無しさん@お腹いっぱい。:2011/05/19(木) 19:39:11.04
cp<space>ファイル名1<space>ファイル名2
って、EUCだとうまく動作しないのだが、これはデフォルトなのかな
761759:2011/05/19(木) 19:41:07.15
単にbashを起動するだけでもforkエラーでリトライしまくり、
stackdumpが生成されるのでとてもうざいです。
ここまでひどくなったのは今日が初めてで、特にcygwin関係の環境を弄った
つもりもありません。

原因がさっぱり分からないのですが、Process Explorerでbashがロードしている
DLLを見ると、cygreadline7.dllだけrebaseで割り当てられたのとは違うアドレスに
マップされているように見えます。
他のcygwin関係のDLLは0x6〜の区間にマップされているのですが
cygreadline7.dllのLoad Addressは0x3D0000となっています。
で、他のWindowsネイティブのDLLのアドレスも見てみると、
リソースDLL以外は0x7〜にマップされているようなので、衝突しているようにも
見えません。
rebase -bでちょっとアドレスをずらしてみたりもしたのですが、状況は
改善しないようです。

なお環境はWin7 64bitです。
762名無しさん@お腹いっぱい。:2011/05/19(木) 19:46:00.18
<space> ってそのまま打ってるってオチだろw
763名無しさん@お腹いっぱい。:2011/05/19(木) 20:28:47.47
cygwinのスレでやれ
764759:2011/05/19(木) 20:30:07.59
ありゃ、思いっきり誤爆ってました……
すいません
765名無しさん@お腹いっぱい。:2011/05/21(土) 19:21:43.61
1 Name: Anonymous : 2011-01-20 12:22
諸君!オレは天才かもしれない。このソートアルゴリズムをみてくれ。こいつをどう思う?

#!/bin/bash
function f() {
sleep "$1"
echo "$1"
}
while [ -n "$1" ]
do
f "$1" &
shift
done
wait

example usage:
./sleepsort.bash 5 3 6 3 6 3 1 4 7
766名無しさん@お腹いっぱい。:2011/05/21(土) 19:34:12.81
>>765
>>754-
767名無しさん@お腹いっぱい。:2011/05/22(日) 00:22:50.06
質問です。

shのスクリプトから、bashの$RANDOM変数を参照する
以下のようなスクリプトを書きました。
-----------------------
~$ cat hoge.sh
#!/bin/sh
num=`/usr/local/bin/bash -c "echo $RANDOM"`
echo "num=$num"
-----------------------

実行結果は、以下のように何も表示されません。
-----------------------
~$ ./hoge.sh
num=
-----------------------

どのようにすれば表示されるでしょうか?
また、表示されないのはどのような理由からでしょうか?





768名無しさん@お腹いっぱい。:2011/05/22(日) 00:31:39.14
実行前にコマンド行の解釈→変数の展開が行われるため。

num=`/usr/local/bin/bash -c 'echo $RANDOM'`
769名無しさん@お腹いっぱい。:2011/05/22(日) 01:35:14.11
>>767
#!/usr/local/bin/sh
echo "num=$RANDOM"
じゃまずいんか?

770名無しさん@お腹いっぱい。:2011/05/22(日) 08:51:47.79
理由は>>768の通り。解釈されて、変数の展開が行われてから、bashが実行される為。

シングルクォートでくくるのが簡単だが、ダブルクォートでくくってみたよ。
num=`/usr/local/bin/bash -vxc "echo \\$RANDOM"`

この手の事は、set -xv を使うと悩まないです。
771名無しさん@お腹いっぱい。:2011/05/22(日) 10:52:24.24
スリープソートがほとんど話題にならずに流されてるwwさすがおまいらw
772名無しさん@お腹いっぱい。:2011/05/22(日) 11:01:21.66
OSにソートさせてうれしいかよ
773名無しさん@お腹いっぱい。:2011/05/22(日) 11:12:38.64
そりゃシェルスクリプトに限った話じゃないしね、
たまたま使われただけで。
プログラム板でやればいいことだ。
774名無しさん@お腹いっぱい。:2011/05/22(日) 11:20:38.94
話はそれるけど、仕事で、bashでスクリプト組むことって増えてきた?
俺の場合はまだまだでshで書いてる。HP-UXとかbashはなかった気もするし。
perlも出来る限り使うなって空気だったり規則はまだあるなぁ。
みなさんの現場はどう?
775名無しさん@お腹いっぱい。:2011/05/22(日) 12:32:10.72
いろいろ
776名無しさん@お腹いっぱい。:2011/05/22(日) 12:51:46.73
>>774
続きはマ板でね。
777名無しさん@お腹いっぱい。:2011/05/22(日) 18:15:19.45
>>774
まさにいろいろ。客先で原則shってところもあるし規則なくても
昔からあるシステムだとそれを継続する。
新規構築のlinux系だとbashで作ってる場合も多い
778>>767:2011/05/22(日) 19:47:10.58
>>768
>>769
>>770
ありがとうございました。みなさんレベルが高いなー。
779名無しさん@お腹いっぱい。:2011/05/23(月) 07:59:04.28
バッククォート `...` を使っていらっしゃる皆さんに、質問です。
POSIX にも $(...) はあるのに、使われる訳は、ずばり何ですか?

このスレだけでなく、検索して見つかるスクリプトでも、バッククォートが多いような気がします。
見にくくネストしづらいだけで、いい事が無いと思いますが、あえて使うのにはなにか理由が有ると見ました。
理由がなくとも、こだわりみたいなものがあれば、教えて下さい。

Heirloom sh を基準とされていて、Bottom Lineを、POSIX まで上げられない理由は何でしょう。
一体どれだけ、UNIX は統一されないで進化できないままなのかと、疑問です。

何故に ANSI C でなく K&R C なのかと。
N88-BASIC でなく N-BASIC なのかと... 8 inch FDD なのかと。
CORDING SHEET に手書きなのかと。グリーンモニターなのかと...。

Solaris の Posix Shell でない Bourne Shell を意識してでしょうか。
確認の為に oracle で調べてみると、Solaris の sh では記載が無いですね。
HP-UX の如く、Posix Shell と置き換わったりしていないとしても、ksh や bash を POSIX モードで使えば、Solaris がスクリプトのスタイルのボトルネックになる理由が無いように思います。
その為の書き換えが必要な事が、だめかなあ。
Solaris 11 Express のシステムシェルは ksh93(1) だそうですが、どうなんでしょう?

Shell Command Language 2.6.3
http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_03

http://download.oracle.com/docs/cd/E19963-01/html/821-1461/sh-1.html
Command Substitution
The shell reads commands from the string between two grave accents (``) and the standard output from these commands can be used as all or part of a word. Trailing newlines from the standard output are removed.
780名無しさん@お腹いっぱい。:2011/05/23(月) 08:08:29.46
みんながバッククオート使う理由は普段バッククオートしか
見たことないからw 世の中そんなもん。
781名無しさん@お腹いっぱい。:2011/05/23(月) 08:24:03.15
back quote は字面的に値を戻している様に見えるから
ネストなんてしないし
782名無しさん@お腹いっぱい。:2011/05/23(月) 08:28:11.57
これくらいで$()使うと神経質な奴だと思われるかもしれないという脅迫的神経症。
783名無しさん@お腹いっぱい。:2011/05/23(月) 10:10:54.38
$() とか $(()) とか () とかかえってまぎらわしい。
784名無しさん@お腹いっぱい。:2011/05/23(月) 10:34:00.41
打ちやすいから。
785名無しさん@お腹いっぱい。:2011/05/23(月) 13:12:56.00
日本語キーボードにはバッククォートが付いてないから、
カナシフトしてカナの濁点「゙」キーを打たなければならないんだけど、
打ちやすいか?
786名無しさん@お腹いっぱい。:2011/05/23(月) 13:26:04.27
入れ子にするときの外側は$(…)にする。普段は`…`だ。3つ以上は入れ子にまずしない。
打ちやすいというより、$がやけに打ちにくい。避けてたら、こうなってた。

ところで、BourneシェルとPOSIXシェルって別物じゃないの?ほぼ一緒だけど。
787名無しさん@お腹いっぱい。:2011/05/23(月) 13:34:01.52
>>786
オスギとピーコくらいしか変わらないよ
788名無しさん@お腹いっぱい。:2011/05/23(月) 13:57:04.52
POSIXシェルってkshとほぼ同一かと思ってた
789名無しさん@お腹いっぱい。:2011/05/23(月) 14:05:48.23
>>788
それってローラとトリンドルくらい違うだろ
790名無しさん@お腹いっぱい。:2011/05/23(月) 14:18:58.08
例えがわかりづらいな…どなたにでも分かるように志村貴子の漫画で例えて
791名無しさん@お腹いっぱい。:2011/05/23(月) 14:26:32.75
ザクとグフくらいかと思ってた
792名無しさん@お腹いっぱい。:2011/05/23(月) 15:47:16.37
榊原郁恵と柏原芳恵くらいの違いか?
793名無しさん@お腹いっぱい。:2011/05/23(月) 15:50:51.09
どちらかというと柏原崇と堂珍嘉邦だろ
794名無しさん@お腹いっぱい。:2011/05/23(月) 15:57:41.36
柏原芳恵と早見優ぐらいの違い?
795名無しさん@お腹いっぱい。:2011/05/23(月) 15:58:39.89
大橋姉妹と一本木蛮ぐらいの違い
796名無しさん@お腹いっぱい。:2011/05/23(月) 15:59:24.60
つまんないのでもうその辺でいいです。
797名無しさん@お腹いっぱい。:2011/05/23(月) 16:05:54.78
ダチョウ倶楽部のリーダーとドリカムのベースくらい違うっての
798名無しさん@お腹いっぱい。:2011/05/23(月) 16:16:22.19
LinuxとUNIXぐらいの違い
799名無しさん@お腹いっぱい。:2011/05/23(月) 16:28:52.81
けっこうちがうね?
800名無しさん@お腹いっぱい。:2011/05/23(月) 16:34:37.35
こまけえことはいいんだよ
801名無しさん@お腹いっぱい。:2011/05/23(月) 16:46:11.97
まなかなっ!
802名無しさん@お腹いっぱい。:2011/05/23(月) 16:49:24.60
あーちゃんとささちゃんぐらいの違い
803名無しさん@お腹いっぱい。:2011/05/23(月) 20:59:17.26
以前も紹介されていましたが、Bourne shell 派生の一覧
sh すなわち bourne shell でなく、Version 7 - SVR4.2 とその modify が Bourne shell という事だと思います。
商業用で無いものは、以下の2つでしょうか。
ここを読む限りでは、modified SVR4 Bourne shell が起源ですね。
Heirloom variant based on OpenSolaris (2005/06/08, ~SunOS 5.10),
Schily variant based on OpenSolaris Nevada Build 84 (2008/03)
あと、Source code の項を見るとV7 shell をsimulator上で走らせたり、V7自体をメンテナンスされている方、FreeBSD port of the v7sh もあります。
http://simh.trailing-edge.com/
http://www.collyer.net/who/geoff/
http://www.freebsdsoftware.org/shells/v7sh.html

traditional Bourne shell family / history and development
http://www.in-ulm.de/~mascheck/bourne/
2011-01-14
? Version 7 (2.9BSD) and 3BSD and 4.xBSD (and Sinix 5.20 (ucb universe), SunOS 2) - Ultrix - Dynix 3.2 (ucb) - DomainOS 10.3
? System III (Plexus 1.0) and SINIX 5.20 (sie)
? SVR1
? SVR2 (MV/UX 3) and Ultrix sh5 - Version 8 - SunOS 3 - OSF/1 - HP/UX - Dynix 3.2 (att)
? SVR3 (MUNIX V3, SINIX 5.20 (att), SCO Xenix 2.3.4) and SunOS 4 - AIX - IRIX 3/4 - SCO Unix - Interactive Unix - DG/UX 40 - DomainOS 10.3 - Dynix PTX
? SVR4 (Reliant 5.42, OSF/1-SysV) and SunOS 5 - Heirloom - Schily - IRIX 5/6 - DG/UX 42 - EP/IX - Reliant UNIX
? SVR4.2 (UnixWare, OpenUnix)
804名無しさん@お腹いっぱい。:2011/05/23(月) 21:03:12.73
###
ash は、ksh と同じく、boune shell とは別のもの
ash variants
http://www.in-ulm.de/~mascheck/various/ash/
It was written by Kenneth Almquist as replacement to the traditional "System V Release 4" Bourne shell
due to the license war between AT&T and Berkeley. Berkeley distributed it first with "BSD 4.3-Net/2".

###
ここに、$(...) と `...` が議論されていました。
$( ) command substitution vs. ')'
http://www.in-ulm.de/~mascheck/various/cmd-subst/
A few words about the issue $( ) vs. `...`

###
抜粋しました。The default system shell /bin/sh の実体らしいです。
ash、bash、ksh、SVR2から4 Bourne shellを改造したものが使われています。
posix shellとして、ksh88 93 ash dash 辺りが使われていると理解しました。

SunOS 5.x (Solaris 2 ff.) ('92-)は、 modified SVR4 Bourne shell
SunOS 5.11 / OpenSolaris 2009.06 ('09)は、ksh93-tらしいですね。
MacOSX は、10.5 より、UNIX ですが、bash です。

various system shells
http://www.in-ulm.de/~mascheck/various/shells/
以下、抜粋した本文が続きます。
805名無しさん@お腹いっぱい。:2011/05/23(月) 21:05:52.05
2011-03-26
AIX 4.3.2 ('98), AIX 5.3 ('04)
* /usr/bin/sh: a (POSIX compliant?) M-ksh88f [aix-ksh]
BSD 4.3-Net/2 ('91), BSD 4.4 ('93) and ff., 386BSD*
* /bin/sh: Almquist shell (SVR4 compatible)
Cygwin 1.7.7 (2010-08-31)
* /bin/sh.exe: bash 3.2.51(24)
* /bin/ash.exe: dash-0.5.6.1-2 (Debian ash variant)
FreeBSD 5.3, 5.4, 6.0 ('04, '05)
* /bin/sh: FreeBSD variant of the Almquist shell
HP-UX B.11.11 / .22 / .23 / .31 aka HP-UX 11i v1 / v1.6 / v2 / v3 ('00 .. '08)
* /usr/bin/sh: M-ksh88f, labeled POSIX compliant, [hp-posix]
* /usr/bin/posix/sh: symbolic link to /usr/bin/sh
* 11.11 (11i): /usr/old/bin/sh: modified SVR2 Bourne shell
* 11.20 (11i v1.5): /usr/old/bin/sh is gone (in accordance to previous announcements)
IRIX 6.4, 6.5.x ('96...'06)
* /sbin/sh: ksh88f (or M-ksh88f e.g. on 6.5.5), modified: [irix-ksh]
* /sbin/bsh: "later" SVR4 Bourne shell [irix-sh]
Linux Distributions
* /bin/sh:
a bash-1, -2, -3, -4,
or dash (e.g. Ubuntu since 6.10 and Debian since 6.0 ("Squeeze")),
or an earlier Linux port of ash,
or the busybox port of ash.
806名無しさん@お腹いっぱい。:2011/05/23(月) 21:06:42.15
MAC-OS X 10.6.3
* /bin/sh, /bin/bash: bash 3.2.48 (separate binaries)
NetBSD 1.5.x, 1.6, 2.0, 4.0.1 ('00..'09)
* /bin/sh: NetBSD variant of the Almquist shell
OpenBSD 2.8, 2.9, 3.1, 3.5, 4.4 ('00,'01,'02,'04,'09)
* /bin/sh: pdksh(-v5.2.14)
OpenServer 6.0.0 (Thanks to Rodolfo Mart?n for access) ('05)
The following are symbolic links to /opt/K/SCO/Unix/6.0.0xxx/usr/bin/
* /usr/bin/sh: modified SVR3 Bourne shell
* /usr/bin/posix/sh (symbolic link to /opt/K/SCO/Unix/6.0.0xxx//u95/bin/sh): a POSIX labeled ksh88g
OSF1/V4, V5 ('96...'06)
* /usr/bin/sh: modified SVR2 Bourne shell, [osf-sh].
SunOS 5.x (Solaris 2 ff.) ('92-)
* /usr/bin/sh: modified SVR4 Bourne shell.
SunOS 5.11 / OpenSolaris 2009.06 ('09)
* /usr/bin/sh: symbolic link to /sbin/sh
* /sbin/sh: symbolic link to /usr/bin/i86/ksh93
* /usr/bin/i86/ksh93: ksh93-t
* /usr/has/bin/sh: SunOS 5 variant of the SVR4 Bourne shell
UWIN (AT&T Unix Services for Windows)
* /bin/sh.exe:
UWIN 4.5 2010-06-08: JM-ksh93t+ 2010-05-24

Endnotes:
[ksh] About ksh versions on this page:
* the short term "[M-]ksh88[x]" actually means "Version [M-]11/16/88[x]", and later versions are abbreviated in the same way.
* The M- prefix in a ksh version string means multi-byte support (behaviour according to locale settings).
807名無しさん@お腹いっぱい。:2011/05/23(月) 22:04:32.10
どうでもええやん
``でも問題ないのだから
808名無しさん@お腹いっぱい。:2011/05/24(火) 00:29:06.52
当然読み飛ばした
809名無しさん@お腹いっぱい。:2011/05/24(火) 06:47:07.98
>>785
それ昔のPC-9801のキーボード
98からUNIXマシンにtelnetする時はカナの濁点を使う必要があった
バッククォートキーがハード的に付いてないって、
まったくUNIXのことを考えられてないキーボードだったな
810名無しさん@お腹いっぱい。:2011/05/24(火) 07:40:27.67
昔の、って確か無印(初代)から、アルファベット1文字世代だっけ?
811名無しさん@お腹いっぱい。:2011/05/24(火) 08:46:18.95
なる程。いろいろな意見がありますね。有難う御座いました。
動けば、違いを気にされないのも分かります。得に、思い通りに動かない時は。
確かに、見たこと無ければ使わないし、周囲の人が、`...` だと、あえて使う $(...) はカジュアルな感じがしなさそうです。

そういえば私も覚えたての頃、入力しながら "Back->戻す" みたいな感じでブツブツ言ってたような気がします。
サブシェルで動くようですので、$(...) が、(...) に似ているのは、利にかなっているなあとか思っていましたが、`...` を使われる方にとっては確かに紛らわしいだけですねぇ。
私などは、画面についたゴミと見間違うようで、あるんだか無いんだか分からない ` の方が、紛らわしいと思うのですが、人により色々ですねぇ。

http://www.in-ulm.de/~mascheck/various/cmd-subst/ をみると、backquotes are easily confused with apostrophes 等と同じ事をいってますね。
一方で、欠点は The "$( )" form is not as traditionally portable as the `...` form ですか。
Bourne Shell と POSIX Shell が違う事は知ってましたし、そのサイトも見た覚えが合ったのですが、POSIX Shell として、ksh88 93 ash dash が使われているんですね。

右手にサンドイッチやメモを持って、左手だけでも打てますしねぇ。$と()は、右手と左手ですし、両手で向かってないと打ちにくいですね。
JISキーボードだと、Pの右側に(@/` kana入力で゛)がありますが。何の話だろうと思っていたのですが、グリーンモニター等の類の、ギャグだったとは。98でtelnetもしていたはずですが、忘れてました。御二人とも、上級者ですねぇ。さぞ痛い目に合ったのでしょう。
PC9801VX2とか何とかってありましたっけ。確かその頃に、そういえば私も腹が立ってキーボードを叩いたような。

ポータブル性が必要もしくは気を払われて、疑問に思いながらも使われている方が多いのかと思いましたが、的外れなようですね。嫌というよりはむしろ愛?して使ってる方が多いとは意外でした。
812名無しさん@お腹いっぱい。:2011/05/24(火) 09:57:15.02
3行で
813名無しさん@お腹いっぱい。:2011/05/24(火) 10:04:18.53
> http://www.in-ulm.de/~mascheck/various/cmd-subst/

zsh使いだが,zsh の互換度の低さにちと笑ってしまった
814名無しさん@お腹いっぱい。:2011/05/24(火) 11:41:05.75
互換性とかどうでもいい気がするー
815名無しさん@お腹いっぱい。:2011/05/24(火) 11:56:52.60
スクリプト記述用としては重要。
zsh専用スクリプトならzshスレで。
816名無しさん@お腹いっぱい。:2011/05/24(火) 11:57:41.19
zshでスクリプト書くやつなんているのか。
817名無しさん@お腹いっぱい。:2011/05/24(火) 12:02:36.65
>>816
既存システムですでにzshの資産があるから今後もzshで開発継続しろ、
とかそんなんは見たことある。
818名無しさん@お腹いっぱい。:2011/05/24(火) 12:33:15.03
ubuntuですが、Version 7版Bourne Shellが、make 1発で出現しますた。

Geoff Collyerのソースは、パッチを当てるとmakeだけ出来たが、エラーが出た。
1つ下のNikola Vladovのv7_sh.tar.gzを落として、make。./shで、そのまま使える。
READMEに"This work is based on the Geoff port cited above."ってあった。

PS1='`pwd`\$ 'とか出来んしw。
819名無しさん@お腹いっぱい。:2011/05/24(火) 13:52:59.15
ksh入れてくれているだけでいいのに
820名無しさん@お腹いっぱい。:2011/05/24(火) 15:29:30.05
シェルスクリプトって同じ記号にたくさん意味割り当て過ぎだと思うよ。
だから`も使いたくなる。

ところで、全然違う話だけど、
$((expression))で計算できるのっていつからなのかな?
ただの拡張機能?exprコマンドの必要性が分からないんだよね。
821名無しさん@お腹いっぱい。:2011/05/24(火) 15:51:35.97
822名無しさん@お腹いっぱい。:2011/05/24(火) 16:01:35.99
Arithmetic expansionが使えるシェルでしか動かなくていいなら御自由にどうぞ。
823名無しさん@お腹いっぱい。:2011/05/24(火) 16:34:38.55
さっそく、役に立ちそうだ。にやにや
v7sh$ echo $(( 2 * 3 ))
syntax error: `(' unexpected
v7sh$ syntax error: `)' unexpected

ksh93$ echo $(( 2 * 3 ))
6

>>821のと合わせて
v7からksh88 の間と見た。
上の、http://www.in-ulm.de/~mascheck/bourne/には、検索で見当たらない。
答えはcshかksh88だな。

しかし、このv7shはexitもできんのぉう。
上でv7sh使いの人がいらっしゃったようだが、まだいたら教えて下さい先生。
Control-Dでexitするので正解?
824名無しさん@お腹いっぱい。:2011/05/24(火) 17:04:09.95
起動時に-tでなければ、対話モードではeofまで終了しません。
See Also: exitsh(), main()

対話モードはスレ違いですけど。
825名無しさん@お腹いっぱい。:2011/05/24(火) 17:12:03.80
exitでエラーも出さずにexitさせないって、どういう罰ゲームなんだろう。
826名無しさん@お腹いっぱい。:2011/05/24(火) 17:24:13.65
そういうプレイなんだよ。
827名無しさん@お腹いっぱい。:2011/05/24(火) 18:31:19.99
>>824 早速教えて下さって、有り難うございます。スレ違い失礼しました。
しかし残念ながら、解決致しませんでした。"v7sh -it"は1コマンドで終了。"v7sh -t"はプロンプト出ずコマンド1つのみ受付けて終了。途中での"set -t"は即終了でした。
main() exitsh()は、manになく、googleで検索しても今ひとつ。main.cと、error.cで定義されてましたが、理解には至りませんでした。
何か勘違いしているかもしれませんが、また調べてみます。

  /*
   * UNIX shell
   *                 そもそもgnome-terminalのbashから起動するもんじゃないんじゃw。
   * S. R. Bourne と下衆な仲間たち\(‘w‘)/
   * Bell Telephone Laboratories
   */
828名無しさん@お腹いっぱい。:2011/05/24(火) 19:29:02.15
結構古くから算術式展開できたんだ。
今じゃほとんどのシェルでできそうだ。
できないシェルはdeclare -iとかletとかでも無理なのかな?

互換性が欲しいときはexpr使うけど、
これもせめて浮動小数点数演算や、標準入力から式の読み込みをやって欲しいなぁ。
bc -lとかxargsとか使えってか?
829名無しさん@お腹いっぱい。:2011/05/24(火) 20:42:32.21
浮動小数点数演算はライブラリやCPUによって結果が違ってくるのに。シェルなんかでできて何が嬉しんだ?
830名無しさん@お腹いっぱい。:2011/05/24(火) 22:14:33.62
>>827
-tなら1コマンドでv7shが終了するから、exitで終了できるだろ。
しかもexit codeはちゃんと引き継がれてる。

# sh -t
exit 0
# echo $?
0
# sh -t
exit 1
# echo $?
1

831名無しさん@お腹いっぱい。:2011/05/24(火) 22:16:54.60
>>828
世の中の/bin/shが何であるか
こっちからコントロールできるわけじゃないのだから、
お前みたいなこと考えても時間の無駄。
832名無しさん@お腹いっぱい。:2011/05/24(火) 22:56:14.55
それを言っちゃあ、おしめぃよぉ
833名無しさん@お腹いっぱい。:2011/05/24(火) 23:55:25.28
>>830
"v7sh -t"はプロンプト出ずコマンド1つのみ受付けて終了
この一文で、830と同じ事を言っているのだが、通じてないのは俺の書き方が悪かったからだろうな。
v7sh -tとすると、exitなんか関係なくecho hogeでも終了する。対話シェルに入って、問答無用で即終了は使えんだろう。
BASH$ v7sh -t
echo hoge
hoge
BASH$

こういうのには、-tは要らないんだが。
BASH$ v7sh -c 'echo -n "hoge "; echo "fuga"; exit 19'
hoge fuga
BASH$ echo $?
19
834名無しさん@お腹いっぱい。:2011/05/25(水) 08:45:56.57
Integer arithmetic の所で$(( ))の比較が見つかりました。
csh 系は syntax こそ違いますが、Bourne shell 以外のシェルでは使えそうです。

Comparison of command shells - Wikipedia, the free encyclopedia
http://en.wikipedia.org/wiki/Comparison_of_command_shells
835名無しさん@お腹いっぱい。:2011/05/25(水) 10:21:25.21
age
836名無しさん@お腹いっぱい。:2011/05/25(水) 12:37:47.09
echo 'foo^bar$baz' | sed -re 's/\^/\\^/g; s/\$/\\$/g'
を `...` で単純にくくって、

escaped=`echo 'foo^bar$baz' | sed 's/\^/\\\\^/g; s/\$/\\\\$/g'`; echo "${escaped}"
とは出来んでしょ。わざわざ、気をつかって

escaped=`echo 'foo^bar$baz' | sed 's/\^/\\\\^/g; s/\\$/\\\\$/g'`; echo "${escaped}"
とするより、$(...)を使って

escaped=$(echo 'foo^bar$baz' | sed 's/\^/\\^/g; s/\$/\\$/g'); echo "${escaped}"
の方が、簡単でしょと、言ってます。

参照元。題は、私の翻意ではありませんので、刺激されやすい方はご留意下さい。
http://blog.livedoor.jp/wbcchsyn/archives/51132233.html
837名無しさん@お腹いっぱい。:2011/05/25(水) 13:06:34.67
http://blog.livedoor.jp/wbcchsyn/archives/51132233.html
FORTRAN以外、しかもシェルなんて使うキッシュイータが何をいってるんだか。
838名無しさん@お腹いっぱい。:2011/05/25(水) 14:33:33.02
13:06 か。
本物のプログラマは昼食時間に合わせて出勤するという噂は、本当のようだな。
839名無しさん@お腹いっぱい。:2011/05/25(水) 20:10:31.05
>>834
こういう比較いいなぁ。どうやらexprの出番は文字列関連だけで済ませられそうだ。
840名無しさん@お腹いっぱい。:2011/05/26(木) 15:45:39.20
あらためて比較すると、100倍以上の差をつけて高速化しますなぁ。

ザクとは違うのだよ、ザクとは!
ザク=`expr' グフ=`$((...))' ギャン=`(( += ))'

ギャンは、`+' が有るからだおー。

他に知っている、高速化テクニックを挙げていきませんか?
知らないのが出てきたら、うれしいんだけど。多分他のポケモンのみんなも。
841名無しさん@お腹いっぱい。:2011/05/26(木) 17:50:36.22
そもそもその例がどういう高速化例なのかがよく分からない
842名無しさん@お腹いっぱい。:2011/05/26(木) 18:08:30.72
高速化って言っても限度があるだろう。
本当に速度が欲しくて手軽に書きたいなら、awk、perl、python、ruby…ってなるんじゃないか。

シェルスクリプトにもコンパイラがあればな。

# 書いてて思い出したが、昔BASICでスペース削って高速化ってあったなぁ。何もかも懐かしい。
843名無しさん@お腹いっぱい。:2011/05/26(木) 18:12:23.60
プロセスを何回も起動するシェルスクリプトで
速度が必要なことって殆ど無いし、ボトルネックはforkでしょ
844 忍法帖【Lv=11,xxxPT】 :2011/05/26(木) 18:22:39.71
懐かし話に乗っかりますが、
BASIC なら PEEK とか POKE とかしましたねー。
マシン語の域でしたが。続けると、スレ違いなのでこの辺で。
845名無しさん@お腹いっぱい。:2011/05/26(木) 18:53:25.35
うわっ、懐かしすぎて涙出てきた。誰だよ、DATA文に機械語書き出した香具師わ
あの頃と今じゃ違い過ぎる、何もかも。

変な小細工でシェルスクリプト高速化するより、選べる時代なんだから適所適材だと思うぞ
846名無しさん@お腹いっぱい。:2011/05/26(木) 20:06:25.35
>>842 >>843 >>845
限度はあるな。確かにオナニーの範囲だ。
それでも、シェルを変えたりしても違いが出るとか喜んでいる奴も少なからずいると思うがね。
上でも、timeとか使っている奴がいたりして、
fgrep grep egrepとか、[...] &&...||...とか比較していた奴がいたが、
お前等にとってみれば無駄な事なんだろうなぁ。

うーん。速度が必要なければ、forkなんか避ける必要もないもんな。
まあ、必要ない奴には必要ないんだろう。
まあ、なんだ、俺はただの知識欲や技術向上欲かも知れないが、
速くなるスクリプトの書き方を選べたりすると嬉しい訳だ。

>>841
たとえば、こんな感じな。適当なので間違ってたら知らん。
まあ、実際に使用するスクリプトじゃあ無いけどね。

#!/bin/ksh
#もしくはbash zsh どうやらPosix Shellにはtimeが無い。
for Command in 'sum=`expr ${sum} + ${i}`' 'sum=$(( ${sum} + ${i} ))' '(( sum+=${i} ))'
do
echo "Now Testing ... ${Command}"
time ( sum=0; for i in $( seq 1 20000 ); do eval "${Command}"; done; echo "Sum: ${sum}" )
echo
done
847名無しさん@お腹いっぱい。:2011/05/26(木) 21:49:41.77
デフォルトらしいから、Bourne Shellで走るようにしてみた。
ほとんど同じもん。

#!/bin/sh
# usage script.sh [sh|ash|ksh|zsh|bash]
TestShell='/bin/'"${1-sh}"
printf "Testing in ... ${TestShell}\n\n"
for Command in 'sum=`expr ${sum} + ${i}`' 'sum=$(( ${sum} + ${i} ))' '(( sum+=${i} ))'
do
echo "Now Testing ... ${Command}"
# どうやらPosix Shellにはtimeが無いらしい。/usr/bin/timeは複合コマンドを受け付けないらしい zshのtimeは {..;} を受け付けない。
logfile="`basename "${0}"`-"${1-sh}".log"
time -p "${TestShell}" -c 'exec 2>/dev/null; sum=0; for i in `seq 1 20000`; do '"${Command}"'; done; echo "Sum: ${sum}"' 3>&2 2>&1 1>&3 3>&- | sed -e "/real/!d" | tee -a "${logfile}"
echo
done
848名無しさん@お腹いっぱい。:2011/05/27(金) 12:48:50.73
実行結果は?
849名無しさん@お腹いっぱい。:2011/05/27(金) 16:07:53.96
>>848
おいおい、そりゃないぜ。
一つ良い事を教えてやろう。スクリプトというのはな、誰でも走らせる事が出来るんだ。
まあ、機会があってお前に興味があれば試してみろ。自分の手でな。
いいか? 自分の手でだ。
この掲示板は、いつまでもお前を待っているからな。
機会が無ければ、お前には縁がなかったって事だろうよ。

二度と馬鹿な事を口にするんじゃあないぞ。
850名無しさん@お腹いっぱい。:2011/05/27(金) 22:58:29.19
仕事でスクリプトを組めば、既知の人も多く、チラ見で結果が予想出来る程度の事だろう。
結果なんか貼っても、誰も喜ばないぞ。何をからかってるのだろう。

と思ったのだが、普通に、良く分からないけれど興味半分で、軽く話に乗ってくれた人かもしれないな。
それなら言い過ぎた。善意の人に負の感情を植え付けて何やってるんだろう。

しかし知らない人に、あれこれ手を差し延べてまで知って欲しい事じゃあないしなあ。
確認程度なら、>>846の for 文のどれかを選んで、time の行をコピペでも十分済むだろうから、試してよ。
851名無しさん@お腹いっぱい。:2011/05/27(金) 23:07:43.81
もはや趣味の世界だな。
実務でシェルスクリプトでそこまでする機会はないといっていい。
852名無しさん@お腹いっぱい。:2011/05/27(金) 23:18:15.11
こういうときにはどう書けば一番速く動くのか、って話じゃないから話題にし辛い。
具体例を出せば、いろいろ出てくるかもしれない。
ただ、誰が書いても、同じようになると思うんだけどねえ。
853名無しさん@お腹いっぱい。:2011/05/27(金) 23:30:28.22
時間の流れから見て、そろそろ 841-845 は、1度以上スレ見てるだろうし、
次の話題を振る人が、振りやすいように書いておきます。

ここに書き込みがあると、すぐに反応を返している人間は少ないから、
上の方で書き込んだ人と同じ人がまだいて、その人達なら time とか好きそうだったから、
ぶっちゃけ、盛り上がるかと思って話を振っただけなんだな。

もしかしたら、分かりにくかったかなぁ?
よく見ると顔文字や、訳分からんギャル文字に見えない事もないし。
すぐ上で同じ話題だったから、そりゃないか。

まあ、気に入らなかったという事で。

ネットで検索すれば色々書いている人もいるし、
特にここで高速化の話がしたい訳じゃないから、軽く流して、次行きましょう。
854名無しさん@お腹いっぱい。:2011/05/28(土) 00:04:29.96
850 を書いてしばらく置いておいて、リロードしないで 853 を書き込んだから、
気付かなかった。

>>851
851 は、言い切りが気持ちいいなあ。同意しかねるが、851 はそうなのだろうな。

>>852
確かに。そういうイメージだと、そうだなぁ。
例えば、[ ] より [[ ]] だとかほとんど答えが出ているものを、言い合って、
それってあるあると、テンポ良く言い合って行きたかったのだけど。

いくつかネタは用意してあったが、
expr $(( ))で、通じなければ、面倒くさそうだから止めておくよ。
855名無しさん@お腹いっぱい。:2011/05/28(土) 00:08:17.62
うーん。前向きな意見に対して、何を後ろ向きな事を、言っているのだろう。
止めておくよは無いよな。

本当に、適当に書き込みすぎだ。
856名無しさん@お腹いっぱい。:2011/05/28(土) 02:50:07.58
[[ ]] はPOSIX shellにないから使いたくないな
857名無しさん@お腹いっぱい。:2011/05/28(土) 18:59:38.74
>>851 は、"仕事"のキーワードに反応して、実務の一般的な話を 851 なりに披露してくれたが、
趣味で使っている人に対し暗示的にネガティブな印象なので、一応言っておく。
850 では"仕事"だけに限定したつもりはない。趣味でも学習目的でも何でも良い。

>>731にも、23時台に似た種類のレスがあって、酔っ払い呼ばわりされていたが、
夜だからか、頭が疲れてくるのだろうね。自分も含めて。
なんだか少し話を変えた内容で批判されても、
それに気付かないで 854 みたいな適当に返事するものじゃあないな。気をつけようっと。
858名無しさん@お腹いっぱい。:2011/05/28(土) 19:18:27.15
変な奴が住み着いたねえ
859名無しさん@お腹いっぱい。:2011/05/28(土) 19:35:12.39
>>858
俺を差して言うようだったら、お前はむかつくやつだな。

それに、住み着いたつもりは無いがなあ。
話の合わない奴等だと分かれば、何も好きこのんでこれ以上こちらから話しかけて言ったりしない。

気持ち悪いから、ねっとり絡み付くようなレスを付けるなよ。

気に入らなけりゃあ、流してくれて結構。
ほっとけば、こちらから何も書かない。
860名無しさん@お腹いっぱい。:2011/05/28(土) 19:35:56.92
>>856
ネタを言い合うのとは、違うが。
そうか、856はポータブル性を、意識しているのだな。

しかし、POSIX Shellには"[[ ]]"があると思うよ。
もしkshの事が即ちPOSIX Shellだと思っているのだとしても、
ksh88のマニュアルにも載っているし、
POSIX Shellにおいても"on some implementations"として記載されている。

俺がどうこう言う事じゃあないだろうが、
POSIXはPOSIXできちんとおさえておいて、シェルによって賢く使い分けてもいいのでは。

"ない"ものを調べるので、一応2種類とも見てみた。
興味あるだろうから、見出し等を貼っておいた。
The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004 Edition
The Open Group Base Specifications Issue 7 IEEE Std 1003.1-2008
2. Shell Command Language
2.4 Reserved Words
861名無しさん@お腹いっぱい。:2011/05/28(土) 19:57:07.70
>>860
> しかし、POSIX Shellには"[[ ]]"があると思うよ。
862名無しさん@お腹いっぱい。:2011/05/28(土) 20:05:21.11
>スクリプトのお勉強・自慢・腕試しなどにどうぞ。

なんだからまさにぴったりとは思うけどな。
863名無しさん@お腹いっぱい。:2011/05/28(土) 21:55:48.04
The following words may be recognized as reserved words on some
implementations (when none of the characters are quoted), causing unspecified results:

[[ ]] function select

POSIX では規定されてないじゃん。
個人的には bash で使いまくってるけど。
864名無しさん@お腹いっぱい。:2011/05/28(土) 23:37:50.13
思うのは勝手なので。
865名無しさん@お腹いっぱい。:2011/05/29(日) 00:22:00.65
初めに高速化の話題を、何も限定しないで振るから…
全般に(POSIXシェルの範囲で)使える高速化の手段なんて、それこそ存在しないんじゃないかな。

[[も予約語であるだけで、挙動は規定されてないようだし、
それが使えないシェルじゃ、高速化とか以前の話だろ。

bashで良いなら、ブレース展開で書くとループ消せて速いとか、
さらに4にすると、mapfileで配列にファイルを読めて速く書けそうとか、
ありそうだが、あまりに限定すると、同じ機能でもシェルによって違う記法になってたり、
あるシェルでしか使えない方法だったり、高速化と移植性がトレードオフになる。

広い範囲でそこそこ動くのも魅力だろ?移植性捨てますか?
捨てるなら捨てるで、限定すべきだ。話自体は、このスレで問題ない。
866名無しさん@お腹いっぱい。:2011/05/29(日) 00:38:58.67
そろそろ勘弁してもらえませんか?
867名無しさん@お腹いっぱい。:2011/05/29(日) 00:48:45.14
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  <  っは?
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\


868名無しさん@お腹いっぱい。:2011/05/29(日) 01:03:28.78
>>860
文献列挙してるくせに全然読めてないのなw
869名無しさん@お腹いっぱい。:2011/05/29(日) 01:40:34.55
[と[[の違いって何でしょうか?
使わないコマンドのことはわからなよね(´・ω・`)
870名無しさん@お腹いっぱい。:2011/05/29(日) 08:05:29.54
なんか、別の人もレスを付けてくれて、別の方向に盛り上がってきたな。

>>863
同じ文らしいが、あえて全文を貼って、議論をしたいという事は、
余程、語学に自身がある奴なのだろうな。
871名無しさん@お腹いっぱい。:2011/05/29(日) 08:06:21.63
しかし、もしかしたら、変化球を投げる奴かもしれないので、少し注意しないとな。
>>857で、"なんだか少し話を変えた内容で批判"してくる奴がいるから気をつけようとしていた矢先だ。
"記載されて" -> "規定されて"
雑で文字の間違いもあるだろうが、自分なりになるべく言葉は選んであるつもりだ。
872名無しさん@お腹いっぱい。:2011/05/29(日) 08:06:54.78
>>865
建設的な意見を、有難う。
reserved wordsとして"記載されて"いる事を、確認していただいている事を、まず挙げておく。

そして、つぎに、このスレのデフォは、POSIXではなくBourneだ。
よって、"$(( ))"とあれば、その意味する所は、自明の理だ。
Bourneを逸脱した話で、当然BASH上等だろう。
873名無しさん@お腹いっぱい。:2011/05/29(日) 08:07:52.74
もとより何か限定しなくとも、知らない奴は調べるだろうし、
使いたくなければスクリプトを書く時に選べるのだから、
キーワードをポンポンと挙げていくだけで、いいと思うが。どうだろう。

こんな雰囲気じゃあ無理だろうが、もっとフランクに、
適当なひらめきだけ挙げて検証は後ほど何て言うのも、いいなあと思っていた。
874名無しさん@お腹いっぱい。:2011/05/29(日) 08:08:29.47
なにも、挙げるだけなのに移植性と身を共にしなくても、柔軟臨機応変で良いのではないだろうか。
最後に、話自体をこのスレでする事を、認めてくれて有難う。
875名無しさん@お腹いっぱい。:2011/05/29(日) 09:33:55.55
読み方によっては、どちらともとれるのが862-863と、866-867なのだが、

>>862-863
>>861 は 860にレスを付けているが、内容が引用だけで、860に向かっていない。
862と合わせて読んでも、いまいち主語がはっきりとせず、誰に向かって言っているのか
876名無しさん@お腹いっぱい。:2011/05/29(日) 09:35:11.55
意図がはっきりとしない。
860は、このスレにぴったり。
"ネタを言い合うのとは、違うが。"に対して、856はこのスレにぴったり。
>>864を見る限り、善意の方で解釈して、860 を肯定してくれているみたいだな。肯定してくれて有難う。

>>866ー867
877名無しさん@お腹いっぱい。:2011/05/29(日) 09:36:03.91
これは、セットで書いたみたいだが、わかりやすい手だな。
からかっているのだろうが、面白かった。
こいつは、過去スレでも、使っているのかなあ。
しかし一応、単に866だけを、他の黙ってみている奴が言ったものだととらえて、謝っておく。

質問したいやつとかもいるだろうに、書き込みづらいだろうなあと、気にしていた。
878名無しさん@お腹いっぱい。:2011/05/29(日) 09:37:05.69
実は、複数人で読んだり書いたりしているのだが、書くのはほぼ俺だが。
"あーあ、もうやめようぜ。酔っ払いがからんでくるのと同じだ。"
"いつまでも答えてるから、反応するんだろうよ。"
"俺は答えないな。"
"返事返すから、いつまでも続くのだろう。"
"突っ込みを入れなくても、見る人が見れば分かる。"
"私はもう止めた。"
879名無しさん@お腹いっぱい。:2011/05/29(日) 09:37:40.62
V6 Thompson Shell Port とか言うのがパッケージにあったのですが
これってこのスレ的にどうでしょうか?
コマンドラインとして使うのではなく、スクリプトのテスト用としては。
880名無しさん@お腹いっぱい。:2011/05/29(日) 09:37:51.83
とか言う意見なので、そろそろ、レスを返すのも止めるが気を悪くしないでくれ。

しかし、質問が書いてあったら、すぐさま答えたりして、偉いなあと思ったよ。
どうぞ続けてやって下さい。陰ながら、応援する。
881名無しさん@お腹いっぱい。:2011/05/29(日) 09:38:39.51
>>842
言いたかったけど、話がそれるので言わなかった事。
ただの口癖かもしれないが、"何もかも懐かしい"は、ガンダムネタを受けて返した様に思って、おかしかった。何だろうと少し考えたら、確かあれはヤマトだったな。懐かしい。
882名無しさん@お腹いっぱい。:2011/05/29(日) 09:39:09.28
>>868
変化球投手の、続投かな。別人でもまあいいけど。なにしろ、書き込む人が少ないからなあ。
他の人の迷惑になるから、反応しない事にする。
883名無しさん@お腹いっぱい。:2011/05/29(日) 10:07:14.86
>>869
口(指)が回っているついでに、書きますが。この手の事は、聞く種類のもんじゃあ無い。
といっても、調べ方も分からなかったら、困るだろうから、調べ方を。
man bash。gman とか w3mman もあるよ。検索はlessなら、/\[\[
そうすると、キーワードが見つかるだろう。そこで、検索。"複合コマンド [["
884名無しさん@お腹いっぱい。:2011/05/29(日) 10:08:13.55
今のところ、"試験運用中なLinux備忘録"が、一番上にくる。

もうくどかったら、読み飛ばしてくれ。コマンドなんかは、覚え(られ)ない。
使っている内は覚えてるのだが、使わなくなるといつの間にか煙の様に消えちまう。
覚えるのは、どこら辺を調べれば良いか。
本を買うのもいいだろう。"ああ、あの本のあの辺に合ったなあ"とかを、覚える。
だからこそ、自分で調べたらいいよ。
885名無しさん@お腹いっぱい。:2011/05/29(日) 10:09:05.93
less textfile としてから、h
大体hとか?とか-h --helpとかお決まりになっている。
うろ覚えだが、telnetで、telnet以外のポートにつないでも、HELPとかだし。
何でもh打ったり、設定ファイル覗いたりすればいい。
886名無しさん@お腹いっぱい。:2011/05/29(日) 10:17:24.77
面倒くさいだろうが、なれてくると聞くより速い。
それに、もし聞いても疑って調べ直すといいと思うよ。

以上、879を除く870から885とこのスレは、すべて俺ね。
>>879 はさみこんでしまったな。すまん。強調しておく。
887名無しさん@お腹いっぱい。:2011/05/29(日) 15:22:39.21
>>879
古すぎ
888名無しさん@お腹いっぱい。:2011/05/29(日) 22:12:02.16
>>887
古過ぎて、テスト用にも出来ない互換性になっちゃってるのでしょうか
できればパッケージ管理下でやりたいので、それ以外だとdash辺りになりますが、こっちのがマシでしょうかね…
889名無しさん@お腹いっぱい。:2011/05/29(日) 22:51:37.00
>>888
どういうスクリプトのテスト用かは知らないけど、
debianで提供されるスクリプトはbash依存を除いて
全部dashで動くようにする(した?)らしい。
使われてるってことで、マシじゃね。
890名無しさん@お腹いっぱい。:2011/05/30(月) 23:52:40.42
>>889
ここにshebang行を#!/bin/shで投稿するスクリプトのテスト用にする場合です
891名無しさん@お腹いっぱい。:2011/05/31(火) 12:15:03.37
openvpn のスクリプトが sh 仕様じゃなくてムカついた。
892名無しさん@お腹いっぱい。:2011/05/31(火) 22:53:14.21
初心者な質問。
cshの``ってどういう意味ですか?
893名無しさん@お腹いっぱい。:2011/06/01(水) 10:19:14.91
command substitution
894名無しさん@お腹いっぱい。:2011/06/01(水) 14:04:42.98
ああ、なんだ、command substitutionのことでしたか。
初心者な質問ですいませんでした。
895名無しさん@お腹いっぱい。:2011/06/01(水) 15:44:30.13
右も左もわからないばか者です。簡単なものでいいので実装したいです。
OSはcentOSになります。
シェルスクリプトの例と作り方教えてください。

お願いいたします。
896名無しさん@お腹いっぱい。:2011/06/01(水) 16:17:32.96
とりあえず >>2 の初心者向けリンクのリンク先を全部読んできたらどうかな
897名無しさん@お腹いっぱい。:2011/06/01(水) 18:28:35.09
Googleの使い方くらいわかるだろ。
898名無しさん@お腹いっぱい。:2011/06/01(水) 19:01:12.21
>>897
こういう時さくっと
簡単に要点だけ書けるやつがなんでいないだろうな。かわいそうに
899名無しさん@お腹いっぱい。:2011/06/01(水) 19:03:05.71
>>898
どうぞどうぞ。
900名無しさん@お腹いっぱい。:2011/06/01(水) 20:03:57.33
何をしたいかわからないのに実装したいですって、どんな質問なんだ
901名無しさん@お腹いっぱい。:2011/06/01(水) 20:11:33.30
>>898が要点だけサクっと書いてくれるらしいから、あわてずに待て。
902 忍法帖【Lv=3,xxxP】 :2011/06/01(水) 23:23:33.83
>>895
Linuxならブートスクリプト眺めてるだけでも良い勉強になる
Red Hat系なら/etc/rc.d/init.d/の中だったと思う

※ unix板では極力Linuxの名前は出さないほうがいいぞ
アホが寄ってくるから
903名無しさん@お腹いっぱい。:2011/06/02(木) 00:30:19.63
echo 'hello world!'
904名無しさん@お腹いっぱい。:2011/06/02(木) 00:43:31.85
>>895
#!/bin/sh
ls
905名無しさん@お腹いっぱい。:2011/06/02(木) 00:53:33.55
if, for, while, function, case

スクリプトで良く使う構文はこんなもんだな
あとは変数とか内部コマンド

Linuxのbashしか書いた事ないからcshとかzshとか分からん
906名無しさん@お腹いっぱい。:2011/06/02(木) 09:13:47.34
その辺のパーツ自体はどのシェルでも使うでしょ
書き方の差はcsh、tcshみたいに根本的な文法の違いとか
あとは同じsh系でも$((とか[とか[[とかが使えるか否か、みたいな違いはあるけれども
907名無しさん@お腹いっぱい。:2011/06/02(木) 20:54:09.88
ex110331.log
という文字列から11だけ抜き出す

$ echo ex110331.log | awk '{print substr($0,3,2)}'

と、適当に書いて思ったのだけど、2000年以前のIISはデフォルトだとどういうログファイル名だったんだろう。
と激しく板違いなことを思った。
908名無しさん@お腹いっぱい。:2011/06/02(木) 21:06:31.36
awk持ち出さなくてもexprで十分そうだけど
909名無しさん@お腹いっぱい。:2011/06/02(木) 21:11:32.61
いまさらながらに気づいたけど、cutにbオプションてのがあったのか…
910名無しさん@お腹いっぱい。:2011/06/06(月) 16:37:19.34
s=( $s )
if [ ${#s[@]} -gt 1 ]; then ... fi
という記述があったのですが、${#s[@]} ってどういう意味でしょうか。
911名無しさん@お腹いっぱい。:2011/06/06(月) 16:57:21.97
>>910
配列の要素数で、bash依存っていう意味ですw
912名無しさん@お腹いっぱい。:2011/06/06(月) 17:17:09.93
>>911
言葉がたりませんでした。
${#s[@]} の、とくに [@] の部分がよくわからないのですが、これはどういう意味でしょうか。
913名無しさん@お腹いっぱい。:2011/06/06(月) 17:25:18.32
Any element of an array may be referenced using ${name[subscript]}.
The braces are required to avoid conflicts with pathname expansion. If
subscript is @ or *, the word expands to all members of name.
914名無しさん@お腹いっぱい。:2011/06/06(月) 17:35:02.35
>>913
なるほど、rubyでいえば "#{list.join(' ')}" みたいなものということですか。
ありがとうございます。
915名無しさん@お腹いっぱい。:2011/06/06(月) 21:25:09.32
ディスクのシリンダ数を取得したいんですが
fdisk /dev/sdb << 'EOF'
p
EOF
で、cylindersとして表示されますが、この出力からgrepでcylinders行を
取り出すことはできますか?
916名無しさん@お腹いっぱい。:2011/06/06(月) 21:44:13.56
BSD板としては wd0d とか書いてほしいんだけど
917 忍法帖【Lv=3,xxxP】 :2011/06/06(月) 22:20:54.63
えっ!
918名無しさん@お腹いっぱい。:2011/06/06(月) 23:39:09.77
(echo p; echo q) | fdisk /dev/... | grep cylinders...

とか、

fdisk /dev/... <<EOF | grep cylinders
p
q
EOF

とか。
919名無しさん@お腹いっぱい。:2011/06/06(月) 23:57:20.27
BSD板て。
920名無しさん@お腹いっぱい。:2011/06/07(火) 02:12:37.86
懐かしBSD板の間違いだろ
921名無しさん@お腹いっぱい。:2011/06/07(火) 02:58:40.15
なつかしうなー
922名無しさん@お腹いっぱい。:2011/06/07(火) 06:03:33.39
fdisk -l | grep cylinders
だけで桶。
923915:2011/06/07(火) 12:29:42.95
>918
ヒヤドキュメントっと、こう言う書きかたができたんですか
>922
シンプルにできたんですね
ありがとう、ございました。

924名無しさん@お腹いっぱい。:2011/06/07(火) 15:37:35.51
edスクリプト+ヒアドキュメントでは定石。
925名無しさん@お腹いっぱい。:2011/06/07(火) 15:47:42.92
どやドッキュメント
926名無しさん@お腹いっぱい。:2011/06/07(火) 18:42:17.39
ヒアドキュメントを使ってしまうのは SunOS の format コマンドの悪影響に違いない
927名無しさん@お腹いっぱい。:2011/06/07(火) 18:51:47.85
たびたびすいません
#!/bin/bash

LANG=C

DATA=$(fdisk -l /dev/sdb | grep heads)
HEAD=$(echo $DATA | awk '{print $1}')
SECTOR=$(echo $DATA | awk '{print $3}')
CYLINDER=$(echo $DATA | awk '{print $5}')

# How many cylinders are needed for 512MB
SWAP=`expr 512 \* 1024 \* 1024 / $HEAD / $SECTOR / 512`
END=`expr $CYLINDER - SWAP - 1`

echo $END

expr: non-integer argument
となってしまします。
整数化するコマンドって

928名無しさん@お腹いっぱい。:2011/06/07(火) 18:55:22.08
ちょこちょこawkを起動するぐらいなら計算は全部awkにお任せで
いいんじゃねーの?
929名無しさん@お腹いっぱい。:2011/06/07(火) 19:01:18.52
>>927

> END=`expr $CYLINDER - SWAP - 1`

SWAPに$が抜けてるぜ
930名無しさん@お腹いっぱい。:2011/06/07(火) 19:06:35.44
>>927

LANG=C
set $(fdisk -l /dev/sdb | grep heads)
HEAD=$1; SECTOR=$3; CYLINDER=$5

ってしちゃえば
931名無しさん@お腹いっぱい。:2011/06/07(火) 19:19:42.09
512byte/sectの普通のHDDなら、
255head, 63sector以外は事実上使われていないから、
1シリンダ=255*63*512=8225280バイト
決め打ちでいいよw
932名無しさん@お腹いっぱい。:2011/06/07(火) 19:28:14.07
是非"$VAR"という習慣を。
933名無しさん@お腹いっぱい。:2011/06/07(火) 19:33:22.29
小容量のHDDの時代は1セクタでも無駄にしないように
全セクタ数を素因数分解したなぁ

あ、今でもUSBメモリで素因数分解するわ
934927:2011/06/07(火) 21:06:16.82
どうも
>929
結局、expr: non-integer argumentは SWAPの$が抜けてたからなんですね。
>930 932
勉強になります。

ありがとう、ございました。

935名無しさん@お腹いっぱい。:2011/06/07(火) 22:23:59.55
>>927
"SWAP" は変数ではなく文字列だから。
END=`expr $CYLINDER - SWAP - 1` ×
END=`expr $CYLINDER - $SWAP - 1` ○
でどうですか?
936名無しさん@お腹いっぱい。:2011/06/07(火) 22:30:20.05
うーーむ。
937名無しさん@お腹いっぱい。:2011/06/07(火) 22:56:21.45
なんで expr だけ $(...) じゃなくて `...` にしてるんだろ。
938名無しさん@お腹いっぱい。:2011/06/07(火) 22:59:14.61
最近やたらと back quote 取締官が出没する気がするんだけど、気の所為かな
939名無しさん@お腹いっぱい。:2011/06/07(火) 23:12:00.59
ダニが嫌いだから。
940名無しさん@お腹いっぱい。:2011/06/07(火) 23:15:42.08
そういう人か
941名無しさん@お腹いっぱい。:2011/06/07(火) 23:39:30.29
>>927
もう見てないかもしれないけど、
awk使っていいんだったら、↓みたいに書けるよ。

#! /bin/bash

LANG=C

DEV=/dev/sdb
fdisk -l "$DEV" |awk '/heads/ { swap = 512*1024^2/$1/$3/512; print $5-int(swap)-1 }'
942名無しさん@お腹いっぱい。:2011/06/07(火) 23:56:16.92
/usr/bin/mailでReturn-Path指定したいんだけど、どうすればいい?
man mail見たけど何も書いてなかった。。
943名無しさん@お腹いっぱい。:2011/06/08(水) 00:14:57.33
>>938
どこどこ?
944名無しさん@お腹いっぱい。:2011/06/08(水) 00:24:01.51
>>942
何のために?
sendmailなら-fでenvelope fromを指定したら設定されるだろうけど、
/usr/bin/mailの末端ユーザにFromをいじらす必要はないってことじゃないかな。
945>>942:2011/06/08(水) 00:28:20.55
>>944
/usr/bin/mailで、Return-Pathは設定不可能ってことですか?
sendmail使ったほうがいいのかなー
946名無しさん@お腹いっぱい。:2011/06/08(水) 00:34:49.20
perl か何かで書いちゃえば。
947927:2011/06/08(水) 10:44:15.86
>941
見ました。
awkって、こんな使い方ができたんですね。
ありがとう、ございます。
948名無しさん@お腹いっぱい。:2011/06/08(水) 14:22:02.52
sed, awkまでは許せるけどperl厨は失せろ
949名無しさん@お腹いっぱい。:2011/06/08(水) 14:56:33.44
rubyよりまだかなりマシ
950名無しさん@お腹いっぱい。:2011/06/08(水) 22:06:21.87
せっかくならawkもgrepも使わずに、fdisk以外はすべてシェルでやるべきだな

#!/bin/sh

LANG=C
set `fdisk -l /dev/sdb`
while [ "$6" != cylinders ]; do shift; done
echo $(($5 - (512 * 1024 * 1024 / $1 / $3 / 512) - 1 ))
951名無しさん@お腹いっぱい。:2011/06/09(木) 01:18:19.88
>>945
そうです、不可能です。
sendmail, rmailの領域です。
952名無しさん@お腹いっぱい。:2011/06/09(木) 10:16:51.19
953名無しさん@お腹いっぱい。:2011/06/09(木) 10:30:38.53
どこの /usr/bin/mail だよ
954名無しさん@お腹いっぱい。:2011/06/09(木) 10:50:51.51
BSDのmailx(1)は--の後ろはsendmailに渡す。
いつ頃からあるオプションか知らない。
少なくともUSDドキュメントにはない。
955名無しさん@お腹いっぱい。:2011/06/09(木) 10:59:16.00
どのBSDのどれ?
956名無しさん@お腹いっぱい。:2011/06/09(木) 11:24:59.06
http://www.freebsd.org/cgi/man.cgi
freebsd以外のmanも見られるのでご自分でお調べください。
957名無しさん@お腹いっぱい。:2011/06/09(木) 11:31:41.14
958名無しさん@お腹いっぱい。:2011/06/09(木) 11:37:15.50
959名無しさん@お腹いっぱい。:2011/06/09(木) 11:38:13.45
直接/usr/lib/sendmail呼び出しゃいいよ。定石なんで。
960名無しさん@お腹いっぱい。:2011/06/09(木) 11:48:47.57
--がいらないじゃん
961名無しさん@お腹いっぱい。:2011/06/09(木) 12:04:46.15
centos で man mail すると -- が必要に見えるな。

SYNOPSIS
mail [-dEIinv] [-a header] [-b bcc-addr] [-c cc-addr] [-s subject]
to-addr ... [-- sendmail-options ...]
mail [-dEIiNnv] -f [file]
mail [-dEIiNnv] [-u user]
962名無しさん@お腹いっぱい。:2011/06/09(木) 12:27:29.91
OS 間の mail コマンドの仕様の違いとか、
マシン間の sendmail の設定の違いとか、
いろいろめんどいよね。
963名無しさん@お腹いっぱい。:2011/06/10(金) 02:19:30.81
>>950
徹底振りが素晴らしい。計算にexpr使ったほうがよさそう、個人的に。

ところで、気になったんだけど、こういうとき元の引数を保存したいなら、どうするのがいい?
関数使うしかないのかねぇ?
964名無しさん@お腹いっぱい。:2011/06/10(金) 06:19:50.95
>>963 こういう事か?bashなら 1行で済むが。違う話かな?
#!/bin/bash
opt=( "${@}" )

#echo "${opt[@]}"
for var in "${opt[@]}"
do
echo "${var}"
done
965名無しさん@お腹いっぱい。:2011/06/10(金) 06:22:09.69
>>963 expr に言及している辺りで Bourne で走らせたいなら 6行か。
#!/bin/sh
[ -n "$DEBUG" ] && set -x

n=1
for var
do
eval opt_${n}=\"${var}\"
n=`expr ${n} + 1`
done

n=1
while eval [ -n \"\${opt_${n}}\" ]
do
eval echo \"\${opt_${n}}\"
n=`expr ${n} + 1`
done
966名無しさん@お腹いっぱい。:2011/06/10(金) 06:36:41.92
素直にサブシェル使った方がいいな。
fdisk関連の処理全体をサブシェル ( )で囲む。
( )を抜けたら引数元通り。
967名無しさん@お腹いっぱい。:2011/06/10(金) 07:29:40.11
ああ、それで関数使う話が出てくるのか。まったく勘違いをしていた。
968名無しさん@お腹いっぱい。:2011/06/11(土) 02:04:34.37
>>966
嗚呼!ありがとう。そうか、サブシェルか。思いつかなかった。

>>967
いろいろ書いてくれたのに、すまない。書き方が悪かったよ。
969名無しさん@お腹いっぱい。:2011/06/11(土) 02:22:24.28
>>963
シェル関数は"$@"は別の物が使われる。
970 忍法帖【Lv=10,xxxPT】 :2011/06/11(土) 15:59:35.72
古いperlに依存してる物を洗い出したんですがどういうスクリプト書けばいいでしょうか?
perl-5.10.1 => perl-5.12.3
971名無しさん@お腹いっぱい。:2011/06/11(土) 16:57:15.61
依存の定義がわからん。
パッケージマネージャーのタグイを使ってるならそれで調べるだろうし。
972 忍法帖【Lv=10,xxxPT】 :2011/06/11(土) 17:06:16.61
パッケージマネージャはrpmですが、ディストリを使ってないので。
今は/usr/lib/perl5/5.10.1/の中から探しだして一つ一つリビルドしてパッケージ作りなおしてるんですが面倒くさいのです。 orz

依存の定義は以前のバージョンのperlを参照してるパッケージ類です
つか、ここでは依存で通じないのか……。
973名無しさん@お腹いっぱい。:2011/06/11(土) 17:25:26.73
for i in $(rpm -qa); do
rpm -ql $x |grep perl5/5.10.1
done

うーん、これじゃどのパッケージに入ってるか判断できんのよな。
974973:2011/06/11(土) 17:26:12.92
for i なのに $xにしてしまった。すまん読み替えてくれ
975名無しさん@お腹いっぱい。:2011/06/11(土) 17:26:50.01
なんでシェルスクリプトでやりたいのかよくわからんが、
パッケージ管理してないなら、自動化は無理でしょ。
perlのrequire, useは、指定したversionより処理系が新しいことしか要求できないから。
〜より新しいと動かないという記述ができない。
「$] < 5.008」みたいな記述を発見したいなら、それこそperlでやった方が…
976名無しさん@お腹いっぱい。:2011/06/11(土) 18:12:41.78
>なんでシェルスクリプトでやりたいのかよくわからんが、
逆になんでこの発想になるのかよくわからんが。
977名無しさん@お腹いっぱい。:2011/06/11(土) 18:36:01.02
>>973,974
それを参考に書いてみました
まだ完璧じゃないですが。

for i in $(rpm -qa);do
rpm -ql $i | grep perl5/5.10.1 > /tmp/perlpkg.txt
for x in $(cat /tmp/perlpkg.txt);do
rpm -qf $x
done;done

forが入れ子になっててダサいですけど
もう一度ファイルに落としてsort|uniqしたほうが見やすいかなぁ
978名無しさん@お腹いっぱい。:2011/06/12(日) 15:12:19.28
ユニケージ開発手法ってどうなの?
別にごく普通のシェルスクリプティングでいいんじゃねーの?
bash、awk、sed、grep、GUIが欲しけりゃtcl/tkでいいじゃん。
メリットが全然見えない。

http://www.usp-lab.com/opinion.html
979名無しさん@お腹いっぱい。:2011/06/12(日) 17:40:39.14
980名無しさん@お腹いっぱい。:2011/06/13(月) 09:22:30.21
よく知らんがデータベースを使わないから安いんでしょ。
981名無しさん@お腹いっぱい。
>>977 解決した様ですが、rpm -qal 等という記述を見つけたので。
http://www.mindgear.org/index.cgi/PlusAlpha?page=%A5%D5%A5%A1%A5%A4%A5%EB%A4%F2%C3%B5%A4%B9RPM%A5%B3%A5%DE%A5%F3%A5%C9
あと、>>977 2行目と3行目は、まとめられます。
for x in $( rpm -ql $i | grep perl5/5.10.1 ); do
また、done の後にパイプで続けられます。