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

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


□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
2おkwwwwwwwwwwwww:2006/03/26(日) 00:57:10
□前スレや過去スレ:
シェルスクリプト総合 その5
http://pc8.2ch.net/test/read.cgi/unix/1137801629/
シェルスクリプト総合 その4
http://pc8.2ch.net/test/read.cgi/unix/1131026501/
シェルスクリプト総合 その3
http://pc8.2ch.net/test/read.cgi/unix/1124889646/
シェルスクリプト総合 その2
http://pc8.2ch.net/test/read.cgi/unix/1113664637/
シェルスクリプト総合 その1
http://pc8.2ch.net/test/read.cgi/unix/1101820646/

□関連スレ:
sed
http://pc8.2ch.net/test/read.cgi/unix/1085730992/
正規表現
http://pc8.2ch.net/test/read.cgi/unix/1039165754/
おまえら! shell は何を使っているんですか?
http://pc8.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc8.2ch.net/test/read.cgi/unix/1102921590/

□他板の関連スレ:
【sed】シェルスクリプト総合@LINUX【awk】
http://pc8.2ch.net/test/read.cgi/linux/1121994321/
【Shell】どのシェル使ってる?【Script】
http://pc8.2ch.net/test/read.cgi/linux/1067330754/
3ちょwwwwww:2006/03/26(日) 00:58:49
□初心者向けリンク
「誰にでも」シリーズ
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/

□参考リンク:
UNIXの部屋 (沢山のコマンドの簡単な紹介など)
http://x68000.q-e-d.net/~68user/unix/
POSIX: Shell & Utilities (標準規格)
http://www.opengroup.org/onlinepubs/009695399/utilities/contents.html
4ワッフルワッフル:2006/03/26(日) 01:00:22
□関連書籍と関連リンク:
FreeBSD Hypertext Man Pages
http://www.freebsd.org/cgi/man.cgi
Linux JF (Japanese FAQ) Project.
http://www.linux.or.jp/JF/
Unix Programming Frequently Asked Questions 日本語訳
http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html
UNIXプログラミング環境
http://www.amazon.co.jp/exec/obidos/ASIN/4871483517/

□人間初心者へのお願い:
・このスレはシェルスクリプトについてのスレです。
 シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
 使い方の質問などはスレ違いなので無用に願います。

□シェルスクリプトでよく使うコマンド:
制御・条件判定系: [,test,expr,true,false,yes,getopts

テキスト処理系: cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join

ファイル検索系: find,xargs
(スペースなどを含むファイル名を正しく処理するため、
findは -print0、xargsは -0オプションを常に付けることを推奨
ただし、Solarisでは未対応。どうするんだろ?)

ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl
5名無しさん@お腹いっぱい。:2006/03/26(日) 01:00:52
□最近のシェルスクリプト本(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/
6名無しさん@お腹いっぱい。:2006/03/26(日) 01:02:35
□最近のシェルスクリプト本(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) 詳解 シェルスクリプト アーノルド ロビンス (著), ほか
http://www.amazon.co.jp/o/ASIN/4873112672/
7名無しさん@お腹いっぱい。:2006/03/26(日) 01:03:05
以上でーす。
8名無しさん@お腹いっぱい。:2006/03/26(日) 01:16:47
|乙>>1|
       //
>三三三 //    ∧_∧ //
( ´>`)y=-※==(・Д・※==================⊃
(    ○      (     )
| ||    // /
(_)_)     (_(_)
9名無しさん@お腹いっぱい。:2006/03/26(日) 01:39:52
>>1
乙。
10名無しさん@お腹いっぱい。:2006/03/26(日) 10:34:22
rm -rf *
11名無しさん@お腹いっぱい。:2006/03/26(日) 14:57:07
結論。シェルを書いて、UNIXを打て!
12名無しさん@お腹いっぱい。:2006/03/27(月) 14:50:04
なぁ





                        お願いだから糞スレを立てないでくれるかな?



           俺からのお願いだよ


                               分かったら削除依頼よろしく
13名無しさん@お腹いっぱい。:2006/03/27(月) 16:21:08
前スレで紹介されてた debianの checkbashismsというコマンド、
perlスクリプトだったので持ってきて、いろいろ試してみた。

手元にあった bashスクリプトの1行目を #!/bin/sh に書き換えて
checkbashismsにかけてみたけど・・・
・・・なんかチェック甘いね。
ほとんど何も引っかからない。
引っかかったのは ${HOGE//hage/boke} くらい。

引っかけて欲しかった、↓は、
for ((i = 0; i < 10; i++)) { echo $i; }
通ってしまった。

これってbash依存じゃないの?
14名無しさん@お腹いっぱい。:2006/03/27(月) 16:37:07
>>13
@bashism_regexs にあるのしかひっかけないみたいね。
パッケージ作る際にありがちなのだけひっかかれば十分、
っていう考えなんじゃないの?
15名無しさん@お腹いっぱい。:2006/03/27(月) 17:14:55
perlって時点で真面目な作りを期待するのは無理があるね。

bashのソースを改造して、構文解析でbash依存の構文が出現したら
メッセージを出すようにすれば簡単に作れると思うんだけど。
16名無しさん@お腹いっぱい。:2006/03/27(月) 23:24:20
なぁ





                        お願いだから糞スレを立てないでくれるかな?



           俺からのお願いだよ


                               分かったら削除依頼よろしく
17HelpME:2006/03/28(火) 14:20:36
シェルスクリプト勉強中のものです。
tcshで困ってます。

----------------------------------------
#!/bin/sh

MYPATH=`pwd`
---------------------------------------
はOKなのに

------------------------------------------
#!/bin/tcsh

MYPATH=`pwd`
------------------------------------------
はNGなのは何故なんでしょう。

shとtcshでは変数に値を入れる文法って
違うのでしょうか?
18名無しさん@お腹いっぱい。:2006/03/28(火) 14:25:26
tcsh のことは忘れてよい。
19名無しさん@お腹いっぱい。:2006/03/28(火) 15:10:52
>>17
>>1 嫁。
>・csh/tcshのシェルスクリプトは推奨されません。
> (理由は「csh-whynot」でググれ)
20名無しさん@お腹いっぱい。:2006/03/28(火) 15:16:38
忘れてよい以前に17はtcshのことなんて全然知らんがな
21名無しさん@お腹いっぱい。:2006/03/28(火) 15:27:06
なぁ





                        お願いだから糞スレを立てないでくれるかな?



           俺からのお願いだよ


                               分かったら削除依頼よろしく
22名無しさん@お腹いっぱい。:2006/03/28(火) 15:30:35
良スレの予感
23csh大好きっ子:2006/03/28(火) 18:53:30
>>17
set MANPATH = `pwd`
24名無しさん@お腹いっぱい。:2006/03/28(火) 20:19:40
>>23
ばかもん。答えるなよ。皆んな知ってても敢えて答えなかったのに。
25名無しさん@お腹いっぱい。:2006/03/28(火) 21:00:47
削除依頼出して来るわ。
26名無しさん@お腹いっぱい。:2006/03/28(火) 21:33:14
基本的なことかも知れませんが、
シェルとUNIXとで実行結果が異なる場合、
どういった原因が考えられますか?
27名無しさん@お腹いっぱい。:2006/03/28(火) 21:51:02
>>26
キミの日本語インタープリターが壊れている。
28名無しさん@お腹いっぱい。:2006/03/28(火) 22:05:10
>>26
それは多分UNIXが間違ってるんだろうね。
ちゃんと手を洗ってからインストールした?
ウイルス入っちゃってるかもよ。
29名無しさん@お腹いっぱい。:2006/03/28(火) 22:33:07
あるコマンドを2回だけ繰り返し実行したいのです。
たった2回なのでforやwhileにするのは大げさなので、

#!/bin/sh
あるコマンド
!!

というシェルを書きましたが、エラーになります。
UNIXだと

$ あるコマンド
$ !!

で実行できます。なぜこうなるのでしょう?
30名無しさん@お腹いっぱい。:2006/03/28(火) 22:44:42
あるコマンド.exe にパスが通ってないんじゃないか?
31名無しさん@お腹いっぱい。:2006/03/28(火) 22:49:02
>>29
あんたは「シェル」を書いたんじゃなくて「シェルスクリプト」を書いた。
「UNIXだと」じゃなくて「シェルプロンプトだと」だ。
おそらくあんたの使っているシェルは/bin/bashか/bin/ksh。これらは/bin/shと違って !! で直前のコマンドを実行できる。

絶対確実というわけではないけど、どのシェルを使っているかは、

echo $SHELL

を実行してごらん。
32名無しさん@お腹いっぱい。:2006/03/28(火) 22:54:44
>>31
$ echo $SHELL
/bin/sh

と出ましたが。
33名無しさん@お腹いっぱい。:2006/03/28(火) 23:04:09
>>31
kshで!!が使えるとは、初耳です。
34名無しさん@お腹いっぱい。:2006/03/28(火) 23:22:23
!で始まるヒストリ操作はcsh由来だからcsh否定論者は使えないなww
35名無しさん@お腹いっぱい。:2006/03/28(火) 23:27:11
UNIX打つの人来てたのかー
3631:2006/03/28(火) 23:36:41
>>33
すまん、間違えた。

>>32
うーむ、今動いてるシェルが何かを確実に見極める方法は知らない。
bashを使っているという前提で次の事を試してみて。

Tabキーを連続して2回押すとどう表示されるか?

echo $BASH  の出力は?

ps の出力は?
37名無しさん@お腹いっぱい。:2006/03/28(火) 23:37:16
あるコマンド
あるコマンド

と素直に二行書けばいいじゃん
38Masa ◆Masa.mmzoo :2006/03/28(火) 23:45:03
sync
sync
sync
39名無しさん@お腹いっぱい。:2006/03/29(水) 00:13:31
>>29
起動する時に-funroll-loopsオプションをつけると
自動的に展開される
40名無しさん@お腹いっぱい。:2006/03/29(水) 00:57:52
!!
!-5
!32
!!
41名無しさん@お腹いっぱい。:2006/03/29(水) 00:59:14
>>37 無能
42名無しさん@お腹いっぱい。:2006/03/29(水) 02:24:03
質問です

aaa.txtという名前の2000バイト固定長ファイルの500〜502バイト目が
'xyz'のときだけ、そのレコードをbbb.txtにコピーするためには
どのようなスクリプトを作ればよろしいのでしょうか?

よろしくお願いします。
43名無しさん@お腹いっぱい。:2006/03/29(水) 02:49:01
> aaa.txtという名前の2000バイト固定長ファイル

固定長なのはレコード長なのじゃないのか?

#!/bin/sh
infile=aaa.txt; outfile=bbb.txt; tmpfile=/tmp/foo.$$
echo 'xyz\c' > $tmpfile.1
dd bs=1 skip=500 count=3 < $infile > $tmpfile.2
if cmp $tmpfile.1 $tmpfile.2; then
cp $tmpfile.2 $outfile
fi
rm $tmpfile.1 $tmpfile.2
44名無しさん@お腹いっぱい。:2006/03/29(水) 05:30:09
head -c502 aaa.txt | tail -c3
とかでいけそうな気もする
45名無しさん@お腹いっぱい。:2006/03/29(水) 06:46:49
なぁ





                        お願いだから糞スレを立てないでくれるかな?



           俺からのお願いだよ


                               分かったら削除依頼よろしく
46名無しさん@お腹いっぱい。:2006/03/29(水) 10:03:33
>>29
2回だけ手軽に繰り返したい、という質問なら、

#!/bin/sh
a='あるコマンド'
$a
$a


コマンドラインで !! が実行できるのに、
シェルスクリプト中では実行できないのは何故かという質問なら、

それは、「インタラクティブかどうか」でシェル自身が動作を変えているから。

!! が使える bashや zshであっても、
シェルスクリプト中では !!はただの !!という文字列になる。
47名無しさん@お腹いっぱい。:2006/03/29(水) 11:10:39
なんで >>37 じゃだめなん?
48名無しさん@お腹いっぱい。:2006/03/29(水) 11:43:34
tcshなら
repeat 2 あるコマンド
49名無しさん@お腹いっぱい。:2006/03/29(水) 12:13:07
>>48
それだと「構文」になっちゃうから、「手軽」にならない。
しかも、(t)cshの文法はタブー。

「構文」使ってもいいなら↓
for i in 1 2; do あるコマンド; done
50名無しさん@お腹いっぱい。:2006/03/29(水) 12:16:05
cshだと、スクリプトの中でさえ !!が使えるぞ。

#!/bin/csh
あるコマンド
!!

で桶。
なんたる糞Cシェル。

副作用として、
echo 'Hello !!'
が、シングルクォートで囲んでいるのに !!が展開されてしまう。
なんたる糞Cシェル。
51名無しさん@お腹いっぱい。:2006/03/29(水) 12:36:44
>>50
解ってるなら
不利益になるコマンドは使わなければ良いんだろ
52名無しさん@お腹いっぱい。:2006/03/29(水) 15:02:37
なぁ





                        お願いだから糞スレを立てないでくれるかな?



           俺からのお願いだよ


                               分かったら削除依頼よろしく
53名無しさん@お腹いっぱい。:2006/03/29(水) 15:13:43
>>52
飽きた
54名無しさん@お腹いっぱい。:2006/03/29(水) 16:01:48
sed と awk はどちらの方が実行速度で有利ですか?
55名無しさん@お腹いっぱい。:2006/03/29(水) 16:08:20
計ってみれば?
56名無しさん@お腹いっぱい。:2006/03/29(水) 16:08:34
>>54
んなもんやることによって違うに決まってるでしょ
57名無しさん@お腹いっぱい。:2006/03/29(水) 16:09:09
>>54
もちろん sed。(sedで書けるものはなるべくsedで)
58名無しさん@お腹いっぱい。:2006/03/29(水) 16:41:08
ありがとうござます。
バイナリサイズは sed < awk で4倍も差があったので、基本は sed で、
sed ではすっきりしないAVアホですっきりしたい時は awk って事にします。
59名無しさん@お腹いっぱい。:2006/03/29(水) 17:44:30
>>58
バイナリサイズの時間への影響なんて誤差の範囲だし、
メモリに載ってるかどうかで逆転する。つまり気にする意味がない。

速度が気になるなら57を鵜飲みにせず自分で2通り書いてはかってみれ。
60名無しさん@お腹いっぱい。:2006/03/29(水) 18:24:45
sed 's/hoge/hage/g'
と、
awk '{ gsub(/hoge/, "hage"); print }'
とで比較すると、

sedの方が約2倍速いなぁ。


>>59
「バイナリサイズの時間への影響はメモリに載ってるかどうかで逆転する」
というのは同意だが、それはsed/awkの起動時のオーバーヘッドであって、
起動中の文字列処理速度とは別の話。

sedでもできる処理をawkにやらせると、やっぱりawkの方が遅くなるよ。
61名無しさん@お腹いっぱい。:2006/03/29(水) 18:27:21
sed 使うか awk 使うか迷う場面ってどんなんだ?
62名無しさん@お腹いっぱい。:2006/03/29(水) 18:28:21
sed/awkについてはスレ違い。

sedは↓
http://pc8.2ch.net/test/read.cgi/unix/1085730992/l50

awkはスレがないけど、必要なら誰か立てて。
63名無しさん@お腹いっぱい。:2006/03/29(水) 18:32:49
awkについて語るスレ
http://pc8.2ch.net/test/read.cgi/tech/1023556171/

でも比較の話は中立な所でするほうが良いような。
64名無しさん@お腹いっぱい。:2006/03/29(水) 19:19:34
なぁ





                        お願いだから糞スレを立てないでくれるかな?



           俺からのお願いだよ


                               分かったら削除依頼よろしく
65名無しさん@お腹いっぱい。:2006/03/30(木) 00:53:43
>64
なにいってんだハゲ
帰れ
66名無しさん@お腹いっぱい。:2006/03/30(木) 01:53:10
なぁ





                        お願いだから糞スレを立てないでくれるかな?



           俺からのお願いだよ


                               分かったら削除依頼よろしく
67名無しさん@お腹いっぱい。:2006/03/30(木) 02:29:52
>>65
これスクリプトで書き込んでいるんじゃないのか?w
68名無しさん@お腹いっぱい。:2006/03/30(木) 08:42:51
結果が多少異なる点は放置して、こうなりました。

>find / -print > find.txt
>ls -l find.txt
-rw-r--r-- 1 root whell 27679632 Mar 30 07:39 find.txt
>time awk -F / '{print $1"/"$2"/"$3}' < find.txt >> /dev/null
17.871u 0.569s 0:18.57 99.2% 148+277k 0+0io 0pf+0w
>time sed -ne 's|^\([^/]*/[^/]*/*[^/]*\).*|\1|p' < find.txt >> /dev/null
770.721u 4.670s 13:00.62 99.3% 35+235k 0+0io 0pf+0w
>time sed -ne 's|^\([^/]*\)/*\([^/]*\)/*\([^/]*\).*|\1/\2/\3|p' < find.txt >>/dev/null
1616.450u 8.887s 27:16.78 99.3% 35+235k 0+0io 0pf+0w

sedに問題がありそうですが、そこはsedスレに行きましょう。
69名無しさん@お腹いっぱい。:2006/03/30(木) 10:00:03
>>68

sed -ne 's|^\([^/]*/[^/]*/*[^/]*\).*|\1|p'
↑じゃなくて、
↓じゃないの?
sed -ne 's|^\([^/]*/[^/]*/[^/]*\).*|\1|p'

(上だとアスタリスクが1個余分だから、無駄な処理が行なわれている)
下の方でawkと比較すると、
やはりsedの方が速かったよ。
70名無しさん@お腹いっぱい。:2006/03/30(木) 10:03:15
なぁ





                        お願いだから糞スレを立てないでくれるかな?



           俺からのお願いだよ


                               分かったら削除依頼よろしく
71名無しさん@お腹いっぱい。:2006/03/30(木) 11:33:43
>>69
うーん。クロック4倍で。
>time awk -F / '{print $1"/"$2"/"$3}' < find.txt >> /dev/null
4.194u 0.070s 0:04.27 99.7% 147+275k 0+0io 0pf+0w
>time sed -ne 's|^\([^/]*\)/*\([^/]*\)/*\([^/]*\).*|\1/\2/\3|p' < find.txt >> /dev/null
378.530u 0.515s 6:19.73 99.8% 35+235k 0+0io 0pf+0w
>time sed -ne 's|^\([^/]*/[^/]*/[^/]*\).*|\1|p' < find.txt >> /dev/null
156.079u 0.249s 2:36.65 99.7% 35+235k 0+0io 0pf+0w
やっぱりうちではsedが遅い。ちなみに結果が異なるというのは、
>awk -F / '{print $1"/"$2"/"$3}' < find.txt | head -3
//
/.snap/
/dev/
>sed -ne 's|^\([^/]*\)/*\([^/]*\)/*\([^/]*\).*|\1/\2/\3|p' < find.txt | head -3
//
/.snap/
/dev/
>sed -ne 's|^\([^/]*/[^/]*/[^/]*\).*|\1|p' < find.txt |head -3
/dev/network
/dev/geom.ctl
/dev/devctl
こんな感じ。awkの結果が必要なものだとすると、sedはプロンプトが返ってこないのに
心配になるくらいうちでは遅い。
Windows Meを入れて売ってた頃のメーカーPCってのがだめなのかなぁ。
72名無しさん@お腹いっぱい。:2006/03/30(木) 11:39:58
どうでもいいけど、head -3で動くんだな。
内部で-3を-n3に書き換えてるのか。
73名無しさん@お腹いっぱい。:2006/03/30(木) 11:46:20
>>71
出力が違うことについては、
sed -ne 's|^\([^/]*/[^/]*/[^/]*\).*|\1|p'
じゃなくて、
sed -e 's|^\([^/]*/[^/]*/[^/]*\).*|\1|'
の方がいいかも。
74名無しさん@お腹いっぱい。:2006/03/30(木) 11:47:44
>>72
head -3 のほうが一般的だよ。
head -n3 だと動かないバージョン(OS)があるはず。
75名無しさん@お腹いっぱい。:2006/03/30(木) 12:41:17
>>73
>time sed -e 's|^\([^/]*/[^/]*/[^/]*\).*|\1|' < find.txt >> /dev/null
156.072u 0.218s 2:36.66 99.7% 35+235k 0+0io 0pf+0w
となりました。しかし
>sed -e 's|^\([^/]*/[^/]*/[^/]*\).*|\1|' < find.txt > sed.txt
>awk -F / '{print $1"/"$2"/"$3}' < find.txt > awk.txt
>diff -q sed.txt awk.txt
Files sed.txt and awk.txt differ
と、結果が違うようです。
> sed -ne 's|^\([^/]*\)/*\([^/]*\)/*\([^/]*\).*|\1/\2/\3|p' < find.txt > sed.txt
>diff -q sed.txt awk.txt
こっちは同じになってるらしい。圧倒的に遅いけど。
76名無しさん@お腹いっぱい。:2006/03/30(木) 14:00:48
なぁ





                        お願いだから糞スレを立てないでくれるかな?



           俺からのお願いだよ


                               分かったら削除依頼よろしく
77名無しさん@お腹いっぱい。:2006/03/30(木) 14:09:15
願いだから糞スレを立てないでくれるかな?
てのは流行ってるの?
なんでああ言う書式なんだろWinブラウザだと何か特殊に見えるの?
78名無しさん@お腹いっぱい。:2006/03/30(木) 15:11:14
>>77
ウィルスでは?
79名無しさん@お腹いっぱい。:2006/03/30(木) 15:50:04
専ブラで透明あぼーんにしやすいようにしてくれてるんじゃないか
80名無しさん@お腹いっぱい。:2006/03/30(木) 15:54:21
なんか.hideに良い特色がもう一言ほしいなぁ
81名無しさん@お腹いっぱい。:2006/03/31(金) 00:48:49
>>74
確かに -n3 より -3 の方が一般的だと思うけど、
GNU textutils 2.1 の man には -LINES は
推奨されないオプションで -n LINES か
--lines=LINES を使えと書いてあるね。
82名無しさん@お腹いっぱい。:2006/03/31(金) 02:34:08
getopt 化が進んで、getopt の標準からはずれたオプションは
迫害される時期にあるのね。head だけじゃなくて sort のオプ
ションも同様な状況。

それがいいことか悪いことかは分からないが…

俺は相変わらず head でも sort でも古い形式を使ってる。
83名無しさん@お腹いっぱい。:2006/03/31(金) 06:52:30
だって確認したらこうですよ?
int
main(int argc, char *argv[])
{
   :
obsolete(argv);
while ((ch = getopt(argc, argv, "n:c:")) != -1)
   :
static void
obsolete(char *argv[])
{
   :
/* Return if "--" or not "-[0-9]*". */
   :
2バイト大きいメモリを確保して"-n"と"-[0-9]*の"-"を取った文字列同士をくっつける処理
   :
}
84名無しさん@お腹いっぱい。:2006/03/31(金) 08:42:16
obsoleteだからといってどうせ切るわけにいかない形式なんだし、
使ってていいんじゃない?
85名無しさん@お腹いっぱい。:2006/03/31(金) 09:02:45
getoptどころか、通常のUNIXコマンドの書式とも合わない ddって、
未だに改善される気配すらないよね。

dd if=/dev/zero of=tmpfile bs=1024k count=1024
じゃなくて、
dd -i /dev/zero -o tmpfile -b 1024k -c 1024
の方が、今から設計するなら然るべきと思うんだが。

特に、ファイル名(デバイス名)の左側に = がくっついてるから、
シェルでワイルドカードの展開とかができない。

headのオプションに拘るより、こういうのを改善するべきだ。
86名無しさん@お腹いっぱい。:2006/03/31(金) 09:17:15
いや、ddで展開が決まると悲惨な状況にもなり得るから、このままで。
87名無しさん@お腹いっぱい。:2006/03/31(金) 10:04:31
>>85
Copy and Convert で cc になる予定が cc はすでにコンパイラで使われて
いたので dd にした。ちなみに dd は JCL の data definition の省略形
なんで, シャレで JCL の構文に合わせてみた(反省はしていない)。
ってのを, どっかで読んだ。

Unix に合わせるんだったら別のコマンドにするべきじゃねぇの?
88名無しさん@お腹いっぱい。:2006/03/31(金) 11:16:38
その方が実装が楽だ (getopt だけで済む) からって、人間様にとって
不便なオプション形式が推奨されるのって、なんか間違ってる気がする。

dd じゃなくて head の話ね。
89名無しさん@お腹いっぱい。:2006/03/31(金) 11:32:03
前:名無しさん@お腹いっぱい。[] 投稿日:2006/03/30(木) 14:00:48
なぁ





                        お願いだから糞スレを立てないでくれるかな?



           俺からのお願いだよ


                               分かったら削除依頼よろしく
90名無しさん@お腹いっぱい。:2006/03/31(金) 11:33:28
なぁ





                        お願いだから糞スレを立てないでくれるかな?



           俺からのお願いだよ


                               分かったら削除依頼よろしく
91名無しさん@お腹いっぱい。:2006/03/31(金) 16:51:27
ff (file format) っていうコマンドを作ればいいんジャマイカ
92名無しさん@お腹いっぱい。:2006/03/31(金) 17:42:57
いいから早く削除依頼してこいハゲ
93名無しさん@お腹いっぱい。:2006/03/31(金) 19:09:34
tar と find も変態
94名無しさん@お腹いっぱい。:2006/03/31(金) 19:23:05
>>93
findは変態だが、tarは別に変態じゃないぞ。

tar ztvf hoge.tar.gz
の代わりに、
tar -z -t -v -f hoge.tar.gz
とも打てるわけだし。
95名無しさん@お腹いっぱい。:2006/03/31(金) 19:31:37
いいから早く削除依頼してこいハゲ
96名無しさん@お腹いっぱい。:2006/03/31(金) 20:12:17
>85はお犬様。犬は帰れ。
97名無しさん@お腹いっぱい。:2006/03/31(金) 20:43:36
>>96
85のどこに犬依存の記述があるんだい???
98名無しさん@お腹いっぱい。:2006/03/31(金) 22:24:42
>>96 は、>>85 を見て、
「Linuxのddではdd -i /dev/zero -o tmpfile -b 1024k -c 1024という記述ができる」
と勘違いしたようだ。
しかも、>>85 が、「Linuxのddの書式をUNIXのddでも使えるようにしろ」と
主張しているものと勘違いしたようだ。
99名無しさん@お腹いっぱい。:2006/03/31(金) 23:40:33
改善すべきだというお題目の元に改悪するのがお犬様。

85は「こんなのも使えるようになりゃいいな」って話じゃなくて、
headやsortのオプションがGNU getoptに合わないので色々
迫害されてるねえって話題の中で、「ddも改善されるべきだ」
という意見を出している。今の話の流れだと、改善されるべきだ=
旧来のオプションは消えちまえだからな。

>98
妄想たくましすぎw
100名無しさん@お腹いっぱい。:2006/03/32(土) 01:06:24
妄想たくましいな。
101名無しさん@お腹いっぱい。:2006/03/32(土) 01:36:59
いいから早く削除依頼してこいハゲ
102名無しさん@お腹いっぱい。:2006/03/32(土) 01:40:48
ええと getopt_long は GNU だけど getopt は POSIX なんだけど…
4.3BSD の時代から getopt はありますよ。
103名無しさん@お腹いっぱい。:2006/03/32(土) 03:58:50
いいから早く削除依頼してこいハゲ
104名無しさん@お腹いっぱい。:2006/03/32(土) 03:59:48
いいから早く削除依頼してこいハゲ
105前スレのクラッカー:2006/03/32(土) 04:06:04
…とまあ、こんな感じで不定期連投スクリプトは楽々組めるよ。
それとクラッキング与太話はするつもりは無いよ僕、リスクが上昇してしまうからね、
まああの時はカナダ、ドイツ、インド、アメリカ、中国、韓国、イスラエル、ルーマニア、イタリア、オーストラリア、アイルランド、アフリカ、チェチェン、バチカン、アイスランド
とこんな感じで超・多段串を刺してクラッキングしたねw
まぁ君らみたいな低脳には到底不可能な芸当だよw
僕を崇めろw
106名無しさん@お腹いっぱい。:2006/03/32(土) 04:27:25
>>105
頭悪いなお前
ぷぷぷ
107名無しさん@お腹いっぱい。:2006/03/32(土) 09:17:13
>>99
お前国語能力ないな。
>>85 は、headのオプションを、-3形式の、互換性のあるものから、
-n3の、新しいけど互換性のない形式にするなら、
ddだって変えてしまってもいいことになるが、
実際にはその気配はない。
だからこういった基本コマンドのオプションは安易に変えるべきではない。
(head -3の方が良い)
と、反語的に主張しているんだよ。
108名無しさん@お腹いっぱい。:2006/03/32(土) 09:28:01
>>107
いや違うだろ。>>85 はそんなこと言ってないだろ
10985=107:2006/03/32(土) 10:03:50
>>108
違うことないよ。俺自身が >>85=107 だから。
110名無しさん@お腹いっぱい。:2006/03/32(土) 10:25:42
違うことないなら日本語勉強するといいよ
111前スレのクラッカー:2006/03/32(土) 10:26:54







              おい           屑共




112名無しさん@お腹いっぱい。:2006/03/32(土) 10:44:21
まあ、manとか技術文書ばかり読んでると、
ストレートな表現ばかりに慣れ過ぎて、
ちょっと捻った文章の読解能力が低下して、
>>96 >>99 >>108 >>110 みたいな香具師が登場することになるわな。
113名無しさん@お腹いっぱい。:2006/03/32(土) 10:47:37
>>112
>まあ、manとか技術文書ばかり読んでると、
>ストレートな表現ばかりに慣れ過ぎて、
>ちょっと捻った文章の読解能力が低下して、
>>96 >>99 >>108 >>110 みたいな香具師が登場することになるわ
>な。

ぎゃはは
ばっかじゃねーのこいつ
114名無しさん@お腹いっぱい。:2006/03/32(土) 11:15:26
>>112
115名無しさん@お腹いっぱい。:2006/03/32(土) 11:58:23
反語的主張をする時は、最後にちゃんと「などと言えるのではなかろうか」などと入れるとか、
褒め殺しをするとか、そういうサインを入れとか無いと駄目ですよって学校で習わなかった?

ひねった文章ってのは、ひねったことが読者に分かって初めて意味があるんだがなあ。

まあ、煽り文句は煽った本人のコンプレックスの現れという定理に基づくと、
「国語能力低いな」と煽った107=85は…(ry
116名無しさん@お腹いっぱい。:2006/03/32(土) 12:53:27
>>115
それを言うなら「定理」じゃなくて「法則」だなw
「国語能力低いな」
117名無しさん@お腹いっぱい。:2006/03/32(土) 13:09:35
>>115
たとえば、↓「エスパーきぼんぬ」のレスを貰う八ヶ条。
http://pc8.2ch.net/test/read.cgi/unix/1142379262/4

は、反語的表現として良くできていて面白いと思う。

しかし、ここに「などと言えるのではなかろうか」みたいな文章が入っていると、
せっかくの反語的表現が白けてしまって面白くなくなる。
(以前は補足みたいなのが付いてたけど、削除されたようだし、
そもそも補足が必要な国語能力低い香具師は居ないと言う前提で桶だろ)
118名無しさん@お腹いっぱい。:2006/03/32(土) 16:29:54
>>117
命題がサインになっている。国語力低いな。
119名無しさん@お腹いっぱい。:2006/03/32(土) 16:42:52
>>96=99 だと仮定して、
>>85 の文章は「ddも改善されるべきだ」とも取れるのはその通りだとしても、
そこから、>>96 の「犬は帰れ。」のところで理論の飛躍があると思う。
どうして犬だと思ったのか、もっとちゃんとした説明が欲しいな。
120115:2006/03/32(土) 16:44:37
>116
ああ、法則のほうがあってるね。わりいな。

>117
ああいう褒め殺しの典型みたいな文章をもってきて、
なにがいいたいのやら。85でももうちょっと技法を使って
他人に反語的表現だと理解してもらえる文章にしないと、
それができないならせめて補足を入れないと駄目だぞ。
121名無しさん@お腹いっぱい。:2006/03/32(土) 16:57:20
>>120
横レススマソ。「法則」の方が合ってる(程度問題)じゃなく、
「定理」だと間違い。
定理なら証明して導かないといけない。
122名無しさん@お腹いっぱい。:2006/03/32(土) 17:07:40
こういう屁理屈はunix的なものから一番遠い所にあるという事を理解してほしい
つべこべ言わずにコード書け
123名無しさん@お腹いっぱい。:2006/03/32(土) 17:12:07
犬アレルギーの人が一人混じっていると、
何でもかんでも犬にこじつけて排除しようとするから、
スレが荒れるなぁ・・
124名無しさん@お腹いっぱい。:2006/03/32(土) 17:36:54
もう既に犬の話はどうでもよくなってる気がする。
今の話題は反語的表現。
125前スレのクラッカー:2006/03/32(土) 17:54:42



        なぁ屑共                お前らに話がある



                   大切な話だ



126名無しさん@お腹いっぱい。:2006/03/32(土) 18:13:04
新スレになってから「シェルってゆーな」の人、来ないね。
来て良さそうなカキコはあったのにね。
>>103,104,111,125 みたいな、自動カキコのシェルを書いてる人本人なのかなぁ。
127名無しさん@お腹いっぱい。:2006/03/32(土) 18:14:43
「屑」に向けての話が「大切」だとは、矛盾してないかい?
128前スレのクラッカー:2006/03/32(土) 18:15:45
中の人居ますが何か?
ところでお前らに大切な話があるよ屑共。
129名無しさん@お腹いっぱい。:2006/03/32(土) 18:26:46
シェルってゆうな。クズ。
130名無しさん@お腹いっぱい。:2006/03/32(土) 18:52:36
>>129 は偽物。本物は「シェルってゆ『ー』な」
131前スレのクラッカー:2006/03/32(土) 19:07:44
おい
132前スレのクラッカー:2006/03/32(土) 19:10:22
俺がこうもシェルスクリプトを嫌う理由はだな。
・・・なんてったって遅いからだよ。

シェルスクリプトに限らず俺はインタプリタ型言語が大ッッッッッ嫌いでね。
悪いが当分の間このスレに居座り、荒らし行為をさせて貰うよ。
因みに俺の好きな言語はアセンブラ。
133名無しさん@お腹いっぱい。:2006/03/32(土) 19:14:28
アセンブラはアセンブリ言語をオブジェクトコードに変換するソフトウェア。

> 俺の好きな言語はアセンブラ。
wwwww ワロス
134名無しさん@お腹いっぱい。:2006/03/32(土) 19:25:19
>128
俺には大切な話なんかないぞ。屑は帰れ。
135前スレのクラッカー:2006/03/32(土) 19:43:19
そうか?
どちらかと言うとお前らの方が屑だと思うぞ。
136名無しさん@お腹いっぱい。:2006/03/32(土) 20:02:55
腐ったみかんどもめ
137前スレのクラッカー:2006/03/32(土) 20:07:57
>>136
同意。
お前も含まれるがな。
138名無しさん@お腹いっぱい。:2006/03/32(土) 20:22:48
俺の好きな言語はコンパイラ。
139名無しさん@お腹いっぱい。:2006/03/32(土) 20:24:05
このグダグダは春のせいか?
140名無しさん@お腹いっぱい。:2006/03/32(土) 20:26:16
僕の家にある機械はコンバイン。
141名無しさん@お腹いっぱい。:2006/03/32(土) 20:29:51
インタプリタ型言語が遅いという妄想な人か。
お大事に。
142名無しさん@お腹いっぱい。:2006/03/32(土) 20:33:09
いや、インタプリタ型言語が遅いのは事実だろ。
速度以外の点でメリットがあるからシェルスクリプトを使うわけで。
143前スレのクラッカー:2006/03/32(土) 20:35:59
>>138
よく分からないけど俺の世代にはアセンブラ言語と言う人間が大多数存在しているから、
間違いじゃないぞ。
あぁ〜自称プログラマーの使えないクズでしたか。すまんすまん。

>>139
お前のせいだ

>>140
意味が分からんよ全く、屑のホザくことは

>>141
実際遅いんだから、事実だろ?
俺が何年PCやプログラムに触れていると思っているんだ?
舐めるなよ。
144名無しさん@お腹いっぱい。:2006/03/32(土) 20:36:35
言語の意味論によっては動的に決定せざるを得なくて
コンパイルしてもたいして速くならなかったりするよ。
145名無しさん@お腹いっぱい。:2006/03/32(土) 20:40:56
> 俺の世代にはアセンブラ言語と言う人間が大多数存在している

えーと、歳いくつ?
世代全員そんな馬鹿だとは思えないから、たぶん君と君の友達だけだよ。

google で検索
アセンブラ言語 の検索結果 約 43,400 件
アセンブリ言語 の検索結果 約 168,000 件
43400/(43400+168000) ≒ 0.2
∴ 人類の下位 20% に属するバカ
なるほど。
φ(..)メモメモ...
146名無しさん@お腹いっぱい。:2006/03/32(土) 20:41:37
正しくは「アセンブリー言語」だろ。
アセンブリー言語のことを慣習的に「アセンブラ」と呼ぶのは一般的だが、
「アセンブラ言語」という言い方は初めて聞いたな。
「言語」がくっつくと確かにおかしく感じる。
147名無しさん@お腹いっぱい。:2006/03/32(土) 20:42:57
下位 0.1% とかじゃなくて良かったね。
148名無しさん@お腹いっぱい。:2006/03/32(土) 20:44:05
世の中の外注会社のレベルの低さを知らないな
コンパイル型言語(というかC言語)でも、インタプリタ以上に遅いコードはざら。
sscanf 一発な簡単な文字列処理でも、strxxxでコピーしてコピーしてとごちゃごちゃやってたり
149名無しさん@お腹いっぱい。:2006/03/32(土) 20:46:35
>>148
一部の特例を出してきても、一般例の反論にはならないのはわかってますか?
150前スレのクラッカー:2006/03/32(土) 20:47:43
>>145
無駄な労力ご苦労様。

>>146
で?
俺は一般的にはアセンブラ言語だと思っているよ。

>>147
お前は下位0.01%に含まれる屑人間だと思うよ。

>>148
レベルが低いのはお前だよ。
良い会社じゃないか、定石通りの綺麗なコードを書くんだろうなあ

>>149
黙ってろ低脳
151名無しさん@お腹いっぱい。:2006/03/32(土) 20:51:08
アセンブラ使って高速化したところで、せいぜい3倍〜100倍程度しか
高速にならないが、高級言語を使ってアルゴリズムのレベルで最適化
すると、指数的オーダで改善することが多いから、高級言語の方が
いいよん。
まあタイトループの最内部をアセンブラで高速化するのは時には意味
があるけど、かなり特殊な用途だね。
152名無しさん@お腹いっぱい。:2006/03/32(土) 20:53:37
> 俺は一般的にはアセンブラ言語だと思っているよ。

「一般的には××だ」と主張する根拠が「俺はそう思っている」からだと。
ククク。
153名無しさん@お腹いっぱい。:2006/03/32(土) 20:57:31
>>151
「タイトループ」? ってもしかしてアノ業界のプログラマ?
154前スレのクラッカー:2006/03/32(土) 21:02:15
>>151
お前BASICからプログラム始めたクチだろ。
アセンブラをよく知らない屑がよく吐く屁理屈だ。
まあお前もアセンブラを深く学べば俺に同調するようになる。

>>152
それは俺が常にルールに従っているからこその自信だ。
あと
>ククク。
気色が悪いから止めてくれないか?屑野郎。

>>153
ほう、タイトスカートフェチか。
ピンクモンキーは大人しくセンズリかいて寝てろよ。
155名無しさん@お腹いっぱい。:2006/03/32(土) 21:06:30
シェルスクリプトで、一部のループを高速化したいと考えています。
そこで、このループのみ、インラインアセンブラを仕込む方法を
教えてください。もちろん、Bourne Shell互換で。
OS依存なしで、お願いします。
156前スレのクラッカー:2006/03/32(土) 21:07:51
>>155


                    すっこんでろヒヨッコが



157名無しさん@お腹いっぱい。:2006/03/32(土) 21:09:40
>>156
あ、書き忘れました。OS依存だけでなく、CPU依存もなしでお願いします。
158前スレのクラッカー:2006/03/32(土) 21:11:25
>>157



               お前に書いてやるコードなどない



159前スレのクラッカー:2006/03/32(土) 21:18:26
ところでお前ら今何してる?
160名無しさん@お腹いっぱい。:2006/03/32(土) 21:22:06
今から風呂入って、上がったらセクースする予定。
161前スレのクラッカー:2006/03/32(土) 21:24:53
>>160
悪いな、お前の彼女なら俺の隣で寝てるよ
162名無しさん@お腹いっぱい。:2006/03/32(土) 21:33:49
>>155
スクリプト内で動的にコード生成してコンパイルなどして実行すればー。
163名無しさん@お腹いっぱい。:2006/03/32(土) 21:37:43
>>155
なに?シェルスクリプトでインラインアセンブラが使えない?
ジョジョ、それはコンパイル言語と同じにやろうとするからだよ

逆に考えるんだ

「インラインアセンブラからシェルスクリプトを呼べばいい」と
164前スレのクラッカー:2006/03/32(土) 21:40:35
>>162,163



                        何このレベルの低さ

                        自分のスキルの無さを露呈しちゃってるよ
165名無しさん@お腹いっぱい。:2006/03/32(土) 21:56:31
シェルスクリプトで、標準入力に流し込まれたマシンコード(バイナリ)を
実行する方法はありませんか?
あ、テンポラリファイルに cat > tmpfile して、
chmod +x tmpfile する方法以外でお願いします。
166名無しさん@お腹いっぱい。:2006/03/32(土) 21:59:23
どうでもいいが、「前スレのクラッカー」が蜂の巣をつついたように暴れてるのは、
>>126 が図星だったってことか。
167名無しさん@お腹いっぱい。:2006/03/32(土) 22:23:07
オレなんかコンパイリ言語得意だけど。

168名無しさん@お腹いっぱい。:2006/04/02(日) 00:01:42
アセンブラ言語 ワロス wwww

ところで、前スレのクラッカーってなんだ?
169名無しさん@お腹いっぱい。:2006/04/02(日) 00:14:51
>>168
お馬鹿さん。
170名無しさん@お腹いっぱい。:2006/04/02(日) 02:53:52
>>169
死ねよデブ
171前スレのクラッカー:2006/04/02(日) 10:12:42
おはよう屑共。
今日は何をして過ごそうかなあ。
172前スレのクラッカー:2006/04/02(日) 12:14:26
ごめん、もう荒らすの止めるわ・・・
還暦間近でストレス溜まってたんだ、許してくれ
173名無しさん@お腹いっぱい。:2006/04/02(日) 13:38:24
どなたかお知恵をお貸しください。
エロサイトから wget -r http://ero.example.com という形で
ファイルをDLしてきました。このファイルには
エロ画像、エロ画像のlzh、サムネイル、html、css等が含まれています。
目的のエロ画像はero.example.com/members/女の子名/img/ 下にあります。

複数の 女の子名/img を一つのディレクトリに ln -s すれば閲覧が楽になるので
今まではシェルスクリプトを作ってlnをしていたのですが、
、今回 女の子名/img の中にサムネイルファイル t_001.jpg, t_002.jpg ... 等が混ざっており、
単純にln -sしただけではサムネイルと画像本体が混ざってしまい、大変不便な思いをしています。

ブラウザで閲覧する事もあるため、できればサムネイルファイルを消さずに
目的の画像だけを集めたディレクトリを作成したいのですが何かよい方法はないでしょうか。

1. ls -r の結果から、サムネイル以外の全ファイルを一つ一つ ln -s する方法、
2. ディレクトリごとcpしてしまってサムネイルをrmしてしまう方法

を考えたのですが、もっとスマートな方法があればお教えください。
なお、使用している画像ビューワはhtml等のフィルタリングはできますので
本番ファイルとhtmlやcssファイル等が混ざるのは問題ありません。
174名無しさん@お腹いっぱい。:2006/04/02(日) 14:47:46
すみません、ググっても出てこないので教えてください。

kshを使ってるんですが、どなたか「[」のPATHを知らないでしょうか?

$[ -z ];echo $?
とすると「空文字」判定で「0」が出力されます。
しかし、シェルスクリプトの中に同じ命令を書くと、
「testの引数が足りない」というエラーになります。

そこで、「[」のPATHを指定してないからだとwhichを実行したのですが、
「PATHの中にはない」というエラーになります。
お手数ですけどどなたかご教示ください。
175名無しさん@お腹いっぱい。:2006/04/02(日) 14:56:39
どうみてもくだ質スレです
ありがとうございました
176名無しさん@お腹いっぱい。:2006/04/02(日) 14:57:45
>>174
OSにもよるけど、今時のkshやshでは [ は内部コマンドになってるよ。
/bin/test とか外部コマンドはあるけど。
[ -z ] で何がしたいの?
変数が定義されてるかどうかなら [ -z "$x" ]
177名無しさん@お腹いっぱい。:2006/04/02(日) 15:03:42
>>176
ありがとうございます。

やりたいことは
[ -z `grep $id $listfile`]
で「$idがリストファイルにある」「ない」で条件分岐をしたいのです。
grepでなければthen以下を実行するという感じです。
178名無しさん@お腹いっぱい。:2006/04/02(日) 15:29:03
>>177
コマンドの終了状態は $? という変数で見る

grep -q hoge file 2> /dev/null
if [ $? -eq 0 ]; then
......
else
......
fi

が素直じゃない。
179名無しさん@お腹いっぱい。:2006/04/02(日) 15:29:52
>>177
そういうときって・・・

grep hoge file > /dev/null 2>&1
if (($?==0)) ; then
  moge
fi
みたいに書かない?
俺だけ?
180名無しさん@お腹いっぱい。:2006/04/02(日) 15:36:14
それなんてbash?
181名無しさん@お腹いっぱい。:2006/04/02(日) 15:37:41
>>177
どうしても [ -z ] 方式でやりたいなら、
[ -z `grep $id $listfile` ] じゃなくて、
[ -z "`grep $id $listfile`" ] みたいに、
ダフルクォートを付けろ。
こうすれば、grepの結果がなくても "" の空文字列が残るので、
testがエラーにならない。

それより、testを使わずに、
if ! grep $id $listfile; then
で行けるよ。(!を使うのはksh依存だけど)

Bourne Shなら
if grep $id $listfile; then :; else

とやるのが普通。
182名無しさん@お腹いっぱい。:2006/04/02(日) 15:42:44
>>178-179
この場合はわざわざ $? を呼び出す必要が無いな。

if grep ...
then
...
else
...
fi

else がいらないならこれでも可。

grep ... || {
...
}
183名無しさん@お腹いっぱい。:2006/04/02(日) 15:43:30
>>178-182
すんません。ありがとうございます。
常に独習でやっていたので知ってる方法しか考えてませんでした。
定石みたいなのがちゃんとあるもんなのですね。
くだ質になって申し訳なかったですけど勉強になりました。
184名無しさん@お腹いっぱい。:2006/04/02(日) 15:51:59
>>179
(( )) の算術式は、kshやbashでは使えるけど、
Bourne Shellでは使えないから、わざわざ使うことはないな。
185名無しさん@お腹いっぱい。:2006/04/02(日) 17:55:06
シェル変数 iに数値が入っている時、
以下のシェル文法の違いを説明せよ。(30点)

(1) [ $i = 3 ]
(2) [ $i == 3 ]
(3) [ $i -eq 3 ]
(4) [[ $i = 3 ]]
(5) [[ $i == 3 ]]
(6) [[ $i -eq 3 ]]
(7) [[ i -eq 3 ]]
(8) (($i == 3))
(9) ((i == 3))
(10) test $i -eq 3
186名無しさん@お腹いっぱい。:2006/04/02(日) 17:59:31
JISだと「アセンブラ言語」なんだよ。
だからJISをふまえた文書だと全て「アセンブラ言語」になってる。
187前スレのクラッカー:2006/04/02(日) 18:11:53
>>186
今さら擁護はよしてくれ。
どうせ俺を叩いてたのは、世間知らずのガキ共だったのだろうから・・・
188名無しさん@お腹いっぱい。:2006/04/02(日) 19:22:34
問 2
>>185 の問でシェル変数 i の中身が i='1+2' である
場合はどうなるか説明せよ。(30点)
189名無しさん@お腹いっぱい。:2006/04/02(日) 19:52:14
>>185
Solarisでの実行例

$ (1) [ $i = 3 ]
syntax error: `[' unexpected
$ (2) [ $i == 3 ]
syntax error: `[' unexpected
$ (3) [ $i -eq 3 ]
syntax error: `[' unexpected
$ (4) [[ $i = 3 ]]
syntax error: `[[' unexpected
$ (5) [[ $i == 3 ]]
syntax error: `[[' unexpected
$ (6) [[ $i -eq 3 ]]
syntax error: `[[' unexpected
$ (7) [[ i -eq 3 ]]
syntax error: `[[' unexpected
$ (8) (($i == 3))
syntax error: `(' unexpected
$ (9) ((i == 3))
syntax error: `(' unexpected
$ (10) test $i -eq 3
syntax error: `test' unexpected
190名無しさん@お腹いっぱい。:2006/04/02(日) 19:59:03
>>187
"assembler language" の検索結果 約 270,000 件
"assembly language" の検索結果 約 6,690,000
海外だと君は下位4%以下の阿呆だ。良かったね。0.1%に入らなくて。

>>186
へー、そうなのか。勉強になった。
変な言葉を使う割合が世界全体と比べて日本が5倍も多いのは
JIS のせいなのね。JIS もたいがいだなあ。まあこの件に限らんが。
セションとかね。
大学ではアセンブリ言語って習ったけどね。
"アセンブラ言語 site:u-tokyo.ac.jp" 38件
"アセンブリ言語 site:u-tokyo.ac.jp" 245件
38/(38+245) = 13.4%
東大は日本の平均よりは若干マシのようだな。
191名無しさん@お腹いっぱい。:2006/04/02(日) 20:41:17
>>189
はいはい。 ワロス ワロス。
で、本当の回答は?
192名無しさん@お腹いっぱい。:2006/04/02(日) 21:02:34
>>185
十人十色と言いましょうか、みなそれぞれ個性を持っております。
一言では語りつくせません。

>>188
一つも真となるものはありません。
193名無しさん@お腹いっぱい。:2006/04/02(日) 21:24:07
>>192
>一つも真となるものはありません。
違います。真となるものがあります。
194名無しさん@お腹いっぱい。:2006/04/02(日) 21:26:42
>>185
(1)(3)(10)以外は bash依存。よって論じる価値なし。

(3)と(10)は同義で、数値としての比較。
よって、仮に i=03でも真になる。

(1)は文字列としての比較。
よって、i=03の場合は偽になる。
195名無しさん@お腹いっぱい。:2006/04/02(日) 22:10:31
i="i='1+2'" としたときにどうなるか教えてください。
どうしても真になるものがあるとは思えないのですが...
196名無しさん@お腹いっぱい。:2006/04/02(日) 22:16:46
>>195
真になるところはbash依存だから、覚えなくていいよ。
197173 :2006/04/02(日) 23:38:01
僕の質問もお願いします^^;;;
198名無しさん@お腹いっぱい。:2006/04/02(日) 23:46:18
>>173
いやそれで間違ってないんじゃないでしょうか^^;;;
199名無しさん@お腹いっぱい。:2006/04/03(月) 04:17:38
bashでcase文の入れ子はどう書けばいいのでしょうか?
200名無しさん@お腹いっぱい。:2006/04/03(月) 05:20:53
shなら普通に書けばいい。bashでも多分そうだろ。何を悩んでるんだ?
201名無しさん@お腹いっぱい。:2006/04/03(月) 08:50:29
インデントとかw
202名無しさん@お腹いっぱい。:2006/04/03(月) 09:38:12
入れ子の内側の esacのあとの ;; を忘れがち、
とか、エスパーしてみるテスト。
203名無しさん@お腹いっぱい。:2006/04/03(月) 13:52:51
>>198 は絶対忘れないだろうな
204名無しさん@お腹いっぱい。:2006/04/03(月) 19:11:36
zshのシグナル(trap)回りの挙動を、Bourne Shellと同じにするには
どうすればいいでしょうか。argv[0]を shにして zshを起動しても、
shと同じにはなりません。setoptあたりかと思いましたが、
シグナルに関するオプションは見つかりませんでした。
やっぱり、zshをBourne Shellとして使うのは無理ってことでしょうか?

ちなみに、bashだと問題ありません。
205名無しさん@お腹いっぱい。:2006/04/04(火) 00:35:14
bashとashは挙動が違う。
206名無しさん@お腹いっぱい。:2006/04/04(火) 12:10:53
cpコマンドで複数のファイルをあるディレクトリ以下にコピーする際、
コピー元のファイルの相対パスを保ったままコピーするには
どうすればいいでしょうか?

具体的には、
cp -p hoge.txt aaa/fuga.txt bbb/ccc/boke.txt /dokoka/sonohen
を実行すると、hoge.txt fuga.txt boke.txtが、
/dokoka/sonohenの直下にコピーされてしまいますが、
hoge.txtは /dokoka/sonohen/hoge.txtでいいですが、
aaa/fuga.txtは /dokoka/sonohen/aaa/fuga.txtに、
bbb/ccc/boke.txtは /dokoka/sonohen/bbb/ccc/boke.txtに、
コピーしたいのです。

シェルでパス名を文字列処理すればできると思いますが、
できればもっと簡単にコマンド一発の方法を希望します。

あと、tar等を使うのは無しでお願いします。
207名無しさん@お腹いっぱい。:2006/04/04(火) 12:17:57
cp -R
208名無しさん@お腹いっぱい。:2006/04/04(火) 12:19:06
>>207
早とちり厨ハケン。質問欲嫁。
209名無しさん@お腹いっぱい。:2006/04/04(火) 12:23:57
質問、わかりにくすぎて途中で読むのやめた
210名無しさん@お腹いっぱい。:2006/04/04(火) 12:25:26
tarが無しな理由は何?
211名無しさん@お腹いっぱい。:2006/04/04(火) 12:30:23
cp -P hoge.txt aaa/fuga.txt bbb/ccc/boke.txt /dokoka/sonohen
かな?
212名無しさん@お腹いっぱい。:2006/04/04(火) 12:33:18
>208
んなん、forで回せばいいだろ。
213名無しさん@お腹いっぱい。:2006/04/04(火) 12:38:52
tarなら
tar -c hoge.txt aaa/fuga.txt bbb/ccc/boke.txt |(cd /dokoka/sonohen; tar xf -)
で済むんだけど、使わないのは宿題かなんか?
214名無しさん@お腹いっぱい。:2006/04/04(火) 12:45:16
>>206
GNU cpなら、
cp --parents hoge.txt aaa/fuga.txt bbb/ccc/boke.txt /dokoka/sonohen
だな。

>>211
GNU cpだと、-Pはシンボリックリンク保存オプションなので違うと思うが。
215名無しさん@お腹いっぱい。:2006/04/04(火) 12:59:33
>>210,213
tarが無しな理由は、コピー元ファイルがシンボリックリンクだった場合に、
実体ファイルに展開して欲しいからです。

>>214
ありがとうございます。でもGNU cpが無い場合はどうすればいいですか?
216名無しさん@お腹いっぱい。:2006/04/04(火) 13:11:00
>>215
symlinkだけの問題なら tarに hオプションを付ければいい。
でも cp --parentsが使える環境ならその方が簡単。
217名無しさん@お腹いっぱい。:2006/04/04(火) 21:31:16
>>206
シェルってゆうな。クズ。
218名無しさん@お腹いっぱい。:2006/04/04(火) 21:37:47
>>217
残念。この場合は「シェル」でもOK。
219名無しさん@お腹いっぱい。:2006/04/04(火) 22:26:22
いや、ダメだろ
220名無しさん@お腹いっぱい。:2006/04/04(火) 22:40:27
>>217 >>219
シェルとシェルスクリプトの違いもわからんのか?
221名無しさん@お腹いっぱい。:2006/04/04(火) 22:44:29
もうその議論秋田。
>>206 の質問だと、シェルスクリプトにせずに
直接コマンド(シェルの構文を含む)を打つとも解釈できるから、
「シェル」でもOKと思われ。
それより、いちいち「シェルってゆうな」の反応の方が鵜剤。
222名無しさん@お腹いっぱい。:2006/04/04(火) 22:55:16
いい加減飽きたのは事実だが、
シェルスクリプトをシェルと言う馬鹿が絶えないのがそもそもの原因であって、
それを指摘するほうにいちいちつっかかるほうが間違い。
223名無しさん@お腹いっぱい。:2006/04/04(火) 23:06:48
ウザイと思わせるためにやってるのでこれからも好き放題に書き込ませてもらうよ
224名無しさん@お腹いっぱい。:2006/04/04(火) 23:13:44
今度、仕事柄、シェルを始めることにしました。
そこでお聞きしたいのですが、皆さんが最初に書いたシェルは何ですか?
やっぱり、echo hello worldとかでしょうか?
225名無しさん@お腹いっぱい。:2006/04/04(火) 23:19:43
>>224
まず、その仕事とやらを紹介してみたまえ。
226名無しさん@お腹いっぱい。:2006/04/04(火) 23:21:29
仕事は、力×距離です。
227名無しさん@お腹いっぱい。:2006/04/05(水) 01:37:57
>226
正解!
228名無しさん@お腹いっぱい。:2006/04/05(水) 07:04:12
>224
つまんねーんだよ
死ねデブ
229前.ス.レ.の.ク.ラ.ッ.カ.ー:2006/04/05(水) 15:26:02
>>224のラベルでネットワーク管理者だったら笑い事だぞ。
俺の方がよっぽどスキルある。
230名無しさん@お腹いっぱい。:2006/04/05(水) 15:39:25
シェルはじめました
UNIXはじめました

と春になると焼き肉屋に案内が出ますが
どっちがブちがいがありますか?
231名無しさん@お腹いっぱい。:2006/04/05(水) 16:14:33
ネットワーク管理なら、シェル作らなくてもUNIXだけで十分だよ。
ネットワーク管理で使うUNIXはパターンが限られているので、
よく使うUNIXを、コメントとともにメモ帳などで保存しておけば良い。
で、これを適宜、TELNETにコピペしてUNIXを打つ。
変にシェルを作っても、そのシェルの名前を忘れそうだし、
シェル自体がブラックボックスになって、結局使わなくなってしまうのがオチだよ。
232名無しさん@お腹いっぱい。:2006/04/05(水) 16:26:39
>>231
じゃシェルはぶたなくても良いのね

UNIXを6回くらいぶつのをまとめて
スクリプトにしたいんだけど使うときは
UNIXをぶつで良いの?
233名無しさん@お腹いっぱい。:2006/04/05(水) 17:10:04
次の流行語予想:UNIXを作る
234名無しさん@お腹いっぱい。:2006/04/05(水) 18:12:38
シェルでUNIXを出すにはどうすればいいですか?
235名無しさん@お腹いっぱい。:2006/04/05(水) 18:38:29
>>234
シェルの中で shを実行すれば UNIXが出せる。
UNIXを終る時は exitを打てば、シェルに戻る。
236名無しさん@お腹いっぱい。:2006/04/05(水) 22:29:44
シェルスクリプトって略すと

シェ
シェル
シェス
シェスク
シェルスクリ
スクリプト
プト

どれが正しいですか?
237名無しさん@お腹いっぱい。:2006/04/05(水) 22:36:52
全部間違い。略せない。
238名無しさん@お腹いっぱい。:2006/04/05(水) 22:49:54
正解は

ェルスクリプ
239名無しさん@お腹いっぱい。:2006/04/05(水) 22:51:37
いや、文脈からシェルスクリプトであることが明らかな場合なら、
「スクリプト」と略すのはありだと思うよ。
そういう場合でも、「シェル」と略すのはまずいと思われ。

ただ、スクリプトだけだと、perl とか ruby のスクリプトも
含まれるから、あくまで文脈からシェルスクリプトだと分かる場合
のみ。
240名無しさん@お腹いっぱい。:2006/04/05(水) 23:10:51
>>236
クリ
241名無しさん@お腹いっぱい。:2006/04/06(木) 00:04:20
本当に文脈から明らかならどういう表現をしたって勝手だろう。
ただ発言者の人格や知性が疑われることはあるだろうが、それもまたよし。
242名無しさん@お腹いっぱい。:2006/04/06(木) 00:17:51
ちょっとまて

UNIXとシェルの使い方が少しラフだ
243名無しさん@お腹いっぱい。:2006/04/06(木) 10:36:15
よくわかんないけど単に「スクリプト」と表現したとき、
それがkshなりperlやpythonで記述されてるかどうかなんてふつう気にする?

>>236
シエル
244名無しさん@お腹いっぱい。:2006/04/06(木) 11:12:06
単に「スクリプト」と表現されると、多分「何スクリプト?」って聞くと思う
245名無しさん@お腹いっぱい。:2006/04/06(木) 11:27:20
>>243
先輩のことかーっ!!
246名無しさん@お腹いっぱい。:2006/04/06(木) 11:47:25
UNIXを打たれるくらいなら
シェルを作られる方がガマンできる
247ななし:2006/04/06(木) 16:54:17
$1 が -a の時に、
[ $1 = -a ] とやるとうまくいきません。
何かいい方法はありませんか?
248名無しさん@お腹いっぱい。:2006/04/06(木) 17:11:26
うまくいくよ
249名無しさん@お腹いっぱい。:2006/04/06(木) 17:20:01
>>247
現行のシェルだとそのままでうまくいく。
うまく行かないのはかなり古いBourne Shell。
ちなみにどのOSのshか教えて。

うまく行かないシェルの場合は、

[ X"$1" = X-a ]

とやって回避する。が、この回避方法はバッドノウハウなので、
もうobsoleteなはずなんだが、、
250名無しさん@お腹いっぱい。:2006/04/06(木) 17:24:13
>>249
なんで廃れたとか原始的とか古典的とか
爺さんの知恵袋とか
文脈に的確な日本語を当てないで
【obsolete】なんて形容詞や動詞として使うの?
251名無しさん@お腹いっぱい。:2006/04/06(木) 17:33:48
>>247
イマドキのシェルだと、>>249 の回避方法を使わなくても
そのままで桶なはずだが、それ以前の問題として、
$1を " " で囲んだ方がいい。
[ "$1" = -a ] ね。
でないと、$1が -aだった場合じゃなくて、
$1がスペースだった場合とかにエラーになる。
252名無しさん@お腹いっぱい。:2006/04/06(木) 23:40:45
>>237
.sh
253名無しさん@お腹いっぱい。:2006/04/07(金) 00:01:00
>>250
重箱の隅をつついいてひとり悦に入る非生産的な奴だね君
254名無しさん@お腹いっぱい。:2006/04/08(土) 00:33:08
>>206
>cp -p hoge.txt aaa/fuga.txt bbb/ccc/boke.txt /dokoka/sonohen
>を実行すると、hoge.txt fuga.txt boke.txtが、
>bbb/ccc/boke.txtは /dokoka/sonohen/bbb/ccc/boke.txtに、
>コピーしたいのです。

find hoge.txt aaa/fuga.txt bbb/ccc/boke.txt -print -depth | cpio -pdmuv /dokoka/sonohen
でできる。
コピー元がリンクなら、コピー後もリンクのまんまだよ。
255名無しさん@お腹いっぱい。:2006/04/08(土) 07:52:08
>>254
欲嫁。>>206 に「tar等を使うのは無しで」とある。
tar等には cpioも含まれると思われる。
それに、コピー後もsymlinkのままでは困るという質問だよ。
(ファイル本体をコピーして欲しいというのが質問の意図)

で、>>214 の cp --parents ですでに解決済み。
256名無しさん@お腹いっぱい。:2006/04/09(日) 18:49:03
あるファイル-Aをcatで別ファイルに出力するプログラムを作っています。
権限関係の理由で sudo と expect を使って
パスワード認証を行ってから cat する方法を取りたいと考えています。
cat だけなら問題ないのですが、

# cat A > hoge1.txt
# ./cat.exp ID PASS A > hoge2.txt

上記のようにした場合、
hoge2.txt の方が10〜300バイトほど量が増えてしまいます。
おそらくcat.expの中で無駄な出力が出てしまっているためかと
思うのですが、改善方法を教えていただけないでしょうか?
expectのマニュアルを見ましたが解決しません
ttp://kansai.anesth.or.jp/gijutu/expect/howto-expect.html

--cat.exp--------------------------------------
#!/usr/bin/expect
set username [lindex $argv 0]
set password [lindex $argv 1]
set file [lindex $argv 2]
log_user 0
spawn sudo -u $username /bin/cat $file
expect "assword:"
send "$password\r"
expect eof
log_user 1
exit
257名無しさん@お腹いっぱい。:2006/04/09(日) 19:20:40
>>256
expectだと改行コードがCR+LFで記録されてしまうからじゃないの?
258256:2006/04/09(日) 22:49:06
>>257
レスありがとうございます、
関連情報を調べてみようと、改行コード expect あたりでぐぐったのですが
特に見つかりませんでした。
直す方法はあるでしょうか?
259名無しさん@お腹いっぱい。:2006/04/09(日) 22:53:09
ファイル出力後に変換する
260256:2006/04/09(日) 23:30:18
か、かなり大容量のファイルなんで、
できるだけ出力後に処理ってのは勘弁を・・・orz
261名無しさん@お腹いっぱい。:2006/04/10(月) 00:12:46
どうせたいした容量じゃねーだろ。何メガバイトぐらいか言ってみ?
262名無しさん@お腹いっぱい。:2006/04/10(月) 03:15:58
>>256

sudo がパスワード認証するんだから、

#!/bin/sh
sudo -u ahouser cat "$@"

でいいじゃん。

パスワードをコマンドラインから入れたら、ps で「もろばれ」なのはわかってんの? それでも、やりたいんだったら、sudo -S っていう手があるけどさ。正気ならそんなことしない。

どうしても、その狂気を避けられないのは「権限関係の設計が悪い」からです。僕
だったら、wrapper作るか、.ssh 作ってssh 経由でcatさせるね。
263名無しさん@お腹いっぱい。:2006/04/10(月) 10:22:34
複数のシンボリックリンクを、指定のディレクトリに移動したいのですが、
移動先のディレクトリでも、シンボリックリンクが正しく元のファイルを
指すようにするには、どういうシェルを書けばいいでしょうか?

シンボリックリンクが絶対パスなら無問題ですが、
シンボリックリンクは、../.. とかを含む相対パスであり、
かつ、移動先でも相対パスでリンクする必要があります。

例えば、
/aaa/bbbディレクトリの下に
hoge -> ../hage
というシンボリックリンクがあったとすると、
これを/aaa/ccc/dddディレクトリの下に移動させた場合、
今度は、
hoge -> ../../hage
を指すようにリンクを修正して移動したいのです。
264名無しさん@お腹いっぱい。:2006/04/10(月) 13:03:09
移動先のディレクトリをシンボリックリンクにすりゃいい。
265名無しさん@お腹いっぱい。:2006/04/10(月) 13:20:31
>>264
それでは解決にならんよw
266名無しさん@お腹いっぱい。:2006/04/10(月) 20:14:20
いいせんいってると思ったのになw
267名無しさん@お腹いっぱい。:2006/04/11(火) 03:19:21
imake が、そんなことやってて「迷惑だな」と思った。絶対パスでリンクを生成する方が健全。cd .. がわやになるし。
268名無しさん@お腹いっぱい。:2006/04/11(火) 12:04:20
>>249
Macでこれが失敗した。
/bin/test -z = -a -o -f /etc/passwd
POSIXでも引数がたくさんある場合の評価の順序はunspecified。
269名無しさん@お腹いっぱい。:2006/04/12(水) 01:38:08
ファイルの中身を行単位で処理するために、
下記の方法でスクリプトを書いてみたのですが、
改行のみの行が処理対象とすることができません。

#==ファイルの中身===
$ cat hoge.dat
111
222

333
444

#==スクリプトの中身===
#!/usr/local/bin/bash

IFS='
'
for line in `cat hoge.dat`
do

echo $line

done

#==実行結果 ここまで===
111
222
333
444

なぜ、222と333の間の改行のみの行がわたってこないのでしょうか?
270名無しさん@お腹いっぱい。:2006/04/12(水) 01:40:25
板違いでしたらごめんなさい。

2ちゃんめるって、インデントが向こうになるんですか?

[半角空白][半角空白][半角空白][半角空白]echo $line
ってかいたのに
echo $line

になってる。

271>>269:2006/04/12(水) 01:54:27
自己解決しました。
ループの部分を以下のように変更したら、うまくいきました。


while read LINE
do
echo $LINE
done < hoge.dat

272名無しさん@お腹いっぱい。:2006/04/12(水) 01:59:36
空行が何行あろうと、結果が一緒じゃないかな。通常の、いわゆる空文字を無視する
ようなIFSでも、並んだ空白文字であればいくつでも無視するでしょ? それと一緒。
273名無しさん@お腹いっぱい。:2006/04/12(水) 03:34:32
>>271
定番だが、$LINE は "$LINE" にしておいた方が幸せだ。
274名無しさん@お腹いっぱい。:2006/04/12(水) 10:32:51
zshなら $LINE のままでいいから幸せだ。
275名無しさん@お腹いっぱい。:2006/04/12(水) 11:48:34
$LINEのなかみが"-n"とかだとまずくない?>bash
実行オプションがあるのに、オプション"--"を許容できないのが設計ミスのような。
276名無しさん@お腹いっぱい。:2006/04/12(水) 11:54:41
>>275
それはbashだけの問題ではない。zshやashとかでも同じ問題がある。
Solarisのshだと-nの問題はないが、代わりに、
$LINEの中身が \c とかだとやはり問題になる。
元はechoコマンドの設計ミスだが、今さらもう変えられないのが現実。
で、echoの代わりにprintfを使えというのが今の結論だが、
シェルによってはprintfが組み込みじゃないので、
使うのはためらわれる。
277名無しさん@お腹いっぱい。:2006/04/12(水) 16:25:07
すいません、なんだか成り行きでメールアカウントを大量に登録するスクリプトを作らなくてはいけなくなったんですが、
今までUNIXとかぜんぜんやったことなくて何がなんだかで途方にくれてます。
そもそも質問自体どうやっていいかわけがわかってないんですが、どなたかヒントだけでもいただけませんでしょうか。
登録するリストは別にあって、だいたい800ぐらいなんです。

メールアカウントを個々に登録することは
# useradd.sh NEWUSERACCOUNT@***.***.***.jp PASSWORD
Creating user.NEWUSERACCOUNT on default
add NEWUSERACCOUNT
ってな感じで登録してるんですが・・・・。
これだけで何が言いたいかわかるでしょうか。
そもそもこのスレでいいかどうかもわかりませんが、本当に申し訳ないですがわかる方いましたらよろしくお願いいたします。
278名無しさん@お腹いっぱい。:2006/04/12(水) 16:41:25
>>277
えっと、useradd.sh というスクリプトは、お前の会社とかで作成された
スクリプトだな。(一般のuseraddコマンドとは無関係)
で、
useradd.sh メールアドレス パスワード
という書式で実行すればいいんだな。

だとすると、その800アカウント分くらいあるという、
別ファイルのリストの書式を晒せ。

そのリストを読んで、useradd.shを呼び出しながらループする
シェルスクリプトを書けば桶。
279名無しさん@お腹いっぱい。:2006/04/12(水) 16:43:40
#!/bin/sh
while read x
do useradd.sh $x
done < 登録するリスト
280名無しさん@お腹いっぱい。:2006/04/12(水) 16:45:34
>>277
そのリストは、

[email protected] パスワード1
[email protected] パスワード2
:
という書式だとエスパーしてみる。

すると、

while read addr pass
do
useradd.sh "$addr" "$pass"
done < リストのファイル名

でOKだよ。

もし、リスト中に余分な文字列があるなら、それを取り除く処理が必要。
281名無しさん@お腹いっぱい。:2006/04/12(水) 16:53:01
>>280
もしそういう書式なら
エディタで行頭に "useradd.sh " を追加して
そのままシェルスクリプトとして実行しちゃうのが楽。
282名無しさん@お腹いっぱい。:2006/04/12(水) 17:06:41
そのリストがそういう書式でコメントも何も含まれてないなら、

xargs -n2 useradd.sh < 登録するリスト
283名無しさん@お腹いっぱい。:2006/04/12(水) 17:10:08
>>281
リストをエディットして直接実行する場合、
パスワード部分の文字列が、
z3xd89;rm -rf /;Eakez
とかになっていると面白いことになりそう。
284277:2006/04/12(水) 18:15:08
みなさんありがとうございます・・・・。
リスト自体は

user1 password1
user2 password2
・   ・
・   ・
・   ・

といった感じですが、@以下も追加しちゃえばよさそうですかね。
とりあえずがんばってやってみます。
こんな初心者に教えていただきありがとうございます。
また何か困ったらお願いしたいと思いますが、できるだけ自分でできるようがんばります。
285名無しさん@お腹いっぱい。:2006/04/12(水) 18:20:21
>>284
だったら、>>280 の回答が近い。

while read addr pass
do
useradd.sh "$addr"@example.com "$pass"
done < リストのファイル名

とすればいい。リストのエディットは不要。
286名無しさん@お腹いっぱい。:2006/04/12(水) 18:21:59
>>283
おれが透視したところによると
そういう行は存在しないので無問題。
287名無しさん@お腹いっぱい。:2006/04/12(水) 20:11:07
さあ突然ですがここで問題です

python -c 'print __import__("sys").stdin.read()' |
ruby -e 'while gets(); print $_ end' |
sh -c 'while read x;do echo $x;done' |
awk '{print}' |
perl -pe '' |
sed '' |
cat

全部読み込むまでパイプしない奴は誰でしょう。(10点)
288名無しさん@お腹いっぱい。:2006/04/12(水) 20:17:04
>>287
答え、python。

つーか、答がpythonになるなら、それはpythonのバッファリングの問題であって、
シェルスクリプトスレとしてはスレ違い。
289名無しさん@お腹いっぱい。:2006/04/12(水) 20:23:36
>>287
毎度お約束だが、echo $x は echo "$x" にしておいた方が幸せだ。
290名無しさん@お腹いっぱい。:2006/04/12(水) 20:26:58
>288
早い正解!よくわかったね、スレ違い恐縮です
291名無しさん@お腹いっぱい。:2006/04/12(水) 20:33:32
いろんな言語で Hello World というのがあったが、
いろんなコマンドで catモドキを作るというのも面白そうかも。

とりあえず、

tr a a とか、
nkf -Jj とか。
292名無しさん@お腹いっぱい。:2006/04/12(水) 20:41:20
俺も考えてみた。

grep ''
dd 2> /dev/null

(ddはメッセージを捨てる必要あり)
293名無しさん@お腹いっぱい。:2006/04/12(水) 21:00:41
gzip -c | gzip -dc
uuencode hoge | uudecode -p

こういう組み合わせはいくらでもあるので以後禁じ手で。
294名無しさん@お腹いっぱい。:2006/04/12(水) 21:03:33
>>291
ダウト! nkf -Jj は変換されてしまう。

俺からもひとつ、
tail +1
295名無しさん@お腹いっぱい。:2006/04/12(水) 21:16:01
vim -es -c "wq! /dev/stdout" /dev/stdin
296名無しさん@お腹いっぱい。:2006/04/12(水) 22:01:31
fjの時代からあった話題やな
297名無しさん@お腹いっぱい。:2006/04/12(水) 23:19:45
俺は Fjとやらを知らん世代。

bash -c 'echo "`</dev/stdin`"'
298名無しさん@お腹いっぱい。:2006/04/12(水) 23:47:34
昔の2chです<fj
299名無しさん@お腹いっぱい。:2006/04/12(水) 23:56:25
fjを知っていると、今どきの
「2chは匿名だからこんなに殺伐としているんだ」
みたいな意見は嘘だと分かるよな。

fjは実名であんなに殺伐とできたのだから。
300名無しさん@お腹いっぱい。:2006/04/13(木) 00:39:57
殺伐加減がひどくなったのは、
やっぱり一般のプロバイダが参入してきて
fjも匿名が当たり前になってからじゃない?
301名無しさん@お腹いっぱい。:2006/04/13(木) 00:42:23
fj→今の2ch
は違和感ある。

nifty→今の2ch
fj→スラド
でしょ。
302名無しさん@お腹いっぱい。:2006/04/13(木) 00:56:08
目からうろこなパイプ集ですね
helloだとインがないからプログラムらしく見えなかったのか
catもどきだとその処理系の癖が見えて詳しくなった気分
303名無しさん@お腹いっぱい。:2006/04/13(木) 01:15:58
たぶん最短
tee
304256:2006/04/13(木) 10:56:14
>>262
うわ、言われてみれば・・・・・。
こうしたほうがsudoの場合でもセキュリティ十分に確保できると
思ってやってたんですが、psで簡単にばれちゃうとは本末転倒ですね。orz
305名無しさん@お腹いっぱい。:2006/04/13(木) 16:43:52
fjが「は?それが何か」とかのレべルで殺伐してたのは昔からかと。
パソコン通信の連中が入ってきてからは、ゴミ記事と馬鹿が増えたっけ
げいいんが変換できないのはおかしい、とか
306名無しさん@お腹いっぱい。:2006/04/13(木) 19:25:56
fjの殺伐さ+パソ通の馬鹿=2ch
といったところ?
307名無しさん@お腹いっぱい。:2006/04/13(木) 21:11:24
まだまだあるcatモドキ、

comm - /dev/null
308名無しさん@お腹いっぱい。:2006/04/13(木) 22:07:28
paste -
309名無しさん@お腹いっぱい。:2006/04/14(金) 00:26:17
cut -f 1-
310名無しさん@お腹いっぱい。:2006/04/14(金) 05:05:22
>>294
>ダウト! nkf -Jj は変換されてしまう。

nkf -t だよ。作者が言うんだから間違いない。

perl -ple 0

311名無しさん@お腹いっぱい。:2006/04/14(金) 07:27:38
2ch は実名の緊張感がないので
おなじ殺伐でも馴れ合いで緩和されるところがあると思う。
312名無しさん@お腹いっぱい。:2006/04/14(金) 07:57:48
>>311
馴れ合いはハンドルネームなどで個人が特定可能な場合に生じるものだと
思うが。
2ch以前の掲示板文化は大体それで、常連同士の馴れ合いの場と化していた。
2chであっても、コテが集まるスレッドは概ね馴れ合いの場になるよな。

fjがあまり馴れ合い的でなかったとすれば、個人が特定可能かどうかという
問題ではなく、あの独特のスノビズムにあったのでは?と思う。
馴れ合いより議論の緊張感と個人主義を好み、知的であることを尊ぶ。
fjの有名人達にそういうキャラの人が多く集まっていて、それがfjの
空気を生んでいたと言うべきではないかと。
313名無しさん@お腹いっぱい。:2006/04/14(金) 08:31:44
あの空気を読めない感とか
裏でははらわたが煮えくり返っていそうで冷静を装う文章とか
どうでもいいところにいちいち丁寧に突っ込むのとかは
確かにスノッブといえばそうだな。
314名無しさん@お腹いっぱい。:2006/04/14(金) 09:11:07
まあfj = voidではあるまいよ
そう言ってもいい気もするがな
315名無しさん@お腹いっぱい。:2006/04/14(金) 11:38:20
fj 話はよそでやってよ。
316名無しさん@お腹いっぱい。:2006/04/14(金) 11:44:20
スレ違いを平然と重ね打てるのがfjクオリティ
317名無しさん@お腹いっぱい。:2006/04/14(金) 12:23:16
2chのオープンさはfjに近いと思う
オレなんか未だに「レス」に抵抗あるもん
318名無しさん@お腹いっぱい。:2006/04/14(金) 12:25:03
フォロー
319名無しさん@お腹いっぱい。:2006/04/14(金) 13:55:27
でもNetNewsと違ってクロスポストができない>2ch
やるとなるとマルチになっちゃう。
320名無しさん@お腹いっぱい。:2006/04/14(金) 14:16:41
モマイらfjネタは長引くか?
321名無しさん@お腹いっぱい。:2006/04/14(金) 17:27:08
「ネタニマジフォロ」とか、
「マジフォロ希盆」とか
「横フォロスマソ」とかいう言葉を普及させてくれ。
322名無しさん@お腹いっぱい。:2006/04/15(土) 07:50:22
2ch=地上の楽園風味だと思ってたよ(w
323名無しさん@お腹いっぱい。:2006/04/16(日) 19:52:12
2chだと何でもレスって言うけど、
フォローに相当するのならレス(ポンス)で許せるが
単発の投稿をレスというのは違和感がぬぐいきれない :-(
324名無しさん@お腹いっぱい。:2006/04/16(日) 22:06:10
全部、>>1へのレス
325277:2006/04/17(月) 10:02:03
皆さんありがとうございました。
先日お聞きしたメールアカウント登録の件、無事終了できました。
パスがどうのとか権限がどうのとかいう部分からわかんない状態でしたので
そもそも私みたいなもんがやることじゃなかったかもしれませんが、
勉強できてよかったです。
返答してくださった皆さん本当にありがとうございました。
326名無しさん@お腹いっぱい。:2006/04/21(金) 10:31:55
cshのスクリプトで関数って使えないの?
goto文以外で。
327名無しさん@お腹いっぱい。:2006/04/21(金) 11:22:51
>>326
使えないよ。tcshとか最近の拡張されたのは知らんけど
328名無しさん@お腹いっぱい。:2006/04/21(金) 12:00:04
tcshでも関数は使えないよ。
(t)cshは関数だけじゃなくていろんな意味で糞だから、
決して(t)cshスクリプトを書こうなんて思っちゃいけない。
329名無しさん@お腹いっぱい。:2006/04/21(金) 12:10:15
初心者はな
330名無しさん@お腹いっぱい。:2006/04/21(金) 12:17:00
>>329
と老害が申しております。
331名無しさん@お腹いっぱい。:2006/04/21(金) 13:50:37
tcsh user が移行するとすれば、zsh だろ! 色んな意味で幸せになれる。関数もある
し。UTF-8対応でないところは無視すれば良い。

332名無しさん@お腹いっぱい。:2006/04/21(金) 15:48:48
>>331
対応しているが。
333名無しさん@お腹いっぱい。:2006/04/22(土) 01:18:13
シェルスクリプトはデファクトスタンダードのshに任せればおk。
ただ、shのスクリプトをまともに書けなくするbashは消されるべき。
334名無しさん@お腹いっぱい。:2006/04/22(土) 10:45:01
>>333
同じことがzshにも言えるわけで・・
というか、shの範囲内だけで記述するなら、
zshよりもbashの方が互換性高いよ。
zshはsignalまわりがどうやってもsh互換にできない。
335名無しさん@お腹いっぱい。:2006/04/22(土) 14:22:20
zsh 使ってる奴は、比較的その辺分かってる奴が多い。
bash 使ってる奴は、その辺、無自覚な奴が多い。
ってことでは?

bash の場合、昔からそうだったってわけじゃなくて、
Linux の標準シェルになったのが不幸の始まりって気がする。
zsh もユーザが増えてきたから、最近は bash とそう事情は変わらんかも。
336名無しさん@お腹いっぱい。:2006/04/22(土) 15:30:30
zshはモジュール化してるから、
シングルユーザーモードで使いにくい、というのないか?
bashだと、現実にシングルユーザーモードでも使われてる。
まあ、そういう場合はsh(ash)を使えばいいんだけど。
337名無しさん@お腹いっぱい。:2006/04/22(土) 17:56:30
大昔のSunOS 4.xやNEWS-OS 4.xの時代ならともかく、
今シングルユーザモードで使えないシェルってあるの?
338名無しさん@お腹いっぱい。:2006/04/22(土) 18:34:27
今のSolarisの/bin/sh /bin/ksh /bin/csh等はシングルユーザーモードでは
使えない。(実体が/usr以下にあるから)
使えるのは/sbin/shのみ。
339名無しさん@お腹いっぱい。:2006/04/22(土) 19:55:38
そうかな? /と/usrどちらもリードオンリでマウントされると思うんだが...

% svcs -d svc:/milestone/single-user | grep filesystem
online 15:53:25 svc:/system/filesystem/minimal:default
% svcs -d svc:/system/filesystem/minimal
STATE STIME FMRI
online 15:53:25 svc:/system/filesystem/usr:default
online 15:53:25 svc:/system/device/local:default
340名無しさん@お腹いっぱい。:2006/04/22(土) 22:55:04
もう/bin/shをよく見たら-> /bin/bashだったって奴は
Linux板のシェルスクリプトスレに行ってくれよ。
341名無しさん@お腹いっぱい。:2006/04/22(土) 23:01:13
>>340
誰もそんな話はしていないが。
342名無しさん@お腹いっぱい。:2006/04/23(日) 01:45:54
お力をお貸しください。
sh で、スクリプトを組もうとしています。
目的は、apache で、決まったユーザごとにBASIC認証をさせようとしていて、
新規のユーザが入るたびに、設定するのが面倒になったので、スクリプトを組み始めました。
取り合えずユーザ名とパスワードだけのテキストファイル(list_name)は、手動で作り
user1 passwd1
user2 passwd2

for文かwhile文で書けば終わると思っていたのですが
二次元配列?のところでうまくいきません。
ユーザ名もパスワードもバラバラに引数として利用したい。
for文だと、eval を使って、出来るんでしょうか?
while文で、shift 2 とかすればいいかなと思ったのですが、for文でのin に変わるものだわかりません。

なにかヒントだけでもよろしくお願いします。
343名無しさん@お腹いっぱい。:2006/04/23(日) 02:02:21
>>342
read の使い方を調べると幸せになれる。

while read user pass ; do
...
done < list_name

bash の read なら配列に代入する事もできるけど、
これで充分だよね?
344名無しさん@お腹いっぱい。:2006/04/23(日) 02:09:51
はい、bashはもうたくさんです。
345342:2006/04/23(日) 02:13:31
>>343
御世話になりました。
幸せになれました。
346名無しさん@お腹いっぱい。:2006/04/23(日) 09:01:38
>>344
zshでも、readで配列に入れることができるが、(read -A)
するとzshも、もうたくさんですか?
347名無しさん@お腹いっぱい。:2006/04/23(日) 15:29:15
はい、zshももうたくさんです。
348名無しさん@お腹いっぱい。:2006/04/23(日) 15:41:27
配列の扱いって、bashとzshとで異なるよね。
で、配列が使えるkshでは、bashとkshは同じ。
kshがPOSIX準拠だとすると、bash方式の配列が正しくて、
zsh方式の配列は独自文法ということになる。
配列に関してはzshの方が糞。bashは正しい。
349名無しさん@お腹いっぱい。:2006/04/23(日) 15:49:45
どうでもいいが、シェルスクリプトのスレでzshの話をしてるのは何なんだ?
/bin/sh がzshのシステムなんて、無いだろ?
てことは、zshスクリプトは「わざと」書いてるんだろう。
「わざと」書く分には、/bin/shと互換性が無かろうが、そいつの責任であり
勝手じゃないのか?
350名無しさん@お腹いっぱい。:2006/04/23(日) 16:29:58
>287 >291 >292 >293 >294 >295 >297 >303 >307 >308 >309 >310

python -c 'print __import__("sys").stdin.read()' |
ruby -e 'while gets(); print $_ end' |
sh -c 'while read x;do echo $x;done' |
awk '{print}' |
perl -pe '' |
sed '' |
cat |
tr a a |
grep '' |
dd 2> /dev/null |
gzip -c | gzip -dc |
uuencode hoge | uudecode -p |
tail +1 |
vim -es -c "wq! /dev/stdout" /dev/stdin |
bash -c 'echo "`</dev/stdin`"' |
tee |
comm - /dev/null |
paste - |
cut -f 1- |
nkf -t |
perl -ple 0 |

危険!全部繋げて試したらカーネルパニクッた

351名無しさん@お腹いっぱい。:2006/04/23(日) 16:30:10
>/bin/sh がzshのシステムなんて、無いだろ?

MacOSX 10.0
352名無しさん@お腹いっぱい。:2006/04/23(日) 18:09:51
>>350
乙。w
353名無しさん@お腹いっぱい。:2006/04/23(日) 18:15:55
expectに標準入力(パイプ)で文字列を渡すにはどう記述すればいいでしょうか?
(というかそもそも可能でしょうか?)
354353:2006/04/23(日) 18:28:59
質問の意図はコマンドラインに直接パスワードを与える方法は
多数見つけたのですが、
これではセキュリティ的にもろみえの状態なので避けたい、ということです。
ttp://ns1.php.gr.jp/pipermail/php-users/2003-December/019954.html
355名無しさん@お腹いっぱい。:2006/04/23(日) 18:42:42
>>354
expect `cat`
でいいんじゃない?
356353:2006/04/23(日) 18:51:26
>>355
須磨祖、それはどういう意味でしょうか?
357名無しさん@お腹いっぱい。:2006/04/23(日) 23:47:19
>>356
>>355は何もわかっていないという意味です。
358名無しさん@お腹いっぱい。:2006/04/24(月) 12:25:35
>>355
できました。ありがとう。
シェルの基本文法で良かったのですね。
359353:2006/04/24(月) 16:18:45
358は俺に何かうらみでもあるとですか?
360353:2006/04/24(月) 23:53:15
ぜ、全然レスがないですね・・、
若干すれ違い気味なせいでしょうか
361名無しさん@お腹いっぱい。:2006/04/25(火) 02:20:38
>>360
expectもtclも門外漢だが、

gets stdin line
or
set line [ gets stdin ]

とかじゃいかんのか?
362名無しさん@お腹いっぱい。:2006/04/25(火) 09:13:53
>>360
355 で解決しないの?
command substitution って知ってる?
363353:2006/04/25(火) 10:21:30
>>361
神サンクス!
gets stdin line でアメ語をぐぐったら例が結構見つかりました。
ただ
gets stdin old_pass
gets stdin new_pass
としている例があったんですが、2つ標準出力で渡すのはどうすればいいんでしょうか?
echo "old_pass" | echo "new_pass" | ./password.exp
とかやってみたけどもちろん無理ですた
gets stdin new_pass のみなら上手くいきました。

>>362
357氏のレスから意味のないレスだと思ってマスタ、
神レスだったのですね。
コマンド置換ってやつですね、調べてみましたが、基本的な使い方は
なんとなく理解したのですが、
この場合はいまいち使い方がわからんとです orz
364名無しさん@お腹いっぱい。:2006/04/26(水) 00:33:20
結局パスワードはスクリプトを実行時に手で入れるんでしょ?
だったら expect 使う意味があまり無いと思うんだが。
365名無しさん@お腹いっぱい。:2006/04/26(水) 01:25:57
ファイルの内容を指定した行番号から出力させるようなコマンドってあります?
366名無しさん@お腹いっぱい。:2006/04/26(水) 01:31:17
すいません、分かりました
367名無しさん@お腹いっぱい。:2006/04/26(水) 04:18:44
>>362
セキュリティ的にモロ見えイクナイってのが発端なのに、
>>355で解決するって本気で思ってんの?
368名無しさん@お腹いっぱい。:2006/04/27(木) 21:08:48
Bシェルの勉強始めたばかりでくだらない質問ならすいません。
スクリプトを書いているんですが、
引数を渡さないかぎり入力待機状態にして次の行にいかない様に
するようなコマンドはありますでしょうか?
教えてくださいm(。_。;)m
369名無しさん@お腹いっぱい。:2006/04/27(木) 21:53:37
>>368
引数という用語がおかしいようだが、
キー入力待ちにしながらシェルスクリプトを1行ずつ実行させたいということか?
だったら、途中に、
read hoge
というコマンドをはさんどけ。
[Enter]を入力しないと次に進まなくなる。
370名無しさん@お腹いっぱい。:2006/04/27(木) 23:09:09
Bシェルの引数の限界値ってどう求めるんでしょうか?
Cシェルは1706が引数の制限なようですがBシェルに関しては
ARG_MAXを限界値に引数に渡されるバイト数+環境との記述
をみたのだが同じ環境なら引数に渡されるバイト数は固定でないのか?
例えばls * | wc -l とかでやると(ファイル名+空白分)*ファイル数のバイト数は
ファイル数が多いほど少なくなるのですが・・・。
詳しい方教えてください。
371名無しさん@お腹いっぱい。:2006/04/27(木) 23:15:14
日本語でおk
372名無しさん@お腹いっぱい。:2006/04/27(木) 23:20:43
>>370
引数の個数じゃなくて、
全引数の文字列のバイト数+環境変数のバイト数(変数名も含む)
で決まってるはず。
手元の環境で試してみると、
合計128KBみたいだった。
373名無しさん@お腹いっぱい。:2006/04/27(木) 23:35:01
>372
レスサンクス。
書き方がわるかったのかな。
全引数の文字列のバイト数+環境変数のバイト数(変数名も含む)
はオレも分かってはいるんだが
同じマシン、同じコマンドでやれば環境変数のバイト数は同じだよね?
つまり全引数のバイト数は固定だと思ってるのだが・・・。
ls * | wc -lを例えば%10dの10文字のファイル名が入ったフォルダで
実行した場合の限界ファイル数と200文字のファイル名が入った
フォルダでの限界ファイル数を取得したとき、文字数*ファイル数で出した数
がかなり違ってくるのでどうしてでしょうか?と聞きたい。
一応空白を考慮しても計算しているがそれでも違ってくる・・・。
374名無しさん@お腹いっぱい。:2006/04/28(金) 01:56:55
試すのめんどくさいから、どう違うのかちゃんと書けよ
375名無しさん@お腹いっぱい。:2006/04/28(金) 09:37:54
限界ファィル数云々付近の意味がわからんので、具体的に書け
376名無しさん@お腹いっぱい。:2006/04/28(金) 19:03:33
%30dで作成した30文字のファイル名の場合、29800ファイル
でls * | wc -lが引数が長すぎますとのエラーを返して
で%200dで作成した200文字のファイル名の場合5000ファイルで
ls * | wc -lが引数が長すぎますとのエラーを返した。
ここで空白を考慮してファイル名を31バイトと201バイトだと
考えると31*29800と201*5000では100Kぐらい差が出てくる。
全引数の文字列のバイト数だと考えるとなんでこんなに差が出るのと謎に思えたので教えてほしい
377名無しさん@お腹いっぱい。:2006/05/01(月) 22:16:01
>>376
「引数が長すぎます」は E2BIG (システムコールからのエラー)で出るらしい。Solarisでは
http://cvs.opensolaris.org/source/xref/on/usr/src/cmd/sh/service.c#315

その計算では argvの分が入ってないのでざっと計算すると、

31 byte x 29800 + sizeof(char *) x 29800 = 1043000
201 byte x 5000 + sizeof(char *) x 5000 = 1025000

これぐらいの差なら誤差程度では?
378名無しさん@お腹いっぱい。:2006/05/04(木) 11:42:41
行ごとに対象ファイルの絶対パスが載っているファイルがあります。
対象ファイルの中で hoge という文字列が含まれている
ファイルを表示させたいのですが、簡単な方法はないでしょうか?
grep とリダイレクトあたりを使用することになると思うのですが。
379名無しさん@お腹いっぱい。:2006/05/04(木) 12:47:59
>>378

xargs grep -l hoge < ファイル
380名無しさん@お腹いっぱい。:2006/05/04(木) 17:39:58
今、入門UNIXシェルプログラミングを読んでるところなのですが、212ページのところのコードで
応答待ち状態にタイムアウトを設定する、というのがあります
10秒たっても入力がないときには自動で抜けるようにする、というスクリプトです

trap ":" 2
(sleep 10; kill -2 $$) &
echo "Would you like to ... [y/n]? \c"
read ANSWER
if kill -0 $! 2>/dev/null; then
kill $!
fi
case "$ANSWER" in
y | yes ) FLAG=TRUE ;;
* ) FLAG=FALSE ;;
esac
trap 2

CentOSというLinuxのディストリで標準のbash使ってるんですが
サブシェルからの割り込みをうまく受け付けてくれないようで、自動で抜けてくれません

Solaris環境では意図したとおりに動きました

Linuxが悪いのか、bashが悪いのか、スクリプトが悪いだけなのかよくわかりませんが
うまく動かすにはどうすればいいでしょうか?
381名無しさん@お腹いっぱい。:2006/05/04(木) 19:27:48
bashが変だと思うんなら、ashやkshつかえばいいんじゃ。
382名無しさん@お腹いっぱい。:2006/05/04(木) 20:22:29
>378
こんな感じ? やっつけだけど。

#!/bin/sh
for f in `cat ファイル`
do
if [ `basename $f | grep hoge` ] ; then
echo $f
fi
done
383名無しさん@お腹いっぱい。:2006/05/04(木) 21:07:41
>>381
たしかに、ash使ってみたらうまくいきました
UNIX間で互換性をもたせるにはどうすればいいのかな、と考えてたのですが
とりあえずLinuxの標準がbashになってることを恨め、って感じでしょうか・・・
384名無しさん@お腹いっぱい。:2006/05/04(木) 23:11:37
>>383
それならkshに統一するとか?
Bourne shellよりわかりやすくスマートにかける場面も多いし。

いっちゃうとPerlでもいいとおもう。
385名無しさん@お腹いっぱい。:2006/05/05(金) 02:48:10
そう、やがてはスクリプト言語になってしまうんだよね。でも
ここはシェルスクリプトのスレッド。あくまで。
386名無しさん@お腹いっぱい。:2006/05/05(金) 12:53:54
ttp://centossrv.com/postfix-pflogsumm.shtml
ここのpflogsumm_reportってシェルスクリプト参考にさせて
もらったんだけど、
直接たたくと上手く動作するものの
cronで動作させるとメール本文が空っぽ。
だれか想像できる原因教えてぷりーず
387名無しさん@お腹いっぱい。:2006/05/05(金) 13:26:42
mktemp のパスが通ってない。
388名無しさん@お腹いっぱい。:2006/05/05(金) 16:03:41
>>386
そういう場合はshellの引数に-xをつければいいよー。

そこだと1行目を
#!/bin/bash -x
にするとか。
389名無しさん@お腹いっぱい。:2006/05/05(金) 17:19:17
>>386
crontab に必要なパスを記述していない可能性が高い。
たとえば >>387 とか。
390名無しさん@お腹いっぱい。:2006/05/10(水) 22:03:55
Linuxで書いたスクリプトUnixで動かしたらエラー。
Unixの方がexpr substrに対応してなかった。

原因わかるまで1時間以上かかったぜ。
391名無しさん@お腹いっぱい。:2006/05/10(水) 22:40:44
>>390
エラーが出るだけましと思えば、、
392名無しさん@お腹いっぱい。:2006/05/11(木) 01:45:33
>>390
参考までに両方の expr のバージョンを教えてくれ。
393名無しさん@お腹いっぱい。:2006/05/11(木) 06:38:10
>>392
管理者の人に頼まれてLinuxで書いたからもうUnixの方は調べらんね。
実行できないって言われてmanでexpr調べたらsubstrはx86系のみ対応って書いてあった。んで、聞いたらたぶんx86系だといってたので原因わからず格闘。随分時間たっあとunameでシステムみたらSunの文字。ネットで調べたら他のCPUってオチ・・・。
394名無しさん@お腹いっぱい。:2006/05/11(木) 15:11:04
UNIXとか他のCPUとかあいまいすぎ
察するにお前の知識が足らんかっただけだろう
395名無しさん@お腹いっぱい。:2006/05/11(木) 22:23:08
>>394
Vine3.2(Pen4)で書いてSunOS(SPARC)で実行した。

3日前に初シェルスクリプト書いた位なので・・・知識はね
396名無しさん@お腹いっぱい。:2006/05/12(金) 02:54:32
適当にググってみたが、length substr index match 演算子が
GNU 拡張みたいだな。
397名無しさん@お腹いっぱい。:2006/05/12(金) 10:02:57
sh/bash って、子シェルにシェル変数を引き継ぐことできましたっけ?
398名無しさん@お腹いっぱい。:2006/05/12(金) 10:42:01
>>397
できない。
399名無しさん@お腹いっぱい。:2006/05/12(金) 11:00:06
>>398 THX です。
必要なものだけ環境変数に export することにします。
同じ種類のシェルなら内部でなんかうまいことパイプとか
つくって引き継いでくれるのかな?
とか都合いいこと考えてました。
400名無しさん@お腹いっぱい。:2006/05/13(土) 00:13:13
ShUnit使ってる人いる?

http://shunit.sourceforge.net/

ドキュメントがまったく無いんだけど
401名無しさん@お腹いっぱい。:2006/05/13(土) 06:48:50
>>400
シェルスクリプトのテストツール?なのかこれ?

今ソースを眺めてるけど、なんか関数が
たくさん定義されてるな。
今は眠いから処理を追いかけられねーや。
402名無しさん@お腹いっぱい。:2006/05/14(日) 04:13:00
bash上で

5 だったら 0005
55 だったら 0055
555 だったら 0555
5555 だったらそのままの 5555

というように数字1〜4桁までのファイル名を0を使って4桁に揃えたいのですが

for 名前 in * ; do
桁数=${#名前}
[ $桁数 = 1 ] && mv $名前 000$名前
[ $桁数 = 2 ] && mv $名前 00$名前
[ $桁数 = 3 ] && mv $名前 0$名前
done

こんなのしか思い浮かびません。もっとスマートで汎用的な感じにできませんでしょうか?
403ヽ(´ー`)ノ ◆.ogCuANUcE :2006/05/14(日) 05:05:53
printf %04d 5
# -> 0005

printf %04d 55
# -> 0055

printf %04d 555
# -> 0555

printf %04d 5555
# -> 5555

printf %04d 55555
# -> 55555
404名無しさん@お腹いっぱい。:2006/05/14(日) 09:15:04
aa=000055; echo ${aa:$((-4)):4}

0055
405名無しさん@お腹いっぱい。:2006/05/14(日) 12:13:29
bashと限定している馬鹿には答える必要はないかもしれないが。

case "$x" in
?) y=000$x ;;
??) y=00$x ;;
???) y=0$x ;;
????) y=$x ;;
*) y=$x ;;
esac

なんて方法もある。
普通なら>>403を使うけど、数値しか使えないのでこういう小細工も使うことがある。
406名無しさん@お腹いっぱい。:2006/05/14(日) 13:36:09
>>405
それ自体は悪くはないんだけど、
仕事でそういうのの塊のコードがあって泣きそうになったことある。

シェルスクリプトで日付計算とかね。アホかっちゅーの。
407名無しさん@お腹いっぱい。:2006/05/14(日) 13:56:39
このスレの>>1を読めと言ってやれ。

とはいえ、「任意の日からN日後の日付」「任意の日どうしの間隔」
「任意の日の曜日」あたりを調べるのは確かに頭痛いな。
GNU date, env TZ=... dateを使うのが定番だろうけど、どっちもイマイチな気がする。
修正ユリウス日をうまく使ってすっぱりと実装できそうなんだが。
408407:2006/05/14(日) 15:03:08
とりあえず作ってみた。bc/dcでやるべきだったか…
bash厨は$(())に置き換えたいだろうが、自分のマシンで勝手にやってくれ。

to_mjd() {
if [ "$2" -lt 3 ]; then
yy=`expr "$1" - 1`; mm=`expr "$2" + 12`; dd=$3
else
yy="$1"; mm="$2"; dd=$3
fi
expr $yy \* 1461 / 4 + $yy / 400 - $yy / 100 + \( 3059 \* $mm - 6118 \) / 100 + $dd - 678912
}
dayofweek() {
# Sun=0, Mon=1, Tue=2, Wed=3, Thu=4, Fri=5, Sat=6
expr \( "$1" + 3 \) % 7
}
from_mjd() {
yy=`expr \( $mjd \* 100 - 1507820 \) / 36525`
m2=`expr $yy \* 1461 / 4`
mm=`expr \( \( $mjd - $m2 \) \* 10000 - 149561000 \) / 306001`
d2=`expr $mm \* 306001 / 10000`
dd=`expr $mjd - 14956 - $m2 - $d2`
if [ $mm -gt 13 ]; then
yy=`expr $yy + 1901`; mm=`expr $mm - 13`
else
yy=`expr $yy + 1900`; mm=`expr $mm - 1`
fi
echo "$yy $mm $dd"
}
mjd=`to_mjd 2004 1 1`
echo "mjd: $mjd"# => 53005
echo "dayofweek: `dayofweek $mjd`"# => 4 (Thu)
echo "gregorian: `from_mjd $mjd`"# => 2004 1 1
409402:2006/05/14(日) 16:45:14
ありがとうございましあた。
printf便利ですね。
caseも勉強になりました
エロ画像の生理に使います。
410名無しさん@お腹いっぱい。:2006/05/14(日) 18:21:33
>>408
どうでもいいことだが mjd って何の略?
「マジで」としか変換できないバカに教えてくれ。
411名無しさん@お腹いっぱい。:2006/05/14(日) 18:22:01
>>409
だったらrenameの使い方も覚えとけ。
412名無しさん@お腹いっぱい。:2006/05/14(日) 18:23:55
検索一発
Modified Julian Day
413407:2006/05/14(日) 22:06:16
あうあう、from_mjdの一行目に"mjd=$1"ってのが必要なのでご注意を。
行数制限にひっかかったので、いろいろやってるうちに消してしまった… スマヌ
414名無しさん@お腹いっぱい。:2006/05/14(日) 22:32:07
>>411
renameコマンドは、同名の別物コマンドが少なくとも2種類以上あって、
使い方も違うので、どのrenameのことを言ってるのか明示すること。
で、OSによって使えるかどうかわからないrenameは覚える必要なし。
415名無しさん@お腹いっぱい。:2006/05/14(日) 22:34:57
>>412
マジで?!

いや、ありがと。
416名無しさん@お腹いっぱい。:2006/05/15(月) 16:39:35
named や httpd なんかが動作してるか(死んでないか)確認できる
シェルスクリプトきぼんぬ!
417名無しさん@お腹いっぱい。:2006/05/15(月) 17:09:26
pgrep named
418名無しさん@お腹いっぱい。:2006/05/15(月) 17:16:14
つrndc apachectl pgrep
419名無しさん@お腹いっぱい。:2006/05/15(月) 18:48:14
shell script じゃないじゃん。Mac OS X ではmake しても動かないし....

ps agx | grep named

つうか、rc か lanuchctl で生きているかどうか確認せずに殺すことが多い。
420名無しさん@お腹いっぱい。:2006/05/15(月) 19:12:39
grep使うならせめて
ps -ef | grep [n]amed
ps ax | grep [/]named
とかしてほしいす。
# 商用Unixにも入ってるようなpgrepがOSXに無いのはオドロキ
421名無しさん@お腹いっぱい。:2006/05/15(月) 19:32:10
やっぱ、
ps `cat /var/run/named.pid`
だろ。
pgrepはまだ歴史が浅井。
422名無しさん@お腹いっぱい。:2006/05/15(月) 21:38:44
>>421
そういうのってときどき見るけど
突然死してpidが再利用されてしまっている可能性は0とみなすの?
423名無しさん@お腹いっぱい。:2006/05/15(月) 23:29:44
PDP-11の時代ならまだしも今なら最低でも31bitあるわけだし、
一巡する前に気づかないのは別の意味で問題な気が。
424名無しさん@お腹いっぱい。:2006/05/15(月) 23:41:00
俺のマシンはPID_MAXが99999な件。
PDP時代ならこれだけの桁数まわすのに相当時間が
かかるからよかっただろうが、
今だからこそ再利用されてしまう可能性があるんじゃないか?
425名無しさん@お腹いっぱい。:2006/05/15(月) 23:47:16
>>420
FreeBSD ベースだからじゃね?
4.x は pgrep を ports で入れないといけなかった記憶がある。
426名無しさん@お腹いっぱい。:2006/05/15(月) 23:50:20
流量の多い qmail なメールサーバだと数時間で1周するな。
427416:2006/05/15(月) 23:56:14
みなさんサンクスコ
でさらにあふぉな質問でスマソなんですが、
プロセスが死んでる場合(PIDが存在しない)は
メール、みたいな分岐処理をするにはどうすればよかとですか?
428名無しさん@お腹いっぱい。:2006/05/16(火) 00:57:56
>>427
if "プロセスが死んでると判定するコマンド"
then "メール送信用のコマンド"
fi
429416:2006/05/16(火) 09:12:54
「プロセスが死んでると判定するコマンド」
は何になるのでしょうか?
pgrep named
はあくまで生きているプロセスを調べるためのコマンドなので
これでは無いですよね?
430名無しさん@お腹いっぱい。:2006/05/16(火) 11:44:04
そのプロセスと同じ uid か、あるいは root 権限で、
if kill -0 プロセスID 2>/dev/null; then
  生きてる
else
  死んでる
fi
431名無しさん@お腹いっぱい。:2006/05/16(火) 12:04:29
>>429
pgrepでもできる。死んでいる(存在しない)プロセスなら、
終了ステータスで偽を返す。

if pgrep named 2> /dev/null; then
:
else
echo 'namedが死んでるよ' | mail omae
fi
432名無しさん@お腹いっぱい。:2006/05/17(水) 17:30:19
すみません、とても素人な質問させてください。
リナックスザウルスの活用の幅を広げようと思ってます。

UNIXシェルスクリプトで、ライフゲームや、HIT&BROW(四桁数字当て)ゲームは
作ることができますか?
433名無しさん@お腹いっぱい。:2006/05/17(水) 17:58:59
職場の管理者が、「もうcsh系は不要」と言って削除されてしまいました。
ログインシェルをtcshにしていた人は強制zsh移行。
そこで、自宅からtcshをフロッピーに入れて ~/bin/tcshに突っ込みましたが、
chshでログインシェルが変更できません。あと、いろいろいじってるうちに
ログインできなくなってしまいました。内容が内容だけに、
管理者には相談できません。どうすればいいでしょうか?
434名無しさん@お腹いっぱい。:2006/05/17(水) 18:10:06
おとなしく懺悔
435名無しさん@お腹いっぱい。:2006/05/17(水) 18:53:24
>>432
できなくは無いと思うが余計な苦労を強いられるだろう。
そういう挑戦に興味が無ければ、より高機能なもの(Perlなど)を薦める。

>>433
> 管理者が削除されてしまいました
ガクガクブルブル
436名無しさん@お腹いっぱい。:2006/05/17(水) 20:07:13
>>435
> >>433
> > 管理者が削除されてしまいました
ヒント:尊敬
437名無しさん@お腹いっぱい。:2006/05/17(水) 23:10:52
僕も、tcsh 削除させようかな。zsh 使うのには、どうしようもない理由が必要だろうし。

function と **/*.c だけでも、zsh にして良かったと思うよ。つうか、なんで、いままでtcshなんか使っていたんだろうと反省中。
438名無しさん@お腹いっぱい。:2006/05/17(水) 23:24:44
zshって、シェルスクリプトスレで延々スレ違いのインタラクティブシェルの話をする馬鹿が
使うシェルってイメージがあるから損してるよな。かわいそう。
439名無しさん@お腹いっぱい。:2006/05/18(木) 03:33:06
それはむやみにフェラーリのるあほな成金がいるから
フェラーリのイメージが成金趣味っぽくなるのと同じだよ。
440精進:2006/05/18(木) 12:18:31
【労働環境】営業担当者が「SEに足りないと思うスキル」とは [06/05/16]
ttp://news18.2ch.net/test/read.cgi/bizplus/1147877411/-100

 「もっと顧客から課題を聞き出す力があればなあ」「専門知識を生かして積極的に提案して
もらえると助かるのだが」---。

 営業担当者がITに関する商談で客先を訪問した際に、同行したSEに対してこんな不満や要望を
抱いている。顧客に対して「何をすればいいのでしょうか」と“御用聞き”に徹して提案しようと
しないSEや、顧客と積極的にコミュニケーションを図ろうとしないSEに対して、営業担当者は
もどかしい思いをしているのだ。

 営業担当者がSEに抱く不満は、SEに対する期待の裏返しでもある。そんな不満や期待が込め
られた、営業担当者からSEに対するコメントをいくつかを紹介しよう。

「お客様の目の前で“それはできません”と即答しないでほしい」
「お客様を満足させていくという顧客指向を持ってほしい」
「指示・依頼を待つだけでなく、自分で考え積極的に提案してほしい」
441名無しさん@お腹いっぱい。:2006/05/18(木) 14:50:12
テキストファイルから /foo .* bar/ を検索して
.* の部分だけ出力するのにスマートな方法ある?
とりあえず ruby で下のように書いてるけど、
長いしPOSIX標準じゃないしで、いまいち気に入らない。
ruby -e '$<.each { |line| line.sub(/foo (.*) bar/) { print $1 + "\n";} }'
442名無しさん@お腹いっぱい。:2006/05/18(木) 14:57:30
sed -n -e 's@.*/foo \(..*\) bar/.*@\1@p'
443441:2006/05/18(木) 16:54:08
>>442
dクス。勉強になりました。
444名無しさん@お腹いっぱい。:2006/05/18(木) 17:32:21
>>440
抜きん出たSEになるために必要なスキルだとは思うけど
SEに提案させて顧客交渉までさせたら営業いらなくなるよな
445名無しさん@お腹いっぱい。:2006/05/18(木) 18:14:27
営業とSEが別の人間てのは、実際にはそうなるケースが多いにしても、
避けた方が良くないかね。
446名無しさん@お腹いっぱい。:2006/05/18(木) 19:57:46
ご注文を分析すれば良いだけだろ。
447名無しさん@お腹いっぱい。:2006/05/18(木) 20:29:17
規模によるな。
448名無しさん@お腹いっぱい。:2006/05/18(木) 23:44:12
質問させてください。
echo で、○行目に文字を追加するにはどうしたらいいでしょうか?
449名無しさん@お腹いっぱい。:2006/05/19(金) 00:08:54
米国一流企業では見積りも有料です。
450名無しさん@お腹いっぱい。:2006/05/19(金) 00:22:01
「見積り」と称して散々技術コンサルを無料でさせられたのを思いだしたじゃないか。
あんな客は2度と相手にしないよ。
451名無しさん@お腹いっぱい。:2006/05/19(金) 00:43:18
うちは要件定義書まで無料でやらされる場合が多いですが・・・
452名無しさん@お腹いっぱい。:2006/05/19(金) 04:29:20
よし、皆わかっている事を敢えて言おう!
泥をかぶるのは俺だけでいい!

仕事の愚痴はスレ違い。
453名無しさん@お腹いっぱい。:2006/05/19(金) 10:03:51
スレ違いな話から戻すため質問に答えようと>>448を見たが意味がわからない。
454名無しさん@お腹いっぱい。:2006/05/19(金) 10:37:56
>>448
カーソルを移動させたいならこんな感じ。
adhocな方法 echo "^[[5;10H"
ちょっとましな方法 tput cup 5 10
文字の追加が具体的にどういう動作なのかわからない。
455448:2006/05/19(金) 15:37:47
>>453>>454さん。ありがとうございます。

echo hoge >> test.txt
この場合はtext.txtの最後の行にhogeが追加されるのですが
このような感じでhogeという文字を
指定の行に追加するにはどうしたらいいでしょうか?
456名無しさん@お腹いっぱい。:2006/05/19(金) 16:07:48
>>455
echoでは無理。
457448:2006/05/19(金) 16:09:33
>>456さん
どうやってできますでしょうか?
458名無しさん@お腹いっぱい。:2006/05/19(金) 16:26:18
>>448
echoでは無理といわれているのだから、問題を再定義しなさい。
459448:2006/05/19(金) 16:29:52
すみません。できました。
460名無しさん@お腹いっぱい。:2006/05/19(金) 19:34:34
>>459
本当に出来たのか?ウソはだめだぞ。
461名無しさん@お腹いっぱい。:2006/05/20(土) 01:05:58
客:「右足上げて、それが地面につく前に左足上げたら空飛べるじゃん」
SE:「それはできません」

営業:「お客様の目の前で“それはできません”と即答しないでほしい」
462名無しさん@お腹いっぱい。:2006/05/20(土) 01:53:40
客:「抱いてくれたらええやん」
SE:「それはできません」

営業:「お客様の目の前で“それはできません”と即答しないでほしい」
463名無しさん@お腹いっぱい。:2006/05/20(土) 04:29:08
ある文字列を含んだ行とその下二行を削除したい、
のですが教えていただけないでしょうか?

例:hoge を含む行とその下二行の削除

-----------------------
1
hoge
2
3
4
hoge
5
6
-----------------------

-----------------------
1



4



-----------------------
464名無しさん@お腹いっぱい。:2006/05/20(土) 05:07:10
>>463
無理にシェルスクリプトにせず、awkやperlで書いたほうがよさそうな気がします
465名無しさん@お腹いっぱい。:2006/05/20(土) 05:18:43
: ${aaa=bbb}
これは
aaa=bbb
と等価になるのはなぜですか?
466名無しさん@お腹いっぱい。:2006/05/20(土) 05:52:55
>>463
sed で簡単に出来そう。
おれは一行ごとに処理するやり方しか知らないからわからん。
467名無しさん@お腹いっぱい。:2006/05/20(土) 09:51:44
newlineが扱えないsedはしらん。
sed -E -e '/hoge/{N
N
s/[^\n]//g
}' data
468名無しさん@お腹いっぱい。:2006/05/20(土) 10:32:09
>>465
先頭のコロンはよくわかんないけど
${aaa=bbb} はaaaが未定義の場合のみ代入
${aaa:=bbb} はaaaが未定義または空の場合のみ代入
:- :? :+ も同様に:の有無でちょい違う動作をする。
:なし 変数が未定義かどうかをチェックする
:あり 変数が未定義かどうか、値が空かどうかをチェックする
ということがマニュアルに書いてある。
469名無しさん@お腹いっぱい。:2006/05/20(土) 10:42:03
>>468
ありがとうございます。
マニュアルの微妙な隙間に : を入れないときの動作がちゃんと書いてありました。
流し読みだったのでいつもいつも読み飛ばしてたorz
パラメータ展開のひとつという事は、先頭のヌルポマンドの引数とすることで
aaa=${aaa:=bbb}
みたいな冗長な代入にしなくてすむっぽいという事ですか。
470名無しさん@お腹いっぱい。:2006/05/20(土) 10:49:21
コロンは何も実行しないコマンド。終了ステータスは常に0。
コマンドなので、引数やリダイレクトは他のコマンドと同様に処理される。
471名無しさん@お腹いっぱい。:2006/05/20(土) 10:54:40
あーそか、ヌルコマンドに引数指定できるという発想はなかったわ
472名無しさん@お腹いっぱい。:2006/05/20(土) 11:01:10
>>465
等価にはならない。
: ${aaa=bbb}
で値が代入されるのは、aaa が未定義の時だけ。

>>467
sed に -E というオプションは無さげ。
sed -e '/hoge/ {
a \

N
a \

N
a \

d
}'
なら、仮に \n を認識しない場合でも出来るかと。
473名無しさん@お腹いっぱい。:2006/05/20(土) 11:03:22
ぐぁ、リロードしたら既に解答が…
ここって案外人多いのね。
474名無しさん@お腹いっぱい。:2006/05/20(土) 11:25:28
>>472
-Eでnewline(\n)が扱えるようになるsedもあるんだよ。
お前のsed(gnu sed)は行末の\でnewlineとみなしてるだけで、行末の\を
newlineとみなさないのもある。

gnu sedなら
sed -e '/hoge/{N
N
s/[^\
]//g
}' data
でも行ける。
475名無しさん@お腹いっぱい。:2006/05/20(土) 11:57:11
そういえば ed は /hoge/,/hoge/+2 という範囲指定ができるんだが
sed はできないんだな。
476名無しさん@お腹いっぱい。:2006/05/20(土) 12:15:10
>>474
> -Eでnewline(\n)が扱えるようになるsedもあるんだよ。
いや、だから -E は POSIX 準拠でもないはずだが。

上のコマンドは間違ってた。a \ じゃなく a\ です。Append コマンドは。
スペース入れると POSIX & SUS 違反。GNU なんかじゃ通っちまうがな。

まあ、洩れ自身 GNU に冒されてるのは認めし、GNU を嫌う気持ちも分かる。
スペースいれちまったことは素直に謝りたい。

後、GNU sed なら N なんぞ使わず、/hoge/,+2 とでもしといた方が良い。
477名無しさん@お腹いっぱい。:2006/05/21(日) 11:57:07
>>463
:g/hoge/.,.+2s/.*//

ってvimじゃないのか。
478名無しさん@お腹いっぱい。:2006/05/22(月) 02:42:26
お勧めはしないが、sed のバージョンに
依存したくないのならこんな方法もある。

#!/bin/sh
i=0
while read x ; do
 y=''
 if [ "$x" = 'hoge' ] ; then
  i=2
 elif [ "$i" -gt 0 ] ; then
  i=`expr "$i" - 2`
 else
  y="$x"
 fi
 echo "$y"
done < file
479名無しさん@お腹いっぱい。:2006/05/22(月) 12:36:14
hogeを含む行だし、-2の意味わかんないし
480名無しさん@お腹いっぱい。:2006/05/25(木) 17:12:36
ある機械のHTTPサーバが落ちている(ポート80にconnect(2)できない)
かどうかを調べるのにはどうしたらよいでしょうか?

HTTPで自分の状況を公開している装置Mがあります。
これの状況を定期的に wget 1.8.2 で調べようとしてるのですが、
時々MのHTTPサーバが落ちています。(OSは動いててping等に応答。)
サーバが落ちていると、wget はいつまでも終了しません。
HTTPでつながらない時にはすぐあきらめるにはどうしたらよいでしょう?

wget の --timeoutオプションは、connect(2)成功後のreadに対する指定
らしく、効果ありませんでした。

wgetするマシンはFreeBSD 4.10で、/bin/sh で書いてます。
481名無しさん@お腹いっぱい。:2006/05/25(木) 17:45:23
ピンポンダッシュにはやっぱりnmap?
482480:2006/05/25(木) 17:56:25
ピンポンした後ダッシュせず、相手の顔色(HTML response)を確認したいっす。
でも、相手出ないのに玄関でずっと待ってるのも変で。

nmapごもっともですが、大鉈っぽくないですか?
483名無しさん@お腹いっぱい。:2006/05/25(木) 18:07:46
>>480
wget http://... &
sleep 5
kill $!
484名無しさん@お腹いっぱい。:2006/05/25(木) 18:41:40
>>480
リトライが0(=infinity)になってない?
1.10.1なら--connect-timeoutがあるよ。
485名無しさん@お腹いっぱい。:2006/05/25(木) 21:18:45
>>480
Smokepingが良いよ。
単体のコマンドはechopingとか
486名無しさん@お腹いっぱい。:2006/05/26(金) 17:45:13
すいません。質問があります。
あるファイルの中の情報が
正しいフォーマット(各情報がタブで分けられている)
かどうか確認する方法はありますか?
たとえば、example.txtというファイルの中が

picture.jpg<tab>jpg
word.txt<tab>txt
music.mp3<space>mp3

だとすると、
このファイルのフォーマットは正しくない(3行目がスペースで分けられている)ので、
falseを返すというようなスクリプトを知りたいです。
よろしくお願いします
487名無しさん@お腹いっぱい。:2006/05/26(金) 17:50:20
>>486
「正しい」の定義がよくわからんが
grep -v ' ' <example.txt >/dev/null && echo false
とか。
' ' の中は TAB 文字で。
488名無しさん@お腹いっぱい。:2006/05/26(金) 17:58:17
>>487
「falseを返す」というのは「falseという文字列を表示する」という意味なのかw
489名無しさん@お腹いっぱい。:2006/05/26(金) 18:05:58
>>488
まぁ、例として挙げたまで。
その辺は好きなように変えてくれ。
490486:2006/05/26(金) 18:21:45
説明が下手ですんません。
あるファイルの中の各ラインの情報が
すべてタブキャラクターで分けられているか確認したいのです。

上記のexample.txtの場合、
1行目と2行目は

picture.jpg<tab>jpg
word.txt<tab>txt

とタブで分けられていますが、
3行目は

music.mp3<space>mp3

タブではなくスペースで分けられているので、
このexample.txtの書式は間違っているということが知りたいのです。
491名無しさん@お腹いっぱい。:2006/05/26(金) 18:28:37
>>490
それなら >>487 がすでに答えてるじゃん。

もっと厳密にするなら
grep -v '\<.*\> \<.*\>'
でいいかな。途中の空白に見えるところは TAB文字でね。
492名無しさん@お腹いっぱい。:2006/05/26(金) 18:28:56
>>490
> あるファイルの中の各ラインの情報が
> すべてタブキャラクターで分けられているか確認したいのです。
さっきと変わってないな。
ここをきちんと定義しないとまともな解は出てこないよ。
たとえば以下のような行をどう扱うか
これじゃわからんでしょ。

a<space><tab>b
a<space>b<tab>c
<tab>b
a<tab><tab>b
a<tab>b<tab>c
493名無しさん@お腹いっぱい。:2006/05/26(金) 19:22:02
>>490
a=$(cat $1 | wc -l)
b=$(cat $1 | sed -nr "/[^\t]*\t[^\t]*/p" | wc -l)
[ $a = $b ] && echo "OK" || echo "NG"
494名無しさん@お腹いっぱい。:2006/05/26(金) 20:16:12
カレントディレクトリ内(サブディレクトリ含む)の特定の拡張子を持つファイルを
一括で処理させたいと思い以下のようなシェルスクリプトを組んだのですが
サブディレクトリ内の一部ファイルが重複して処理されてしまいます
どこがダメなのでしょうか?

recursive_func()
{
for i in *
do
if [ -d $i ]
then
cd $i
recursive_func
cd ..
fi

if echo $i | grep '\.c$' > /dev/null || echo $i | grep '\.h$' > /dev/null
then
//ここに処理
fi
done
}

recursive_func
495名無しさん@お腹いっぱい。:2006/05/26(金) 20:21:54
>>494
find と xargs じゃだめなん?
496名無しさん@お腹いっぱい。:2006/05/26(金) 20:40:57
>>494
シェル変数iはローカル変数じゃないよ。
再帰呼び出しした時に iの値を変化させてしまうから、
呼び出し元の iまで狂ってしまう。
497名無しさん@お腹いっぱい。:2006/05/26(金) 20:41:55
>>495
find自体は知ってたんですが、まさかこんな使い方があるとは知りませんでした・・・orz
下の様に書き換えることで目的の処理は達成できました
ありがとうございました&お騒がせしました・・・


find . \( -regex ".*\.c" -o -regex ".*\.h" \) -exec //ここに処理 \;
498名無しさん@お腹いっぱい。:2006/05/26(金) 20:45:38
>>496
そういうことだったんですか。シェルスクリプトはちょっと齧っただけなので
ついCの感覚で書いてました・・・
元の方も関数先頭で local i とすることでうまく動くようになりました
わざわざありがとうございました
499名無しさん@お腹いっぱい。:2006/05/26(金) 20:50:03
>>494
hoge.c っていうディレクトリがあったときに
おかしくなりそうだな。
500名無しさん@お腹いっぱい。:2006/05/26(金) 21:12:25
>>499
grepしてるとこelifにすりゃ良くね?
501名無しさん@お腹いっぱい。:2006/05/26(金) 21:15:16
>>500
答え言うなよ。
空気嫁。
502名無しさん@お腹いっぱい。:2006/05/26(金) 21:16:18
いや、ファイル名の拡張子判定するならgrepなんか使わん。

case "$i" in
*.c|*.h)
ここに処理;;
esac

で桶。
503名無しさん@お腹いっぱい。:2006/05/27(土) 19:29:58
ディレクトリが空かどうかを表示するにはどうすれば?
504名無しさん@お腹いっぱい。:2006/05/27(土) 19:34:00
kshにて環境変数を複数行定義したファイルを
スクリプト内で読み込ませ、全行正常に読み込んだか判定したいのですが

. /環境変数定義ファイル
echo $?

環境変数定義ファイルの途中で読み込みエラーが発生しても
最終行が正常ならば、echoは0を返すのですが
読み込みエラーを発見する方法ってありますか。

505名無しさん@お腹いっぱい。:2006/05/27(土) 20:16:47
各ディレクトリにファイルが何個あるか高速に調べる方法はありますか?
506名無しさん@お腹いっぱい。:2006/05/28(日) 02:13:45
>>505
速度重視ならシェルスクリプトはやめといた方がいい。
507名無しさん@お腹いっぱい。:2006/05/29(月) 04:12:25
>505

a) .で始まるファイルは数えられなくてもいーんなら
find . -type d | while read DIR ; do printf "$DIR: %d\n" `find $DIR/* -prune ! -type d | wc -l` ; done

b) それじゃあ困るよという場合は
find . -type d | while read DIR ; do printf "$DIR: %d\n" `ls -aF $DIR | fgrep -v '/' | wc -l ` ; done

iBook(500MHzのG3)で試したら、、、

a)の例
# time find /usr -type d | while read DIR ; do printf "$DIR: %d\n" `find $DIR/* -prune ! -type d | wc -l` ; done
real 1m1.054s
user 0m7.870s
sys 0m42.810s
#

b)の例
# find /usr -type d | while read DIR ; do printf "$DIR: %d\n" `ls -aF $DIR | fgrep -v '/' | wc -l ` ; done
real 1m18.302s
user 0m10.340s
sys 0m53.310s
#

約17秒ほど差がでますた。(当社比約1.3倍)

※うちiBookの/usrはファイル19240コ、ディレクトリ973だぉ
508名無しさん@お腹いっぱい。:2006/05/29(月) 04:19:57
>>506
iBookでやってみた感じだと、%SYSの方の比率が大きいくて
wcやfgrepの負荷は%USRの比率が大きいぉ。

とゆーことで、
ファイル名・ディレクトリ名をファイルシステム内でぐるぐる走査する時間に多くが費やされるっぽいぉ。

ならば、シェルスクリプトでも大差ない鴨よ?
lsやfindを上回るCのアプリ書くのも難しいし。
509sage:2006/05/29(月) 04:53:11
find /usr -type f | wc でいいんじゃないの?
510名無しさん@お腹いっぱい。:2006/05/29(月) 09:44:08
find /usr -type f -printf "%h\n" |uniq -c
が速いんじゃないかな。
511名無しさん@お腹いっぱい。:2006/05/29(月) 09:50:51
>>509 質問欲嫁。>>505 は「ディレクトリ毎に」ファイル数を数えたいらしいぞ。
>>507 >>510 は一応ディレクトリ毎に結果を表示するから、回答になってる。

回答が >>509 でいいんなら、そもそも質問しないだろ。
512age:2006/05/29(月) 11:08:01
おしえてくださいお願いします。shスクリプト等で1行目の
#!/bin/sh とか記述する行の事、何て言うんでしたっけ。
人の名前みたいな「○○の行」みたいな名前が付いてたと思うんですが。
513名無しさん@お腹いっぱい。:2006/05/29(月) 11:19:51
514age:2006/05/29(月) 11:39:09
>>513
あー、それッス!有り難うございます!有り難うございます!
昨日の夜からのモヤモヤが吹っ飛びました!
515名無しさん@お腹いっぱい。:2006/05/29(月) 13:43:51
>>509
GNU findには-printfなんてのがあるのか・・・ベンリね

GNU find じゃない人は
find . -type f -exec dirname {} \; | sort | uniq -c
と書かないと動かん鴨

# FIFOなんかもファイルの数として数えたければ
# find . ! -type d -exec dirname {} \; | sort | uniq -c
516名無しさん@お腹いっぱい。:2006/05/29(月) 14:52:01
サーバーのシェルスクリプトをCGIでsystemコールして動かないんですが、
環境設定をapacheのhttpd.confに追加して動かす方法はあるのでしょうか?
いま環境設定はサーバー上で

FILE=data.ini
export FILE

で行っています。
シェルはLinuxのbashです。


517名無しさん@お腹いっぱい。:2006/05/29(月) 14:56:44
>>516
くだらねえ質問はここに書き込め! Part 125
http://pc8.2ch.net/test/read.cgi/linux/1147260130/
518名無しさん@お腹いっぱい。:2006/05/29(月) 15:09:11
【sed】シェルスクリプト総合@LINUX【awk】
http://pc8.2ch.net/test/read.cgi/linux/1121994321/l50
519名無しさん@お腹いっぱい。:2006/05/29(月) 16:57:12
>>516
SetEnv FILE data.ini

って、アンタそりゃーhttpdの使い方の話だから
シェルスクリプトの話じゃねーべ
520名無しさん@お腹いっぱい。:2006/05/29(月) 21:09:11
aaaというファイルが更新されたら次の処理に移るというスクリプトはどう書けばいいですか?

例]file_procという自作コマンドを実行してaaaというファイルが更新されたらファイルの最後に時刻を書き込む

1.file_proc1 aaaを実行
2.aaaというファイルが更新されるのを待つ
3.更新されたらそのファイルの最後に時刻を追加
4.file_proc2 aaaを実行
5.aaaというファイルが更新されるのを待つ
6.更新されたらそのファイルの最後に時刻を追加
 ・
 ・
 ・
 ・
521名無しさん@お腹いっぱい。:2006/05/29(月) 21:16:15
セマフォって概念を理解するといいと思うよ
522名無しさん@お腹いっぱい。:2006/05/29(月) 23:01:27
>>520
よくわからんがこんなんでええんかい?

----
FILE_WATCH=/home/foo/aaa
FILE_PREVIOUS=/tmp/watch.txt

if [ ! -f $FILE_WATCH ]
then
echo "$FILE_WATCH not found."
exit 1
fi

ls -l $FILE_WATCH > $FILE_PREVIOUS
while [ -1 ]
do
LS_CURRENT=`ls -l $FILE_WATCH`
LS_BEFORE=`cat $FILE_PREVIOUS`
if [ x"$LS_CURRENT" != x"$LS_BEFORE" ]
then
# file is updated
date >> $FILE_WATCH
fi
ls -l $FILE_WATCH > $FILE_PREVIOUS
sleep 10
done
----
523名無しさん@お腹いっぱい。:2006/05/30(火) 00:27:07
>>520
file_proc1 aaa && date >> aaa

こんなのじゃだめなの?
524名無しさん@お腹いっぱい。:2006/05/30(火) 23:30:11
シェルスクリプトで実行しているコマンド
を実行した結果と一緒にファイルに出力したいのですが

set -x
としても
./abc.sh > aaa.txt
のように実行したときに
aaa.txtに実行した結果しか出力されません。

どうすればコマンドも出力できるようになりますか?
525名無しさん@お腹いっぱい。:2006/05/30(火) 23:37:57
>>524
./abc.sh > aaa.txt 2>&1
526名無しさん@お腹いっぱい。:2006/05/30(火) 23:39:45
>>524
スクリプトの一行目に、
echo -n $0
とか書いとけばいいんじゃないかと。
527名無しさん@お腹いっぱい。:2006/05/30(火) 23:42:56
>>526 は質問の意味をどう取り違えたのだろうか?
528名無しさん@お腹いっぱい。:2006/05/30(火) 23:57:10
set -v じゃだめなのかな?
529名無しさん@お腹いっぱい。:2006/05/30(火) 23:59:55
>>528 は質問の意味をどう取り違えたのだろうか?

つか、>>525 に答え出てるって。
530名無しさん@お腹いっぱい。:2006/05/31(水) 00:18:48
at- f abc.sh now + 1 minute
として数分待ってメールを読む
531名無しさん@お腹いっぱい。:2006/05/31(水) 08:46:30
> aaa.txt だと標準出力だけしか書き込まないから
2>&1ってつけると標準エラー出力もファイルに書き込む
532名無しさん@お腹いっぱい。:2006/05/31(水) 10:57:59
例えば
c123456 cs012
という文字列がhogehogeというファイルに記述されていた場合、
cs以下の数字3つを切り取り、それを変数numとする
更にその変数numに対して
整数a≦変数num≦整数b
という条件が満たされた場合にその旨を伝える

…というスクリプトを作っているのですが、どうもうまくいきません

if [ $num >= 0 ] ; then
if [ $num <= 61 ] ; then
echo
533切れてる…orz:2006/05/31(水) 11:01:11
if [ $num >= 0 ] ; then
if [ $num <= 61 ] ; then
echo "0 <= $num <= 61"
fi
fi

if [ $num >= 62 ] ; then
if [ $num <= 122 ] ; then
echo "62 <= $num <= 122"
fi
fi

と条件を指定したのですが、numの値如何に関わらず全てのecho文が表示されてしまいます
どうすればいいんでしょうか?
534セル塩いちご:2006/05/31(水) 11:23:27
>= を -ge に
<= を -le に

と直せばいいじゃないかな
535名無しさん@お腹いっぱい。:2006/05/31(水) 12:01:59
あと、カレントディレクトリに = というファイルができてしまってるはずだから、
削除するヨロシ。
536名無しさん@お腹いっぱい。:2006/05/31(水) 12:46:42
[ 0 -le $num -a $num -le 61 ]
とかの方が見やすそうな希ガス
537名無しさん@お腹いっぱい。:2006/05/31(水) 12:50:50
だったら、↓こういう書き方もあり。

if ((0 <= num && num <= 61)); then
538名無しさん@お腹いっぱい。:2006/05/31(水) 13:16:35
cshはこの辺が楽過ぎw
539名無しさん@お腹いっぱい。:2006/05/31(水) 17:48:58
cshは邪道
540名無しさん@お腹いっぱい。:2006/05/31(水) 17:53:53
>>537
罰手異存!
541名無しさん@お腹いっぱい。:2006/05/31(水) 17:56:48
ムゥ、罰手異存か……まだ使い手がいたとは……
542名無しさん@お腹いっぱい。:2006/05/31(水) 19:00:43
>>541
知っているのか雷電。
543名無しさん@お腹いっぱい。:2006/05/31(水) 20:21:14
>>534
そのようにすると「unary operator expected」と出て弾かれてしまいます…

>>535
分かりました。処理しておきます

>>536,537
すぐには無理ですが、明日にでも試してみます。ありがとうございます

>>538
諸事情によりshでやらなければならないので…残念です
544名無しさん@お腹いっぱい。:2006/05/31(水) 20:33:26
>>543
>そのようにすると「unary operator expected」と出て弾かれてしまいます…

だとすると、$numに何も代入されていない(空文字列)の可能性あり。

[ $num >= 62 ] だから、>= はリダイレクトとみなされ、引数ではないので
testコマンドには test $num 62 だけが渡り、$numが空文字列なので、
test 62 となって、これは62という文字列の長さが1以上あるので
常に真になる。

元の質問で常に真になるという現象の説明が付く。

ちなみに、正しく$numに代入されていれば、
[ $num -ge 62 ] で動かないとおかしい。
545名無しさん@お腹いっぱい。:2006/05/31(水) 21:05:05
そもそも$numにどうやって代入してるん?
テキストから読み取って代入ってシェルだと結構難しいよ
awkとかでやってるのか?
546名無しさん@お腹いっぱい。:2006/05/31(水) 21:27:49
>>545
えーっとですね…種明かしをすると、大学の課題の一環なんです。
手元にスクリプトファイルがないので、明日また質問させていただきます。
因みにawkは使わず(使い方がよく分からない)、sedで例としてあげたcs012の"012"部分を切り取って使っています。
先生によるとそれが文字列として認識されており、整数に直す処理をしてやればよいのではないか…との事です。
んが、そのやり方が分からずに困ってます…
547名無しさん@お腹いっぱい。:2006/05/31(水) 21:33:32
>>546
本当に先生がそう言ったのならその先生は信用しない方がいい。
シェルスクリプトの変数では文字列と整数を区別しない。
(testコマンドでの判定時に演算子によって区別するだけ)

あと、宿題なら回答はこれで打ち切る。
548名無しさん@お腹いっぱい。:2006/05/31(水) 23:26:11
>>546
だからそのsedで抜き出してる処理の部分を詳しく
そこが間違ってたらもともこもねえじゃん
012の部分を切り取ってるソースをここに書け
549名無しさん@お腹いっぱい。:2006/05/31(水) 23:52:48
整数の場合を分け、比較に >= <= を使う shell となると… まさか、csh?
550名無しさん@お腹いっぱい。:2006/06/01(木) 02:15:27
bash $ [ 010 -gt 8 ] && echo ok
ok

へー、これでもエラーでないのか。
知らなかった。
551546:2006/06/01(木) 14:31:53
#!/bin/sh
friend="$HOME/.friendlist"
friend2="$HOME/.friendlist2"

echo "Do you use me?---y/n"
read first
while test x"$first" = xy
do

w | grep -v pts | sort | sed 's/\([^ ]*\) :0\/\([^ ]*\) *[^ ]* *[^ ]* *[^ ]* *[^ ]* *[^ ]*/\1\2/' | cat >>$friend

read first
for i in $first
do
grep "$i" $friend | cat >>$friend2
set tmp=`sed 's/^c[0-9]\{6\} cs\([0-9]\{3\}\)/\1/' $friend2`
num=`$tmp >& /dev/null`
echo "
$i is here.
"
grep "$i" $friend2
echo ""
done
552名無しさん@お腹いっぱい。:2006/06/01(木) 14:38:24
>>551
num=`$tmp >& /dev/null`

↑/dev/nullに捨ててどうするw こりゃだめだ。
553名無しさん@お腹いっぱい。:2006/06/01(木) 14:54:18
>>552
該当行を削除してif構文を>>537さんの提示してくれた文に書き換えた結果、エラーは吐き出されなくなったものの
if ((0 <= num && num <= 61)) ; then
echo "$i is in \"2nd bld.101A\"."
fi

if ((62 <= num && num <= 122)) ; then
echo "$i is in \"2nd bld.109A\"."
fi

if ((123 <= num && num <= 142)) ; then
echo "$i is in \"20th bld.107\"."
fi

if ((143 <= num && num <= 162)) ; then
echo "$i is in \"20th bld.619\"."
fi

if ((201 <= num && num <= 245)) ; then
echo "$i is in \"20th bld.310\"."
fi

if ((301 <= num && num <= 320)) ; then
echo "$i is in \"20th bld.413\"."
fi

if ((321 <= num && num <= 340)) ; then
echo "$i is in \"20th bld.613\"."
fi
のようにしているのにnumの値に関わらず一番最初の処理しか実行されません…
554名無しさん@お腹いっぱい。:2006/06/01(木) 15:01:42
>>553
>該当行を削除して

削除してどうする。/dev/nullに捨てるのだけが余計。その他は必要。
あと、その前の行の set もおかしい。
これ本当にに自分で理解して書いたスクリプトじゃないだろ。
もっとシェルスクリプトの基本からやり直した方がいい。

555名無しさん@お腹いっぱい。:2006/06/01(木) 15:19:45
>>554
了解しました。確かに、理解せずに書いた部分がほとんどです。
勉強して出直すことにします。ありがとうございました。
556セル塩いちご:2006/06/01(木) 23:02:54
>>555

----
#!/bin/sh
set -x
----

と、「set -x」をつけて動かしてデバッグするといいじゃないかな
557名無しさん@お腹いっぱい。:2006/06/02(金) 11:57:20
----
#!/bin/sh -x
----
でいいんじゃないかな
558名無しさん@お腹いっぱい。:2006/06/02(金) 12:50:40
ファイルの頭から何バイト目を0xffとかに書き換えるってシェルスクリプトでどうやればよいでしょうか?
559名無しさん@お腹いっぱい。:2006/06/02(金) 12:54:53
>>558
perl使っちゃえよ。
560名無しさん@お腹いっぱい。:2006/06/02(金) 13:03:36
シェルスクリプトで八進数→十進数に変換する方法ってないものだろうか?
探しているんだが全然見つからん…orz
561名無しさん@お腹いっぱい。:2006/06/02(金) 13:09:14
>>560
bc使っちゃえよ。
562名無しさん@お腹いっぱい。:2006/06/02(金) 13:37:19
>>558
ヒント: head -c; tail -c

>>560
$ printf '%d\n' 0377
255
563名無しさん@お腹いっぱい。:2006/06/02(金) 13:49:34
>>562
サンクス。こんなやり方があったのか…
564名無しさん@お腹いっぱい。:2006/06/02(金) 14:56:10
$ echo 'ibase=8;377' | bc
255
$ perl -e 'print 0377,"\n";'
255
$
565名無しさん@お腹いっぱい。:2006/06/02(金) 23:45:58
シェルスクリプトの中で実行時間がちと長く掛かるコマンドを
実行している時に , 標準出力にディスプレイ 風車 ? が回って
いる様にみせるにはどうすればいいでしょうか ?
566名無しさん@お腹いっぱい。:2006/06/03(土) 02:51:19
俺はdcが大好き!

$ echo '8i377p' | dc
255
567名無しさん@お腹いっぱい。:2006/06/03(土) 03:10:32
>>565
ヒントをやるから後は自分でアレンジしな。

for i in a b c
do
echo -en "$i\r"
sleep 1
done
568名無しさん@お腹いっぱい。:2006/06/03(土) 08:02:28
bc って echo で標準入力にいれないと
ワンライナー計算ができないのが面倒くさい。
bc -e '1+2'
くらいできてもいいのに。
569名無しさん@お腹いっぱい。:2006/06/03(土) 08:32:25
>>568
dcは出来る子。
570名無しさん@お腹いっぱい。:2006/06/03(土) 11:44:41
>>568
exprは出来る子。
571名無しさん@お腹いっぱい。:2006/06/03(土) 12:02:32
bc…恐ろしい子!
572名無しさん@お腹いっぱい。:2006/06/03(土) 14:21:54
いまはprintfコマンドは普通にどこでもはいってるよね?
なんでつかわないんだろ。
573名無しさん@お腹いっぱい。:2006/06/03(土) 14:43:15
入ってなかったらいやだからw

最近ようやくどの新しいOSにでも入ってる状態になったってことは、
後10年くらいしたらどこで使っても問題ないかなって感じだ。
574名無しさん@お腹いっぱい。:2006/06/03(土) 17:10:36
規格的にはX/Open System Interface issue 4から入ってるらしいよ。1994年発行。
自分は今Solarisを使っているんだが、 実は2.5.1にはすでに入ってたのね。知らなかった。
575名無しさん@お腹いっぱい。:2006/06/03(土) 19:13:50
>567

ありがとう。
ps で実行したコマンドのプロセスを確認と絡めて
うまい具合に作れました。
576名無しさん@お腹いっぱい。:2006/06/03(土) 23:48:49
>>568
#!/bin/sh
echo "$@" | bc
577名無しさん@お腹いっぱい。:2006/06/03(土) 23:53:14
出来る子$@が恐ろしい子bcをかばったって感じ?
578名無しさん@お腹いっぱい。:2006/06/17(土) 01:14:46
教えて下さい!

finde ./ の結果が

AAA
AAA/BBB
AAA/BBB/hoge1.txt
AAA/BBB/hoge2.txt
AAA/BBB/hoge3.txt
AAA/BBB/CCC/hoge4.txt
AAA/BBB/CCC/DDD
AAA/BBB/CCC/DDD/EEE
AAA/BBB/FFF/GGG/hoge5.txt
AAA/BBB/FFF/GGG/hoge6.txt
AAA/BBB/FFF/GGG/HHH
AAA/BBB/FFF/III/hoge7.txt
AAA/BBB/FFF/III/JJJ
AAA/BBB/FFF/III/JJJ/KKK
AAA/BBB/FFF/III/JJJ/KKK/LLL
AAA/BBB/FFF/III/JJJ/KKK/LLL/MMM

となっていて、ツリーにファイルを持たないフォルダのみを
抜き出したいです。
579名無しさん@お腹いっぱい。:2006/06/17(土) 01:15:24
↓こんな感じです。

AAA/BBB/CCC/DDD
AAA/BBB/CCC/DDD/EEE
AAA/BBB/FFF/GGG/HHH
AAA/BBB/FFF/III/JJJ
AAA/BBB/FFF/III/JJJ/KKK
AAA/BBB/FFF/III/JJJ/KKK/LLL
AAA/BBB/FFF/III/JJJ/KKK/LLL/MMM

先輩は、find . -type d -emptyと言い残して旅に出ましたが
動きませんでした…

OSはこれです。シェルがどうこうはよくわかりません。。。
SunOS devcvs01 5.9 Generic_118558-05 sun4u sparc SUNW,UltraAX-i2
580名無しさん@お腹いっぱい。:2006/06/17(土) 02:56:59
>>579 動きませんでした…
実はちゃんと動いている、に1票。
動かしてみたらどうなったか具体的に書いてみ。

あと、次に>>578がここに戻ってくるときまでには、
先輩が教えたオプションの意味をman見て100%理解しとけよ。
581名無しさん@お腹いっぱい。:2006/06/17(土) 08:52:40
>>579
先輩はガソリンが空っぽになったので探しながら旅をしてる

まで読んだ
582578:2006/06/17(土) 08:55:24
-emptyが無効みたいなエラーだったとおもいます。
また、UNIXのコマンドのfindのとこに-emptyオプションがなかったです。
583名無しさん@お腹いっぱい。:2006/06/17(土) 09:22:50
んじゃ、-empty に相当するチェック処理を別に書けばよい。
584名無しさん@お腹いっぱい。:2006/06/17(土) 10:25:12
-empty を使うと結果は >>579 ではなく
AAA/BBB/CCC/DDD/EEE
AAA/BBB/FFF/GGG/HHH
AAA/BBB/FFF/III/JJJ/KKK/LLL/MMM
になるはず。AAA/BBB/CCC/DDD の下に AAA/BBB/CCC/DDD/EEE があるから
-empty でひっかからない。

-type d でひっかかったディレクトリのそれぞれにファイルがあるかどうかを
ひとつずつ地道に調べるしかないんじゃ?
585名無しさん@お腹いっぱい。:2006/06/17(土) 11:18:24
findの結果をfindで調べればよいな。
586578:2006/06/17(土) 11:49:13
>>584
地道に調べてるのですが、いかんせんフォルダが10000くらいあって
そのうちの500フォルダくらいが空のようですが、目視はなんとも精度が低く

>>585
すみません、どんな感じにやるのですか?
587名無しさん@お腹いっぱい。:2006/06/17(土) 12:06:31
#! /bin/sh
find $1 -type f|grep '^$' >/dev/null

みたいなシェルスクリプトを使うのか?
588名無しさん@お腹いっぱい。:2006/06/17(土) 12:14:16
>>578

Solarisのfindには、-emptyオプションが無い件については、
↓で代用できる。

find . -type d -links 2

で、サブディレクトリがあって空の場合に、
親ディレクトリは引っかからないという問題はあるけど、
どうせ、その空のディレクトリを消したいんだろ?

なら、末端の空のディレクトリを消して、再び
↑のfindをすることを数回繰り返せば、目的は果たせる。
589578:2006/06/17(土) 12:18:16
最終的には消すのが目的なのですが、先に消してもいいフォルダの
一覧をこさえて提出しないと、鬼が怒るという問題があるのです

-emptyないのですか…
590名無しさん@お腹いっぱい。:2006/06/17(土) 15:12:39
#!/usr/bin/perl
use File::Find;
no warnings File::Find;
do {
my %not_empty;
find({'bydepth'=>1, 'no_chdir'=>1,
'wanted'=>sub {
my $dir = $File::Find::dir;
my $name = $File::Find::name;
if (-d $name) {
return if (defined ($deleted{$name}));
if (! defined ($not_empty{$name})) {
$deleted{$name} = 1;
return;
}
}
$not_empty{$dir} = 1;
}},'.');
$old = $new;
$new = length(keys %not_empty);
} while ($old!=$new);

print join("\n",sort keys %deleted) ,"\n";

長過ぎ。シェルスクリプトじゃないし。しかも、この出力をrm -rf できないし。
591名無しさん@お腹いっぱい。:2006/06/17(土) 15:50:18
こんな感じ

#!/bin/sh
for x in `find $1 -type d` ; do
find $x -maxdepth 1 -type f | grep . > /dev/null
if [ $? -eq 0 ] ; then
continue
fi
echo $x
done

環境が違うんでgrepの違いとかは適当に直して呉
リンクの有無とかもチェックするなら3-6行を増やせ

>589
結果に責任は持たんから怒られる覚悟はしとけw
592591:2006/06/17(土) 16:01:10
>589
実はあのままだと怒られるパターンがあるが、詳しく書かないでおく。
593名無しさん@お腹いっぱい。:2006/06/17(土) 17:04:33
>>591
Solarisの findには -maxdepthオプションがないというのがオチ。

あと、シェル変数を " " してないから、いろいろ危ない。
594名無しさん@お腹いっぱい。:2006/06/17(土) 17:23:24
1 find でディレクトリの一覧を得る find . -type d > a
2 find でディレクトリ以外の一覧を得る find . ! -type d > b
3 2 で得られたものから、dirname の一覧を作る
cat b | sed 's,/[^/]*$,,' > c1
cat c1 | sed 's,/[^/]*$,,') > c2
以下、最も深い階層回繰り返し。
4 1 にしか含まれないものを創る cat a c1 c1 c2 c2 ... |sort |uniq -u
595名無しさん@お腹いっぱい。:2006/06/17(土) 19:13:07
俺なら、指定されたディレクトリが条件を満たすかどうか調べるコマンドを作って、
それを find から -exec で起動するかな
596名無しさん@お腹いっぱい。:2006/06/17(土) 19:43:52
ls -aRF | awk '/:$/{d=$0;next}NF==0{if(!f)print d;f=0;next}!/\/$/{f=1}'

ディレクトリの末尾に余計なコロンがついてるが気にするな。
最上位のディレクトリだけはディレクトリだけあってファイルがひとつもなくても
結果に出てこないがそれ以外は正しいはず。目視で確認してくれ。
改行コードを含むディレクトリだとかコロンで終わるファイルとかあると
おかしな結果になるがそれ以外は正しいはず。そんなファイルを作るな(w
597名無しさん@お腹いっぱい。:2006/06/17(土) 20:22:53
>593
あと、サ(ry
598名無しさん@お腹いっぱい。:2006/06/17(土) 20:39:00
du
でいいじゃん
599名無しさん@お腹いっぱい。:2006/06/18(日) 00:04:44
>>598
だめだろ。duじゃディレクトリが空か判定できんぞ。
600名無しさん@お腹いっぱい。:2006/06/18(日) 00:20:51
rmdir しまくれば?
601名無しさん@お腹いっぱい。:2006/06/18(日) 00:58:37
反則技
rsync -avn
find
diff
602名無しさん@お腹いっぱい。:2006/06/18(日) 06:21:08
>>599
使用ファイルサイズで分かる。
603名無しさん@お腹いっぱい。:2006/06/18(日) 06:45:04
>591
あ、-maxdepthなんか無い方が目的に適うことに気づいてしまったw
604名無しさん@お腹いっぱい。:2006/06/18(日) 20:05:24
>>602
いや、わからないですね。
ディレクトリ内のファイルの作成削除の履歴&OSによるディレクトリ管理の方法によっては、
ファイルが全くなくてもディレクトリのサイズが巨大になる場合がありえるものなんです。
605名無しさん@お腹いっぱい。:2006/06/19(月) 16:52:37
シェルスクリプト内で外部プログラムを呼び出したとき、
メモリ制限やプロセス数制限でプロセス生成に失敗すると、
シェルスクリプト本体が終了してしまいますが、
終了させずに次の行へ処理を進める方法はありますか?
一定時間ウェイトしてから、リトライさせたいのですが…
606名無しさん@お腹いっぱい。:2006/06/19(月) 17:13:55
>>604
サンプル希望
607名無しさん@お腹いっぱい。:2006/06/19(月) 17:41:23
>>606
FAT
608名無しさん@お腹いっぱい。:2006/06/19(月) 17:51:34
>>606
$ uname -a
FreeBSD xxx 7.0-CURRENT FreeBSD 7.0-CURRENT #13: Tue May 9 14:37:19 JST 2006 xxx i386
$ mkdir /tmp/testdir
$ ls -ld /tmp/testdir
drwxr-xr-x 2 xxxx xxxx 512 Jun 19 17:40 /tmp/testdir
$ for f in $(jot 1000);do touch /tmp/testdir/$f;done
$ ls -ld /tmp/testdir
drwxr-xr-x 2 xxxx xxxx 12288 Jun 19 17:41 /tmp/testdir
$ rm /tmp/testdir/*
$ ls -ld /tmp/testdir
drwxr-xr-x 2 xxxx xxxx 12288 Jun 19 17:41 /tmp/testdir

他人にサンプル要求してるんだから「使用ファイルサイズで分かる」サンプルも提示しろよ。
609名無しさん@お腹いっぱい。:2006/06/19(月) 19:36:34
>>608
Linuxなんだけど
$mkdir -p /tmp/testdir/test{1,2}
$for aa in `seq 10`; do mkdir /tmp/testdir/test1/aa$aa; done
$du -b /tmp/testdir/ |sort -nr
53248 /tmp/testdir
45056 /tmp/testdir/test1
4096 /tmp/testdir/test2
4096 /tmp/testdir/test1/aa9
4096 /tmp/testdir/test1/aa8
4096 /tmp/testdir/test1/aa7
4096 /tmp/testdir/test1/aa6
4096 /tmp/testdir/test1/aa5
4096 /tmp/testdir/test1/aa4
4096 /tmp/testdir/test1/aa3
4096 /tmp/testdir/test1/aa2
4096 /tmp/testdir/test1/aa10
4096 /tmp/testdir/test1/aa1
空のディレクトリは最小サイズだよ。
610名無しさん@お腹いっぱい。:2006/06/19(月) 20:03:50
そこで、
touch /tmp/testdir/test2/hoge
してファイルを作成してみるとどうなるか。
611名無しさん@お腹いっぱい。:2006/06/19(月) 20:06:56
>>608
おんなじことを Linux-2.4.20 で追試させてもらった。
やっぱ同様にファイルが1つもないのに/tmp/testdirが12288と大きいままだったわい。
612名無しさん@お腹いっぱい。:2006/06/19(月) 23:40:21
>>609
空じゃないディレクトリでも最小サイズだな。
もっとも真に空のディレクトリが存在したらファイルシステムが壊れているという事だけど。

$ mkdir /tmp/testdir
$ ls -ld /tmp/testdir
drwxr-xr-x 2 xxxx xxxx 4096 Jun 20 00:54 /tmp/testdir
$ touch /tmp/testdir/1
$ ls -ld /tmp/testdir
drwxr-xr-x 2 xxxx xxxx 4096 Jun 20 00:54 /tmp/testdir
613名無しさん@お腹いっぱい。:2006/06/20(火) 00:05:48
ファイルシステムによるよ。
linux の reiserfs3 だと
mkdir a
drwxr-xr-x 2 xxxx xxxx 48 Jun 20 00:03 a/
touch a/hoge
drwxr-xr-x 2 xxxx xxxx 72 Jun 20 00:03 a/
rm a/hoge
drwxr-xr-x 2 xxxx xxxx 48 Jun 20 00:03 a/
614604:2006/06/20(火) 00:31:51
>>613
おっしゃるとおりです。OSとか「ファイルシステムによる」わけです。
だから、そういうことに依存したスクリプトは書いてはいけないでしょう。

最低限、>>598,602のような表明には、「XXXファイルシステムとか△△△OSでは」
という条件を付さねばならなかったわけです。
615604:2006/06/20(火) 00:34:20
うっ、でも今回の場合環境がSolarisと決まってたんだっけ。(>>579)

ニゲヨット。
616名無しさん@お腹いっぱい。:2006/06/20(火) 00:42:59
>>613に一俵。Solarisだけど、ufs(logging付き)では
% ls -ld
drwxr-xr-x 2 xxxx users 512 Jun 20 00:38 .
% touch `yes '' | head -1000 | cat -n` ; ls -ld
drwxr-xr-x 2 xxxx users 12288 Jun 20 00:38 .
% rm * ; ls -ld
drwxr-xr-x 2 xxxx users 12288 Jun 20 00:38 .

みたいにサイズが戻らないけど、swapfs(仮想メモリディスク)上だと

% ls -ld
drwxr-xr-x 2 xxxx users 117 Jun 20 00:37 .
% touch `yes '' | head -1000 | cat -n`; ls -ld
drwxr-xr-x 2 xxxx users 60010 Jun 20 00:37 .
% rm *; ls -ld
drwxr-xr-x 2 xxxx users 117 Jun 20 00:37 .

みたいに元に戻る。
617名無しさん@お腹いっぱい。:2006/06/20(火) 10:41:17
割り込んですみません
>608 の jot って coreutils ( sh-utils だった ?) の seq みたいなのですか ?
618名無しさん@お腹いっぱい。:2006/06/20(火) 11:08:27
619名無しさん@お腹いっぱい。:2006/06/20(火) 11:09:14
>>617
そうです。
JOT(1) FreeBSD General Commands Manual JOT(1)
NAME
jot -- print sequential or random data
SYNOPSIS
jot [-cnr] [-b word] [-w word] [-s string] [-p precision]
[reps [begin [end [s]]]]
620名無しさん@お腹いっぱい。:2006/06/20(火) 12:02:34
わかりくいコマンド名だな
621名無しさん@お腹いっぱい。:2006/06/20(火) 12:20:58
>618-819 ありがとうございました。
622名無しさん@お腹いっぱい。:2006/06/20(火) 12:22:19
↑ 訂正
>618-619 ありがとうございました。
623名無しさん@お腹いっぱい。:2006/06/20(火) 13:29:03
The name jot derives in part from iota, a function in APL.
だそうだ。
624名無しさん@お腹いっぱい。:2006/06/20(火) 19:34:24
hoge.txt というファイルが存在したらメールで知らせる、
というシェルスクリプトきぼんぬ
625名無しさん@お腹いっぱい。:2006/06/20(火) 19:44:01
if [ -e hoge.txt ];then
echo hoge|mail aho
fi
626名無しさん@お腹いっぱい。:2006/06/20(火) 20:00:15
>>625
$ [ -e hoge.txt ]
test: argument expected
$ uname -sr
SunOS 5.10
627名無しさん@お腹いっぱい。:2006/06/20(火) 21:46:25
>>626
そりゃ、SunOSみたいな古いOSじゃ動かないかもね。Solaris使えよ。
628名無しさん@お腹いっぱい。:2006/06/20(火) 22:09:18
>>627
お前、それがとても恥ずかしい発言だってわかってる? 晒し上げ www
629名無しさん@お腹いっぱい。:2006/06/20(火) 22:24:25
630名無しさん@お腹いっぱい。:2006/06/21(水) 08:49:43
>>627 は未来人。詳しくは禁則事項なので言えませんが
631名無しさん@お腹いっぱい。:2006/06/21(水) 08:58:58
結局、一番恥ずかしいのは >>628 ってことでFA。
632名無しさん@お腹いっぱい。:2006/06/21(水) 09:54:48
>>627 wwwww
633名無しさん@お腹いっぱい。:2006/06/21(水) 10:32:01
>>627
pgr
634名無しさん@お腹いっぱい。:2006/06/21(水) 10:49:16
おまえら、>>630 をよく見ろ。未来(今後)に何かあるらしいぞ。
>>627 を笑うものの方が逆に恥ずかしいみたいだから。
635名無しさん@お腹いっぱい。:2006/06/21(水) 15:39:16
>>627の人気に禿しく嫉妬
636名無しさん@お腹いっぱい。:2006/06/21(水) 16:59:40
URIエスケープをシェルスクリプト中でやるのって
sedで地道にやる以外になんかカッコイイのない?

echo -n "ほげ" | od -t x2 -A n | tr -d ' ' | sed 's/\([0-9a-z][0-9a-z]\)\([0-9a-z][0-9a-z]\)/%\2%\1/g'
↑はどっかで拾ってきたやつだけど、
変換しなくていい文字とか、スペースと+の変換とかまで考慮したのを
スマートに誰か書いてちょーだい
637名無しさん@お腹いっぱい。:2006/06/21(水) 17:13:38
>>636
それ以前に、その拾ってきた奴というのがバイトオーダーの問題で
環境によっては動かないはずだが。
638名無しさん@お腹いっぱい。:2006/06/21(水) 17:20:10
>>636
RubyかPerlでやれば?
639名無しさん@お腹いっぱい。:2006/06/21(水) 19:42:56
Solaris10=SunOS5.10
Solaris9=SunOS5.9
Solaris8=SunOS5.8
Solaris7=SunOS5.7
640名無しさん@お腹いっぱい。:2006/06/21(水) 19:49:59
solaris11$ uname -sr
Solaris 11
641名無しさん@お腹いっぱい。:2006/06/21(水) 20:15:43
Solaris11$ uname -sr
Linux 2.4
642名無しさん@お腹いっぱい。:2006/06/21(水) 20:41:14
Ruby >>>>>>>> シェル
643名無しさん@お腹いっぱい。:2006/06/21(水) 21:14:47
典型的なrubyデブロッパー
ttp://jp.rubyist.net/magazine/?0001-NoraTutorial#l10
644名無しさん@お腹いっぱい。:2006/06/21(水) 21:54:47
$ uname -sr
Darwin 8.6.2
645名無しさん@お腹いっぱい。:2006/06/21(水) 22:27:13
下請けにシェルスクリプトの作成を発注する予定です

放っておくとtcshのシェルスクリプトを書くような連中なので
tcsh/csh/zshのシェルスクリプトは禁止する予定なのですが、
ターゲットはSunOSなので放っておくとbash固有の機能を使いかねません。

ボーンシェルのシェルスクリプトの仕様を提示したいのですがどこかにあるでしょうか?
646名無しさん@お腹いっぱい。:2006/06/21(水) 22:57:51
ボーンシェルって何ですか? Bourneシェルとは違うものですよね?
647名無しさん@お腹いっぱい。:2006/06/21(水) 23:04:57
>>645
マシンも環境も同じにするのがプロの発注。
648名無しさん@お腹いっぱい。:2006/06/21(水) 23:25:53
俺の経験上ヘボな奴ほどcshスクリプトを書く割合が多い。
理由はわからぬ。
649名無しさん@お腹いっぱい。:2006/06/21(水) 23:34:17
仕様を提示したところでそんな連中が仕様に従うはずない。
現物(マシン+OS+sh)を貸し出してこれで動くようにしろ、
というのが確実。

で、cshで書いてしまうような外注は捨てて、
もっとマシな所に発注するのがもっとも確実。
650645:2006/06/21(水) 23:40:59
下請けの技術レベルが低いのはそのとおりですが、
元請の弊社は発注元と下請けの間の調整もせず勝手にやってというのが
基本姿勢のクズ会社なのでどっちもどっちなのです。

ポータビリティは考えずに、動作するコーンシェルのバージョンを指定しようと思います。
651名無しさん@お腹いっぱい。:2006/06/22(木) 00:12:29
opengroup.orgに転がってるPOSIXのシェルの仕様でも渡したらどうよ?
…英語の仕様書が読めるわけもないか。
652名無しさん@お腹いっぱい。:2006/06/22(木) 04:08:14
下請けより645のレベルが心配
653名無しさん@お腹いっぱい。:2006/06/22(木) 09:36:23
>>648
ヘボじゃない奴はcshではスクリプト書きにくいのにすぐ気がついて書かなくなるから
当然の帰結じゃないか。
654名無しさん@お腹いっぱい。:2006/06/22(木) 09:44:09
ヘボじゃあに香具師が、foreach使いたいからcsh script
を使っているのはみたことがある。
655名無しさん@お腹いっぱい。:2006/06/22(木) 11:57:13
cshはいろいろヘボいけど、それを使いこなしてこそ熟練者
cshは恐くない
656名無しさん@お腹いっぱい。:2006/06/22(木) 12:00:51
俺はまんじゅうが恐い
657名無しさん@お腹いっぱい。:2006/06/22(木) 12:14:55
cshはいろいろヘボいので、それを廃絶してこそ熟練者
cshはUNIXの汚点
658名無しさん@お腹いっぱい。:2006/06/22(木) 12:47:42
>>655
それはチューリングマシンでCGIを書くことに匹敵するほど実りの無いこと。
659名無しさん@お腹いっぱい。:2006/06/22(木) 15:19:23
645はkshしらんの?
Solarisからむなら普通ksh
660名無しさん@お腹いっぱい。:2006/06/22(木) 15:21:57
>>659
>>650


ただし、「kshの同じバージョン」はSolaris以外では用意できないと思われ。
Linuxにあるksh(pdkshじゃなくてkshだよ)は、Solarisのkshとは
結構動作が違う。
661名無しさん@お腹いっぱい。:2006/06/23(金) 22:15:00
Linuxのkshがどうだろうと、Solarisで開発すればいいのでは
いまの下請けはLinux で開発すんの?
662名無しさん@お腹いっぱい。:2006/06/23(金) 22:26:58
そりゃ、Solarisみたいな古いOSじゃ動かないかもね。Linux使えよ。
663名無しさん@お腹いっぱい。:2006/06/23(金) 23:08:39
OpenSolarisから持ってくればいいんじゃない?
664名無しさん@お腹いっぱい。:2006/06/28(水) 17:24:43
2行以上連続する空行を1行に縮めるにはどうすればいいですか?
665名無しさん@お腹いっぱい。:2006/06/28(水) 17:32:07
cat -s
666名無しさん@お腹いっぱい。:2006/06/28(水) 17:43:33
>>665
できました. でも質問が間違ってました. 改めて
2行以上連続する空行は1行に縮め,
1行だけの空行はその行を削除するにはどうすればいいですか?
667名無しさん@お腹いっぱい。:2006/06/28(水) 18:03:34
awk '/^$/{if(++n==2){print}next}{print;n=0}'
668名無しさん@お腹いっぱい。:2006/06/28(水) 19:35:20
できました. ありがとうございます.
669名無しさん@お腹いっぱい。:2006/06/29(木) 21:00:43
>>666
sed -e "N; s/\n$//; /^$/{N; /^\n$/D;};"
670名無しさん@お腹いっぱい。:2006/06/29(木) 23:09:01
webサイトのサムネイル画像から画像本体を取り出そうとしてまして
アドレスの一部、"thumb” を "src" に。数字の最後の ”s”を除去
あとバナー除去のために、"thumb” を含まないアドレスを削除しようと考えています

http://xxx/thumb/1585427411s.jpg から
http://xxx/src/1585427411.jpg
http://xxx/ad/bar_1.jpg ←バナー画像

/bin/sh
sed 's/thumb\/(\d+)s/src\/$1/'

で置換はできたと思ったのですがうまくいきません。
sed 's/thumb/src/' のように単純な置換だとうまくいきます
バナー画像に関しては行の削除がわかりません
文法間違えてたりしますか?アドバイスお願いします

OSXのAutomatorでやってます
671名無しさん@お腹いっぱい。:2006/06/29(木) 23:15:49
/thumb/d
672名無しさん@お腹いっぱい。:2006/06/29(木) 23:20:48
s@thumb/\([0-9]*\)s@src/\1@
673名無しさん@お腹いっぱい。:2006/06/29(木) 23:23:33
このディレクトリのこんなかんじの名前のファイルがあったらこの処理をするってシェルスクリプトってどう書くのかなぁ

-----------
cd /root/work
if [ -f abc* ]; then
処理1
else
処理2
fi
-----------

こんな感じのやつ。
でも、こんなワイルドカードの使い方ってだめなんでしょ?
674名無しさん@お腹いっぱい。:2006/06/29(木) 23:38:52
>>673
ちょっとしかないなら
if ls abc* >/dev/null 2>&1; then
でどう?

マッチするファイルが何万個もある可能性のある状況で
正しく動くのを作るのはちと複雑かも
675名無しさん@お腹いっぱい。:2006/06/29(木) 23:38:58
>>672
綺麗に置換できました。ありがとお
676名無しさん@お腹いっぱい。:2006/06/29(木) 23:40:11
>>669
うちのFreeBSD 4.11-RELEASEの/usr/bin/sedだとうまく動かん。
あわててcygwinのGNU sedで試したら動いた。
こんなのうちだけか?
sedの何かって環境依存なのかな???(ファイル末のNの振る舞いとかか?)

ちなみに上の「動かん」ってのをkwsk書くと:
・入力が1行のみの時、それが空行かどうか関係なく、出力が全く空。(wcに渡すと0バイト)。
・ファイル末に連続する空行があった時、それに対応して出力されるべき1行の空行がでない。
(つまり出力の最後は空でない行になっている)
677673:2006/06/29(木) 23:49:24
>>674
ありがと。やってみるよ。

最近、シェルスクリプト書かなきゃならないところに異動になって困ってるんだ。
また助けてね。
678名無しさん@お腹いっぱい。:2006/06/29(木) 23:58:10
その給料の何%かで助けるよ
679名無しさん@お腹いっぱい。:2006/06/30(金) 15:52:08
>>676
BSDのsedとGNUのsedとは当然違います。
前者は古きよきBSDの雰囲気を留めているが、後者は独自に機能拡張してる。
680名無しさん@お腹いっぱい。:2006/07/01(土) 15:44:05
もしそうなら全然上げないBSDの方が独自だと思うぞ。
何をもって独自と断定するかは難しいが。
681名無しさん@お腹いっぱい。:2006/07/06(木) 12:02:41
DSCN0001.jpg〜DSCN9999.jpgのファイルを全てtravel2006GW0001.jpg〜travel2006GW9999.jpgに変更したいのですが
これを実現するLinuxのシェルスクリプトはどう記述したらいいですか?
それと
travel2006GW0001.jpg
travel2006GW0002.jpg



のようにtxtに打ち出すのもお願いします

682名無しさん@お腹いっぱい。:2006/07/06(木) 12:15:49
mv DSCN0001.jpg travel2006GW0001.jpg
mv DSCN0002.jpg travel2006GW0002.jpg
〜(以下同様に9999まで)

echo travel2006GW0001.jpg >foo.txt
echo travel2006GW0002.jpg >>foo.txt
〜(以下同様に9999まで)

2以降は'>>'なのに注意せよ。
683名無しさん@お腹いっぱい。:2006/07/06(木) 12:22:40
ちょw
684名無しさん@お腹いっぱい。:2006/07/06(木) 12:26:59
>>681
rename DSCN travel2006GW DSCN*
685名無しさん@お腹いっぱい。:2006/07/06(木) 12:34:15
>>681
マジレスするよ。
Linuxのシェルということはbashでいいんだよね。
だったら↓

#!/bin/bash

rm -f list.txt

for ((n=1; n<=9999; n++)) {
 nnnn=`printf %04d $n`
 mv DSCN$nnnn.jpg travel2006GW$nnnn.jpg
 echo travel2006GW$nnnn.jpg >> list.txt
}
686名無しさん@お腹いっぱい。:2006/07/06(木) 12:50:27
マジレスうれしぃ!
687名無しさん@お腹いっぱい。:2006/07/06(木) 13:30:19
>>682
こういうのを自動生成しちゃって実行する方が
楽なときもあるな。
実際に何が行なわれてるかわかりやすいし。
688名無しさん@お腹いっぱい。:2006/07/06(木) 13:33:29
>>687
その自動生成スクリプトも >>685 をちょっと改造すればできる
689名無しさん@お腹いっぱい。:2006/07/06(木) 13:42:15
>>687
あーそういうのよくやる。俺の場合だと

awk 'END{for(i=1;i<=9999;i++){printf "mv DSCN%04d.jpg travel2006GW%04d.jpg\n",i, i}}' /dev/null|less

とかやって確認してから

awk 'END{for(i=1;i<=9999;i++){printf "mv DSCN%04d.jpg travel2006GW%04d.jpg\n",i, i}}' /dev/null|sh

だな。mvの起動回数とか考えると何回も使うものならperlか何かでちゃんと書くけど、
1回限りのワンライナーだと確認しながらやれるのでこの方が安心できる。
690名無しさん@お腹いっぱい。:2006/07/06(木) 13:44:31
>>685
list.txtはわざわざスクリプトで作らなくても、名前の付け替えがすんだら
lsの出力をファイルに書き出せばいいだけじゃないか。
691名無しさん@お腹いっぱい。:2006/07/06(木) 13:49:13
>>687-690

http://pc8.2ch.net/test/read.cgi/tech/1112553783/299-301
> もう用済みじゃぼけぇwww
だそうですよ。
692名無しさん@お腹いっぱい。:2006/07/06(木) 13:50:06
wget って保存先指定できないの?.wgetrcでも
いつも直前にcdしてたんだけど不便で
693名無しさん@お腹いっぱい。:2006/07/06(木) 13:53:33
>>692
↓みたいなラッパーを、wgetという名前のスクリプトで書いて
先にPATHが通った ~/binにでも入れとけば?

#!/bin/sh

cd hoge
wget "$@"
694名無しさん@お腹いっぱい。:2006/07/06(木) 13:55:22
wget -P (or --directory-prefix=hoge) ?
695名無しさん@お腹いっぱい。:2006/07/06(木) 13:57:19
>>693
釣り?
696名無しさん@お腹いっぱい。:2006/07/06(木) 13:58:30
>>693
マラマラご冗談を
697名無しさん@お腹いっぱい。:2006/07/06(木) 14:03:29
毎回-Pを指定するのがめんどくさければ、.wgetrcに書いとけ。

dir_prefix = STRING
Top of directory tree--the same as `-P STRING'.
698名無しさん@お腹いっぱい。:2006/07/06(木) 14:41:04
おおこりゃ便利
ありがとう
699名無しさん@お腹いっぱい。:2006/07/07(金) 22:32:59
no-ipの自動設定スクリプトなんですけど
http://www.rhythm-cafe.com/shell/GrammerMenu.aspx
ここを参考にしながら
#!/bin/sh
wget http://dynupdate.no-ip.com/ip.php
ip='cat ip.php'
old_ip='cat oldip'
if [$old_ip!=$ip]; then
wget http://dynupdate.no-ip.com/update.php?username=MailAddress&pass=PassWord&host=HostName&ip=$ip
fi
mv ip.php old-ip
#sh -x ./ddns.sh
+ cat ip.php
+ ip=203.138.29.123
+ cat oldip
+ old_ip=203.138.29.58
+ [203.138.29.58!=203.138.29.123]
[203.138.29.58!=203.138.29.123]: not found
なんてエラーがでてしまいます
OSはNetBSD3.0です
恐ろしく基礎的な質問で申し訳ありませんが宜しくお願いします
700名無しさん@お腹いっぱい。:2006/07/08(土) 00:22:45
if [$old_ip!=$ip]; then

if [ $old_ip != $ip ]; then

[ はただのコマンド名なので特別扱いはされません。

cat fooをcatfooと書いたらだめなのと同じ理由でだめです。

701699:2006/07/08(土) 00:54:48
>>700
お答えしてくださってありがとうございます
なんとか起動できました
702名無しさん@お腹いっぱい。:2006/07/08(土) 15:15:05
foreach i (1 2 3 4 5 6 7 8 9)
touch $i
end
とか
for i in 1 2 3 4 5 6 7 8 9;do
touch $
done
みたいな感じで、ファイルを名前を問わず
沢山作るにはどうすれば良いのでしょうか?
703名無しさん@お腹いっぱい。:2006/07/08(土) 15:36:00
seq 1 100000 | xargs touch
704名無しさん@お腹いっぱい。:2006/07/08(土) 15:39:48
while true; do mktemp "$(date)-XXXXXX";done
705名無しさん@お腹いっぱい。:2006/07/08(土) 15:40:30
>>703
sh: seq: command not found
706名無しさん@お腹いっぱい。:2006/07/08(土) 16:54:27
jotでもなんでもいいじゃんかよ
707名無しさん@お腹いっぱい。:2006/07/08(土) 17:55:57
:>${RANDOM}
708名無しさん@お腹いっぱい。:2006/07/09(日) 02:42:09
seqもjotもないぜ > Solaris

yes '' | head -10000 | cat -nでなんとかなるが
709名無しさん@お腹いっぱい。:2006/07/09(日) 10:49:20
Solaris8とかだと yesもないな。
710名無しさん@お腹いっぱい。:2006/07/09(日) 11:23:32
>>709
csh -cf 'repeat 100 echo'
711名無しさん@お腹いっぱい。:2006/07/09(日) 14:06:00
perlcc -e 'print $_ . "¥n" for $ARGV[0] .. $ARGV[1] ' -o seq
して seq を作る。

# もちろん冗談
712名無しさん@お腹いっぱい。:2006/07/09(日) 17:28:55
>>709
zshが入っているだろ。
713名無しさん@お腹いっぱい。:2006/07/09(日) 18:50:08
ファイルを変数展開してから開くにはどうしたらよいでしょうか?

aaa.txt の中身が
------------------
${vvv}
------------------
という記述のときに

#!/bin/sh
vvv="VVVVV"
cat aaa.txt
とした場合

------------------
${vvv}
------------------
ファイルに書いてある内容がそのまんま表示される、これを
------------------
VVVVV
------------------
としたいのです。

要は↓と同じことをもっと簡単に出来る方法はあるかということなのですが
#!/bin/sh
vvv="VVVVV"
v_sed=`sed \'s/\${vvv}/\'\${vvv}\'/g\' aaa.txt`
## sed 's/${vvv}/'VVVVV'/g' aaa.txt
eval ${v_sed}
714名無しさん@お腹いっぱい。:2006/07/09(日) 19:27:16
一般的には、開いてからshに食わせるんだけど、
変数展開だけをファイルオープン前に済ませたいのか。
難しいね。shを自作しないといけないかも。
715名無しさん@お腹いっぱい。:2006/07/09(日) 20:01:02
eval echo `cat aaa.txt`
716名無しさん@お腹いっぱい。:2006/07/09(日) 23:42:56
evalって今一使い方が分からない
717名無しさん@お腹いっぱい。:2006/07/10(月) 06:54:08
使っているうちにわかる。
718名無しさん@お腹いっぱい。:2006/07/10(月) 08:11:54
使い方はわかるが変数が絡むとキモス
719名無しさん@お腹いっぱい。:2006/07/10(月) 08:59:36
変数からめないでeval使ってもつまんないだろ
720713:2006/07/10(月) 09:11:44
eval echo `cat ですか〜
ありがとうございます
やりたい事が出来ました。
721名無しさん@お腹いっぱい。:2006/07/10(月) 12:54:40
それじゃファイルの中味に`rm -rf `とか入ってたらどーする...

あまりに危険すぎるよ...
722名無しさん@お腹いっぱい。:2006/07/10(月) 13:07:20
それはそうだが前提条件次第だな。
723名無しさん@お腹いっぱい。:2006/07/10(月) 22:12:57
readを使ったときに入力文字を * でマスクしてくれる方法はありませんか?
イメージとしては login 時の Passwd: のような感じです。

以下のようなスクリプトを書きたいのですが、人に説明しながらスクリプトを
実行したい場合、パスワードが見えてしまうのでなんとかしたいです。
(さっと思いついた例なので誤字文法ミスは見逃してください)

#!/bin/sh

echo "user: "; read user
echo "passwd: "; read passwd

expect -c "
expect \"login: \"
send \"$user\r\"
expect \"passwd: \"
send \"$passwd\r\"
"
724名無しさん@お腹いっぱい。:2006/07/10(月) 22:15:42
>>723
stty -echo
read passwd
stty echo
725名無しさん@お腹いっぱい。:2006/07/10(月) 22:41:59
うほ。できました。
無知は損ですね。ものすごく助かりました。

man sttyで-echoの意味を調べたところ、
echo (-echo)
Echo back (do not echo back) every character typed.
ということで、そのままecho backさせないということのようです。
ありがとうございました。
726名無しさん@お腹いっぱい。:2006/07/11(火) 01:02:22
>>723
read -s

たぶん bash 専用オプションだが。
727名無しさん@お腹いっぱい。:2006/07/11(火) 21:59:23
シェルスクリプトで、キーボードから値を入力させる時に、
デフォルト値を表示させておく事ってできるでしょうか?

例えば
入力しろやゴルァ>hogehoge■
としておいて、
ユーザがhogehogeの部分を編集できるようにしたいのですが。

シェルはshかcshかkshが使えるようです。
728名無しさん@お腹いっぱい。:2006/07/11(火) 23:02:11
編集ってのが良く分らんが、とりあえずreadlineが
使えりゃいいのかな。
729727:2006/07/11(火) 23:46:11
まぁそうなんだが、
1.Cでの開発は無理そうだ
2.多分readlineやlibeditは入っていないし、入れることはできないだろう

ユーザから入力を求める際に、あらかじめ入力バッファ(?)に
文字を入れておくこととかできないのだろうか。
730名無しさん@お腹いっぱい。:2006/07/11(火) 23:54:17
普通

入力しろやゴルァ [hogehoge]>■

これが気に入らないなら頑張ってくれ。
731727:2006/07/12(水) 06:07:57
気に入らないから頑張りたいんだけど、
頑張り方が分からない。
732名無しさん@お腹いっぱい。:2006/07/12(水) 08:05:53
bashのreadは-eすりゃreadline使うようだが、初期値を入れる方法が
みつからないね。もうCかperlかなんかでそういうコマンド用意する
しかないような気がしてきた。

perlだとこう。

use strict;
use Term::ReadLine;
my($prompt, $preput) = @ARGV;

my $term = Term::ReadLine->new('hoge');
my $s = $term->readline($prompt, $preput);
print $s, "\n";

使い方:
x=`perl readline.pl '入力しろやゴルァ>' 'hogehoge'`

しかしこのスレでperlのような飛び道具を使うのは気が引ける...
733名無しさん@お腹いっぱい。:2006/07/12(水) 08:32:46
いいじゃん、適材適所で。
734名無しさん@お腹いっぱい。:2006/07/12(水) 09:26:46
結論としては、やっぱスクリプト言語使えってことか。
言語の学習は手間暇かかるんだよね。時間も。できればシェルスクリプトで
済ませたい。
あー、俺がもっと頭良ければ、新しい言語ぐらいすぐに覚えるのに。
735名無しさん@お腹いっぱい。:2006/07/12(水) 09:32:02
シェルスクリプトであれこれ工夫するほうが、適当なスクリプト言語(perlとかrubyとかpythonとか)
おぼえるよりよっぽど頭使うと思う。
736名無しさん@お腹いっぱい。:2006/07/12(水) 10:32:28
UIに特化したdialog(1)もよろしく
737727:2006/07/12(水) 23:10:42
>>732
dくす
だが、perlは入ってないようだ。

仕方がないから、sttyでrawモードにして、
一文字ずつキー入力を取得して編集できるようにした。shだけで。

お客に言われたとき、早いうちに「出来ねぇ」と言っておけば良かったorz...
738名無しさん@お腹いっぱい。:2006/07/13(木) 06:30:08
スクリプトの場所をスクリプト自身がフルパスで知ることってできないでしょうか。
ターミナル上からならpwdに繋げてなんとかなるんだけど
nautilusやrox、konquerorから実行するとそうもいかない。
$0は相対バスしか返さないし。
ちょっとしたGUIインストーラみたいのを作ってみたいんだけども
739名無しさん@お腹いっぱい。:2006/07/13(木) 08:19:27
740名無しさん@お腹いっぱい。:2006/07/13(木) 08:34:47
無理とはっきり分かるとすっきりしていいでつね。
どうもです。
結局ps p (PID) |sed 's/.* //g'を中で実行してなんとかしました。
741名無しさん@お腹いっぱい。:2006/07/13(木) 08:57:14
>>740
それでも第0引き数いじられたら無理じゃない?
742名無しさん@お腹いっぱい。:2006/07/13(木) 10:19:23
>>739
嘘を言わないように。

インタープリターがスクリプトファイルを「オープン」して「リード」する必要があるので
スクリプトファイルのファイル名は必ず渡る。
ファイル名をスクリプトに渡す方法はインタープリター依存。
sh,cshなら$0。相対パスだったらカレントディレクトリを補ってやればよい。
743名無しさん@お腹いっぱい。:2006/07/13(木) 12:13:10
シンボリックリンクとかハードリンクがあるとややこしいことになるよ。
744名無しさん@お腹いっぱい。:2006/07/13(木) 12:17:15
antの起動スクリプトがその辺がんばってたような気がした。
745名無しさん@お腹いっぱい。:2006/07/13(木) 20:41:28
Windows育ちの俺は昔、同じことで頭を悩ませたが、
労多くして易少なかった。
746名無しさん@お腹いっぱい。:2006/07/13(木) 23:51:56
>>743
でも、そこにある。
747名無しさん@お腹いっぱい。:2006/07/14(金) 01:19:29
ドコのlsコマンドを
どんな環境で使っても
確実にファイルのmtimeを
英数字のみのフォーマットで取得するには
どうしたらベストでしょうか?
ls よりもそれに適したコマンドってあります?
748名無しさん@お腹いっぱい。:2006/07/14(金) 01:23:32
おれが作ったlsではそんなことさせないぜ
749名無しさん@お腹いっぱい。:2006/07/14(金) 01:31:50
これでもくらえ
env LC_ALL=C ls
750名無しさん@お腹いっぱい。:2006/07/14(金) 05:58:37
>>747
そういうことをするには stat が便利なんだが
ポータビリティーを重視しているみたいだから
locale を固定した ls (>>749) をお勧めしておく。
751名無しさん@お腹いっぱい。:2006/07/14(金) 07:43:16
>>749
古いOSだと LC_ALLが使えないのがある。
LANG=C LC_TIME=C の方がよりポータブル。
752名無しさん@お腹いっぱい。:2006/07/14(金) 09:43:54
>>751
env - PATH=$PATH ls のほうがポータブル
753名無しさん@お腹いっぱい。:2006/07/14(金) 09:56:45
だったら、
unset LANG LC_TIME LC_ALL; ls
でいいじゃん。
754名無しさん@お腹いっぱい。:2006/07/14(金) 10:25:34
実行後に影響が残るので落第。
755名無しさん@お腹いっぱい。:2006/07/14(金) 10:26:45
>>754
サブシェルも知らんのか。

(unset LANG LC_TIME LC_ALL; ls)
756名無しさん@お腹いっぱい。:2006/07/14(金) 10:36:15
>>755
当然知っている。知らなかったのは>>753
757名無しさん@お腹いっぱい。:2006/07/14(金) 10:41:21
>>756
当然知ってる割には反応が遅かったな。
>>755 見てから「サブシェル」でググったのかい?

>>753 だってサブシェルは知ってると思われ。
当たり前のことは必要なければ省略するから。
たとえば、unset LANG LC_TIME LC_ALL; ls だけの1行で
シェルスクリプトが終るなら、実行後には影響出ないし。
758名無しさん@お腹いっぱい。:2006/07/14(金) 10:57:05
>>757
はいはい、後付の言い訳惨め。
759名無しさん@お腹いっぱい。:2006/07/14(金) 11:01:11
>>758
後付の言い訳は >>756 = >>754
760名無しさん@お腹いっぱい。:2006/07/14(金) 11:10:03
>>753が9:56に知っていたという証明をしてくれ。www
761名無しさん@お腹いっぱい。:2006/07/14(金) 11:26:13
envなんてガイブコマンド使うより unsetの方がエレガントだな。
1行シェルスクリプトなら、あとexec付けた方がいい。

unset LANG LC_TIME LC_ALL; exec ls -l
762名無しさん@お腹いっぱい。:2006/07/14(金) 17:18:12
>>761
必死だな、落第男。www
763名無しさん@お腹いっぱい。:2006/07/14(金) 19:16:58
ひっぱりすぎ。
764名無しさん@お腹いっぱい。:2006/07/14(金) 19:52:00
それより、ls -lだと半年以上前のタイムスタンプがわからないとか、
秒単位がわからないとかいう問題の方が大きいな。
ls -l --full-time や ls -T はポータブルじゃないし。
765名無しさん@お腹いっぱい。:2006/07/14(金) 20:05:01
>>764
diff -c /dev/null /path/to/file | sed -n 2p
766名無しさん@お腹いっぱい。:2006/07/14(金) 20:10:25
>>765
残念だな。テキストファイルだとそれでいいが、
/path/to/file がバイナリファイルだと、diffが拒否するんだよ。
767名無しさん@お腹いっぱい。:2006/07/14(金) 20:28:30
じゃ、こういうことか

case `uname -s` in
Linux) ls -l --full-time;;
*BSD) ls -T;;
SunOS) ls -e;;
esac

--full-timeの場合は LANG=ja_JP.eucJPでも関係ないみたい。
768名無しさん@お腹いっぱい。:2006/07/14(金) 20:32:14
diff -caにすれば?
769名無しさん@お腹いっぱい。:2006/07/14(金) 20:36:30
>>768
diff -ca にしても問題が4つある。

(1) diff -a オプション自体がポータブルじゃない
(2) 対象ファイルがディレクトリ自体だと動作しない
(3) 対象ファイルが自分のパーミッションで読めないと動作しない
(4) 対象ファイルの中身を読み出してしまうので atimeが変わってしまう
770名無しさん@お腹いっぱい。:2006/07/14(金) 21:37:28
(5) 対象ファイルが empty fileだと /dev/nullと一致してしまうので時刻表示できない
771名無しさん@お腹いっぱい。:2006/07/19(水) 22:02:53
ディレクトリをブックマークしたいと思って
bash で↓こんな関数を作ったのですが、
Cygwin なのでディレクトリ名にスペースが入って
select のところがうまくいかなくなってしまいます。
いい書き方はないでしょうか?

function addbm() {
pwd >> ~/.dirbookmark
}
function bm() {
select dir in `cat ~/.dirbookmark`
do
cd $dir
break
done
}
772名無しさん@お腹いっぱい。:2006/07/19(水) 22:06:25
>>771
ダブルクォートしる!
"`cat ~/.dirbookmark`"

bashなら catは省略できて、
↓でも桶。
"`< ~/.dirbookmark`"
773名無しさん@お腹いっぱい。:2006/07/19(水) 22:09:25
>>772
ダブルクォートだとファイル中の複数行が全部つながって解釈されるだろ。

↓が正解。IFSのあとにシングルクォートした改行コードね。
IFS='
'
774771:2006/07/19(水) 22:49:16
>>772 >>773
さくっとできました。素早い回答ありがとうございます!
775名無しさん@お腹いっぱい。:2006/07/21(金) 22:14:31
シェルっていうなクズ。




と最近言えなくて少し寂しい。
776名無しさん@お腹いっぱい。:2006/07/21(金) 22:33:07
シェルも高くなったからなあ。
777名無しさん@お腹いっぱい。:2006/07/21(金) 22:49:32
1. nkf -e $* | grep hoge の機能を果たす
2. 出力にはファイル名:行番号がついてほしい
3. ハイフンで始まる引数はすべてgrepに渡される
の条件を満たすスクリプトが欲しいんですが、
簡単に作ることは可能でしょうか?
778名無しさん@お腹いっぱい。:2006/07/21(金) 23:01:22
>>777
2の、 出力にファイル名:行番号を付ける処理がちょっと面倒だけど、
「可能か?」という質問なら「可能」
779名無しさん@お腹いっぱい。:2006/07/21(金) 23:25:45
>>777
テストとかは自分でやってくれ。

#! /bin/sh
while [ $# -gt 0 ] ; do
 case "$1" in
  -*)
   opt="$opt $1"
   shift
  ;;

  *)
   break
  ;;
 esac
done
nkf -e $* | grep -n -H $opt
780名無しさん@お腹いっぱい。:2006/07/21(金) 23:32:11
あ、よく考えたら grep の前に nkf してるから
-n とか -H を grep につけた意味が無いな。

>>778 の面倒ってそういう事か。
確かにできなくはないけど >>779
2、3 行足すくらいじゃ出来そうもないな。
781名無しさん@お腹いっぱい。:2006/07/21(金) 23:32:51
>>779
それだと grepが標準入力から読んじゃうから、
ファイル名の表示ができない。
それでいいなら問題ないし、もっと簡単に書ける。

>>778 が言うように、ファイル名:行番号を付ける処理のところが面倒。
782名無しさん@お腹いっぱい。:2006/07/22(土) 00:11:30
出力した後に cat -n に逃げるってのは…だめだよなあw
783名無しさん@お腹いっぱい。:2006/07/22(土) 00:15:17
for i in $@; do
case "$i" in
-*) arg="$arg $i";;
*) files="$files $i";;
esac
for f in $files; do
nkf -e $f | grep -Hn $args
done

ちゃんと動くかどうかは知らね。
784名無しさん@お腹いっぱい。:2006/07/22(土) 00:16:36
あ、最初の for が閉じてねーや。そのへんは察してくれ。
785名無しさん@お腹いっぱい。:2006/07/22(土) 00:20:55
おれはアホか。

- nkf -e $f | grep -Hn $args
+ nkf -e $f | grep -n $arg | sed "s;^;$f:;"
786名無しさん@お腹いっぱい。:2006/07/22(土) 05:08:00
getoptとかの使用は不可なの?
787名無しさん@お腹いっぱい。:2006/07/22(土) 08:14:19
外部コマンドの getoptより、
内部コマンドの getoptsの方がモアベター。
788777:2006/07/22(土) 10:04:37
>>782さんのものに最初の引数とパターンとみなすようにして
↓こんな感じになりました。
これだとまだ
・grep の「-e パターン」という指定方法ができない
・スペースを含むファイル名を正しく扱えない
という問題がありますが。
getopt を使えば解決できますかね?

#!/bin/sh
for i in "$@"; do
    case "$i" in
        -*) arg="$arg $i";;
        *)  if [ "$pattern" = "" ]; then
                pattern="$i"
            else
                files="$files $i"
            fi
            ;;
    esac
done

#echo "pattern="$pattern
#echo "files="$files
#echo "arg="$arg

for f in $files; do
    nkf -e "$f" | grep -n $arg "$pattern" | sed "s;^;$f:;"
done
789名無しさん@お腹いっぱい。:2006/07/22(土) 14:19:04
宿題につらられる奴が大量発生。
それだけ愛に飢えているのか?
790名無しさん@お腹いっぱい。:2006/07/22(土) 15:03:15
愛飢男
791名無しさん@お腹いっぱい。:2006/07/22(土) 19:01:41
肺から吐く血
792名無しさん@お腹いっぱい。:2006/07/23(日) 01:12:30
一日一回、Wikipedia のメインページから
季節の話題、今日の暦、今日は何の日
をプレーンテキストで取り出してメールで送るようにしたいんですが
どうすればいいでしょう。

w3mかcurlでページを取得してsedを使って必要な分を取り出してmailで送るのをcronすれば
いいんですよね
793名無しさん@お腹いっぱい。:2006/07/23(日) 01:26:07
それPl(ry
794名無しさん@お腹いっぱい。:2006/07/23(日) 09:50:43
>>792
漏れだったら、perlで全部処理するけどな。LWPモジュール+Socketモジュール+cron
795名無しさん@お腹いっぱい。:2006/07/23(日) 10:19:06
俺ならwgetで取ってきてsedとtrで必要なところだけ取り出すな。
796名無しさん@お腹いっぱい。:2006/07/23(日) 10:46:56
まあ、何でもすぐperlに走っちゃうのは利工じゃないってことで。
797名無しさん@お腹いっぱい。:2006/07/23(日) 12:34:51
簡単にできるものを車輪の再発明してる方が(ryってことで。
798名無しさん@お腹いっぱい。:2006/07/23(日) 12:43:07
シェルの方が歴史がずーーっと古いわけだが。perl自体が車輪の再発明。
799名無しさん@お腹いっぱい。:2006/07/23(日) 12:47:14
perlはごった煮の闇鍋。
800名無しさん@お腹いっぱい。:2006/07/23(日) 12:47:38
つーか、シェルスレで質問してる以上、シェルでのやりかたを聞いてるわけだから、
perlしか知らない厨が不安になって自己弁明するために「俺ならperlでやる」みたいな
カキコするのいいかげんやめれ。
801名無しさん@お腹いっぱい。:2006/07/23(日) 12:50:57
車輪の再発明ってバカみたいだよね。言ってるほうが。
802名無しさん@お腹いっぱい。:2006/07/23(日) 12:53:04
シェル(スクリプト)でやることにこだわるなら答えは「できない」になりますが
803名無しさん@お腹いっぱい。:2006/07/23(日) 13:04:11
>>802
「お前にはシェルではできない」だな。
804名無しさん@お腹いっぱい。:2006/07/23(日) 13:14:55
それじゃお得意のシェルでやって見せてくれよw
805名無しさん@お腹いっぱい。:2006/07/23(日) 13:19:12
シェルっていうなクズ。
806名無しさん@お腹いっぱい。:2006/07/23(日) 13:22:57
空ageすんなクズ。
807名無しさん@お腹いっぱい。:2006/07/23(日) 13:24:31
>>804
>>795 に書いてあるのが見えないのか?

>>806
誰もageてないわけだが…?
808名無しさん@お腹いっぱい。:2006/07/23(日) 13:37:02
(プ
809名無しさん@お腹いっぱい。:2006/07/23(日) 15:22:00
>>805
久しぶりに言えて良かったねw
810名無しさん@お腹いっぱい。:2006/07/23(日) 16:11:25
俺ならCでやる。
811名無しさん@お腹いっぱい。:2006/07/23(日) 16:34:22
shでもperlでもcでもいいけど具体的なコード示したら
812名無しさん@お腹いっぱい。:2006/07/23(日) 16:42:18
おねがいします、って言えよ
813名無しさん@お腹いっぱい。:2006/07/23(日) 16:56:32
空ageすんな
814名無しさん@お腹いっぱい。:2006/07/23(日) 16:57:19
こんなテキストファイルが有るとき(行頭の数字は行数)
----------------
1 あああ
2 てすと
3 <html>
4 おちんぽ
5 あへあへ
6 ぶりぶりー</html>
7 あげあげ
8 ふとったーt
----------------
<html>〜</html> の間だけ抜き出したいんですがどうやったらええんでしょうか。
それぞれ行は可変です。

\nを削除してしまって一行にして、sedで s/.*<html>.*</html>/\1/g みたいなのとかは思いつくんですが
イマイチ美しゅうないと思うとります。

マッチする行数をゲッツ出来れば、tail&headでがっつり抜き出せそうなんですが、
行番号をゲッツする方法が分かりませぬ。
エロ胃人お願いします
815名無しさん@お腹いっぱい。:2006/07/23(日) 17:02:54
>>814
\nを削除しなくても、↓でできるよ。

sed -n '/<html>/,/<\/html>/p'

ただしこれだと<html>や</html>と同じ行のタグ外の部分も出てくるから、
あとsedの置換で<html>より左の部分と</html>より右の部分を削除すれば良い。
816名無しさん@お腹いっぱい。:2006/07/23(日) 17:30:33
>>815
ありがとおおおおお


と言うことでドブの素人の俺様が作ってみました

url='http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8'
rm temp.html
wget -nv --output-document=temp.html $url
sed -n '/今日は何の日/,/訃報/p' temp.html | sed 's/<[^>]*>//g'

今日はこれくらいで勘弁してください>>792
817名無しさん@お腹いっぱい。:2006/07/23(日) 20:26:09
wikipediaのメインページ、何故こんなに重い?
818名無しさん@お腹いっぱい。:2006/07/23(日) 20:57:24
# echo "蔵" >file
# /usr/bin/printf "%.1s" $(cat file) | wc -c

わかれば教えてください。
一連、動作なんですが、特に書式指定子の.(ドット)の意味がわからないです。
819名無しさん@お腹いっぱい。:2006/07/23(日) 23:32:36
>>818
man printf
info printf
820名無しさん@お腹いっぱい。:2006/07/23(日) 23:33:47
まあどうせ探せんだろうから、.は小数点。.2は小数点以下2桁
821名無しさん@お腹いっぱい。:2006/07/23(日) 23:34:16
>>819
それだとなんか英語のようなものが表示され、(END)のところでハングたので、
パソコンをリセットしてしまいました。
822名無しさん@お腹いっぱい。:2006/07/23(日) 23:52:04
その釣り何度めだ。
823名無しさん@お腹いっぱい。:2006/07/24(月) 22:52:41
>> 819 さん 820 さん
ありがとうございます。
コマンド実行結果は、1 or 2 のどちらが正しいのでしょうか?
824名無しさん@お腹いっぱい。:2006/07/25(火) 08:30:20
>>823
オレの環境では、マンド実行結果は 0になる。
825名無しさん@お腹いっぱい。:2006/07/25(火) 16:35:46
はじめまして超初心者です。会社の嫌がらせでパソコンぐらいしか使ったことない
私にshellを作れといわれて苦労している45才です。教えてください。

問題が、日付を手入力したときに正常な日付かどうかと、うるう年の計算
方法です。たとえば20051313はエラーですが20060220は正常ですよね。そのときに
曜日も表示したいのでやり方をすいませんがはじめから詳しく教えてください。
すいませんが、お願いします。
826名無しさん@お腹いっぱい。:2006/07/25(火) 16:42:21
いい加減見飽きた。
827名無しさん@お腹いっぱい。:2006/07/25(火) 16:45:46
shellってゆうなクズ。
828名無しさん@お腹いっぱい。:2006/07/25(火) 16:59:35
空ageすんな得た。
829名無しさん@お腹いっぱい。:2006/07/25(火) 19:39:01
いまのプロジェクトでも
シェルスクリプトで日付計算やってるのを数箇所で見て、げんなり。

どうしてもやりたいなら自前で演算するんじゃなくて、
ダミーファイルをtouchするとか、外部でPerlでもよんでほしい。
830名無しさん@お腹いっぱい。:2006/07/25(火) 20:18:08
最近じゃdateで大概のことができるし
831名無しさん@お腹いっぱい。:2006/07/25(火) 21:26:13
date -d 2006/02/02 +%A とかすりゃ曜日出るしね。日付部分は不正だとエラーにも
してくれる。数字8桁はさすがに食ってくれないようだが、ちょいと/を付け足して食わせりゃ
出来上がりだ。
832名無しさん@お腹いっぱい。:2006/07/25(火) 21:34:06
俺の環境ではこうなる。

$ date -d 20060230
Thu Mar 2 00:00:00 JST 2006

数字8桁でもそのまま日付として食ってくれるが、
2月30日はご丁寧にも3月2日として解釈してくれる。

ま、これも、
if [ `date -d 20060230 +%Y%m%d` = 20060230 ]; then

とかでチェックすれば済むことだな。

それより、>>825 はコピペだから詳しくは答えてあげない。
めでたくリストラされてください。
あ、もし自宅が借り上げ社宅なら、リストラ前に個人契約に変更しといた方がいいよ。
リストラ後だと保証人とかの問題で部屋が借りにくくなるから。
833名無しさん@お腹いっぱい。:2006/07/25(火) 23:30:41
>>832 は社宅を追い出されたことがあるの?
834名無しさん@お腹いっぱい。:2006/07/26(水) 11:13:09
dateコマンドを使う方法だと、1969年以前の日付や、2038年以降の日付に対応できないな。
835名無しさん@お腹いっぱい。:2006/07/26(水) 12:02:44
つcal
836名無しさん@お腹いっぱい。:2006/07/26(水) 12:19:54
>>835 は質問の意味を取り違えているようだ。
837名無しさん@お腹いっぱい。:2006/07/26(水) 12:25:09
日付から曜日求める Zellerの公式を使って expr で計算すればできるな。
あと、日付の正当性チェックは閏年、大小の月で case文あたりで場合わけ判断と。
とは言っても、シェルスクリプト自体超初心者の >>825 には無理。
リストラされろ。
838名無しさん@お腹いっぱい。:2006/07/26(水) 13:00:24
839名無しさん@お腹いっぱい。:2006/07/26(水) 13:02:49
>>1を読めまで読んだ
840名無しさん@お腹いっぱい。:2006/07/26(水) 13:23:45
>>838
欲嫁。>>408 では日付の正当性チェックはできてない。曜日計算のみ。
あと、曜日計算なら >>408 よりももっと簡単にできる。
841名無しさん@お腹いっぱい。:2006/07/26(水) 22:41:35
>>825
どうしても解決したいなら、有料でもいいのだろ?
職業別電話帳見ると、街の便利屋さん(何でも屋さん)みたいなの載ってるだろ。
そこに電話して頼め。
もちろん、その便利屋さん本人はshellだのUNIXだの言っても知らないだろうが、
相手もプロだ。shellとかUNIXとかキーワードを頼りにそれ関係の詳しい人に
取り次いで問題を解決してくれる。特殊な用件だから少々高く取られるかもね。
842名無しさん@お腹いっぱい。:2006/07/28(金) 14:25:42
これなんかどう?
# valid-date - validate date, taking into account leap year rules
ttp://www.intuitive.com/wicked/showscript.cgi?007-valid-date.sh
843名無しさん@お腹いっぱい。:2006/07/30(日) 13:16:38
すごくダさいと思った
844名無しさん@お腹いっぱい。:2006/08/05(土) 11:51:54
超初心者的な質問ですが優しい人、教えてください。

Grepを使った検索スクリプトについて

1) あるテキストファイル(Pattern.txt)に検索対象文字列が改行単位で入っている。
2) この文字列ひとつひとつをパターン文字として、/apl/usr配下のファイルをGrepしたい。
3) 最終的にRESULTファイルに以下のような形式に保存したい。(RDB取込用ファイルの作成)
     <検索対象文字列> , <ヒットしたファイル名>

多分、Ptternファイルを一行ずつ読み込んで、Grepする処理を
ループさせるようなスクリプトになると思うんですけど・・

845名無しさん@お腹いっぱい。:2006/08/05(土) 12:31:30
http://pc8.2ch.net/test/read.cgi/unix/1152364804/532
はいはい、マルチマルチ。
846名無しさん@お腹いっぱい。:2006/08/06(日) 00:31:32
質問です
CGIやPHPでシェルスクリプトを実行するにはどうしたらできますか?
実行方法がわからないのでおしえてください。
847名無しさん@お腹いっぱい。:2006/08/06(日) 00:45:02
>>846
(1)先頭に
#!/bin/sh
のように陽にshellのmagicを書いておいて、
(2)CGIやPHPが動くときのuser id での実行許可をたてて、
(3)system()やexec()を呼ぶ。スクリプトのパスは原則フルパスで。
848名無しさん@お腹いっぱい。:2006/08/06(日) 00:46:03
>>847
ちょw
849847:2006/08/07(月) 03:14:47
え?駄目かえ?厨なりに一所懸命に考えたんだが。
850名無しさん@お腹いっぱい。:2006/08/07(月) 03:36:41
(1) ホームセンターに行き鉄定規を購入
(2) CGI鯖のあるプロバイダに接続
(3) 鉄定規をF5キーの箇所に置き、ハイパーオリンピックの要領で弾く
(4) 頃合いを見て80番ポートからログイン
(5) 自分のディレクトリの実行許可を書き換え
(6) /bin/shを実行
851名無しさん@お腹いっぱい。:2006/08/07(月) 03:54:34
>>849
CGIとPHPが一緒くたな時点で「ちょw」
CGIは文字通りインターフェースだから、シェルスクリプト自体を直接実行できるのをわるれるな。
852名無しさん@お腹いっぱい。:2006/08/07(月) 09:06:47
「わるれるな」に、ちょw
853名無しさん@お腹いっぱい。:2006/08/11(金) 23:09:46
% echo a:~
a:~

となるのに、
% a=a:~
% echo $a
a:/home/giko
となるのはなぜですか?
854名無しさん@お腹いっぱい。:2006/08/11(金) 23:44:49
なんでだろね♪
855名無しさん@お腹いっぱい。:2006/08/12(土) 00:27:26
bashだからか?
856名無しさん@お腹いっぱい。:2006/08/12(土) 00:43:01
>>855
NetBSD の sh と zsh でそうなりました。
857名無しさん@お腹いっぱい。:2006/08/12(土) 00:57:13
$ a=a:~; export a
$ export a=a:~

このふたつの違いを考えてみるとわかる。
~ がコマンド引数の一部なのか、変数代入文なのか。
858名無しさん@お腹いっぱい。:2006/08/12(土) 01:16:36
>>857
どっちの echo $a の結果は同じなのですが…
859名無しさん@お腹いっぱい。:2006/08/12(土) 01:34:16
うそーん。うちの sh は違う結果になるが。
860名無しさん@お腹いっぱい。:2006/08/12(土) 01:35:05
うちの、つーてもわからんか。FreeBSD 5.4 の /bin/sh。
861名無しさん@お腹いっぱい。:2006/08/12(土) 16:04:10
なんでだろ〜おなんでだろ〜
862名無しさん@お腹いっぱい。:2006/08/12(土) 16:44:30
PATH=~/hoge:~/fuga
てことがしたくて変数代入のときだけ小細工してるから
863名無しさん@お腹いっぱい。:2006/08/12(土) 19:24:24
Tilde Substitution.

After alias substitution is performed, each word is checked to see if it begins with an unquoted ~. For tilde substitution, word
also refers to the word portion of parameter expansion (see ParameterExpansion below). If it does, then the word up to a / is
checked to see if it matches a user name in the password database (often the /etc/passwd file). If a match is found, the ~ and
the matched login name are replaced by the login directory of the matched user. If no match is found, the original text is left
unchanged. A ~ by itself, or in front of a /, is replaced by $HOME. A ~ followed by a + or - is replaced by the value of $PWD and
$OLDPWD respectively.

In addition, when expanding a variable assignment, tilde substitution is attempted when the value of the assignment begins with
a ~, and when a ~ appears after a :. The : also terminates a ~ login name.

つまり普通はワードの先頭が~のときしかtilde substitutionが行われないが、変数代入のときだけは:の後でもやる
というわけね。これはいかにも知ってないと混乱しそうな仕様だな。便利は便利なのだろうが。
864名無しさん@お腹いっぱい。:2006/08/12(土) 22:10:32
HOME_DIR="/export/home/.../..." ; export HOME_DIR
このような書き方を良く見かけるんだが、2行に分けず
1行にまとめて書いてるのは、何か技術的な理由があるの?
それとも、ただ単に行の節約とか見やすさを考慮しただけ?
865名無しさん@お腹いっぱい。:2006/08/12(土) 22:20:56
書いた奴の気分
866名無しさん@お腹いっぱい。:2006/08/12(土) 22:39:34
export HOME_DIR="/export/home/.../..."
このような書き方を良く見かけるんだが、2行に分けず
1行にまとめて書いてるのは、何か技術的な理由があるの?
それとも、ただ単に行の節約とか見やすさを考慮しただけ?
867名無しさん@お腹いっぱい。:2006/08/12(土) 22:47:22
# 一個でコメントアウトできる。(という事まで考えているかは知らない)
868名無しさん@お腹いっぱい。:2006/08/17(木) 16:30:16
20060817ってな感じの日付を
基準時点 (UTC の 1970 年 1 月 1 日 00:00:00; time(3) 参照) からの秒数
に変換するスマートなやりかた教えて
869名無しさん@お腹いっぱい。:2006/08/17(木) 16:40:48
>>868
date -u +%s -d 20060817
870名無しさん@お腹いっぱい。:2006/08/17(木) 16:42:31
% date -d 20060817 +%s
1155740400
871名無しさん@お腹いっぱい。:2006/08/17(木) 16:42:49
うちのdateだとこうかな
date -j -f "%Y%m%d%H%M%S" 20060817000000 +%s
872名無しさん@お腹いっぱい。:2006/08/17(木) 16:42:50
20060817がJSTなら -u は要らない。
date +%s -d 20060817
873名無しさん@お腹いっぱい。:2006/08/17(木) 17:23:45
>>866
・その文法しか知らないから
・その文法をサポートしている OS でしか動かす予定がないから
・その文法をサポートしてない /bin/sh を持つ OS への嫌がらせ
のいずれか
874名無しさん@お腹いっぱい。:2006/08/17(木) 17:28:15
>>866 は、質問じゃなくて >>864 の修正コピペだろ。

で、>>864 は、>>866 的な exportと代入を同時にやる bash依存文法に反対する意味をこめて
あえて1行で書いてるんだと思う。

でも、俺的には

HOGE=hoge
HAGE=hage
export HOGE HAGE

↑の書き方が好み。
875868:2006/08/17(木) 18:07:27
サンクス
869,870は無理だった
871でおk FreeBSD

876名無しさん@お腹いっぱい。:2006/08/17(木) 18:17:31
>>874
export VAR=value
をbash依存文法とする根拠を述べよ。


877名無しさん@お腹いっぱい。:2006/08/17(木) 18:34:09
>>876
「bashで使えて Bourne shで使えないから」そのままやん。

先に言っとくと、*BSDのsh=ash≠Bourne shだからね。
878名無しさん@お腹いっぱい。:2006/08/17(木) 18:37:17
>>876
やれやれ。最近は export VAR=value がbash依存文法であることも知らない新参者が多いのう。
879名無しさん@お腹いっぱい。:2006/08/17(木) 18:48:28
なぜかほこらしげ
880名無しさん@お腹いっぱい。:2006/08/17(木) 19:50:30
>>878
bash依存というより、ksh依存といった方が正しい。
881名無しさん@お腹いっぱい。:2006/08/17(木) 20:06:58
bash依存というけれど他がbashに合わせるべきだよね。
立場をわきまえないと。
882名無しさん@お腹いっぱい。:2006/08/17(木) 22:22:58
ああ、どれが釣りなのかわからん…

"export var=value"という書き方はPOSIXシェルで有効な文法で、
bash依存の仕様と言うわけではない。
SolarisではkshはPOSIXとの互換性を使いたい場合のシェルで、
/bin/shは上記文法を受け付けず、POSIXに準拠しない。
883名無しさん@お腹いっぱい。:2006/08/18(金) 00:24:41
>>878
POSIXくらいは確認してから書こうな。テンプレにも入れてあるんだし。
884名無しさん@お腹いっぱい。:2006/08/18(金) 00:47:04
で、POSIX準拠かどうかということが実践では役に立たないのも事実なわけで、
POSIXよりも、「/bin/shで使える文法かどうか」の方が重要。
885名無しさん@お腹いっぱい。:2006/08/18(金) 01:17:06
/bin/shがPOSIX準拠でないOSにはそろそろ引退してもらいましょう
886名無しさん@お腹いっぱい。:2006/08/18(金) 02:45:19
仕事で使うなら、いいわけもえり好みもできない。
だから確実性が最優先だし、選択肢が存在すると考えること自体が間違い。
/bin/shが何者か分からなければ、bourne shellサポート範囲内かつbash拡張範囲外で書くべき。

POSIXシェルでなければならない理由が本当にあるかどうか分からないが、
もし仮に本当に必要ならば明示的に指定して使ってやればいいんだよ。
/bin/bashや/bin/xpg4/sh(Solaris)や/bin/ksh(Solaris)が存在するなら
ベンダが保証したPOSIXシェルとして使えるんだから、
何者か分からない/bin/shをおっかなびっくり使うよりマシ。
887名無しさん@お腹いっぱい。:2006/08/18(金) 07:39:23
autoconfが生成するconfigure.shはnon-POSIXでも動くよう書かれているんだよね...
888名無しさん@お腹いっぱい。:2006/08/18(金) 07:57:41
そういうクズなシステムを例にだしてもなんの意味も無い。
889名無しさん@お腹いっぱい。:2006/08/18(金) 08:11:18
一番混乱させているのが、*BSD。

Linux(の多くのディストロ)は標準をbashと決めているから、そういうものとして理解すればいいが、
*BSDの/bin/shはそれぞれで勝手に拡張されているし、バージョンによってコロコロ変わってたりするから、
わかりにくい。
890名無しさん@お腹いっぱい。:2006/08/18(金) 08:14:41
FreeBSDのshで、printfが外部コマンドに変更されたのは許せん。
891名無しさん@お腹いっぱい。:2006/08/18(金) 08:31:30
実装違いに悩まされないためにPerlで書いてしまう手もあるが
やはり/bin/shで何とかするのが心意気というものであろう
892名無しさん@お腹いっぱい。:2006/08/18(金) 11:31:48
実行前にshを調べてperlで整形すれば解決ですよ。
893名無しさん@お腹いっぱい。:2006/08/18(金) 17:59:00
HOGE=abcd export HOGE
でも設定出来るのになんでセミコロン入れるんだろ?
894名無しさん@お腹いっぱい。:2006/08/18(金) 18:05:10
>>893
古いシェルだと、内部コマンドに対して HOGE=hoge のような変数の指定が
うまく動作しないものがある。だから ; を入れるのが吉。
895名無しさん@お腹いっぱい。:2006/08/18(金) 18:10:06
いや、HOGE=hoge export HOGE の場合、
exportという1コマンドに対してのみ一時的に HOGE=hogeという環境変数を設定する、
という動作が本来の仕様なのだから、
HOGE=hoge export HOGE (セミコロンなし)でもexportできてしまう方がバグと思われる。
(古いシェルの動作が正しい)

たとえば、
HOGE=hoge printenv HOGE
だと、printenvコマンドではhogeが表示されるが、
その後はHOGEは未設定になる動作が正しい。exportでもそうなるべきだ。
896名無しさん@お腹いっぱい。:2006/08/19(土) 05:48:58
過去のしがらみも古参の権威もなくPOSIXしか拠り所のないlinuxはPOSIX優等生。
うちは昔からこうやってるなんて言いだす傲慢さは無い。
最古参のBSDは困ったちゃん。
897名無しさん@お腹いっぱい。:2006/08/19(土) 08:01:41
>>896
LinuxはPOSIXに準拠してないよ。拠り所は GNU。
GNUの独自拡張だろうが、GNUで使えれば事実上の標準になってる。
898名無しさん@お腹いっぱい。:2006/08/19(土) 09:03:50
つーか、「便利ならいいじゃん」がLinux。
そういって、95年当時にLinusが事務処理にはWindowsを使っ
ていたことは公然の秘密だ。
899名無しさん@お腹いっぱい。:2006/08/19(土) 09:18:08
>>896
POSIX準拠なのはLinuxだけじゃないし、opengroupのUNIX認証を通ってないから
結局のところPOSIX準拠であることを第三者に証明できない。
優等生ってのは言い過ぎじゃないかなあ。

>>897
「GNUで使えれば」ってどういう意味よ? 説明してみて。
900名無しさん@お腹いっぱい。:2006/08/19(土) 14:21:52
opengroupのUNIX認証を通ってないから<-誤り
UNIX認証を受けてない、メンバーにも入れてもらえない。
もしUNIX認証を受けるにしてもデストリごどになる。
linuxにUNIXを実装する事自体は容易、ほぼそのままでもいけるか。
現状はlinuxである方が有理なのでUNIX認証にはあまり興味が無い。
linuxはlinux認証を立ち上げた。
901名無しさん@お腹いっぱい。:2006/08/20(日) 00:57:46
>>895
exportが、値を何というか環境に担ぎ出して固定する
ようなイメーヅだと思えば不思議じゃない。

$ HOGE=hoge HOGE=hoge

とやった後にHOGE=hogeに設定される、
そういう効果をもともと持つコマンドがexportってこと。
902名無しさん@お腹いっぱい。:2006/08/20(日) 03:54:31
> opengroupのUNIX認証を通ってないから<-誤り
> もしUNIX認証を受けるにしてもデストリごどになる。

ほほう、UNIX認証を受けたLinuxディストリビューションが
1つでも存在するのならば知りたいものだね。興味がある。

で、「Linux認証」なるものが仮に標準たりうるとしても、
それは>>896の言う「BSDの権威」とどう違うのよ?という話。
903名無しさん@お腹いっぱい。:2006/08/20(日) 13:15:37
Linux認証?
904名無しさん@お腹いっぱい。:2006/08/20(日) 14:05:04
http://www.google.co.jp/search?q=linux+iso+%E8%A6%8F%E6%A0%BC+&hl=ja&lr=&start=0&sa=N
たぶん失敗する、なんら権威の根拠とはならないだろう。
今linuxにおける権威はRedHat、Debian、Fedora、そしてリーナスである。
一見上層に見える色々なlinux関連団体は実はなんら支配力も実効力も持っていない。
Fedoraを怒らせたらStallmanだって追放されるだろうよ。
StallmanはFedoraを抱き込んでxFree86を追放した、そういう権力構造。

>>902
その前にunixの会員になるのにいくら金積めばいいのか教えてくれ。
905名無しさん@お腹いっぱい。:2006/08/20(日) 15:48:52
Stallmanを追放って...
追放が可能なためには、まずは所属してないと。
906名無しさん@お腹いっぱい。:2006/08/20(日) 20:10:26
>>904
UNIX認証とは違う話をしているようだけど、
「unixの会員になる」というのが何を指すのか説明して。

>>905
彼の妄想世界では可能なんだよ、きっと。
907名無しさん@お腹いっぱい。:2006/08/21(月) 08:35:36
そういや最近のGNU coreutilsはsort, head, tailとかのコマンドが
「-行数」をデフォルトで受け付けたりやめたりとずいぶん揺れてるね。

このへんはPOSIX 1003.2-1992かPOSIX 1003.1-2001かで違うみたいだ。
908名無しさん@お腹いっぱい。:2006/08/21(月) 09:34:22
「UNIX」は、X/Open Company Limitedが独占的にライセンスしている米国ならびに他の国における登録商標です。
909名無しさん@お腹いっぱい。:2006/08/21(月) 15:45:35
>>906
きっと美容院のことだよ。
ご紹介システムを利用すれば、1000円分のポイントもらえるよ。
910名無しさん@お腹いっぱい。:2006/08/21(月) 16:12:59
「unixの会員になる」って、
レンタル・ビデオ屋UNIXの会員になるってことじゃないかな。
911名無しさん@お腹いっぱい。:2006/08/21(月) 16:24:16
>>901
そのexportの解釈でもちょっと苦しいね。

あと、別の例だけど、
$ HOGE=hoge unset hoge
$ echo $HOGE
hoge

↑unsetされてない。
これはどう解釈する?
やっぱバグだろ。
912911:2006/08/21(月) 16:35:48
typoしてもうた。↓のとおり

$ HOGE=hoge unset HOGE
$ echo $HOGE
hoge

この現象が起きるのはシェルの種類によるかも。

もちろん、セミコロンを入れて
$ HOGE=hoge; unset HOGE
ならちゃんと unsetされる。

何が言いたいかというと、元の話題の HOGE=hoge; export HOGE の時、
念のためセミコロンを入れろということ。
913名無しさん@お腹いっぱい。:2006/08/21(月) 21:25:46
いやいやいやexportの話でしょ?
その言い方からすると、そのウンコシェルでもexportは効くんでしょ?
914名無しさん@お腹いっぱい。:2006/08/22(火) 13:34:42
>>910
ウチの近くに本当にunixっていうレンタルやがあるぞ。
915名無しさん@お腹いっぱい。:2006/08/22(火) 13:52:53
>>914
もちろん実在することを知っているからこそ書いてる。
916名無しさん@お腹いっぱい。:2006/08/22(火) 20:36:31
タッパ…
917名無しさん@お腹いっぱい。:2006/08/23(水) 00:31:55
Solaris9/10なんですが、教えてください。

標準出力に数値を出力するプログラムがあり、その値を
シェルでexitしたいんですが、マイナス値でエラー"番号が正しくありません"になります。
簡単にいうと、エラーとなるのは↓のようなものです。

#/bin/sh
EXITVALUE=-1
exit ${EXITVALUE}

これ、Linuxではうまくいくんですが、Solarisではだめなんでしょうか?
918名無しさん@お腹いっぱい。:2006/08/23(水) 00:36:29
うまくいく方がおかしいので、おとなしく 0 から 255 までの数を使ってください。
919名無しさん@お腹いっぱい。:2006/08/23(水) 01:12:45
POSIX では 0 〜 255 までだっけ。
920名無しさん@お腹いっぱい。:2006/08/23(水) 07:21:59
>>917
Linuxというより、bashだと exitの値に勝手に mod 256をとった上で
符号なし8bitとみなした 0 〜 255の値になる模様。
なので、Solarisでもbashを使えば無問題。

あるいは、exit `expr \( ${EXITVALUE} + 256 \) % 256` かな。
921名無しさん@お腹いっぱい。:2006/08/23(水) 08:04:38
>>920
ありがとう。
今日環境使えたら試してみます。
922名無しさん@お腹いっぱい。:2006/08/23(水) 08:35:25
受け側で、`` で受ければいいんじゃないの?
923名無しさん@お腹いっぱい。:2006/08/23(水) 09:21:27
bash使ってもエラーにならなくなるだけで、親プロセスがexit statusとしてもらえる値は
そのコマンドが返した値の-1ではなくてmod 256した値の255に変化してしまうのだが、
それでいいのかね?
924名無しさん@お腹いっぱい。:2006/08/23(水) 09:43:03
>>922
`` で受けてる。
実際には、フォーマットが決まってるから、その後awkで切り出して、
それをEXITVALUEに代入しているけど。
で、その値がマイナスだとexitで怒られます。

>>922
呼び出し側は専用のアプリで、singned charとして扱っているから大丈夫だと
思われます。
925917:2006/08/24(木) 00:21:43
>>920
今思えば質問も的を得ていないにもかかわらず、望んでいたのは
そういうレスでした。おかげでなんとかしのげました。
ありがとうございます。

他にもレスくれた人達、ありがとう!
926名無しさん@お腹いっぱい。:2006/08/24(木) 00:29:02
× 的を得る
○ 的を射る
○ 当を得る
○ 要を得る
927名無しさん@お腹いっぱい。:2006/08/26(土) 09:38:02
ttp://en.tldp.org/HOWTO/Reading-List-HOWTO/b80.html

Shell (as a programming language for more than trivial scripting) is dead.

シ ェ ル は 死 ん で い る
928名無しさん@お腹いっぱい。:2006/08/26(土) 10:55:13
>>927
ラリーウォールがperlの広告してる、ふう、それだけのこと
929名無しさん@お腹いっぱい。:2006/08/26(土) 17:06:11
それであってさえ、`trivial scripting' にはシェルスクリプトが最適なのを
認めてしまっている罠
930名無しさん@お腹いっぱい。:2006/08/28(月) 10:44:12
1ヶ月後までにやっとかなきゃいけないこと(でもできればその直前くらいがいいこと)を、
自分のメールアドレスにお知らせしてくれるリマインダーを書きたいんだけど、
どっから手を付けていいのやら。
931名無しさん@お腹いっぱい。:2006/08/28(月) 10:50:23
at
932名無しさん@お腹いっぱい。:2006/08/28(月) 20:59:48
アッー!
933名無しさん@お腹いっぱい。:2006/08/29(火) 05:35:33
>>930
Google Calendar
934名無しさん@お腹いっぱい。:2006/08/30(水) 15:21:50
bashでバックグラウンドジョブが終わったときの
[1]+  Done                    kterm
を表示させなくするにはどうすればいいんでしょうか?
935名無しさん@お腹いっぱい。:2006/08/30(水) 15:25:59
モニタを破壊する
936名無しさん@お腹いっぱい。:2006/08/30(水) 15:30:10
rm `which bash`
937名無しさん@お腹いっぱい。:2006/08/30(水) 15:34:30
>>934
(command &) みたいに、サブシェルを1段かましてバックグラウンドにする。

>>935 >>936 氏ね。
938934:2006/08/30(水) 15:49:15
>>937
ありがとうございます。
939名無しさん@お腹いっぱい。:2006/08/30(水) 15:58:36
ふつう、disown じゃね?
bash だと、&! や、&| って無いのかな?
940名無しさん@お腹いっぱい。:2006/08/30(水) 16:11:29
>>939
disownだと、bashを含む一部のシェルのみに依存した方法になるから、
ashでも使える >>937 を尊重したい。
941名無しさん@お腹いっぱい。:2006/08/30(水) 16:22:59
>>939
disownだと、コマンド起動直後の [1] 1234 みたいなジョブ/プロセス番号の
表示までは消せない、という話しもある。

&! は zsh依存だな。
942名無しさん@お腹いっぱい。:2006/09/01(金) 01:16:16
対話的に使っているとき、bash(というかbsh系)で標準エラー出力を
簡単に捕まえる方法ってありますか?

hogehoge 2>&1 | less

とか打つの面倒なので、

hogehoge |& less

とcsh系のみたいな簡略系がないかなと思うんですが。cshは
あらゆるところがヘボイけど、これだけはうれしい。zsh使え?
943名無しさん@お腹いっぱい。:2006/09/01(金) 06:47:08
>hogehoge 2>&1 | less
画面に表示するだけなら、2>&1はいらないわけだが。
944名無しさん@お腹いっぱい。:2006/09/01(金) 08:07:00
>>942
自分で答え書いてるけど、zsh使えばいいんじゃない。
ちなみに、オレは hoge 2>&1 | less と打つのが苦にならない(もう指が覚えてる)。
945名無しさん@お腹いっぱい。:2006/09/01(金) 08:46:07
>>942
マンドイってたった2文字の差じゃ‥‥
946名無しさん@お腹いっぱい。:2006/09/01(金) 09:29:16
>>944
漏れも同じ。zshでも2>&1って打ってることが多い。

これより101キーバインドと106/109キーバインドの差の方が引っかかりやすい。
947名無しさん@お腹いっぱい。:2006/09/01(金) 10:16:31
日本語キーでも必ず英語配列で使う。(&はSHIFT+7)
最近は英語配列キーボードが入手困難で困るなぁ。
948名無しさん@お腹いっぱい。:2006/09/01(金) 12:33:33
>q hogehoge | less

qはエイリアスでも関数でも、実行プログラムででも適当にこさえる。
949名無しさん@お腹いっぱい。:2006/09/01(金) 12:37:13
q() { "$@" 2>&1;} でいいね。
950名無しさん@お腹いっぱい。:2006/09/01(金) 12:52:08
>>947
私は日本語キーボードを英語配列で使うと「\」が「:」の隣に来て押しやすいので
まともな英語配列キーボードより好きだったりします。どうせキートップなんて
見ないし。
951名無しさん@お腹いっぱい。:2006/09/01(金) 13:14:52
英語配列は、:がshift要求するから嫌だ。
952名無しさん@お腹いっぱい。:2006/09/01(金) 14:21:55
>>951
http://とかがshift押さないといけないからダメ
という理由で日本語配列を薦めてた人がいたな。
953名無しさん@お腹いっぱい。:2006/09/01(金) 16:27:29
俺はカッコが1つずれてさえいなければどっちでも良いんだがな…
JISキーボードを作った人はなんでわざわざずらしたんだろう。
954名無しさん@お腹いっぱい。:2006/09/01(金) 17:16:35
逆だ。
英語配列が変態配列なんだよ。
955名無しさん@お腹いっぱい。:2006/09/01(金) 17:34:18
>>953
カッコって"(" と ")" のことかい?

JISキーボードのShift+数字の部分は,
数字のJIS(ASCII)コード - 0x10
になるように配置されている.

気持としては 0x21 から 0x2f までの範囲のコードは
shift+<0x31 から 0x3f までのキー>
でコード化したかったのではあるまいか?
一部逆転してるけど...

このほうがハードだけでコード化するのが楽.

大昔のやつさがせば shift+0 でスペースを出力する
キーボードがあったかも知れない.

どっちかって言うと, USキーの方が不思議な並び.

タイプライターってどんな並びだったんだっけ?
956名無しさん@お腹いっぱい。:2006/09/01(金) 19:34:23
昔のタイプライターだと、ゼロとイチはなくて、ゼロは大文字のオー(O)、
イチは小文字のエル(l)を使っていた。
957名無しさん@お腹いっぱい。:2006/09/01(金) 19:35:50
( ・∀・)つ〃∩ ヘェーヘェーヘェー
958名無しさん@お腹いっぱい。:2006/09/02(土) 22:53:37
英語キーボードは今も昔と同じぐらい普通に売ってる気がする。
いや20年前のことはしらないが。
959名無しさん@お腹いっぱい。:2006/09/02(土) 22:58:26
>>958
売ってるとこ教えて。ちなみに近所のPC量販店では皆無。
ネット通販でも見かけない。

あと、HHKもパスでお願い。フルサイズのが欲しいので。
960名無しさん@お腹いっぱい。:2006/09/02(土) 23:54:28
「キーボード」でググるだけで相当でてくるが。。。
961名無しさん@お腹いっぱい。:2006/09/03(日) 01:21:47
84のことを言っているのか101の事を言っているのか整理してみようか
ttp://www.pfu.fujitsu.com/hhkeyboard/kb_collection/index.html
漏れは昔のomnikeyが欲しい
962名無しさん@お腹いっぱい。:2006/09/03(日) 02:43:10
これがOMNIの正当なる後継 俺は今使っている。
http://www.cvtinc.com/products/keyboards/menu.htm
963名無しさん@お腹いっぱい。:2006/09/03(日) 09:30:06
>>960
それだとS/N比が非常に悪いですが。。

>>961
HHK系はパスだとおっしゃってますが。。
964名無しさん@お腹いっぱい。:2006/09/03(日) 09:51:54
urlだけ見て喋るなカス
965名無しさん@お腹いっぱい。:2006/09/03(日) 09:54:04
キーボードが{こわれた,タッチが気に入らない}ので、
ちょっと近所の **{電気,無線,カメラ}まで行って
英語キーボード買ってくるか、と思った場合、
5-6年前なら売ってたけど、今は日本語キーしか売ってないよ。
キーボードは現物触ってからじゃないと買いにくいし、
確かに困るね。
966名無しさん@お腹いっぱい。:2006/09/03(日) 10:11:48
はいはい、引っ越した引っ越した

Keyboard キーボード 2
http://pc8.2ch.net/test/read.cgi/unix/1055904385/
967名無しさん@お腹いっぱい。:2006/09/03(日) 10:38:53
うちの庭に埴輪の鶏がいる。
968名無しさん@お腹いっぱい。:2006/09/03(日) 12:54:22
家に埴輪鶏がいる。
969名無しさん@お腹いっぱい。:2006/09/03(日) 18:53:05
シェルスクリプト用(/bin/sh)のlintみたいなのあったら教えてください。
970名無しさん@お腹いっぱい。:2006/09/03(日) 19:54:26
sh -n
971名無しさん@お腹いっぱい。:2006/09/03(日) 19:56:57
>>970
できました。どうもありがとうございました。
972名無しさん@お腹いっぱい。:2006/09/03(日) 23:07:37
>>959
「英語 キーボード 価格」
でぐぐってみ?
スレ違いゴメソ。
973名無しさん@お腹いっぱい。:2006/09/06(水) 10:48:16
bashでshellscriptを書いています。

scpする前に、ネットワーク上のサーバにscp可能かどうかを
確認するif文などは可能でしょうか。
この意味ではsshもscpも等価だと思うので
例えばsshをtryしてみてログイン可能だったら次にすすむ、
という感じで可能でしょうか?
974名無しさん@お腹いっぱい。:2006/09/06(水) 10:55:11
>>973
不可能。

↓はい、次の方どうぞ。
975名無しさん@お腹いっぱい。:2006/09/06(水) 10:55:22
調べた直後にネットワークが不調になったり相手の設定がかわるかもしれないから、
結局scpできない可能性は残るので対策が必要。となると事前に確認する意味は
どのくらいあるか...
976名無しさん@お腹いっぱい。:2006/09/06(水) 10:56:39
>>973
実際に scp やってみて返り値見るとかじゃだめなん?
977名無しさん@お腹いっぱい。:2006/09/06(水) 11:01:55
それより次スレよろ。
978973:2006/09/06(水) 11:07:59
これかな〜、と思ったけどうまくいきませんでした・・・orz
#!/bin/sh
PATH=/bin:/usr/bin:/usr/local/bin

ssh [email protected]
if test -e Sites/rute/*
echo "file exists. exited the server."
else
echo "unable to login the server."
fi

>>976
それはナイスアイデアですね!
で、返り血はどうやってみるんですか??
979名無しさん@お腹いっぱい。:2006/09/06(水) 11:10:37
hogehoge.comは実在しま(ry
980名無しさん@お腹いっぱい。:2006/09/06(水) 11:22:31
> それはナイスアイデアですね!
> で、返り血はどうやってみるんですか??
( ゚д゚)
981名無しさん@お腹いっぱい。:2006/09/06(水) 11:27:07
返り血は みるんじゃなくて あびる優

おそまつ
982名無しさん@お腹いっぱい。:2006/09/06(水) 11:28:18
だから >>973 の質問を見た瞬間、答える甲斐のない糞質と見抜いたわけだが…
983名無しさん@お腹いっぱい。:2006/09/06(水) 11:34:10
bashで解決できないならcommand.com使うしかないな。
984名無しさん@お腹いっぱい。:2006/09/07(木) 07:21:29
bashのシェルスクリプトをnice付けて起動したらシェルスクリプトから呼び出した
アプリケーションプログラムもniceの影響を受けるのかな?
985名無しさん@お腹いっぱい。:2006/09/07(木) 07:51:21
試してみ。
986名無しさん@お腹いっぱい。:2006/09/07(木) 12:59:19
スレ立て行ってきます
987名無しさん@お腹いっぱい。:2006/09/07(木) 13:07:58
はいどうぞ

シェルスクリプト総合 その7
http://pc8.2ch.net/test/read.cgi/unix/1157601611/
988名無しさん@お腹いっぱい。:2006/09/08(金) 11:59:41
>>985-987
niceです
989名無しさん@お腹いっぱい。:2006/09/09(土) 00:18:05
$?
990名無しさん@お腹いっぱい。:2006/09/09(土) 00:37:42
1
991名無しさん@お腹いっぱい。:2006/09/10(日) 20:35:41
先に前スレ埋めろよage
992名無しさん@お腹いっぱい。:2006/09/10(日) 22:05:23
980越えたらほっときゃ落ちる。
993名無しさん@お腹いっぱい。:2006/09/11(月) 09:05:06
994名無しさん@お腹いっぱい。
ume