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

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

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

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

前スレ
シェルスクリプト総合 その14
http://pc12.2ch.net/test/read.cgi/unix/1233179688/
2名無しさん@お腹いっぱい。:2009/07/01(水) 09:45:39
□関連スレ:
sed
http://pc12.2ch.net/test/read.cgi/unix/1085730992/
正規表現
http://pc12.2ch.net/test/read.cgi/unix/1039165754/
おまえら! shell は何を使っているんですか?
http://pc12.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc12.2ch.net/test/read.cgi/unix/1102921590/

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

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

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

(2004/03) UNIXシェルスクリプトハンドブック 関根 達夫 (著)
http://amazon.co.jp/o/ASIN/4797326522/
(2004/10) UNIXシェルスクリプト逆引き大全333の極意 中橋 一朗 (著)
http://amazon.co.jp/o/ASIN/4798008842/
(2004/11) 仕事に使えるLinuxシェルスクリプト 千葉 真人 (著)
http://amazon.co.jp/o/ASIN/4822282090/
(2004/12) UNIXシェルスクリプトサンプルブック デイブ・テイラー (著)
http://amazon.co.jp/o/ASIN/4797327286/
(2005/02) シェルスクリプト基本リファレンス 山森 丈範 (著)
http://amazon.co.jp/o/ASIN/4774122610/
(2005/04) LinuxWorldスクリプト 月刊リナックス・ワールド総集編 月刊LinuxWorld特別 (著)
http://amazon.co.jp/o/ASIN/4872802349/
(2005/05) UNIXシェルスクリプトコマンドブック 山下 哲典 (著)
http://amazon.co.jp/o/ASIN/4797330635/
(2005/05) わかる&使える UNIX基礎講座 シェルスクリプト編 中井 獏 (著)
http://amazon.co.jp/o/ASIN/4774123625/
4名無しさん@お腹いっぱい。:2009/07/01(水) 09:48:31
□最近のシェルスクリプト本(2)
(2005/07) UNIX シェルスクリプト辞典 川井 義治 (著)
http://amazon.co.jp/o/ASIN/4798109231/
(2005/08) シェルスクリプト ポケットリファレンス bash編 宮原 徹 (著), 川原 龍人 (著)
http://www.amazon.co.jp/o/ASIN/4774124818/
(2005/12) 図解でわかるLinuxシェルスクリプト・正規表現 小泉 修 (著)
http://www.amazon.co.jp/o/ASIN/4534040067/
(2006/01)詳解 シェルスクリプト アーノルド ロビンス (著), ネルソン・H.F. ベーブ(著), Arnold Robbins (原著), Nelson H.F. Beebe (原著), 日向 あおい (翻訳)
http://www.amazon.co.jp/o/ASIN/4873112672/
(2007/3) Linuxシェルスクリプトユーザー便利帳―bash2/bash3対応 伊藤 幸夫 (著), 寒川 陽美(著)
http://www.amazon.co.jp/o/ASIN/4798015954/
(2007/9) ゲームで極める シェルスクリプトスーパーテクニック 山森 丈範
http://www.amazon.co.jp/o/ASIN/4774132020/
(2007/10) UNIX/Linuxシェルスクリプトマスタリングハンドブック 野川 准子
http://www.amazon.co.jp/o/ASIN/4798017957/
5名無しさん@お腹いっぱい。:2009/07/01(水) 09:49:46
□関連書籍と関連リンク:
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
(スペースなどを含むファイル名を正しく処理するため、
findは -exec command {} + を推奨。
他に -print0、xargsは -0オプションという方法もあるがSolaris非対応)
ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl
6名無しさん@お腹いっぱい。:2009/07/01(水) 10:57:14
回答者側の心得:
エスパー以外回答禁止
わからないなら無理に回答せず、黙っていましょう
あなたが回答しなくても、もっと詳しい回答者がより的確に回答してくれます
無理に中途半端な回答をすると、回答者同士で叩き合いが始まり、スレのS/N比が悪化します
7名無しさん@お腹いっぱい。:2009/07/02(木) 00:49:01
2005年は、最近ですか?
8名無しさん@お腹いっぱい。:2009/07/02(木) 09:10:15
地球の歴史からすれば一瞬
9名無しさん@お腹いっぱい。:2009/07/02(木) 11:05:46
中国の歴史からしても1‰
10名無しさん@お腹いっぱい。:2009/07/02(木) 11:13:19
中国400年の歴史?
11名無しさん@お腹いっぱい。:2009/07/02(木) 11:58:24
‰を知らないゆとり乙
12名無しさん@お腹いっぱい。:2009/07/02(木) 12:08:38
中国は建国60年

つまり
>中国の歴史からしても1‰
は0.6年、61日
13名無しさん@お腹いっぱい。:2009/07/02(木) 12:09:35
219日だw
14名無しさん@お腹いっぱい。:2009/07/02(木) 13:14:42
句点の。に見えたわorz
15名無しさん@お腹いっぱい。:2009/07/05(日) 03:20:29
ftpであるディレクトリ配下をまるまるダウンロードするために、
ローカルに同じディレクトリ構造を作りながらファイルを1個づつダウンロードしていくシェルをつくりたいんですが
ftpでのdir結果をファイルに落としてそれを読んでって感じになりますかね?
簡単そうな方法があるとうれしいんですが?
16名無しさん@お腹いっぱい。:2009/07/05(日) 03:32:17
簡単な方法なら wget -r だが
17名無しさん@お腹いっぱい。:2009/07/05(日) 16:48:05
>>12
最近はパーミル習わないのか
18名無しさん@お腹いっぱい。:2009/07/05(日) 18:56:12
>>17
円周率を3と習う世代に無理を言っちゃいかん。
19名無しさん@お腹いっぱい。:2009/07/08(水) 12:49:23
シェルの本で定番は何ですか?
20名無しさん@お腹いっぱい。:2009/07/08(水) 12:59:59
「たった3日でシェルが書ける、シェル自作入門」
〜 シェルで始める Hello World 〜

とか?
21名無しさん@お腹いっぱい。:2009/07/08(水) 13:05:47
「ゲームで極める シェルスクリプトスーパーテクニック 」
シェルスクリプトでここまでできる。ゲームを作ってシェルスクリプトの超技を学べ。
22名無しさん@お腹いっぱい。:2009/07/08(水) 13:08:42
おもわずググっちまったorz
23名無しさん@お腹いっぱい。:2009/07/08(水) 13:17:05
>>22
see >>4
24名無しさん@お腹いっぱい。:2009/07/08(水) 13:18:29
いや、自作の方な
25名無しさん@お腹いっぱい。:2009/07/10(金) 00:53:20
質問です。

たとえば、以下のような仮のhogeコマンドを実行すると、
$ hoge -12 hoge.dat foo.dat bar.dat
パラメタで指定したファイル(hoge.dat、foo.dat、bar.dat)の12行目だけをリストするようなコマンドはないでしょうか?

よろしくお願いします。
26名無しさん@お腹いっぱい。:2009/07/10(金) 01:14:30
シェルスクリプトスレなのに、単一のコマンドでないといかんのか?

でないなら
for i in hoge.dat foo.dat bar.dat; do sed -n 12p "$i"; done
とか、
cat -n hoge.dat foo.dat bar.dat | egrep '^ *12^I'
とか。

「コマンド」風にしたいなら、関数にするなり、別のスクリプトにするなり。
27名無しさん@お腹いっぱい。:2009/07/10(金) 06:43:11
>>26
シェルスクリプトスレで質問してるんだから、

$ hoge -行番号 ファイル...

という形式の引数を渡せるようなシェルを書いて回答してやれよ。

例えば、-12 で渡された引数を、sedの中に 12p の形に渡すためには
文字列の変換処理とかがちょっと必要になるだろ。
そのあたりも含めての質問だと思うが。
28名無しさん@お腹いっぱい。:2009/07/10(金) 09:16:55
シェルを書いて回答してやれよ(笑)
29名無しさん@お腹いっぱい。:2009/07/10(金) 09:47:48
>>26
2つ目の、cat -n の例、それじゃ駄目だろ。
全部のファイルに通し番号で番号が付いちゃうから。
30名無しさん@お腹いっぱい。:2009/07/10(金) 10:04:15
俺のcatはファイルごとに1から始まるぞ
31名無しさん@お腹いっぱい。:2009/07/10(金) 10:06:41
どこの方言OSのcatですか?
32名無しさん@お腹いっぱい。:2009/07/10(金) 10:30:33
OpenSolarisとFreeBSDとNetBSDです。おたくはどちらのご出身で?
33名無しさん@お腹いっぱい。:2009/07/10(金) 10:51:08
>>25
awk 'FNR==12{print}'

が単純でエレガントでは。パイプやループが要らないし。
34名無しさん@お腹いっぱい。:2009/07/10(金) 11:02:28
あ、シェルにするには、

#!/bin/sh

n=$1
shift
awk "FNR==-($n){print}" "$@"


ね。-12とかの引数をマイナスの数とみなして、awkの中で符合反転してる。
35名無しさん@お腹いっぱい。:2009/07/10(金) 13:05:32
シェルにする、とな!
36名無しさん@お腹いっぱい。:2009/07/10(金) 15:19:28
>>32
みえすいた嘘付くな。

$ uname -a
SunOS opensolaris 5.11 snv_111b i86pc i386 i86pc Solaris
$ cat hoge
boke
kasu
$ cat -n hoge hoge
1 boke
2 kasu
3 boke
4 kasu
37名無しさん@お腹いっぱい。:2009/07/10(金) 21:10:31
>>36

$ uname -a
FreeBSD freebsd.example.com 7.2-RELEASE FreeBSD 7.2-RELEASE #2: Fri May 22 10:29:03 JST 2009 [email protected]:/usr/obj/usr/src/sys/GENERIC i386

$ cat -n /etc/ntp.conf /etc/ntp.conf
1 server ntp1.jst.mfeed.ad.jp
2 server ntp2.jst.mfeed.ad.jp
3 server ntp3.jst.mfeed.ad.jp
1 server ntp1.jst.mfeed.ad.jp
2 server ntp2.jst.mfeed.ad.jp
3 server ntp3.jst.mfeed.ad.jp
38名無しさん@お腹いっぱい。:2009/07/10(金) 21:11:39
ちなみに GNU の cat だと連続する。

$ gcat -n /etc/ntp.conf /etc/ntp.conf
1 server ntp1.jst.mfeed.ad.jp
2 server ntp2.jst.mfeed.ad.jp
3 server ntp3.jst.mfeed.ad.jp
4 server ntp1.jst.mfeed.ad.jp
5 server ntp2.jst.mfeed.ad.jp
6 server ntp3.jst.mfeed.ad.jp
39名無しさん@お腹いっぱい。:2009/07/10(金) 21:19:02
ntp.nict.jp 使ってやれよ!
40名無しさん@お腹いっぱい。:2009/07/10(金) 21:51:19
>>39
Stratum 2 で充分だよ。
41名無しさん@お腹いっぱい。:2009/07/11(土) 14:58:42
>>36
> みえすいた嘘付くな。
デフォルトだと/usr/gnu/binにあるcatが動くのも知らんのか。
わざわざインストールしてみたりしたんだろうか。

GNU以外でcat -nの番号が連続する実装ってある?
42名無しさん@お腹いっぱい。:2009/07/11(土) 17:42:32
>>33 >>34 のエレガントな解が出た今となっては、
cat -n(笑)を使うようなかっこ悪い解はどうでもよい。
43名無しさん@お腹いっぱい。:2009/07/11(土) 19:55:16
かっこ悪(笑)
44名無しさん@お腹いっぱい。:2009/07/11(土) 21:51:28
(command)
って
command
ってやるのと何か違います?
45名無しさん@お腹いっぱい。:2009/07/11(土) 22:23:25
デヴャブ
46名無しさん@お腹いっぱい。:2009/07/11(土) 23:47:08
>>39
3msくらい遠い。ジッタは大差ない。
47名無しさん@お腹いっぱい。:2009/07/12(日) 01:38:50
>>44
一例
cd / ; cd /tmp ; pwd
cd / ; ( cd /tmp ) ; pwd
48名無しさん@お腹いっぱい。:2009/07/12(日) 06:48:20
>>47
それは当然知ってる。

コマンド1個だけの場合に、
command と (command) に違いがあるかどうかを聞いてるんだが。
49名無しさん@お腹いっぱい。:2009/07/12(日) 07:00:54
>>44
シェルによっては、シェル自身の最適化で、
( ) を付けていてもサブシェルの必要がない場合はサブシェルにはしないため、
(command) と command に違いはない。
50名無しさん@お腹いっぱい。:2009/07/12(日) 08:32:03
>>48
有る。
51名無しさん@お腹いっぱい。:2009/07/12(日) 08:41:05
ash zsh ksh では (command) と command に違いはないようだ。(トレースして確認)
52名無しさん@お腹いっぱい。:2009/07/12(日) 12:45:20
それらにおいても unset PATH と (unset PATH) は動作が違う気がする
53名無しさん@お腹いっぱい。:2009/07/12(日) 14:01:37
>>52
それはあたりまえ。で、そんなことは聞いてない。

>>49
> 「サブシェルの必要がない場合はサブシェルにはしない」

欲嫁。
54名無しさん@お腹いっぱい。:2009/07/12(日) 14:09:27
>>48
そこまでいくと実装依存的な話になる気がするけど
誰かに " (command) と command に違いは無い " とでも言って欲しいの?

で誰かがそういったところで保証される訳でもなし
" (command) と command " に違いはないから今後は " command "で書こうって話にはならない

逆に " (command) と command " に違いがないから作成中のスクリプトで「今困ってる」っていうなら
そこまで動作を調べられる>>48なら解決方法も分かってるだろ?

バカなの?
55名無しさん@お腹いっぱい。:2009/07/12(日) 14:14:05
バカで〜す
56名無しさん@お腹いっぱい。:2009/07/12(日) 14:48:35
>>54
> 実装依存的な話になる気がするけど

すでに、>>51 が、
> ash zsh ksh では (command) と command に違いはないようだ。

って(実装依存を前提として)答えてるのに、いまさら「気がするけど」って何?

補足したいなら、>>51 が調べた以外のシェルではどうなってるか試して
レポートするべきじゃないの?
57名無しさん@お腹いっぱい。:2009/07/12(日) 17:08:44
        ___ モシャモシャ
        /     \
     /   ⌒  ⌒ \
   /    (●)  (●) \   >56なに言ってんだこいつ
    |   、" ゙)(__人__)" .)|    ___________
   \      。` ⌒゚:j´ ,/ j゙~~| | |             |
__/          \  |__| | |             |
| | /   ,              \n||  | |             |
| | /   /         r.  ( こ) | |             |
| | | ⌒ ーnnn        |\ (⊆ソ .|_|___________|
 ̄ \__、("二) ̄ ̄ ̄ ̄ ̄l二二l二二  _|_|__|_
58amatsuno ◆Z7H81aEWFM :2009/07/13(月) 12:42:35
テストします。
次で質問させて下さい
59amatsuno ◆y1bfd53lWE :2009/07/13(月) 13:02:32
質問させて下さい。

AIX(ksh)で、以下を行おうとしています。
コマンドなどわかりましたら、教えて下さい。
やりたいこと)
csvファイルを読み込んで、データを抜きだす。

csvファイル)
A_table,3,DEF_ind,JKL_ind,TUV_ind,out.txt
のように書かれたリストが複数行有ります。
出力ルール)
csvファイルの第1カラム目に書かれたテーブルを見て、
その中から該当の文字列を呼び出します。
該当の文字列は、
第2カラムで指定された数字分、第3カラム目から先のカラムに書かれたものになります。
(上記の場合、第2カラム目が3なので、第3カラム目から第5カラム目までとなります)
そしてその出力を最終カラムで指定したファイルに出力します。

上記の出力結果は、
DEF_ind
JKL_ind
TUV_ind
をout.txtに出力します。

すいませんが、
わかるかた、宜しくお願いいたします。
60名無しさん@お腹いっぱい。:2009/07/13(月) 13:21:29
>>59
ほれ、

awk -F, '$1=="A_table"{out=$($2+3);for(i=1;i<=$2;i++)print $(i+2)>>out}'
61amatsuno ◆y1bfd53lWE :2009/07/13(月) 13:47:11
>60
ありがとうございます。
ただこれを実行したところ、1箇所だけ問題があるようで、
3カラム目から先が永遠に出力されてしまい、ひたすら空白行が出ます。
第2カラム目で指定しらカラム数で止めるには、
どうすれば良いのでしょうか?
たびたびで申し訳ございませんが、宜しくお願いいたします。
62amatsuno ◆y1bfd53lWE :2009/07/13(月) 13:51:46
>60
もうしわけございません。
61はデータ側の問題でした。
スクリプトは完璧でした。
誠に申し訳ございません。
ありがとうございました。
63名無しさん@お腹いっぱい。:2009/07/13(月) 14:02:13
不正なデータとして、
第2カラムが数値以外だと、ループがおかしくなるな。
そういう場合でも安全なように、

for(i=1;i<=$2;i++)
を、
for(i=1;i<=$2+0;i++)

にしておいた方がいいかも。
64名無しさん@お腹いっぱい。:2009/07/13(月) 14:13:42
>>59 >>60

awkはシェルにあらず。
シェルスレならシェルで解決。


#!/bin/sh

IFS=,
while read line
do
set $line
case $1 in A_table):;;*)continue;;esac
shift
max=$1
shift
eval out=?$$#
i=1
while [ $i -le $max ]; do
echo "$1"
shift
i=`expr $i + 1`
done > "$out"
done
65名無しさん@お腹いっぱい。:2009/07/13(月) 14:19:55
awkも可だよ。
66amatsuno ◆y1bfd53lWE :2009/07/13(月) 14:33:33
>>64

このawkを含んだ処理のkshは、
1.リストからデータの抜き出し
2.抜いたデータのインデックス検索
3.インデックス検索でたデータのバックアップ
4.バックアップデータのソート

になります。
その一部でしたので、
ここで質問させていただきました。
67名無しさん@お腹いっぱい。:2009/07/13(月) 23:23:55
質問させてください。

テキストファイルの最後からN行を削除するにはどうしたらいいでしょうか?
例えばa.txtの最後から2行を削除して保存したいです。よろしくお願いします。
68名無しさん@お腹いっぱい。:2009/07/13(月) 23:36:53
>>67

head -n `expr ?`wc -l < a.txt?` - 2` a.txt
69名無しさん@お腹いっぱい。:2009/07/13(月) 23:39:34
>>68
「保存」してねえぞ

(echo '$-1,$d'; echo wq) | ed -s a.txt
70名無しさん@お腹いっぱい。:2009/07/13(月) 23:41:10
>>68
全角?はなんのおまじない?
71名無しさん@お腹いっぱい。:2009/07/13(月) 23:43:51
>>69
printfコマンドって、使えない環境もあるのかな。
あと「wq」は使えなくて「w」と「q」の2コマンドなら
OKという環境はよくあるね。
72名無しさん@お腹いっぱい。:2009/07/13(月) 23:44:10
>>69
ありがとうございます。
でも結構難しいですね。もうちょっと簡単に短くできませんでしたっけ?
73名無しさん@お腹いっぱい。:2009/07/14(火) 00:47:11
度々すみません。
たしかheadで出来たと思うのですが
a.txtの最後から2行を削除して保存。とか出来ませんでしたっけ?
74名無しさん@お腹いっぱい。:2009/07/14(火) 01:09:23
保存はともかく、
末尾の指定行数をカットできるのはGNUのおせっかいheadくらいじゃないか
75名無しさん@お腹いっぱい。:2009/07/14(火) 07:38:51
>>70
半角バックスラッシュが?に化ける模様。
そう解釈すれば >>68 が正解。
76名無しさん@お腹いっぱい。:2009/07/14(火) 08:06:31
Safari@Macかね?
77名無しさん@お腹いっぱい。:2009/07/14(火) 16:19:50
>>71
>printfコマンドって、使えない環境もあるのかな。

SunOS4 とか。
78amatsuno ◆y1bfd53lWE :2009/07/14(火) 17:52:11
この前はありがとうございました。

もうひとつ教えて下さい。

前回教えていただきましたリストを1行にまとめる方法を教えて下さい。

変更前のファイル(b_ind)の中身);0
DEF_ind
JKL_ind
TUV_ind

変更後のファイル(a_ind)の中身);
DEF_ind,JKL_ind,TUV_ind

上記では3行ですが、実際は1-8のいずれかの行数となります。
このような複数行をカンマ区切りの1行にしたいのです。


DBからバックアップを取る時の指定のインデックスのため、
カンマ区切りの1行記載が必要となりました。

すいませんが知っている方、
宜しくお願いいたします。
79名無しさん@お腹いっぱい。:2009/07/14(火) 18:01:02
>>78
>>60 のスクリプトをちょっと修正すればいいだけだよ。

awk -F, '$1=="A_table"{out=$($2+3);for(i=1;i<$2+0;i++){printf $(i+2) ",">>out}print $(i+2)>>out}'
80名無しさん@お腹いっぱい。:2009/07/14(火) 19:17:06
>>78-79

awkはシェルにあらず。
シェルスレならシェルで解決。


#!/bin/sh

IFS=,
while read line
do
set $line
case $1 in A_table):;;*)continue;;esac
shift
max=$1
shift
eval out='$'$#
i=1
while [ $i -lt $max ]; do
echo -n "$1",
shift
i=`expr $i + 1`
done > "$out"
echo "$1" >> "$out"
done
81名無しさん@お腹いっぱい。:2009/07/14(火) 21:01:22
経験的にsedとawkはrcスクリプトで使われてるのでOK
82名無しさん@お腹いっぱい。:2009/07/14(火) 21:16:41
経験的にイマドキのOSはrcスクリプト自体を使わないのでNG
83amatsuno ◆y1bfd53lWE :2009/07/15(水) 09:40:43
>>79
できました。
ありがとうございます。
84名無しさん@お腹いっぱい。:2009/07/15(水) 16:09:35
>>82
テンプレ読み直してこい
あまりキチガイめいたこと言うなよ
85名無しさん@お腹いっぱい。:2009/07/16(木) 00:53:20
#!/bin/rc もベル研純正シェル
86名無しさん@お腹いっぱい。:2009/07/17(金) 21:39:49
>>34

awkはシェルにあらず。
シェルスレならシェルで解決。


#!/bin/bash

n=$((-$1))
shift
for file in "$@"; {
i=1
while IFS= read -r line
do
((i++ == n)) && {
echo "$line"
break
}
done < "$file"
}
87名無しさん@お腹いっぱい。:2009/07/17(金) 21:52:56
bash使うなよ
88名無しさん@お腹いっぱい。:2009/07/17(金) 22:25:33
bashはLinux板でやれ
89名無しさん@お腹いっぱい。:2009/07/17(金) 22:39:05
>>87-88
bashに過剰反応するな。
kshでもzshでも動くから、bash依存とまでは言えない。


#!/bin/ksh

n=$((- $1))
shift
for file in "$@"; {
i=1
while IFS= read -r line
do
((i++ == n)) && {
echo "$line"
break
}
done < "$file"
}
90名無しさん@お腹いっぱい。:2009/07/18(土) 00:36:24
POSIX準拠だから#!/bin/shでもいいはず、といってみる
91名無しさん@お腹いっぱい。:2009/07/18(土) 01:40:37
/bin/shにはPOSIX shellを置く、なんてことはPOSIXに書いてない
92名無しさん@お腹いっぱい。:2009/07/21(火) 13:50:12
シェルスクリプトでドラッグアンドドロップできる?
93名無しさん@お腹いっぱい。:2009/07/21(火) 14:12:21
>>92
目的は何?
94名無しさん@お腹いっぱい。:2009/07/21(火) 14:32:02
>>93
目的がわかっても答えられないのに逆質すんな。
95名無しさん@お腹いっぱい。:2009/07/21(火) 14:38:10
あぁ、釣りか。

つられちゃったw てへっ?☆
9692:2009/07/21(火) 15:19:06
ちょっと思いついたので聞いてみただけです。目的はありません。
97名無しさん@お腹いっぱい。:2009/07/22(水) 01:01:27
シェルスクリプトで手マンできますか?
98名無しさん@お腹いっぱい。:2009/07/22(水) 01:03:03
>>97
目的は何?
99sage:2009/07/22(水) 15:28:06
質問させてください。
標準入力から入力した値を処理するシェルスクリプト(Bシェル)を作成しています。
入力値に\(バックスラッシュ)が入る可能性があるので、
readのオプションに「-r」を付けて、入力値をすべて受け取れるようにしようと思ったのですが、
「-r」オプションをつけると「英数字以外の文字が使用されています。」というメッセージが出力され
オプションが使えないようです。

例) OS:Solaris10
$ cat aaa.sh
#!/bin/sh
read aaa
echo $aaa

read -r ppp
echo $ppp
$
$ ./aaa.sh
III ←コマンドラインから入力
III ←出力
./aaa.sh: -r: 英数字以外の文字が使用されています。 ←オプションを付けたreadに対してのエラーメッセージ

質問ですが、Bシェルでは、readに「-r」オプションは使えないのでしょうか?
(manを見る限り使えないとは言ってないように思われたのですが)
もし、使えないとすると、何か他に方法をご教授頂けないでしょうか?
(出来る限りBシェルでしたいと考えているのでこのコマンドだけkshで実行するなどでしょうか)
よろしくお願いします。
100名無しさん@お腹いっぱい。:2009/07/22(水) 15:45:09
どうみても使えるとは書いていませんが、何を見ているのでしょうか?
http://docs.sun.com/app/docs/doc/816-5165/sh-1?l=Ja&a=view
101名無しさん@お腹いっぱい。:2009/07/22(水) 16:14:27
>>99
Solarisの/bin/shのreadは、-rには対応していません。

bashか、zshか、kshを使いましょう。
102名無しさん@お腹いっぱい。:2009/07/22(水) 16:18:57
>>99
どうしても /bin/sh だけでやりたい場合、

read -r aaa
の代わりに、

aaa=`head -1`
とやる方法がある。
103sage:2009/07/22(水) 16:32:21
ありがとうございます。
>>100
-r 使えないんですね。
http://docs.sun.com/app/docs/doc/819-1210/read-1?a=view
を見て、標準のオプションなのかなと思い込んでました。

>>101
やっぱり他のシェルにするべきなのか
検討します。

>>102
その様な方法もあるんですね。勉強になります。
今回使用できるのか検討します。
104名無しさん@お腹いっぱい。:2009/07/22(水) 16:32:27
なるほどねえ
105名無しさん@お腹いっぱい。:2009/07/22(水) 16:34:43
>>103
> http://docs.sun.com/app/docs/doc/819-1210/read-1?a=view
sh のとこに -r 書いてないじゃん。
106名無しさん@お腹いっぱい。:2009/07/22(水) 16:39:22
docs.sun.com に書いてあるのは、外部コマンド版の /usr/bin/readじゃん。
中身はkshスクリプト。

これって、結局シェル変数が親プロセスに渡らないから意味ないし、
外部コマンド版の /usr/bin/cd と並んで意味不明コマンドのひとつなんだよな。
107名無しさん@お腹いっぱい。:2009/07/22(水) 16:40:44
>>106
いや、/usr/bin/read 以外にシェルの内部コマンドについても書いてあるよ。
108名無しさん@お腹いっぱい。:2009/07/22(水) 16:44:04
>>107
そんなことは知ってるよ。
そうじゃなくて、/usr/bin/readのアフォさ加減について話題を振りたいわけだが。
109名無しさん@お腹いっぱい。:2009/07/22(水) 16:46:03
>>106の書き方じゃ知ってたかどうかわからんよ。
110名無しさん@お腹いっぱい。:2009/07/22(水) 16:50:18
質問者の >>99 が、shの内部コマンドのreadは使えなくても、
shから/usr/bin/readを呼び出せば使える、と勘違いしていた可能性もあるわな。
111名無しさん@お腹いっぱい。:2009/07/22(水) 17:04:48
>>108
POSIX標準では、
・$0 "$@"で実装できるからシステムの負担にはならない
・いい使い方があるかも知れない
・対称性のため
などと存在理由を説明しています。
112名無しさん@お腹いっぱい。:2009/07/22(水) 17:26:25
>>111
>・対称性のため

なら、なぜ、eval exit export wait などについては
外部コマンド版がないのか合理的な説明をお願いします。
113名無しさん@お腹いっぱい。:2009/07/22(水) 17:35:26
POSIX仕様には書いてありません。
114名無しさん@お腹いっぱい。:2009/07/22(水) 17:41:28
POSIX標準がそう決めた理由を聞いているのに、
「POSIX仕様には書いてありません」は循環論法。
115名無しさん@お腹いっぱい。:2009/07/22(水) 17:53:32
>>111に理由聞いてもしょうがないんじゃね。
116名無しさん@お腹いっぱい。:2009/07/22(水) 17:56:28
使えない外部コマンドがあるくせに、
Solarisでは /usr/bin/[ が削除されてるんだよなぁ。
ほんとわけわからん。
117名無しさん@お腹いっぱい。:2009/07/22(水) 17:57:33
>>116
使いたいの?
118名無しさん@お腹いっぱい。:2009/07/22(水) 17:59:48
v7shをもってきて使いたくなるかもしれないじゃないか
119名無しさん@お腹いっぱい。:2009/07/22(水) 18:16:31
>>117
使いたいかどうかじゃなくて、

/usr/bin/[ は、呼び出せば動作する。
一方、/usr/bin/read とか、/usr/bin/umask とかは readや umaskの動作はしない。

動作するものを削除して、動作しないものを配置することの馬鹿さを言ってるんだが。
120名無しさん@お腹いっぱい。:2009/07/22(水) 18:56:40
あってもなくても害がないならどっちでもいいじゃん。
馬鹿と非難するほどのことでもないと思うけど。
121名無しさん@お腹いっぱい。:2009/07/22(水) 19:39:41
これ、正しいか?

http://docs.sun.com/app/docs/doc/819-1210/read-1?a=view
> 例 1 read コマンドの例
>
> 以下に示す /usr/bin/read の例は、入力ファイルの内容を、各行の先頭フィールドを最後尾に 移動して出力するものです。
> example% while read -r xx yy
> do
> printf "%s %s\n" "$yy" "$xx"
> done < input_file
122名無しさん@お腹いっぱい。:2009/07/22(水) 20:12:29
マニュアルのバグだね。send-prしといてね。
123名無しさん@お腹いっぱい。:2009/07/23(木) 03:48:55
AIX5.2,5.3で2Gを超えるディレクトリをtarで固めるにはどうすればいいのでしょうか?
124名無しさん@お腹いっぱい。:2009/07/23(木) 15:41:48
man tarとすると、ustarヘッダーの書式を使用すると、ファイルサイズを最大8GBにできます。
とあるのですが、具体的にどうすれば2GB以上のファイルをtarで扱えるようになるのでしょうか?
125名無しさん@お腹いっぱい。:2009/07/23(木) 17:05:40
まず、適切な質問の方法を学びましょう。
126名無しさん@お腹いっぱい。:2009/07/23(木) 17:05:54
これは「シェルスクリプト」なのか ?

まぁとりあえずAIX 5.2では可能らしい
ttp://d.hatena.ne.jp/aix_memo/20090202/1233564844

US-TARかどうかは適当に固めたものを用意してcatで確認したらいい
ustarの文字が入ってたらUS-TARの形式

ほかに
ファイルシステムの問題かも知れない。何使ってる ?
/tmpの残り容量の問題かも知れない。十分ある ?
127名無しさん@お腹いっぱい。:2009/07/23(木) 17:52:21
>>125
まず、適切な回答の方法を学びましょう。

わからないなら黙っていましょう。
128名無しさん@お腹いっぱい。:2009/07/23(木) 17:58:09
AIXスレ行け。
129名無しさん@お腹いっぱい。:2009/07/23(木) 18:06:20
>>127
クズは黙ってろ。
130名無しさん@お腹いっぱい。:2009/07/23(木) 18:15:49
>>123 の質問がとくに不適切とも不備な質問とも思えない。
実際にAIXで2GB超のファイルをtarで固めた経験がある者なら
>>123 を見ただけで即答できるはずだ。

質問の仕方に注文を付けたり、さらに「○○の結果は?」とか追加情報を求める回答者は
その追加情報があっても答えられないダメ回答者。
131名無しさん@お腹いっぱい。:2009/07/23(木) 18:17:42
おかしな煽り野郎が張り付いている模様です。

しばらく放置しましょう。てか、元の質問がシェルスクリプトの質問じゃねぇし。
132名無しさん@お腹いっぱい。:2009/07/23(木) 18:18:36
シェルスクリプトスレで質問するのは適切ではない。言い訳してないで。消えろ。
133名無しさん@お腹いっぱい。:2009/07/23(木) 18:20:43
その tarを シェルスクリプトの中で使う予定なんですぅ、、
134名無しさん@お腹いっぱい。:2009/07/23(木) 18:22:24
言い訳してないで。消えろ。カス。
135名無しさん@お腹いっぱい。:2009/07/23(木) 18:27:49
AIX5.2とAIX5.3です。
以下のようなシェルを発行したところ、
dir以下に2GBを越えるファイルがあるとエラーになります。
どのように修正すればよろしいか?

#!/bin/sh
tar cvf hoge.tar dir
136名無しさん@お腹いっぱい。:2009/07/23(木) 18:36:21
詰まらん。消えろ。クズ。
137名無しさん@お腹いっぱい。:2009/07/23(木) 20:43:57
>>126
ありがとうございます。
USTARの文字ははいっていました。
TMPには空きがあります。
ファイルシステムについては、よくわかりません。
138名無しさん@お腹いっぱい。:2009/07/23(木) 21:51:51
>>137
2G制限ならulimitを確認。
8G制限はどうにもならないのでGNU tarでも使ったら?
で「シェルスクリプトで必要だから」という理由で環境依存の
質問をシェルスクリプト一般のスレでやっても煙たがられるだけ
というありがたい指摘を、そろそろ受けいれたらどうかな?
139名無しさん@お腹いっぱい。:2009/07/23(木) 23:39:41
>>138
ありがとうございます。
今帰りなので、週末に調べてみます。
140名無しさん@お腹いっぱい。:2009/07/26(日) 07:59:26
ulimitはunlimitedでした。引続きお願いします。
141名無しさん@お腹いっぱい。:2009/07/29(水) 12:57:14
スレ違いだと何度いったらわかるんだ。池沼。消えろ。
142名無しさん@お腹いっぱい。:2009/07/31(金) 20:12:20
すみません、お力を貸してください。
aaa.txtの中身が、

aa\n
bb\n
cc\n

として、これをシェルスクリプトで

unko=$(cat aaa.txt)
echo ${unko}

とすると、

aa bb cc

と改行がスペースに置換されていますが、これを改行のまま格納することはできないでしょうか。

上記はあまりいい例ではないので「cat aaa.txt」でいいだろ、と思われるかと思いますが。。。
ftp -nvとかの標準出力を一旦変数に入れといて、後から結果解析及び出力したく、しかも、諸事情でtmpファイル(←すみません、ちんぽファイルではなくて一時ファイルです)を作るのはNGなので、なんとか改行をスペースに置換させないで変数に入れて実現したいのです。

どなたか、ご教示お願いいたします。OSは、HP-UX、Bashです。よろしくお願いします。
143名無しさん@お腹いっぱい。:2009/07/31(金) 20:48:07
>>142
echo "$unko"
144名無しさん@お腹いっぱい。:2009/08/01(土) 23:50:17
シェルを2つ以上コマンドで開くことは出来る?
今はパネルからクリックしてるので大変。
でも、コマンド売っても出てこない><
ちなみに端末エルミネーターはBASH。
145名無しさん@お腹いっぱい。:2009/08/01(土) 23:52:35
はいはい 15点
146名無しさん@お腹いっぱい。:2009/08/02(日) 05:00:19
>>142
配列(パイオツじゃないよ)使うんじゃだめなの?
147名無しさん@お腹いっぱい。:2009/08/02(日) 09:40:59
148名無しさん@お腹いっぱい。:2009/08/02(日) 13:13:29
>>142
シェル変数の展開時は、ダブルクォートでくくるのが原則。
それで、改行もスペースもそのまま保存される。

逆に、単純に展開する場合は ${ } でくくる必要はない。
149名無しさん@お腹いっぱい。:2009/08/03(月) 00:52:02
. や source で起動されても、自分の名前を取れる方法ありますか?

当然$0だとだめなわけですが

[root@miu tmp]# cat a.sh
#!/bin/sh

echo $0

[root@miu tmp]# source a.sh
bash
[root@miu tmp]#
150名無しさん@お腹いっぱい。:2009/08/03(月) 01:39:05
. や source は起動されてないし
151名無しさん@お腹いっぱい。:2009/08/03(月) 02:40:17
そこをなんとか・・
152名無しさん@お腹いっぱい。:2009/08/03(月) 04:37:49
bash依存

$ echo 'echo $BASH_SOURCE' > /tmp/t.sh
$ . /tmp/t.sh
/tmp/t.sh
153名無しさん@お腹いっぱい。:2009/08/03(月) 06:26:10
>>152
bash3以降依存だね。bash2だと動作しない。
154名無しさん@お腹いっぱい。:2009/08/03(月) 07:19:14
>>149
先頭で自分の名前を変数に代入すれば?
155名無しさん@お腹いっぱい。:2009/08/03(月) 07:24:49
>>154
全然解決になりません。
同じスクリプトを複数のファイル名でハードリンクしていて、
呼ばれた名前によって動作を切替えたいので。
156名無しさん@お腹いっぱい。:2009/08/03(月) 07:28:15
もう $BASH_VERSION チェックして $BASH_SOURCE 使えよ。
157名無しさん@お腹いっぱい。:2009/08/03(月) 08:19:17
そもそも.でもsourceでも名前わかってなきゃ呼べないよね
呼べるってことは名前わかってるじゃん
あほじゃないの?
$_とかでもいいんじゃないの?
158名無しさん@お腹いっぱい。:2009/08/03(月) 08:39:57
>>157
惜しいけど、

hoge=file
source $hoge

みたいに、変数経由で呼ぶと、
$_ では名前を取得できないから NG。
159名無しさん@お腹いっぱい。:2009/08/03(月) 08:43:04
>>157
シェル依存。

ashとかでは、sourceファイル内一発目の $_ は、$0 と同じ値になってる。よって不可。
160名無しさん@お腹いっぱい。:2009/08/03(月) 20:41:06
>>155
>同じスクリプトを複数のファイル名でハードリンクしていて、
>呼ばれた名前によって動作を切替えたいので。
それは(+sourceした時にまで対応したいという)発想に無理があるのでは
161名無しさん@お腹いっぱい。:2009/08/03(月) 20:48:50
>>160
わからないなら黙ってろ
162名無しさん@お腹いっぱい。:2009/08/03(月) 21:10:02
シェル非依存な方法はないから。
163名無しさん@お腹いっぱい。:2009/08/04(火) 01:00:01
関数内のexitをreturnと同じように振舞わせる方法はないでしょうか。

現場で共通利用している共通関数の定義ファイルを . で読込んで使っているのですが、、、
お目当ての共通関数は、関数内でエラーだった場合、ログ吐いてexitまでしてしまい、困りました。
エラーコードで返してくれさえすれば、処理自体はそのまんま使いたいのですが。。。

その共通関数の戻り値はreturnでは返されず、共通関数内で定義した変数に格納され、呼び元でその変数を使う作りになっています。
何卒よろしくお願いします。
164名無しさん@お腹いっぱい。:2009/08/04(火) 01:02:56
質問です。
以下のようなファイルhoge.datがあるとします。
------------------------
~$ cat hoge.dat
usa\newyork
japan\tokyo
korea soul
------------------------
このhoge.datを、以下のようなスクリプトで読み込んでから、出力してみたのですが、
円マーク(\)が表示されなくなります。
------------------------
~$ cat hoge.sh
#!/bin/sh
IFS='
'
while read line
do
echo "$line"
done < hoge.dat
---------------------------
実行結果
---------------------------
~$ ./hoge.sh
usanewyork
japantokyo
korea soul
---------------------------
円マーク(¥)も表示されるようにするにはどうしたらよいでしょうか?
165名無しさん@お腹いっぱい。:2009/08/04(火) 06:39:16
>>164
read -r


あと、円マークじゃなくてバックスラッシュが表示されるように設定しろ
166名無しさん@お腹いっぱい。:2009/08/04(火) 06:44:51
>>163
alias exit=return
. hoge
unalias exit
167名無しさん@お腹いっぱい。:2009/08/04(火) 08:37:30
>>163
result=`. hoge;echo \$result`
168名無しさん@お腹いっぱい。:2009/08/04(火) 08:43:41
>>167
「.」でソースしてるファイル内で「関数定義」をしているので、
それだとサブシェル扱いになるので、リターンすると関数定義が消えてしまうので
解決になりません。(戻り値が必要なのではありません)
169名無しさん@お腹いっぱい。:2009/08/04(火) 08:58:38
条件後出しすんなよ。そういうことなら
(共通関数)

条件後出しのお代りか?
170名無しさん@お腹いっぱい。:2009/08/04(火) 09:06:40
>>169
後出しじゃないだろ

>>163
>共通関数の定義ファイル
171名無しさん@お腹いっぱい。:2009/08/04(火) 09:09:35
>>166 で解決でしょ。
sourceしたファイル内で returnできるshには、aliasもあるから。
172名無しさん@お腹いっぱい。:2009/08/04(火) 09:21:24
見てきたように嘘をつくなあ、純正shはreturnあって、alias無い。
173名無しさん@お腹いっぱい。:2009/08/04(火) 09:27:17
>>172
> 「sourceしたファイル内で return」

純正shは、関数の中でしかreturnできない。
sourceしたファイル内で returnすると、純正シェルではエラーになる。

嘘はお前。
174名無しさん@お腹いっぱい。:2009/08/04(火) 09:58:18
嘘つきはどちらでしょうか?
> お目当ての共通関数は、関数内でエラーだった場合、ログ吐いてexitまでしてしまい、困りました。
175163:2009/08/04(火) 12:35:58
みなさんたくさんのレスありがとうございます。

>>166を使って相談してみたところ怪訝な顔をされてしまい、
結局「共通関数のコピペで別の関数(exit→returnだけ)を作れ」
となってしまいました。。。
※個人的には、その方がよっぽど怪訝な顔したいですが。。。

とても勉強になりました。ありがとうございました!
176名無しさん@お腹いっぱい。:2009/08/04(火) 13:39:20
>>172
質問者(>>175)が、「>>166(alias)を使って相談してみた」って言ってるから、
やっぱりaliasが使えるシェルだったということで、>>171 が正しかったじゃん。
177名無しさん@お腹いっぱい。:2009/08/04(火) 13:44:25
たまたま使えただけ。↓は赤っ恥全開の嘘。
> sourceしたファイル内で returnできるshには、aliasもあるから。
178名無しさん@お腹いっぱい。:2009/08/04(火) 13:45:27
>>177
「sourceしたファイル内で returnできるshには、aliasもある」は正しいが。
179名無しさん@お腹いっぱい。:2009/08/04(火) 13:50:33
恥の上塗りミットも茄子。
シェル関数内でのexitを書き換える為には↓これでは十分じゃないから。
> sourceしたファイル内で returnできるshには、aliasもあるから。
180名無しさん@お腹いっぱい。:2009/08/04(火) 13:53:53
>>179
おまえ、意味取り違えてるよ。

シェル関数じゃなくて、sourceしたファイルを中途終了するときに、
returnが使えるんだよ。(純正シェルだと使えない)
(exitを使うとsourceした元のシェル自体が終了するので使えない)

そういう新しい機能のreturnが使えるシェルなら、aliasも使える。
181名無しさん@お腹いっぱい。:2009/08/04(火) 13:58:38
>>180
とぼけようと必死だな。質問者のお題(>>163)は関数内のexitを再定義すること。
> 関数内のexitをreturnと同じように振舞わせる方法はないでしょうか。

「sourceしたファイル内でのreturn」は全然関係ない。
182名無しさん@お腹いっぱい。:2009/08/04(火) 14:08:28
>>172 は、
>>171 「sourceしたファイル内で returnできるshには、aliasもある」
のことを「嘘」だと言った。

その >>172 は間違い。
(>>172 では、元の質問のことには触れられていないから、
>>171 自体を質問に関係なく「嘘」と決めつけている。それは当然間違い)

「sourceしたファイル内で returnできるshには、aliasもある」は正しい。
183名無しさん@お腹いっぱい。:2009/08/04(火) 14:09:10
彼らは何のために戦っているのだろう。
184名無しさん@お腹いっぱい。:2009/08/04(火) 14:11:55
なぜ「彼」と限定できるんですか? エスパーですか?
185名無しさん@お腹いっぱい。:2009/08/04(火) 14:13:25
エスパーですよ。
186名無しさん@お腹いっぱい。:2009/08/04(火) 14:14:22
>>173 に指摘されるまでは、
>>172 は関数外での returnの用法を知らなかったんだろう。
187名無しさん@お腹いっぱい。:2009/08/04(火) 14:14:44
>>182
無様杉。引っ込んでろ。
188名無しさん@お腹いっぱい。:2009/08/04(火) 14:17:13
>>187
一般的に、>>187 みたいに論理的な指摘が一切含まれていない暴言を先に吐いた方が
議論の負け。
189名無しさん@お腹いっぱい。:2009/08/04(火) 14:19:02
>>186
お前も引っ込んでろ。
190名無しさん@お腹いっぱい。:2009/08/04(火) 14:20:12
一般的に、言い訳満開の>>176で既に大敗。
191名無しさん@お腹いっぱい。:2009/08/04(火) 14:22:19
>>190
「一般的に」の日本語の用法を間違っています。
192名無しさん@お腹いっぱい。:2009/08/04(火) 15:10:29
一般的に、「日本語の用法」とか関係ないところにケチ付け始めたところで負け。
193名無しさん@お腹いっぱい。:2009/08/04(火) 15:14:22
用法、容量を守ってご使用ください。
194名無しさん@お腹いっぱい。:2009/08/04(火) 15:55:43
YO! HO!
195名無しさん@お腹いっぱい。:2009/08/04(火) 15:59:03
用法・用量な
196名無しさん@お腹いっぱい。:2009/08/04(火) 19:46:10
追試してみるから純正shってのがどれなのか教えてくれ
197名無しさん@お腹いっぱい。:2009/08/04(火) 19:50:56
>>180が言うところの「そういう新しい機能のreturnが使えるシェルなら、
aliasも使える。」じゃないシェルだろ。
198名無しさん@お腹いっぱい。:2009/08/04(火) 20:13:58
>>196 そりゃ純正というくらいだから Sixth Edition とか Seventh Edition とかについてきたやつじゃないの
199名無しさん@お腹いっぱい。:2009/08/04(火) 20:16:29
純正シェルには、return以前にシェル関数自体がないから。
200名無しさん@お腹いっぱい。:2009/08/04(火) 20:19:43
Solaris10の/bin/sh: ×「.」の中でのreturn / × alias
FreeBSDの/bin/sh: ○「.」の中でのreturn / ○ alias
bash: ○「.」の中でのreturn / ○ alias
zsh: ○「.」の中でのreturn / ○ alias
ksh: ○「.」の中でのreturn / ○ alias
201名無しさん@お腹いっぱい。:2009/08/05(水) 00:56:33
FreeBSDの/bin/shってボーンシェルじゃないの?もしかして
202名無しさん@お腹いっぱい。:2009/08/05(水) 01:33:46
もしかしても糞もなくボーンシェルじゃありません
203名無しさん@お腹いっぱい。:2009/08/05(水) 02:09:21
BシェルというのはBourne Shell=/bin/sh だと思ってたけど違うの?
ボーンシェルでない/bin/shというのはBシェルでもなく一体なんなんですか?
204名無しさん@お腹いっぱい。:2009/08/05(水) 02:17:07
>>1読めよ
205名無しさん@お腹いっぱい。:2009/08/05(水) 06:22:27
Bourne Shell ≠ ボーンシェル
Bourne Shell = ブールネシェル
206名無しさん@お腹いっぱい。:2009/08/05(水) 17:46:17
>>201 >>203
どのバージョンからかだったかは忘れたが、
FreeBSD や NetBSD の /bin/sh は Bourne Shell ではなくその互換再実装の Almquist Shell だよ

>AUTHORS
> This version of sh was originally written by Kenneth Almquist.
207名無しさん@お腹いっぱい。:2009/08/05(水) 19:45:44
386BSDはすでにashだった。
208名無しさん@お腹いっぱい。:2009/08/06(木) 06:48:56
>>206
なるほど、ashはbourne shellであってはいけないのか。
http://en.wikipedia.org/wiki/Bourne_shell
> Due to copyright issues surrounding the Bourne Shell as it was
> used in historic CSRG BSD releases, Kenneth Almquist developed
> a clone of the Bourne Shell
209名無しさん@お腹いっぱい。:2009/08/06(木) 15:38:32
44,555
34,567
0
143,456
1,235,004
44
0
0
55
みたいな数字の列があるのですが、これのトータルを計算したいと思ってます。
問題は数字の3桁ごとに,が入ってることなのですが、Bashスクリプトでこれを取りつつ合計を計算
する方法ってあるでしょうか?
どうかよろしくお願いします。
210名無しさん@お腹いっぱい。:2009/08/06(木) 15:54:06
sed -e "s/,//g"
で出来ましたが、合計の計算ができません。
44555
34567
0
143456
1235004
44
0
0
55
から、全部の合計を出したいです。
211名無しさん@お腹いっぱい。:2009/08/06(木) 15:57:01
sed -e "s/,//g" | xargs echo | sed -e "s/ /+/g" | bc
これで出来た。
212名無しさん@お腹いっぱい。:2009/08/06(木) 15:59:44
何万行もあると破綻しそうな
213名無しさん@お腹いっぱい。:2009/08/06(木) 16:17:27
>>209

#!/bin/bash

n=0
while IFS=, read line
do
((n += line))
done
echo $n
214名無しさん@お腹いっぱい。:2009/08/06(木) 16:25:39
>>213
それ、カンマの除去処理がおかしい


>>209

#!/bin/bash

n=0
while read line
do
((n += ${line//,/}))
done
echo $n
215名無しさん@お腹いっぱい。:2009/08/06(木) 17:07:33
{ echo 0; sed -e 's/,//g' -e 's/$/+/'; echo p; } |dc
216名無しさん@お腹いっぱい。:2009/08/06(木) 17:12:10
sed 's/,//g'| paste -s -d+ | bc
217名無しさん@お腹いっぱい。:2009/08/06(木) 17:22:53
>>215
それだったら、

sed 's/,//g; s/$/+/; $s/$/0/' | bc

の方が簡潔。
218名無しさん@お腹いっぱい。:2009/08/06(木) 17:31:47
>>217
bcだと、途中改行できないから不可。
sedでさらに行末にバックスラッシュを付加してやればそれでも動くかな。

>>215
echoとsedと一緒に使うと無駄。

sed '1s/^/0 /; s/,//g; s/$/+/; $s/$/p/' | dc

でいいだろ。
219名無しさん@お腹いっぱい。:2009/08/06(木) 17:34:20
>>217
実行してから因縁つけろ。カス

sed 's/,//g; s/$/+/; $s/$/0/' file| bc
(standard_in) 2: syntax error
(standard_in) 3: syntax error
(standard_in) 4: syntax error
(standard_in) 5: syntax error
(standard_in) 6: syntax error
(standard_in) 7: syntax error
(standard_in) 8: syntax error
(standard_in) 9: syntax error
220名無しさん@お腹いっぱい。:2009/08/06(木) 17:42:32
みなさん、質問を良く読みましょうね。
>>209 さんは、
> Bashスクリプトで
って言ってますよ。

よって、>>214 が正解ですね。

すでに正解が出ているのに >>215 以降に何か書いてるおともだちがいますが、
Bashも使っていないし、質問の答としてはふさわしくありませんね。
221名無しさん@お腹いっぱい。:2009/08/06(木) 17:44:22
Bash: not found だから>>214は不正解だな。
222名無しさん@お腹いっぱい。:2009/08/06(木) 17:58:51
>>221
そういうことしか言えないようだから >>214 が正解だな
223名無しさん@お腹いっぱい。:2009/08/06(木) 23:36:58
>>218
それで処理すると、
dc: stack empty
dc: stack empty
dc: stack empty
と出ます。
224名無しさん@お腹いっぱい。:2009/08/07(金) 07:05:39
>>223
スペースも含めてちゃんとコピペしろ。
225名無しさん@お腹いっぱい。:2009/08/10(月) 15:20:35
シェルスクリプトって、ほんとツンデレだよな。
理解するまで四苦八苦ツンツンしてるくせに、一旦わかってしまうと、とたんにデレデレ。
226名無しさん@お腹いっぱい。:2009/08/10(月) 16:25:01
別にそれはシェルスクリプトに限ったことでもなかろう
227名無しさん@お腹いっぱい。:2009/08/11(火) 18:17:01
しばらく使わないと忘れちゃってまたツン期に入るのが…
228名無しさん@お腹いっぱい。:2009/08/11(火) 23:15:11
bashで変数の置換と切り出しとかを一緒にできないですかね?

echo ${HOGE//a/A}
echo ${HOGE:0:8}

これをひとつにしたい感じです
229名無しさん@お腹いっぱい。:2009/08/12(水) 00:02:16
もちろん、できません
230名無しさん@お腹いっぱい。:2009/08/15(土) 15:52:19
bash です。

date | read HOGE

これやっても変数 HOGE が空なんだけど、どうして?
231名無しさん@お腹いっぱい。:2009/08/15(土) 15:55:14
readはサブシェルで実行されて瞬殺で終了するから。
232230:2009/08/15(土) 16:05:15
>>231
即答サンクス!

そうだった、パイプラインはそれぞれサブシェルで動くんだった。
つーことは、date 出力を変数に入れるには、素直に

HOGE=`date`

でよい、と。
233名無しさん@お腹いっぱい。:2009/08/15(土) 16:57:18
>>232
× パイプラインはそれぞれサブシェルで動く
○ 1個以上のパイプを含んだパイプラインはそれぞれサブシェルで動く

普通のコマンド1個だけでも「パイプライン」なので。
234232:2009/08/15(土) 17:37:04
>>233
訂正サンクス!
確かに。

サブシェルと「環境」について、いまいち理解できない…
235名無しさん@お腹いっぱい。:2009/08/15(土) 17:47:10
バッドノウハウよりもっと有用な事を覚えよう
236名無しさん@お腹いっぱい。:2009/08/15(土) 20:09:24
バッドノウハウを覚えることは有益
バッドノウハウをあれこれ考えることは無益
237名無しさん@お腹いっぱい。:2009/08/15(土) 20:50:30
バッドノウハウって、具体的に何のこと言ってるの?
238名無しさん@お腹いっぱい。:2009/08/15(土) 20:55:52
定義にこだわるふりをして、干されている現実から目をそらす>>233の手法。
239名無しさん@お腹いっぱい。:2009/08/17(月) 06:30:05
la -Alでファイルサイズとファイル名のみほしいので
la -Al | cut -d " " -f 5,9
とかやるとうまくいきません。どうすればいいですか?
240名無しさん@お腹いっぱい。:2009/08/17(月) 06:43:43
>>239
cutでうまういかないのは、複数のスペースがすべて「区切り」とみなされるから。

awk使った方がいい

ls -Al | awk '{print $5 " " $9}'
241名無しさん@お腹いっぱい。:2009/08/17(月) 07:29:22
>>240
awkはシェルにあらず。
シェルスレなんだからシェルでやれ

ls -lA | while read line; do set -- $line; echo $5 $9; done
242名無しさん@お腹いっぱい。:2009/08/17(月) 08:51:13
>>239>>240
あざーす
もうひとつ聞きたいのですが
文字列の先頭の1文字目のみ切り出す
ってどうやればいいでしょうか?
val1=abc
val1=`expr "$val1" : "\(.\).*"`
とかでいいですか?
243名無しさん@お腹いっぱい。:2009/08/17(月) 09:38:43
>>242
bashなら、

var=abc
echo "${var:0:1}"
244名無しさん@お腹いっぱい。:2009/08/17(月) 12:23:11
>>243
あざーす
245名無しさん@お腹いっぱい。:2009/08/17(月) 17:19:44
>>241
> awkはシェルにあらず。
> シェルスレなんだからシェルでやれ
濡れた。
アッーーーー
246名無しさん@お腹いっぱい。:2009/08/17(月) 21:32:10
便乗質問。

>>241 の手法に感心したんだけど、わざわざ set で位置パラメータを再設定して
使うっていう方法は、普通にアリなの?
set はシェル動作制御用コマンドの側面が強くないですか? そうでもない?
247名無しさん@お腹いっぱい。:2009/08/17(月) 21:51:50
>>246
set使わずに、
↓でもいいんだけどね

ls -lA | while read x x x x s x x x f x; do echo $s $f; done
248名無しさん@お腹いっぱい。:2009/08/17(月) 23:25:45
(純正シェルで)使える機能は何でも使うのがシェルプログラミングの作法。
249246:2009/08/17(月) 23:51:47
>>247
これはすげえ! 強引!w

>>248
そうかあ。使えるものは使う、と。自分専用ツールならなおさらだね。

ううむ、シェルは深いなあ。でも楽しい。
覚えると明らかに生産性が上がる。
250名無しさん@お腹いっぱい。:2009/08/18(火) 00:57:44
>>247
すげえ・・・目から鱗・・・
251名無しさん@お腹いっぱい。:2009/08/18(火) 11:43:54
>>247はわりとよく見かけると思うが……。
>>241の方法は元々の$@が破壊されるのでよほどのことがないかぎりやらない。
252名無しさん@お腹いっぱい。:2009/08/18(火) 11:51:59
>>251
>>241 の方法を使っても、readのパイプがサブシェルだから、
それを抜けたら $@ は破壊されていない。
253名無しさん@お腹いっぱい。:2009/08/20(木) 01:48:49
echo に渡すのがスマートでないですか?

ls -Al | xargs -l echo | cut -d" " -f5,9
254名無しさん@お腹いっぱい。:2009/08/20(木) 01:51:38
というか
ls -Al | xargs -l | cut -d" " -f5,9
これでよかった・・・・
255名無しさん@お腹いっぱい。:2009/08/20(木) 16:46:23
で、改行、空白を含むファイル名を正しく扱えるのはどの回答?
256名無しさん@お腹いっぱい。:2009/08/20(木) 16:52:37
>>255
ls 使ってる時点で改行、空白を含むファイル名は最初から考えられてない。
257名無しさん@お腹いっぱい。:2009/08/20(木) 21:13:57
コマンドなしのxargsってどういう意味?
258名無しさん@お腹いっぱい。:2009/08/20(木) 21:16:00
>>257
2個以上のスペースを1個だけにするもの。

>>240 も参照。
259名無しさん@お腹いっぱい。:2009/08/20(木) 21:26:14
echoの省略形
260名無しさん@お腹いっぱい。:2009/08/20(木) 21:32:38
>>259
それは知ってるよ(>>253)。そのechoが何の意味があるかの質問だろ。
261名無しさん@お腹いっぱい。:2009/08/21(金) 09:59:17
だから2個以上のスペースを1個にするんだって。
262名無しさん@お腹いっぱい。:2009/08/21(金) 10:10:39
そもそも human readableな ls の output を filtering するというのが
bad design なんんだよな。
次期 ls には是非、
--format='%f %s' 的な optionを appendしていただくことを wishする。
263名無しさん@お腹いっぱい。:2009/08/21(金) 10:14:50
stat(1)あたりをposixに入れる方が早くないか?
264名無しさん@お腹いっぱい。:2009/08/21(金) 12:51:07
>>262
英語使って、かっこつけているつもり?
265名無しさん@お腹いっぱい。:2009/08/21(金) 16:40:18
ルー語はカッコよかったんか
266名無しさん@お腹いっぱい。:2009/08/22(土) 11:36:50
csh の存在価値はなんだろう。
bash でいいじゃん。
267名無しさん@お腹いっぱい。:2009/08/22(土) 12:07:49
それはこっちで

C shell 撲滅委員会
http://pc12.2ch.net/test/read.cgi/unix/1094041299/
268名無しさん@お腹いっぱい。:2009/08/22(土) 18:50:28
bashが無駄に重くなっていってくれたおかげで
tcshは無難に使えるログインシェルという位置を確保できたw
そしていろいろと便利な設定をするためにcshスクリプトの書き方を知る必要がある。
269名無しさん@お腹いっぱい。:2009/08/22(土) 19:37:03
ksh93を使ってる俺は勝ち組
270名無しさん@お腹いっぱい。:2009/08/25(火) 17:34:40
質問です
1 12 123
1 2 23
のようなテキストを
xx1xx12x123
xx1xxx2xx23
(x=空白)
のように幅を揃えるにはどうすればいいですか?
271名無しさん@お腹いっぱい。:2009/08/25(火) 17:44:42
awk '{printf("%3d%3d%4d\n",$1,$2,$3);}' < test.txt
272名無しさん@お腹いっぱい。:2009/08/25(火) 17:50:50
>>271
勝手に桁数決め打ちしていいのか?
同じカラム上にある最大桁数をサーチした上で %*d (*は数字)に
しなければならないという質問だと思うが。
273名無しさん@お腹いっぱい。:2009/08/25(火) 17:57:58
それは質問者が言うべきこと。
274270:2009/08/25(火) 18:09:22
すいません。実際の数字は一行に数千あって行も数千あります。
でも一つの区切りの中の数字は三桁までです。
275名無しさん@お腹いっぱい。:2009/08/25(火) 18:15:40
絵に描いたような後出しw
276ruby,perl等のほうが早いかも:2009/08/25(火) 19:34:46
>>274
一行にある数字の数は固定している?それとも変動もある?
277名無しさん@お腹いっぱい。:2009/08/25(火) 21:29:45
>>270 >>274

#!/bin/sh
while read line
do
set $line
while [ $# -ge 1 ]
do
printf '%3d ' $1
shift
done
echo
done
278名無しさん@お腹いっぱい。:2009/08/25(火) 21:30:54
>>276
固定してます。
279名無しさん@お腹いっぱい。:2009/08/25(火) 21:36:54
>>277
だったら forの方がいい。


#!/bin/sh
while read line
do
for n in $line
do
printf '%3d ' $n
done
echo
done

>>278
直前の回答読めよ。
280名無しさん@お腹いっぱい。:2009/08/25(火) 21:44:07
すいませんリロードしてませんでした。
上手く行きそうです。みなさんありがとうございました。
281名無しさん@お腹いっぱい。:2009/08/26(水) 00:47:55
>>279
| sed 's/ $//'したいな
282名無しさん@お腹いっぱい。:2009/08/26(水) 06:48:36
>>279
いや、行末のスペースを取ることを考えると、
>>277 の方式の方がいいんだよ。


#!/bin/sh
while read line; do
set -- $line
while [ $# -ge 2 ]; do
printf '%3d ' $1
shift
done
if [ $# -eq 1 ]; then
printf '%3d' $1
fi
echo
done
283名無しさん@お腹いっぱい。:2009/08/27(木) 11:50:33
execute.shellを実行し、psコマンドを実行すると以下のように表示されます。

PID TTY TIME CMD
13219 pts/1 00:00:00 bash
17938 pts/1 00:00:30 java
17222 pts/1 00:00:37 java
25353 pts/1 00:00:00 ps

CMDのjavaがexecute.shellのプロセス名みたいなんですが、
これをexcecuteと表示させることは可能ですか?
284名無しさん@お腹いっぱい。:2009/08/27(木) 12:28:06
>>283
コマンド自身がargv[0]を書き換えてるか、
またはexecute.shellは単なる起動スクリプトで、実際にjavaがexecされてるから、
元のコマンドのexcecuteを表示させることは無理。
285名無しさん@お腹いっぱい。:2009/08/27(木) 12:39:26
コマンドライン引数にかけらが有るかもしれない。
ps -a
286名無しさん@お腹いっぱい。:2009/08/27(木) 13:59:26
>>284
了解です。レスありがとうございます。

>>285
ありがとうございます。
ps -aしてみましたが表示は変わらなかったです。


2重起動を防止するため、プロセス名を取得しようとしていたのですが無理のようなのであきらめました。
PID番号付きのファイルを作成することにしました。ファイルはなるべく作りたくなかったのですが。
287名無しさん@お腹いっぱい。:2009/08/27(木) 17:29:53
sedコマンドをつかって
aaa|abc|bef|efg||||aa
の文字列(|は区切り文字)の一番最後のフィールドのaaの部分をbcdに変えて
aaa|abc|bef|efg||||bcd
と出力させるにはどのようにすればよいのでしょうか?
288名無しさん@お腹いっぱい。:2009/08/27(木) 17:48:38
最後はどれもbcdに変えるのか、aaになってるものだけ変えるのか
289名無しさん@お腹いっぱい。:2009/08/27(木) 17:54:37
>>287
sed指定の質問ならsedスレへ

sed
http://pc12.2ch.net/test/read.cgi/unix/1085730992/
290名無しさん@お腹いっぱい。:2009/08/27(木) 17:57:51
>>287

sed 's/|[^|]*$/bcd/'
291名無しさん@お腹いっぱい。:2009/08/27(木) 17:58:17
sygwinでのbashなんですが
declare -a userhome
userhome=($(cut -d":" -f6 /etc/passwd))
とすると、/etc/passwdの6番目の要素がnullの場合
配列に何も代入されません。
何か文字を代入したい場合はどうすればいいんでしょうか?
292名無しさん@お腹いっぱい。:2009/08/27(木) 18:04:24
>>291

userhome=($(cut -d":" -f6 /etc/passwd | sed 's/^$/none/'))
293名無しさん@お腹いっぱい。:2009/08/27(木) 18:10:41
>>290
ありがとうございます
294名無しさん@お腹いっぱい。:2009/08/27(木) 18:15:40
#!/bin/sh
s="~/work/"
ls $s

としても、 No such file or directoryと言われます。
たぶん~が展開されていないと思うのですが、
どうすれば展開できますか?
295名無しさん@お腹いっぱい。:2009/08/27(木) 18:26:29
>>294

eval ls $s

または、最初から
s=?/work/
で代入。(ダブルクォートなし)
296名無しさん@お腹いっぱい。:2009/08/27(木) 18:37:12
>>288
> 最後はどれもbcdに変えるのか、aaになってるものだけ変えるのか

そんなの質問の意図を読めばわかる。
>>290 みたいに回答した方が早い。
297名無しさん@お腹いっぱい。:2009/08/27(木) 18:48:08
>>290
sed 's/|[^|]*$/|bcd/'
だろw

>>293
ありがたいか?w
298名無しさん@お腹いっぱい。:2009/08/27(木) 19:10:28
>>294
由緒正しきshは~は使えない。$HOME使え。
299名無しさん@お腹いっぱい。:2009/08/27(木) 19:28:05
トホホの自民 生き残れるのはひと握り

 大マスコミの選挙予測によると、自民党は壊滅状態で、当確を数えたほうが早いほど。
小選挙区で確実に生き残れるのは元・現閣僚が7人ほど、石原伸晃など地盤が強固な世襲議員が6人ほど、重鎮が3人。
ほかに5人程度のひと握り。自民党が少数政党に転落し、永田町の勢力図が一変する可能性だってある。

http://gendai.net/?m=view&c=010&no=22639
300名無しさん@お腹いっぱい。:2009/08/27(木) 21:04:45
便乗質問だけど、

>>298
チルダ展開は bash だけなの? sh は展開してくれない?
301名無しさん@お腹いっぱい。:2009/08/27(木) 21:09:45
sh の種類による。
302名無しさん@お腹いっぱい。:2009/08/27(木) 21:10:04
>>300
bashだけではない。

Solarisなどの純正sh以外、
ash ksh zsh dash 等、みんなチルダ展開には対応してる。
でも $HOMEを使う方がお勧め。
303名無しさん@お腹いっぱい。:2009/08/27(木) 21:10:36
posix sh ならやってくれるはず
~ だけなら $HOME で間に合うが、~user はどうしようもないし
304名無しさん@お腹いっぱい。:2009/08/27(木) 21:21:53
posix(笑)
305名無しさん@お腹いっぱい。:2009/08/27(木) 21:24:00
>>303

IFS=:
set `getent passwd user`
echo $6
306300:2009/08/27(木) 21:42:19
サンクス。

 アムロ「マ ~ さーん!」


……すまん。
307名無しさん@お腹いっぱい。:2009/08/28(金) 11:20:37
>>305
getent が使える環境で ~user の展開をしてくれないシェルって何があるの?
308名無しさん@お腹いっぱい。:2009/08/28(金) 11:45:53
>>307
Solaris
309名無しさん@お腹いっぱい。:2009/08/28(金) 12:28:29
可搬性を求めると csh -fc 'echo ~user' になるかな?
310名無しさん@お腹いっぱい。:2009/08/28(金) 12:41:08
$ csh -fc 'echo ~user'
csh: not found
311名無しさん@お腹いっぱい。:2009/08/28(金) 13:09:31
最近のLinuxの鳥はデフォではcsh入ってないからな
312名無しさん@お腹いっぱい。:2009/08/28(金) 13:16:18
可搬性を求めてるから getentだろ。
313名無しさん@お腹いっぱい。:2009/08/28(金) 13:44:58
可搬性なんて幻想
314名無しさん@お腹いっぱい。:2009/08/28(金) 21:12:21
315名無しさん@お腹いっぱい。:2009/08/30(日) 00:11:54
シェルスクリプトは奥が深すぎて、きりがない。
どこらへんまで身に付いたら、「シェルスクリプトは理解した」と納得していいのかな?
316名無しさん@そうだ選挙に行こう:2009/08/30(日) 19:19:46
実行できたら出いいよ
317名無しさん@お腹いっぱい。:2009/08/30(日) 21:21:06
すみませんが詳しい方のみ回答をお願いします
318名無しさん@お腹いっぱい。:2009/08/30(日) 22:00:26
>>315
それが、公での質問の仕方として相応しい、と自分で納得し、的確な回答を期待できる質問文だ、と納得して書き込んだキミ。
>>316はキミの「納得していい」レベルに的確にあわせてくれたんだろwwww

結論、キミ次第。
別の回答がほしければ、他人の立場で>>315を読み直すことから始めよう。
319315:2009/08/31(月) 21:53:35
なんだ? 俺の知らんうちに。 >>317 は誰だよ?w

>>318
自分次第、そうだねぇ。
いや、たとえば C とかなら、ポインタ、構造体を理解すれば初心者卒業とか、
具体的に言っているのをよく見かけるでしょ。そんなのを期待してたんだ、スマン。
とりあえず、元々 bash にある、起動まわりのスクリプトを読み解くことにするよ。
320名無しさん@お腹いっぱい。:2009/08/31(月) 22:11:18
>>319
> なんだ? 俺の知らんうちに。
1ヶ月ROMってろ
321名無しさん@お腹いっぱい。:2009/09/01(火) 02:26:03
「元々 bash にある、起動まわりのスクリプト」って何だ?
322名無しさん@お腹いっぱい。:2009/09/01(火) 03:47:22
>>321
rcスクリプトのこととエスパー。
323名無しさん@お腹いっぱい。:2009/09/01(火) 10:35:12
>>319
> いや、たとえば C とかなら、ポインタ、構造体を理解すれば初心者卒業とか、
> 具体的に言っているのをよく見かけるでしょ。そんなのを期待してたんだ、スマン。

そういった「目的」を明示しなかったのが問題だったのだよ。
きっと皆の脳裏には、破滅に向かうプロジェクトの上流工程が彷彿したお。
324名無しさん@お腹いっぱい。:2009/09/01(火) 11:24:46
・パラメータ展開の修飾子を使いこなす
・リダイレクトを使いこなす

他には?
325名無しさん@お腹いっぱい。:2009/09/01(火) 12:30:22
・evalを使いこなす
326名無しさん@お腹いっぱい。:2009/09/01(火) 12:39:21
× evalを使いこなす
○ evalを使いこなしていばる
327名無しさん@お腹いっぱい。:2009/09/01(火) 13:57:58
◎ evalは俺の嫁。
328名無しさん@お腹いっぱい。:2009/09/01(火) 14:02:02
>>327
evil の間違いでしょ?
329名無しさん@お腹いっぱい。:2009/09/01(火) 14:08:10
>>324
リダイレクトというより、ファイルディスクリプタを使いこなせるようになりたい。
330名無しさん@お腹いっぱい。:2009/09/01(火) 14:24:51
初 evalる事覚える
中 evalらない事を覚える
上 たまにevalる事を覚える
331名無しさん@お腹いっぱい。:2009/09/01(火) 16:28:10
あんまりおもしろくないからその辺で。
332名無しさん@お腹いっぱい。:2009/09/02(水) 10:15:12
ls $dirの結果を変数sに格納するにはどうすればいいですか?
333名無しさん@お腹いっぱい。:2009/09/02(水) 10:43:40
>>332
s=`ls $dir`
ってこと?

なんか罠がありそうな質問だ。
334名無しさん@お腹いっぱい。:2009/09/02(水) 11:19:57
それを1個ずつとりだしたいとか、スペース・タブが入ってるとか…
335名無しさん@お腹いっぱい。:2009/09/02(水) 13:49:18
後のこと考えるなら、-1オプション付けといたほうが無難かもね。
336名無しさん@お腹いっぱい。:2009/09/02(水) 14:17:12
>>335
つ、釣りだよな?
337名無しさん@お腹いっぱい。:2009/09/02(水) 14:19:12
俺も初心者なんだけど、
ls -1 . | while read s
do
done
てことでしょ?何で釣り?
338名無しさん@お腹いっぱい。:2009/09/02(水) 14:21:08
>>337

ls -1
ls | cat
s=`ls`
echo "$s"

違いを述べよ。

よって、釣りじゃなければ「無知」。
339名無しさん@お腹いっぱい。:2009/09/02(水) 14:24:32
>>337
ls | while ...
みたいに、lsの出力がパイプとかリダイレクト(端末以外)の場合は、
-1 オプションを付けなくてもデフォルトで勝手に -1が付くんだよ。

s=`ls $dir` の場合でも同じ。

「-1付けろ」なんて言ってる >>335 はアフォ。
340337:2009/09/02(水) 14:53:59
なるほど・・・勉強になった!
341名無しさん@お腹いっぱい。:2009/09/02(水) 16:44:41
「付く」わけではない。
342名無しさん@お腹いっぱい。:2009/09/02(水) 16:45:59
けっきょく>>332は納得したの?
343名無しさん@お腹いっぱい。:2009/09/02(水) 16:51:58
>>341
「勝手に -1の効果が付く」と言って欲しいのかよww
344332:2009/09/02(水) 16:52:09
返事が遅くなって申し訳ありません。
>>333さんのレスが欲しかった答えでした。
345名無しさん@お腹いっぱい。:2009/09/02(水) 16:55:27
>>343
うん。
346名無しさん@お腹いっぱい。:2009/09/03(木) 17:03:44
質問させて下さい。

#!/bin/bash
echo $"文字列$hensu"

のような記述がありました。
$"〜"という表現を初めて見たのですが、
クォートの左の$は何の役割ですか?
347名無しさん@お腹いっぱい。:2009/09/03(木) 17:15:00
bash依存だから、覚えない方がよろしい
348名無しさん@お腹いっぱい。:2009/09/03(木) 17:51:38
>>346

bash$ echo $"FAILED"
FAILED
bash$ TEXTDOMAIN=initscripts
bash$ echo $"FAILED"
失敗
349346:2009/09/03(木) 20:06:49
>>348
ああ、*.poだか*.moだかですか。
ありがとうございます。
350335:2009/09/04(金) 09:29:19
>>338
>>339
やっべオレ超アフォ!!
感動した!!!!!
ヒャッハ!!!ヽ(゚∀゚)ノ
351名無しさん@お腹いっぱい。:2009/09/06(日) 21:01:39
シェルスクリプト初心者です。
全てのファイル名の最後の余計な部分を一括して取り除くにはどうしたらいいんでしょうか?
$ ls
hoge.hog;piyo fuga.fug;piyo foo.fo;piyo bar.ba;piyo
この ;piyo を取り除きたいんです。
とっさに
for hoge in *\;piyo; do mv $hoge
まで打ち込みましたが、これ以上解りません…

どなたか教えていただけないでしょうか
352名無しさん@お腹いっぱい。:2009/09/06(日) 21:09:31
>>351

for hoge in *';piyo'; do mv "$hoge" `basename "$hoge" ';piyo'`; done
353名無しさん@お腹いっぱい。:2009/09/06(日) 21:21:55
できました ありがとうございます。
文字列の操作 少し勉強します…
354名無しさん@お腹いっぱい。:2009/09/06(日) 21:31:32
どうせbashだろうから、
↓の方が簡単だろうけどな。

for hoge in *';piyo'; do mv "$hoge" "${hoge%;piyo}"; done
355名無しさん@お腹いっぱい。:2009/09/06(日) 21:49:34
posixをbashと言っちゃう恥知らず。
356名無しさん@お腹いっぱい。:2009/09/06(日) 21:57:33
posix(笑)
357名無しさん@お腹いっぱい。:2009/09/07(月) 14:34:09
なんでposixをbashと言ってると思ったんだろう。
358名無しさん@お腹いっぱい。:2009/09/09(水) 12:51:42
Joshua Price氏がMake Tech Easierにおいて8 Useful and Interesting Bash Promptsのタイトルのもと、
bashシェルにおけるさまざまなコマンドプロンプトの設定例を紹介している。使いやすいコマンドプロンプトは
コマンドラインの使い方を変えると説明があり、同氏が調査した中でも、特によく使われていたり、
おもしろいプロンプトとその設定例が紹介されている。紹介されているプロンプトは次のとおり。

1.間違ったコマンドを入力すると顔が変わるプロンプト
http://journal.mycom.co.jp/articles/2009/09/09/bash/images/002.jpg

2.間違ったコマンドを入力すると色が変わるプロンプト
http://journal.mycom.co.jp/articles/2009/09/09/bash/images/003.jpg

3.複数行プロンプト
http://journal.mycom.co.jp/articles/2009/09/09/bash/images/004.jpg

4.データごとに色を変えて見やすくしたプロンプト
http://journal.mycom.co.jp/articles/2009/09/09/bash/images/005.jpg

5.フルパスを表示する複数行プロンプト
http://journal.mycom.co.jp/articles/2009/09/09/bash/images/006.jpg

設定方法はソース先で
http://journal.mycom.co.jp/articles/2009/09/09/bash/index.html

359名無しさん@お腹いっぱい。:2009/09/09(水) 12:55:34
>>358

>>5
このスレはシェルスクリプトについてのスレです。
シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
使い方の質問などはスレ違いなので無用に願います。
360名無しさん@お腹いっぱい。:2009/09/09(水) 13:01:46
1レスくらいどうってことないだろ。
器量が狭いな
361名無しさん@お腹いっぱい。:2009/09/09(水) 13:07:57
つまんねー記事貼りつけるな。しかもbash専用。
362名無しさん@お腹いっぱい。:2009/09/09(水) 13:13:32
俺はbashですが何か?
363名無しさん@お腹いっぱい。:2009/09/09(水) 13:22:57
>>360
「器量」の意味を間違えて使っています。
364名無しさん@お腹いっぱい。:2009/09/09(水) 14:06:48
どういう意味?
365名無しさん@お腹いっぱい。:2009/09/09(水) 14:11:03
>>363
どういう意味?
366名無しさん@お腹いっぱい。:2009/09/09(水) 21:26:43
器量は良かったり悪かったりするもので狭かったり広かったりするのは心とか懐だろ。ちなみに大きかったり小さかったりするのは度量だ。
367名無しさん@お腹いっぱい。:2009/09/09(水) 21:36:14
語源は「器の量」なのだから、大きいでも間違いではあるまい。
368名無しさん@お腹いっぱい。:2009/09/09(水) 21:38:25
そういうことじゃなくて、
「器量が良い」=「顔が良い」(美人) という意味。

「狭い」じゃ意味をなさない。
369名無しさん@お腹いっぱい。:2009/09/09(水) 21:46:36
女の器量はすなわち女性器なので狭いで正解。
370名無しさん@お腹いっぱい。:2009/09/09(水) 21:51:06
日本語スクリプト総合 その2
http://pc12.2ch.net/test/read.cgi/unix/1117138567/
371名無しさん@お腹いっぱい。:2009/09/10(木) 23:56:22
き‐りょう【器量】 ‥リヤウ
(「器」は材の在る所、「量」は徳のみつる所の意)
(1)その地位・役目にふさわしい才能・人柄。保元物語「合戦の場には兄弟といふ差別候ふまじ。ただ―により候」。「人の上に立つ―がある」「―を上げる」
(2)才能・力量のすぐれていること。ものの上手。平家物語(4)「笛の御―たるによつてこの宮御相伝ありけり」
(3)(「縹緻」とも書く)顔だち。みめ。また、容姿のすぐれていること。狂、猿座頭「そなたの様な好い―で」。「十人並みの―」
372名無しさん@お腹いっぱい。:2009/09/11(金) 00:48:22
>>368
それも意味の一つってだけだぞ
それしか知らずにそれだけだと思い込んで更に他人に意見するお前は馬鹿

器量
人の器の量だ。大きい小さい狭い広いであってるんだよ。
才能や心の広さ

度量というのは心意気を指して使う。
これは大きい小さいと使う
いわゆる男気のように心の大きさ

例えば人を許すという時に慈悲深い気持ちと我慢強さからくる二通りがある。
前者は器量、後者は度量。
373名無しさん@お腹いっぱい。:2009/09/11(金) 01:34:53
>>366,368は完璧なゆとり
ゆとり怖ぇ
374名無しさん@お腹いっぱい。:2009/09/11(金) 01:59:31
勉強になりますお













スレ違いの
375名無しさん@お腹いっぱい。:2009/09/11(金) 02:16:36
無駄な改行うざ
ひょっとしてスクロールしなきゃ見えないとでも?
お前の頭、いつから時代が止まってんだ
376名無しさん@お腹いっぱい。:2009/09/11(金) 02:21:41
黙ってろ。禿げ。
377名無しさん@お腹いっぱい。:2009/09/11(金) 06:39:03
>>371
「古語辞典」使って誤魔化すんじゃねーよ。
(現代の)「国語辞典」でちゃんと意味調べてから出直せ。
あと、どちらにしても「?が狭い」なんて用法はないから。
378名無しさん@お腹いっぱい。:2009/09/11(金) 09:02:14
旧カナ遣いは「古語」ではない。知らない奴は黙ってろ。
379名無しさん@お腹いっぱい。:2009/09/11(金) 09:39:41
板名とスレタイトルを確認してください。
380名無しさん@お腹いっぱい。:2009/09/11(金) 09:41:06
>>378
平家物語や保元物語は何時代に書かれたんだよww
知らないなら黙ってろ。
381名無しさん@お腹いっぱい。:2009/09/11(金) 09:58:01
>>372
>器量
>人の器の量だ。大きい小さい狭い広いであってるんだよ。
>才能や心の広さ

ミスリードしてるね。

「才能」の意味はあるが、「心の広さ」の意味はない。

「器量を上げる(下げる)」=「才能、能力を上げる(下げる)」
といういい方は正しいが、

「器量が狭い(広い)」といういい方は間違い。
おそらく「器(うつわ)が小さい」(←これは正しい)の、
「器(うつわ)」と「器量」を混同して間違えて覚えているのだろう。
382名無しさん@お腹いっぱい。:2009/09/11(金) 10:16:41
平家物語が引用されている辞書が全部「古語辞典」かよ。
馬鹿は黙ってろ。
383名無しさん@お腹いっぱい。:2009/09/11(金) 10:23:39
>>382
少なくとも(>>378)が、「古語ではない」ただの「旧カナ遣い」だ、
って言ってるのは間違いだろ。
384名無しさん@お腹いっぱい。:2009/09/11(金) 10:32:58
>>383
広辞苑が古語辞典かよ。どんだけ未来から来たんだ。引っ込んでろ禿げ。
385名無しさん@お腹いっぱい。:2009/09/11(金) 10:46:16
斬新なキャラ語尾だな
386名無しさん@お腹いっぱい。:2009/09/11(金) 10:51:06
>>384
広辞苑の話の前に、

「合戦の場には兄弟といふ差別候ふまじ。」
という文章が、
(1)古語
(2)古語ではないただの旧カナ遣い

のどちらなのか決着を付けようぜ。
387名無しさん@お腹いっぱい。:2009/09/11(金) 11:48:25
>>386
そんな事誰も言っていない。
諦めて「>>377は間違いでした。ごめんなさい」って謝れよ。
388名無しさん@お腹いっぱい。:2009/09/11(金) 11:53:59
>>381 でFAだな。
「器量が狭い」(>>360)は間違い。

あとから出てきて議論してる人は「器量」の他の意味を挙げてるけど、
どれも「狭い」につながる意味はない。
389名無しさん@お腹いっぱい。:2009/09/11(金) 12:04:38
http://dic.yahoo.co.jp/search?stype=1&ei=UTF-8&dtype=2&p=%E5%B0%8F%E4%B8%88%E5%A4%AB
これでも更に言い訳続けるか? >>377が間違いである事も謝罪しろ。
390名無しさん@お腹いっぱい。:2009/09/11(金) 12:22:13
>>378 の謝罪は?
> 旧カナ遣いは「古語」ではない。
391名無しさん@お腹いっぱい。:2009/09/11(金) 12:40:37
論点を整理すると、
「器量」に「心の広さ」「包容力」という意味があるかどうかってことだろ。
広辞苑(>>371) にも「包容力」という意味は載ってなかったわけだし、
>>371 は自殺点を入れたな。

まあ、>>371 は「器量には顔の良さ以外の意味もある」ということを
言いたかったんだろうけど、それを主張しても、
「器量が狭い」(>>360)を正当化することにはならない。
392名無しさん@お腹いっぱい。:2009/09/11(金) 14:19:40
Results 1 - 10 of about 44,900 Japanese pages for 器量が狭い. (0.14 seconds)
Results 1 - 10 of about 71,300 Japanese pages for 器量が小さい. (0.09 seconds)
Results 1 - 10 of about 42,600 Japanese pages for 器量が広い. (0.14 seconds)
Results 1 - 10 of about 76,900 Japanese pages for 器量が大きい. (0.28 seconds)
393名無しさん@お腹いっぱい。:2009/09/11(金) 14:23:00
394名無しさん@お腹いっぱい。:2009/09/11(金) 18:34:03
おまえら器量がないな
395名無しさん@お腹いっぱい。:2009/09/11(金) 18:54:08
>>390
正しいだろ。馬鹿。
396名無しさん@お腹いっぱい。:2009/09/11(金) 18:56:41
ヲタクは100%の確率で度量が小さい
リアルでは常にビクビクしてる鼠みたいなやつ
397名無しさん@お腹いっぱい。:2009/09/11(金) 19:05:21
httpdが生きてるか否かを監視するスクリプトどなたか作ってください。
GETして200が返ればOK
返らなきゃ[email protected]にメールを投げる
みたいな簡単なのでいいです。
398名無しさん@お腹いっぱい。:2009/09/11(金) 19:27:06
>>371>>368
> 「器量が良い」=「顔が良い」(美人) という意味。
に対する反証だろ。無様な言い逃れまだ続ける気?
399名無しさん@お腹いっぱい。:2009/09/11(金) 19:32:11
>>397
ここはそういうスレじゃない
400名無しさん@お腹いっぱい。:2009/09/11(金) 19:35:50
>>398
ということは、やっぱり、

「器量が狭い」(>>360)は間違い、

ということじゃん。
401名無しさん@お腹いっぱい。:2009/09/11(金) 19:41:07
どうでもいい、だまれ
402名無しさん@お腹いっぱい。:2009/09/11(金) 19:52:52
>>400
かわいそうなくらい頭悪いな。お前もう死んだ方が良い。
403名無しさん@お腹いっぱい。:2009/09/11(金) 21:14:33
>>363
スレに関係無いところ突っ込んで、無知を晒す事になった感想は?
止めときゃよかったと思ってる? 死にたくならない?
404名無しさん@お腹いっぱい。:2009/09/11(金) 21:38:15
狭量なやつらでいっぱいのスレ
405名無しさん@お腹いっぱい。:2009/09/11(金) 21:53:56
>>403
おいおい、間違ってるのはお前だってw
406名無しさん@お腹いっぱい。:2009/09/11(金) 21:57:58
>>360 間違い
>>366 正解
>>368 正解
>>372 間違い
>>381 正解

あとは煽り
407名無しさん@お腹いっぱい。:2009/09/11(金) 21:59:34
>>389で大辞泉に
> しょう懼じょうふ【小丈夫】
> 2 器量の狭い人物。小人物。
という用例を例示されてるのに、まだ醜態晒し続けるの? 死にたくならない?
408名無しさん@お腹いっぱい。:2009/09/11(金) 22:05:35
>>403
アンカー間違えてるよ。
>>360 に言ってくれ。
409名無しさん@お腹いっぱい。:2009/09/11(金) 22:10:27
>>395
流れ良め。

>>378>>371 に書かれている文章が
「旧カナ遣いだけど古語ではない」って言ってるんだよ。

間違いだろ。馬鹿。
410名無しさん@お腹いっぱい。:2009/09/11(金) 22:24:41
>>409
>>395 = >>378だ。
俺は
> 旧カナ遣いは「古語」ではない。
と言った。改変するな。クズ。
411名無しさん@お腹いっぱい。:2009/09/11(金) 22:28:28
>>378 は、
>>377>>371 を見て、「古語」と言ったのを受けて

>>378 で 旧カナ遣いは「古語」ではない、と言った。
一般論としてではなくて、
>>371 の文章が旧カナ遣いであって古語ではない、と言った。

明らかに間違い。
412名無しさん@お腹いっぱい。:2009/09/11(金) 22:31:40
>>408
>>360はスレ違いはともかく、用法は間違っていないな。
>>363って、恥かいて悦ぶ趣味?
413名無しさん@お腹いっぱい。:2009/09/11(金) 22:37:18
「才能が狭い」
「技量が狭い」
「面目が狭い」

どれもおかしい。

よって「器量が狭い」は誤用。
414名無しさん@お腹いっぱい。:2009/09/11(金) 23:01:12
>>411
また捏造かよ。恥知らず。
>>371 の「リヤウ」を指して「旧カナ遣いは『古語』ではない」と言ったんだよ。わかるか? 馬鹿。

広辞苑を「古語辞典」といった本当の理由は>>377の馬鹿じゃないと分らないが、
「リヤウ」をみて古語辞典と誤解したと思ったんだよ。
他に広辞苑を「古語辞典」という理由がお前は思い当たるのか?
>>377はもう出てこないだろうから真相は藪の中だが。
逃亡するくらいならしゃしゃりでてこなきゃ良いのに。馬鹿を自覚しつーの。
415名無しさん@お腹いっぱい。:2009/09/11(金) 23:05:53
>>414
>「リヤウ」をみて古語辞典と誤解したと思ったんだよ。

ハハハ、そんなところ見てないよ。

古語と言ったのは用例の平家物語とかのところだよ。
結局古語でしか用例を示せてない辞書だから古語辞典だと思ったのだろう。
416名無しさん@お腹いっぱい。:2009/09/11(金) 23:11:17
古語が載ってれば「古語辞典」と思うような馬鹿が存在するとは想定の範囲外だ。
>>377 お前は馬鹿過ぎ。出入り禁止。二度と発言すんな。
417名無しさん@お腹いっぱい。:2009/09/12(土) 08:05:08
>>413
>>372,393
418名無しさん@お腹いっぱい。:2009/09/12(土) 09:08:07
辞書に載ってるのは、
「顔立ち」「才能、技量」「面目」の3点なのに、

>>372 が「才能」の意味に「心の広さ」を勝手に追加してる件に付いて。
419名無しさん@お腹いっぱい。:2009/09/12(土) 09:10:41
=================器量の話は終了=================
=================器量の話は終了=================
=================器量の話は終了=================
=================器量の話は終了=================
=================器量の話は終了=================
=================器量の話は終了=================
420名無しさん@お腹いっぱい。:2009/09/12(土) 09:46:40
>>418が勝手に3点に絞ってる件
421名無しさん@お腹いっぱい。:2009/09/12(土) 09:54:20
度量(どりょう)が大きい
「器量(きりょう)が大きい」は誤り。心が広いということ。「度量」は心の広さ、「器量」は力量や容姿。

http://starscafe.net/kotoba/misuse/fit_t.htm
422名無しさん@お腹いっぱい。:2009/09/12(土) 09:56:42
UNIX使う人ってどうでもいいことで延々と語るのが好きな人が多いのなだよもんだよもんだよもん
*BSDのマスコットは
423名無しさん@お腹いっぱい。:2009/09/12(土) 10:08:13
goo辞書
http://dictionary.goo.ne.jp/leaf/jn/50515/m0u/%E3%81%8D%E3%82%8F/

きりょう ―りやう 1 【器量】
補足説明「器」は才能のあること。「量」は心の大きさ、徳のあること

(1)物の役に立つ才能・力量。
+ 「人の上に立つ―をもった人物」

(2)主に女性について、容貌(ようぼう)。顔立ち。みめ。
+ 「―がよい」

(3)主に男性について、その人の面目。価値。
+ 「―を上げる」

>>418
see 補足説明
424名無しさん@お腹いっぱい。:2009/09/12(土) 10:10:12
ゆとりは器量が狭いのぅ
425名無しさん@お腹いっぱい。:2009/09/12(土) 10:16:52
>>424
誤用用語を使って自己紹介乙
426名無しさん@お腹いっぱい。:2009/09/12(土) 10:24:59
器量良しの意味しか無いと思い込んでた馬鹿が悪い
>>363の事だが
427名無しさん@お腹いっぱい。:2009/09/12(土) 10:25:51
>>423
その補足説明は「器量」という熟語自体の意味の説明にはなっていないよ。
補足説明は「器」と「量」の単漢字の意味の説明だから。
熟語になると意味が変わる。
428名無しさん@お腹いっぱい。:2009/09/12(土) 10:26:30
>>425
器量の狭い小者乙
429名無しさん@お腹いっぱい。:2009/09/12(土) 10:29:29
俺は器量が広く度量があり、そして器量良しの女房がいる。
お前らカスと一緒にすんな。
430名無しさん@お腹いっぱい。:2009/09/12(土) 10:34:47
間違いを認められずに醜態を晒し続ける>>363,>>368,>>377は典型的な小丈夫だな。
スレ違いの話題を振って絡んでおきながら、大外しって惨め過ぎる。

大辞泉
http://dic.yahoo.co.jp/search?stype=1&ei=UTF-8&dtype=2&p=%E5%B0%8F%E4%B8%88%E5%A4%AB
しょう-じょうふ【小丈夫】
1 小柄な男。2 器量の狭い人物。小人物。
431名無しさん@お腹いっぱい。:2009/09/12(土) 10:40:12
有識者諸兄殿
シェルスクリプトの勉強中で、教えていただきたい。

@while read AAA ; do 〜 ; done < fileX
Afor AAA in `cat fileX`; do 〜 ; done

の違いを教えて下さい。
処理スピードや処理(do 〜 )での柔軟性、fileXが小さい場合と大きい場合での違いなど。

よろしくお願いします。
432名無しさん@お腹いっぱい。:2009/09/12(土) 10:43:09
普段から言葉を大事に使わないからイザとなったら慌てて辞書に頼り表面の意味だけを捉えて赤っ恥をかく。
>>363,368,377がその例だろう。
433名無しさん@お腹いっぱい。:2009/09/12(土) 10:48:44
>>430
だれも「小丈夫」の話なんかしてないよ。的はずれな指摘。

「器量」の項目を引いて出直せ。
434名無しさん@お腹いっぱい。:2009/09/12(土) 10:53:10
>>431
機種依存文字使うな。

whileの方は、1行毎にループ処理される。

forの方は、改行だけでなく、スペース・タブでも区切られて
それぞれに付いてループ処理される。
435名無しさん@お腹いっぱい。:2009/09/12(土) 10:54:20
>>433
>慌てて辞書に頼り表面の意味だけを捉えて
一つ上のレスの意味すら理解できないんだな。
お前につける薬は無いな
436名無しさん@お腹いっぱい。:2009/09/12(土) 10:57:53
>>431
シェルスクリプトスレで訊けよ
ひとこと言うなら、スペースの有無とかfileXの大きさとかより
(1)の do〜doneがサブシェルになることが注意
437名無しさん@お腹いっぱい。:2009/09/12(土) 11:02:18
>>368を書いた時点では、器量には容貌という意味しかないと信じ切っていたようだ。惨め過ぎる。
438名無しさん@お腹いっぱい。:2009/09/12(土) 11:02:22
>>436
ダウト。

単なるファイル入力のリダイレクトだから、while read でも
サブシェルにはならない。

サブシェルになるのは、echo hoge | while read みたいな
パイプの場合。
439名無しさん@お腹いっぱい。:2009/09/12(土) 11:03:53
>>437
違うよ。

容貌、才能、面目のすべての意味を知っていたが、
判例を挙げるにはひとつだけで十分だから、
一番意味がはっきり違う容貌を挙げただけ。
440431:2009/09/12(土) 11:10:07
>>434
>>436
>>438

なるほど!
forはfileXの行にスペース・タブ(IFS?)がある場合、行単位にならないのですね。
行単位に処理させたい場合はwhileの方が確実ですね。
勉強になりました。

サブシェルになる場合とその注意点などまだ自分にはピンと来ませんので
ちょっと勉強してみます。

ありがとうございました。
441名無しさん@お腹いっぱい。:2009/09/12(土) 11:11:42
>>439
もう分かったから失せろボケ
442名無しさん@お腹いっぱい。:2009/09/12(土) 11:15:17
>>440
サブシェルで代入したシェル変数は親シェルには伝わらない。
443名無しさん@お腹いっぱい。:2009/09/12(土) 11:26:32
>>434 の正解が出たあとで
間違ったことを書いてる >>436 はマヌケだなぁ。
444名無しさん@お腹いっぱい。:2009/09/12(土) 11:31:23
>>439
残念ながら「狭い」という用法が*無い事*を示すためには、他の例をあげるだけ
では不十分なんだ。*有る*事をしめすなら一つだけ挙げればいいがな。

恥の上塗りまだ続けるのか? 惨め惨め惨め惨め。
445名無しさん@お腹いっぱい。:2009/09/12(土) 11:33:12
いいかげんバカは放置しようよ
446名無しさん@お腹いっぱい。:2009/09/12(土) 11:35:59
>>444
いや、>>360 が、「器量」を「懐」あたりの意味と取り違えていて、
「器量」にはその意味しかないと思い込んでいると思われたので、
その反例として>>368 で「器量」の意味のひとつを挙げた。
反例にはなっている。
447名無しさん@お腹いっぱい。:2009/09/12(土) 11:39:42
>>446
お前が基地害だというのは充分判ったから
もういいだろ。どう足掻いてもお前に勝ち目は無いよ
448名無しさん@お腹いっぱい。:2009/09/12(土) 11:43:59
>>363が責任を取って氏ねば解決
449名無しさん@お腹いっぱい。:2009/09/12(土) 11:44:00
>>447
はためから見ると負けてるのは >>447 の方だがw
450名無しさん@お腹いっぱい。:2009/09/12(土) 11:47:25
「器量が狭い」を認められない器量の狭さワロス
451名無しさん@お腹いっぱい。:2009/09/12(土) 11:48:59
>>450
そういうのは「懐が狭い」って言うんだよ。覚えとけ。
452名無しさん@お腹いっぱい。:2009/09/12(土) 11:49:33
>>445
>>439のような馬鹿は半端に叩くと粘着するから。「器量」を見ただけでPTSD起こす
くらいまで叩いて置かないといけない。

>>446
なってねーよ。馬鹿。たった、「1レスくらいどうってことないだろ。器量が狭いな」だけの
発言から
> 「器量」にはその意味しかないと思い込んでいると思われたので、
このように思うって、お前が馬鹿であるという証明にしかならない。

しかも、*無い*事を示すために他の例を挙げれば済むとか。
どんだけ低脳なんだよ。惨め惨め惨めの三重奏だぜ。
453名無しさん@お腹いっぱい。:2009/09/12(土) 11:51:05
>>451
懐は深い/浅いだよ。覚えとけ。
454名無しさん@お腹いっぱい。:2009/09/12(土) 11:53:51
>>451
恥の上塗り乙
455名無しさん@お腹いっぱい。:2009/09/12(土) 11:55:06
>>453
あほか、
懐が深い/浅いだと意味が違う。反例になってない。
456名無しさん@お腹いっぱい。:2009/09/12(土) 11:58:14
>>455
更に恥の上塗り乙
457名無しさん@お腹いっぱい。:2009/09/12(土) 12:02:24
一般的に、>>454 >>456 みたいに「恥の上塗り」とかだけ書いて
具体的な反論を書かなくなった方が議論の負けなんだよ。
458名無しさん@お腹いっぱい。:2009/09/12(土) 12:04:25
>>457
そのルールだとファビョったほうの勝ちか?
お前のように(笑)
459名無しさん@お腹いっぱい。:2009/09/12(土) 12:20:17
まだ続くのか日本語講座
460名無しさん@お腹いっぱい。:2009/09/12(土) 13:19:30
自作自演飽きた。
461名無しさん@お腹いっぱい。:2009/09/12(土) 13:47:48
自演だと思うのは自分が自演してるからだ。
462名無しさん@お腹いっぱい。:2009/09/12(土) 13:56:20
全部おれの自演でした
463名無しさん@お腹いっぱい。:2009/09/12(土) 13:59:07
>>457が吊れば平和
とっとと逝け
464名無しさん@お腹いっぱい。:2009/09/12(土) 14:12:22
>>438
Solarisの/bin/shだとファイルリダイレクトでもサブシェルになる。
465名無しさん@お腹いっぱい。:2009/09/12(土) 14:22:06
>>464
「サブシェルになる」ことをどうやって確認した?

まさか、while read AAA の、ループを抜けた時、
AAAの内容が空になるのを見て「サブシェルだ」と思ってないだろな。

readは最後に EOF を読み込んで while を抜けるから、
ループを抜けた時 AAA は空になるが、サブシェルではない。

while read AAA
do
BBB=$AAA
done < file

echo $BBB

で試してみろ。
466名無しさん@お腹いっぱい。:2009/09/12(土) 14:22:49
SunOS4 当時の /bin/sh はどう振舞うの?
467名無しさん@お腹いっぱい。:2009/09/12(土) 14:34:53
>>465
試したけど Solarisの /bin/shだとやっぱりサブシェルだよ。
468名無しさん@お腹いっぱい。:2009/09/12(土) 23:49:07
自信満々でダウトしといて外してるって恥ずかしくない? どんな気持ち?
>>363とか>>363とか>>363とか>>363とか>>438
469名無しさん@お腹いっぱい。:2009/09/13(日) 01:00:33
シェルスクリプトの実行者に対しy/n等で確認を求めたい場合
通常readで止めて入力を促しているのですが
while read のループの中でそれをやろうとすると上手くいきません。

while read 〜
echo "Y or N"
read YESNO ←ここで止まってくれない
〜判定処理〜
done < fileHoge


whileのreadと入力要求のreadが干渉しているのが原因のように思っています。
よい方法はありますでしょうか?
(ddやselectなども試しましたがダメでした)
470名無しさん@お腹いっぱい。:2009/09/13(日) 01:03:39
read YESNO < /dev/tty
かな?
471名無しさん@お腹いっぱい。:2009/09/13(日) 01:08:19
ありがとう
それやってみます!
472名無しさん@お腹いっぱい。:2009/09/13(日) 17:59:13
よく 
commandA | tee LOGFILE
などのやり方で表示しつつログをとる事があると思いますが
commandAの終了ステータスを判断したい時、この場合だと$?がteeの結果になり
commandAの終了ステータスが分りません

bashなら環境変数${PIPESTATUS[パイプライン中のコマンド位置]}
で取れることを調べられたのですが、あいにく改造母体のファイルはkshなんです。

よい方法はありますでしょうか?

473名無しさん@お腹いっぱい。:2009/09/13(日) 18:04:42
>>472

((commandA; echo $? 1>&3) | tee LOGFILE ) 3>&1
474472:2009/09/13(日) 18:22:57
>>473
ありがとうございます!
明日試してみます!
475名無しさん@お腹いっぱい。:2009/09/13(日) 19:39:39
>>473
この書き方すぐ忘れるんで、そんな時はcsh-whynotでググるんだ
476名無しさん@お腹いっぱい。:2009/09/13(日) 20:03:38
csh(笑)
477名無しさん@お腹いっぱい。:2009/09/13(日) 21:17:24
csh-whynotを知らずにcshを笑うとは…
爆笑だぜ。
478名無しさん@お腹いっぱい。:2009/09/14(月) 08:13:40
ここだけ20世紀
479名無しさん@お腹いっぱい。:2009/09/20(日) 15:13:01
コマンドの引数に別のコマンド実行結果を利用する時
commandA `commandB`
とやりますが、さらにその実行結果をコマンドの引数に利用したい場合、
変数にcommandA `commandB`を入れてcommandC $変数 などとやってるのですが、
変数を使わずに出来る手法はありますでしょうか。
イメージ的には「commandC `commandA `commandB``」みたいな感じ。
480名無しさん@お腹いっぱい。:2009/09/20(日) 15:17:56
commandC $(commandA $(commandB))

純正シェルの人は苦行に耐えて頑張ってください。
481名無しさん@お腹いっぱい。:2009/09/20(日) 15:34:01
commandC `commandA ¥`commandB¥``
482名無しさん@お腹いっぱい。:2009/09/20(日) 15:40:06
>>480-481

ありがとう!試してみます!
483名無しさん@お腹いっぱい。:2009/09/20(日) 18:46:17
あるフォルダの中の*.cというファイルを~/srcというフォルダにコピーするにはどうすればいいですかね?
484名無しさん@お腹いっぱい。:2009/09/20(日) 18:47:47
スクリプト使わない質問はスレ違い
485483:2009/09/20(日) 18:49:13
申し訳ありませんでした。。
486名無しさん@お腹いっぱい。:2009/09/20(日) 18:56:39
cp *.c ~/src/
487名無しさん@お腹いっぱい。:2009/09/20(日) 19:01:09
>>486
説明不足でした。。
いくつかの階層に分かれていたのでできなかったのです。
情報後出しとか氏んどけって話ですよね。。

mv `find -name *.c` ~/src/

上のレスみて何とかなりました
もう本当にスレ汚し失礼しました。
488名無しさん@お腹いっぱい。:2009/09/20(日) 19:01:22
>>486
やってみましたが、どうもホームフォルダの下の/srcにコピーされるようです。
?/srcというフォルダにコピーしたいんですが。
489名無しさん@お腹いっぱい。:2009/09/20(日) 19:14:59
>>487
それだと同じ名前ぶつかってると上書きされるぞ。
490名無しさん@お腹いっぱい。:2009/09/20(日) 20:11:24
スクリプトの中で使う場合って~と$HOMEってどっちが一般的なんですか?
491名無しさん@お腹いっぱい。:2009/09/20(日) 20:25:00
もちろん $HOME
チルダは純正では使えない
492名無しさん@お腹いっぱい。:2009/09/20(日) 20:46:49
bash又はkshで長さが一定でないファイル名からある位置の文字を取り出したい。
具体的にはhogehoge〜XX.txtのXXの2文字。後ろから5,6文字目。
前からの位置であればcutで簡単だったのだが後ろからで行き詰った。
考えた挙句、echo ファイル名 | wc -c等で長さを取って、
それをexprで6減算した値をcutの開始位置にしてやったりして出来たのだが
たかが2文字取り出すだけなのにスマートじゃない。
もっとシンプルに行かないものでしょうか?
493名無しさん@お腹いっぱい。:2009/09/20(日) 21:00:31
>>492
expr 'hogehoge〜XX.txt' : '.*¥(..¥).txt'
494名無しさん@お腹いっぱい。:2009/09/20(日) 21:16:12
>>493

ありがとう今度やってみます
でもちょっと難しくて今時点でなんで期待の結果が得れるか把握しきれてないです。
exprのそういった使い方を勉強します。
495名無しさん@お腹いっぱい。:2009/09/20(日) 23:18:27
revは環境依存?
496名無しさん@お腹いっぱい。:2009/09/21(月) 10:57:39
>>492
fにファイル名が入っているとして
a=${f#${f%??.txt}}
echo ${a%.txt}
ではどうか。
497名無しさん@お腹いっぱい。:2009/09/21(月) 13:03:33
bashでいいなら、
↓で一発じゃん (fileにファイル名が入っているとして)

echo ${file:$((${#file}-6)):2}
498名無しさん@お腹いっぱい。:2009/09/21(月) 14:38:10
対話的なスクリプトが二つあって
それをスクリプト同士対話させたいのですが
どのように相手の出力をもう片方の入力につなげるのでしょうか?
499名無しさん@お腹いっぱい。:2009/09/21(月) 14:40:43
>>498
fifo
500名無しさん@お腹いっぱい。:2009/09/21(月) 14:46:33
>>5
> シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
> 使い方の質問などはスレ違いなので無用に願います。
501名無しさん@お腹いっぱい。:2009/09/21(月) 15:07:30
>>498
双頭バイブ
502492 :2009/09/26(土) 20:45:00
>>493
>>496
>>497

全て上手くできました。
ありがとう。
>>493のやつはshでもOKですね。
503名無しさん@お腹いっぱい。:2009/09/27(日) 00:28:00
スクリプトの中で他ユーザにしか実行権の無い別のスクリプトを実行するため、
su - USER -c COMMAND
としたいのですが、パスワードを求められます。
今時点ではパスワード入力をスクリプトの実行者に入力させてますが
このパスワード入力をスクリプトの中で自動で出来る方法はありますか?
ご教授お願いします。
504名無しさん@お腹いっぱい。:2009/09/27(日) 01:43:06
>>503
sudoかexpect
505名無しさん@お腹いっぱい。:2009/09/28(月) 01:37:41
バッククォートで実行するコマンドの標準出力と標準エラーをそれぞれ
別の変数に入れることってできますか?

やりたいことは以下と等価なんだけど、一時ファイルを作らずにやりたいんです。
stdout=`command 2>stderr.tmp`
stderr=`cat stderr.tmp`
506名無しさん@お腹いっぱい。:2009/09/28(月) 23:10:05
>>504

すみません、Solarisなので両方とも使えませんでした。
507名無しさん@お腹いっぱい。:2009/09/29(火) 00:48:13
508名無しさん@お腹いっぱい。:2009/09/29(火) 21:59:35
>>506
Solarisでsudoもexpectも使えないなんてことを書いてしまうとは・・・
ろくに調べもしないでコマンド入れ替えただけとしか思えん。
509名無しさん@お腹いっぱい。:2009/09/29(火) 22:17:54
混ぜ物を一切していない純血Solaris
510名無しさん@お腹いっぱい。:2009/10/01(木) 21:34:47
あるコマンドの標準出力を一行ずつ見ていって、それがある正規表現Xにマッチしてたら
コマンドAの標準入力にいれて、その標準出力を取得、それ以外なら、コマンドBの
標準入力に入れて、その標準出力を取得、その2つの標準出力を、標準入力の
順番と同じ順番でそろえて出力を得たいのですが、方法はありますでしょうか?

わかる方いたら教えていただけませんでしょうか。よろしくお願いいたします。。。
511名無しさん@お腹いっぱい。:2009/10/01(木) 22:00:58
>>510


#!/bin/sh

while IFS= read line
do
if echo "$line" | grep -q XXX
then
a=`echo "$line" | command_A`
echo "$a"
else
a=`echo "$line" | command_B`
echo "$a"
fi
done
512名無しさん@お腹いっぱい。:2009/10/01(木) 22:40:13
>>511
ありがとうございます。
でもこれだと、command_A、command_Bは毎入力行ごとに起動しなおすことに
なりませんでしょうか。
command_A, command_Bともに入力に応じて、内部で状態が変化するので、
ずっと起動しっぱなしにしたいのですが、そういうことはできますか?
513名無しさん@お腹いっぱい。:2009/10/01(木) 22:43:20
後出し乙。

ハイ、次の方どうぞ
514名無しさん@お腹いっぱい。:2009/10/01(木) 22:51:19
>>510

#!/bin/sh

(
(
while IFS= read line
do
if echo "$line" | grep -q XXX
then
echo "$line"
else
echo "$line" 1>&3
fi
done | command_A 1>&4
) 3>&1 | command_B
) 4>&1
515名無しさん@お腹いっぱい。:2009/10/01(木) 23:03:55
command_A, command_Bに確実に一行ずつ出力させる事が出来なければ不可能。
516名無しさん@お腹いっぱい。:2009/10/01(木) 23:18:02
>>514
素早い回答、ありがとうございます。
ファイルディスクリプタんの複製なんて、10年振りに見ました。
このスレは初探訪なのですが、スレ住人の方々はみな、このような
スクリプトを自在に操る変態さんばかりなのでしょうか。
まだまだ精進が足りないと痛切に思いました。
自在にこんなスクリプトが書けるまで、精進したいと思います....

ところで、この"grep -q" って、入力毎に起動しているようですが、
これはずっと起動しっぱなしに比べて、パフォーマンス的にはどうなんでしょう。
実はgrepのこういう多数回の起動(fork())ってそんなに大変なことではない??
517名無しさん@お腹いっぱい。:2009/10/01(木) 23:24:12
>>515
うーむ、さきにcommand_Aの方が処理された後に、command_Bの方が
実行されるみたいですね。やっぱり無理かなぁ。
518名無しさん@お腹いっぱい。:2009/10/01(木) 23:24:43
>>516
正規表現じゃなくて、単なるパターンマッチで良ければ、
grep -q の代わりに case文を使えば、
内部コマンドだけになるから速くなるよ。
519名無しさん@お腹いっぱい。:2009/10/02(金) 01:29:03
シェルスクリプトを、別のシェルスクリプトの中からをバックグラウンドで実行すると
SIGINTが無視されてしまうんだけど、何とかSIGINTをトラップできる
ようにする方法ありませんか?

例えば以下のようなシェルスクリプト command.sh を作って、
#!/bin/sh
trap 'echo sigint' INT
trap -p

インタラクティブなシェルから command.sh & すれば期待通り動くんですが、
別のシェルスクリプトの中から command.sh & で呼び出すと SIGINT のハンドラが
設定されないんです。

この動作自体は一応 bsh 系の仕様っぽいですが…
Linux 上の bash 限定でも良いので、何か解決法があったら教えてください。
520名無しさん@お腹いっぱい。:2009/10/02(金) 06:45:21
>>519
シェルスクリプトの中から、

sh -c 'set -m; command.sh &'

で呼び出す。
521名無しさん@お腹いっぱい。:2009/10/03(土) 09:28:17
>>481のやり方ってネストは2個まで?

commandD `commandC \`commandA \`commandB\`\``
でやったら上手くいかなかったような。。。(bash)
522名無しさん@お腹いっぱい。:2009/10/03(土) 09:42:57
あたりまえ。\もエスケープしなければダメ。
523名無しさん@お腹いっぱい。:2009/10/03(土) 09:46:57
>521

commandD `commandC ¥`commandA ¥¥¥`commandB¥¥¥`¥``
524名無しさん@お腹いっぱい。:2009/10/03(土) 09:48:20
>>521
3個でもできるよ。

commandD `commandC ¥`commandB ¥¥¥`commandA¥¥¥`¥``
525名無しさん@お腹いっぱい。:2009/10/03(土) 09:50:21
>>522-523
お、言われて見ればその通りだ。
ありがとぅ。
526名無しさん@お腹いっぱい。:2009/10/03(土) 09:51:31
>>524
ありがとぅ。
527名無しさん@お腹いっぱい。:2009/10/04(日) 17:20:27
時々シェルスクリプトで簡単なツールを作ったりしてるのですが
perlを勉強してみたくなりました。

>>1
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。

とありますが、具体的にどのような観点でシェルスクリプトとperlを使い分けするのでしょうか?
このような処理ケースではperlを使う方が効果的みたいな例を教授
(もしくはそのような事が記載されているサイトに誘導)していただけたら幸いです。
528名無しさん@お腹いっぱい。:2009/10/04(日) 17:26:53
現状でシェルスクリプトで問題なくやってるなら、
perlなんて覚えない方がいい。
529527:2009/10/04(日) 17:27:13
少し調べてみてるのですがPerlは文字列処理等が得意であるというのを見ますが、
そうするとsedやawkを使う場面なんかがperlでやった方がよりよいでしょうか?
530527:2009/10/04(日) 17:34:22
>>528

現状、何とか目的の機能は達成してるって感じですが、
同じ事がperlなら断然簡潔かつ高速処理で出来たりするのかな?なんて思うもので。。。
531名無しさん@お腹いっぱい。:2009/10/04(日) 17:47:06
3項演算子は両方とも評価するのか?
532名無しさん@お腹いっぱい。:2009/10/04(日) 18:05:40
>>529
例えば一行の処理毎に、シェルスクリプトでは外部コマンドを起動する必要がある、
perlでは不要。というような場合、データが大きくなればperlの方が速くなる。
533529:2009/10/04(日) 18:31:28
>>532

それはテキストの一行に対して処理する事に対し、シェルスクリプトならその行数分外部コマンドが実行、
つまりシェルスクリプトでテキストの1行に1コマンド処理実行させてる場合、
100行なら100回外部コマンドが実行される事になるが
perlなら1コマンド?で処理が終了するので大きいテキストに対してだと
処理スピードに差がでるって事でしょうか?
534名無しさん@お腹いっぱい。:2009/10/04(日) 18:45:38
テキストの一行じゃないんじゃないの。sedもawkも複数行を処理できるでしょ。
あとマルチコアプロセッサとかだと、プロセスが分かれていた方が処理が早く
終わったりもするね。

キッチンシンクアプローチとツールボックスアプローチを調べてみると良いと思うよ。
535名無しさん@お腹いっぱい。:2009/10/04(日) 18:58:02
>>533
そう。プロセスの生成は非常にハイコスト。
536529:2009/10/04(日) 19:12:23
>>534-535
ありがとう。
うーん、でも完全に理解し切れてない。
何かを実現させる時、シェルスクリプトの場合複数のコマンド発行(プロセス起動)が
perlなら少プロセスで可能な場合(主にテキスト処理などで)があるって事でしょうか?

>キッチンシンクアプローチとツールボックスアプローチを調べてみると良いと思うよ。

調べてみます。
537名無しさん@お腹いっぱい。:2009/10/05(月) 00:38:28
python
538名無しさん@お腹いっぱい。:2009/10/05(月) 02:27:03
オライリーのミニマルPerlって本があって、
sh&sed&awk の粗探しをして Perl への移行を薦めるような内容なんだが、
これ読むと逆に、とくに大規模でもないテキスト処理なら
シェルで無問題じゃんって感じなんだよね。
Perlが受けたのは、第一に実装が優秀で速かったのと、
あと Perl はベル研系の厳格な雰囲気がないというか、
何となく書いて動いちゃうとこがある。そのへんの寛容さが人気の秘密かと
539名無しさん@お腹いっぱい。:2009/10/05(月) 15:57:27
結局適材適所と、それを判断出来る能力の問題だと思うよ。
シェルスクリプトで遅いなら、perlなりでやる。それでも遅いならCとか。
540名無しさん@お腹いっぱい。:2009/10/05(月) 18:06:14
echoで最後に改行したくない場合、
echo -n "unko"
では期待通りに出力されるのですが、
echo "unko\c"
だとunko\cと改行して出力されてしまいます。
Cygwinで\cに対応させるにはどうしたらよいでしょうか。
よろしくお願いいたします。
541名無しさん@お腹いっぱい。:2009/10/05(月) 18:15:13
>>541
CygwinということはGNU coreutilsのechoか。
-e オプション?
542540:2009/10/05(月) 19:05:48
>>541
おおお、ありがとうございます。
$ echo -e "unko\c"
で期待通り
unko$
と出力ができました。

本番の環境はHP-UXを使用しておりまして、
逆に-eオプションが無い(?)ため、
$ echo -e "unko\c"
とした場合、
-e unko$
と出力されてしまいすが、とりあえず、
alias echo='echo -e'
で解決いたしました。

ありがとうございました!!!!
543名無しさん@お腹いっぱい。:2009/10/05(月) 21:56:31
そのへんの移植性に関するバッドノウハウはGNU autotoolsに詰まってる。
544名無しさん@お腹いっぱい。:2009/10/21(水) 12:16:25
RCSで、チェックイン済みの最新リビジョンと、そのひとつ前のリビジョンを比較
ということをよくやります。
今は、rlog -r fileで最新リビジョン番号を調べて、たとえば 1.123 だったとすると、
頭の中でリビジョンを1引いて、rcsdiff -r -r1.122 file みたいに実行しています。
これを1発でやるシェルはできませんか?

あ、sed/awk等でゴニョゴニョやる方法じゃなく(それしかないなら自分でやるので)、
奇麗にエレガントにやる方法を希望します。
545名無しさん@お腹いっぱい。:2009/10/21(水) 18:10:19
よく知らないで申し訳ないが
current=`rlog -r file | grep 'なんとか'`
current=`expr $current - 0.001`
rcsdiff -r -$current file
空白とか改行とか考慮せずかなり適当に書いたけど。

exprでできないならbc使えばできるかもしれない。
546名無しさん@お腹いっぱい。:2009/10/21(水) 18:32:38
それはエレガントじゃないらしいよ
547名無しさん@お腹いっぱい。:2009/10/21(水) 20:25:10
シェルってゆうな。クズ。
548名無しさん@お腹いっぱい。:2009/10/21(水) 22:12:01
エレガントさが求められていたのか
知らんかったよ、すまん
549名無しさん@お腹いっぱい。:2009/10/21(水) 22:41:49
奇麗でエレガントな質問を募集します。
550名無しさん@お腹いっぱい。:2009/10/24(土) 13:10:57
>>545
エレガント云々を除いてもそれじゃ駄目だよ。
リビジョン番号は、 1.8 1.9 1.10 1.11 ... 1.99 1.100 1.101 ...
って進むから、expr で 0.001 引くのは全然見当違い。
551名無しさん@お腹いっぱい。:2009/10/26(月) 22:08:08
どうしてもわからないので質問させてください。

#!/bin/sh

DIR=`pwd`

cd $DIR/file
./play


のようにC言語で記述したplayファイルを実行しているのですが
play内では簡単に表すと以下のような処理をしています

while(true){
ファイルの読み込み処理
sleep(1);
}

このように1秒ごとにファイルを監視してるのですが
シェルスクリプトで実行すると1秒待たずにwhileループが回っているのですが
どうすればよいのでしょうか?
552名無しさん@お腹いっぱい。:2009/10/26(月) 22:13:23
>>551
そのwhileループの具体的なスクリプトを出さずに質問したいなら、
エスパースレに池。

sleepコマンド自体が文法またはオプションエラーになってて
1秒待ててないんじゃないの?
553名無しさん@お腹いっぱい。:2009/10/26(月) 22:15:27
問題点を人に伝える能力が欠けすぎ
554名無しさん@お腹いっぱい。:2009/10/26(月) 22:17:39
>>552
whileループはC言語で書いてるんだろ。(プログラムは出てるじゃん)

コマンドラインで直接 ./play を実行すると1秒毎に処理されるのに、
>>551 のシェルスクリプト経由で ./play を実行すると1秒待たずにループする、
という話だろ。
555名無しさん@お腹いっぱい。:2009/10/26(月) 22:20:28
で、答えは?
556名無しさん@お腹いっぱい。:2009/10/26(月) 22:20:58
>>551
sleep()関数はシグナルで中断される可能性がある。
シグナルが到着すればsleep(1)は1秒未満で終了する。
代わりにnanosleep()使え。

たぶん、シェルスクリプト経由の時だけシグナルが発生するような
別の条件が加わってるんだろ。
557名無しさん@お腹いっぱい。:2009/10/26(月) 22:36:54
>>551
play コマンド側は特に何もせずシェルスクリプト側で sleep 1; すればいいんじゃね?
558名無しさん@お腹いっぱい。:2009/10/26(月) 22:58:35
>>556
ありがとうございます。
試してみましたが同じ状態になりました。

説明が不足していてすみません
GNU Chessを改造していたので、その部分のコードを切り抜いても分かりづらいので自分なりに説明したのですが、説明力がなくてすみません。

ファイルの読み込み部分の処理は

while(true){
sleep(1);
if(rlogfp=fopen("./black.log","r")){
fgets(inp, MAXSTR, rlogfp);
fclose(rlogfp);
remove("./black.log");
break;
}
}


black.logというのは次の手を指定した文字列が収められているファイルです。
C言語で書くのもうまくないので下手なコードですが、ご了承ください。
559名無しさん@お腹いっぱい。:2009/10/26(月) 23:01:09
>>557
whileで監視しているのでsleep(1)がないとファイル作成時に読み込みが実行されるのか、うまくデータが受け取れないので
sleep(1)を追加している次第です。
560名無しさん@お腹いっぱい。:2009/10/26(月) 23:39:32
後からこんなことを追加するのはすみませんが

どうやら監視しているファイルが存在しないのに、ファイルがあるように動いているみたいで、
ファイル読み込む→whileを抜け出す→間違った手だと解釈→whileに入りファイルを読み込む
を繰り返すようになっているみたいです。
シェルスクリプトではなくターム上で実行するとうまくいくのに
スクリプトだとこの現象がおこるのはどういったわけでしょうか?
561名無しさん@お腹いっぱい。:2009/10/26(月) 23:56:55
>>560
シェルスクリプトの cd $DIR/file あたりがうまく行ってないとか。
別のディレクトリの black.logを読んでループしてるとか。
562名無しさん@お腹いっぱい。:2009/10/27(火) 00:11:19
>>561 レスありがとうございます
他のディレクトリではblack.logは生成していないのでそのケースはないかと思います
ディレクトリの場所も間違いはないです
563名無しさん@お腹いっぱい。:2009/10/27(火) 00:23:15
sleepはループの先頭なの?それなら確実に1秒待つでしょ?
説明に一貫性がないと回答者も混乱するし、いいことないよ。
あとは、fgets, fclose, removeの戻り値をちゃんとチェックしてみる。
564名無しさん@お腹いっぱい。:2009/10/27(火) 00:30:07
ぱおーん

ってそれはエレファント
565名無しさん@お腹いっぱい。:2009/10/27(火) 00:40:24
>>551
>シェルスクリプトで実行すると1秒待たずにwhileループが回っている

これはどうやって確認したの?

原因を切り分ける為に、問題を再現出来る最小限の
プログラムを作ってみると良いと思うよ。
566名無しさん@お腹いっぱい。:2009/10/27(火) 00:46:46
>>563,565
アドバイス通り明日調べてみます。
567名無しさん@お腹いっぱい。:2009/10/27(火) 08:05:15
>>559
> whileで監視しているのでsleep(1)がないと
> ファイル作成時に読み込みが実行されるのか、
> うまくデータが受け取れないので

busy waitになるだけでちゃんと動くはずだろ。
だから動かないのは、sleep()以外のところがおかしい。

568名無しさん@お腹いっぱい。:2009/10/27(火) 11:08:26
そのファイル、NFS かなんかの領域に置いてないか?
おかしなキャッシュが効いてるような気がする。
569名無しさん@お腹いっぱい。:2009/10/27(火) 11:38:40
>>568
特に変わった場所には置いてません。

とりあえずthreadやwhileループとファイルの読み込みの部分だけ同じ形でtestファイルを作ってみたのですが
直接実行、シェルスクリプトで実行で共に問題がなかったので、もっと別の場所だと分かりました。
もう少し試行錯誤してみたいと思います。
570名無しさん@お腹いっぱい。:2009/10/27(火) 12:26:31
ちょっと説明が長くなるのでアップロードしてみました。
お手数をおかけしてもうしわけありません。
DLkey:unix

http://www1.axfc.net/uploader/Sc/so/49655.txt
571名無しさん@お腹いっぱい。:2009/10/27(火) 13:04:39
input_threadが動き出す前にwait_for_inputに入ると、
input_statusが初期値(INPUT_NONE)のままなので、whileを抜けてしまう。
572名無しさん@お腹いっぱい。:2009/10/27(火) 21:14:09
test が表示されないという現象はウチでは一度も再現しませんでした。
Dual Core の Mac です。

外してたらスマソ。

test.sh を実行する
Ctrl-C で test.sh を止める
a.out のプロセスは残ったまま

とかじゃないよね?

まあそれでも test が表示されない理由にはなりませんけど。
573名無しさん@お腹いっぱい。:2009/10/27(火) 21:50:45
一度目がその症状があって
もう一度試したら治っていました

>>571
どのように記述すれば回避できるのでしょうか?
丸投げのようですみません^^;
574名無しさん@お腹いっぱい。:2009/10/28(水) 00:03:20
以前動作していたスクリプトが動かなくなってしまいました…
ここ最近kshのアップデートを行ったのが原因なのでしょうか…

何か情報をお持ちの方いらっしゃいましたらご教授願います。

<事象>
特に問題なく見えるkshがsyntax Error `(' unexpectedで異常終了
コメント内のスペースを1つ削除or2つ追加すると正常に動作する

<やったこと>
kshとbashのアップデート
ksh 20060214-1.4 → 20080202-14.el5
bash bash3.1-16.1 → bash3.2-21.el5

<環境>
redhat Linux 5.1
uname -a結果
Linuc 2.6.18-53.el5 #1 SMP Wed Oct 10 16:34:19 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux

<備考>
ksh -nで構文チェックをかけると、構文エラー以外に「" quote may be missing」という警告が必ずついてきます。
コメントを弄ってエラーを抑止するとこの警告も発生しなくなります。
575551:2009/10/28(水) 00:05:16
. play.shで実行したらうまく動きました。
結局原因はわかりませんでしたが、サブシェルだと何か環境とちがったのかな?と素人ながら思います。
お騒がせしてすみませんでした。
576名無しさん@お腹いっぱい。:2009/10/28(水) 00:59:40
それたまたまだから
577名無しさん@お腹いっぱい。:2009/10/28(水) 01:16:52
while(true)なんてしないで、openの返り値でなんとかならんの?
578名無しさん@お腹いっぱい。:2009/10/28(水) 07:06:37
>>574
おいおい、redhat 5.1というのは10年くらい前のOSで、
カーネルは2.0の時代のもの。(libc5からやっとglibc2に変わった時代)
カーネル2.6で動くわけがない。
579574:2009/10/28(水) 11:18:44
>>578
今確認したところ、redhat 5.1ではなく
RHEL 5.1でした

redhatLINUXとRHELを混同していました
申し訳ありません
580名無しさん@お腹いっぱい。:2009/10/28(水) 11:43:19
>>574
スクリプト晒せ
581名無しさん@お腹いっぱい。:2009/10/28(水) 11:44:15
libc5なつかしいな。
glibc2(libc6)になってようやくLANG関係がマトモになったんだっけ
582名無しさん@お腹いっぱい。:2009/10/28(水) 11:44:22
どうせShift_JISのコメントだろ。
583574:2009/10/28(水) 23:54:47
>>580
手元にスクリプトがない上に動く動かないの条件がよく分からないので再現できず…
申し訳ないです。

>>582
コメント等もう一度文字コードを見直しましたが、すべてUTF-8でした。
584名無しさん@お腹いっぱい。:2009/10/28(水) 23:56:51
手元にスクリプトがないのにコメント等見直した?意味が分からんのだが
585名無しさん@お腹いっぱい。:2009/10/28(水) 23:57:32
不思議な話だなw
586名無しさん@お腹いっぱい。:2009/10/29(木) 22:50:29
LOTO6用の数字列を生成する

for x in $(seq 1 5); do echo $(seq 1 43 | shuf | head -6 | sort -n); done
587名無しさん@お腹いっぱい。:2009/10/30(金) 23:17:20
>>586
for((i=0;i++<5;)){ echo `shuf -i 1-43 -n 6 | sort`; }

↑の方が簡単
588名無しさん@お腹いっぱい。:2009/11/10(火) 09:10:20
質問です。記法1と2では違いがありますか?どちらが正しいとか…
doの後に改行入れるべきかどうなのか,ということですが。

記法1
for i in *
do
echo $i
done

記法2
for i in *
do \
echo $i
done
589名無しさん@お腹いっぱい。:2009/11/10(火) 09:48:42
>>588
記法2は間違いではないがバックスラッシュが余分。
もともと do の直後には、空白、タブまたは改行の区切り文字があればなんでも良い。
「行の継続」をする必要はないので、バックスラッシュは不要。
590588:2009/11/10(火) 11:02:41
>>589
ありがとうございました。
591名無しさん@お腹いっぱい。:2009/11/10(火) 11:33:58
今のトレンドは↓の書き方。
bash依存じゃないぞ。純正シェルでもちゃんと動くから安心して使え。

for i in *
{
echo $i
}
592名無しさん@お腹いっぱい。:2009/11/10(火) 11:37:50
どこのトレンドだよwwwww
593名無しさん@お腹いっぱい。:2009/11/10(火) 11:43:46
for は { ... } でもいいけど、
while は do ... done じゃないといかんというのがアレ。
594名無しさん@お腹いっぱい。:2009/11/12(木) 08:07:11
kshで標準出力と標準エラーをデフォルトでファイル&画面に出力するやり方はありますか?
毎行、| tee -a hoge.log を書くのが大変なので。
595名無しさん@お腹いっぱい。:2009/11/12(木) 08:19:07
>>594

(
command1
command2
command3
:

) 2>&1 | tee -a hoge.log
596名無しさん@お腹いっぱい。:2009/11/12(木) 08:41:02
>>594
scriptコマンドは?
597名無しさん@お腹いっぱい。:2009/11/12(木) 08:58:07
俺はそういうとき
telnet localhost | tee hoge.log
ってやってる
598名無しさん@お腹いっぱい。:2009/11/12(木) 09:27:34
正解(>>595)が出た後にボケ回答(>>596-597)が出てくる、の法則
599名無しさん@お腹いっぱい。:2009/11/13(金) 19:18:09
自分よりいい答えが出たのがそんなに悔しかったのか
600名無しさん@お腹いっぱい。:2009/11/13(金) 19:57:03
> 毎行、| tee -a hoge.log を書くのが大変なので。
毎行と言っているし、ここはシェルスクリプトスレなのでスクリプトの中での記述に
関しての質問だと言う事が容易に予想できる。

スクリプトに関しての質問にscript使えだの、telnetをリダイレクトしろだの、
ボケまくりの回答してる奴らは何なのだろう?
匿名掲示板だからボケ回答も恥ずかしくないのだろうか?
601名無しさん@お腹いっぱい。:2009/11/14(土) 03:03:51
必死だなw
602名無しさん@お腹いっぱい。:2009/11/20(金) 10:11:52
>>599
只の知ったかだろ
半角数字とか学生の分際で早くも理系気取りかよ
603名無しさん@お腹いっぱい。:2009/11/20(金) 10:44:29
>>602
日本語で頼むわ……
604名無しさん@お腹いっぱい。:2009/11/20(金) 20:00:12
> 半角数字とか学生の分際で早くも理系気取りかよ

これは新コピペになりそうな気がする
605名無しさん@お腹いっぱい。:2009/11/21(土) 01:23:51
>>604
新コピペとか学生の分際で早くも理系気取りかよ
…こんな感じ?
606名無しさん@お腹いっぱい。:2009/11/21(土) 02:02:27
bashを使用しています。
数字が入っている変数に3桁毎にカンマを入れる方法が分かりません。
どうやれば3桁毎にカンマを入れれるようになりますか?
607名無しさん@お腹いっぱい。:2009/11/21(土) 12:27:50
>>606
printf "%'d" "$var"
608名無しさん@お腹いっぱい。:2009/11/21(土) 22:05:46
>>607
これはいいことを聞いたと、試してみたができないぞ?
$ bash --version
GNU bash, version 4.0.28(2)-release (i686-pc-linux-gnu)
609名無しさん@お腹いっぱい。:2009/11/21(土) 22:13:00
>>608
varの中にちゃんと数字入れてるか?
610名無しさん@お腹いっぱい。:2009/11/21(土) 22:17:56
>>607 では printfの書式に改行が入ってないから、
シェルのプロンプト設定によってはprintfの出力をプロンプトが上書きしてしまう
とエスパー。

それとは別に、zshの内蔵printfでは動作しないね。
611606:2009/11/21(土) 23:23:18
>>607さん
有難うございました。ウチの環境ではうまくいきました。
612名無しさん@お腹いっぱい。:2009/11/22(日) 14:57:44
$ printf "%'d\n" "123456"
123456
$ var="12345667"
$ printf "%'d\n" "$var"
12345667

なにがいけないのかねー
613名無しさん@お腹いっぱい。:2009/11/22(日) 17:20:06
$ printf "%aqd\n" "123456"
614名無しさん@お腹いっぱい。:2009/11/22(日) 17:29:35
>>612
localeの設定じゃない?
printf(3)によると、

>>printf("%'.2f", 1234567.89);
>>results in '1234567.89' in the POSIX locale, in '1234567,89' in the nl_NL locale,
>>and in '1.234.567,89' in the da_DK locale.
615名無しさん@お腹いっぱい。:2009/11/23(月) 00:52:46
>>614
ロケールの問題でした。ありがとう。
ちょっと気になるのは、printfコマンドする時に
LC_ALLを明示的に与えても上手く動作しなかったんですよね
組み込みコマンドだと伝わらないのかな?

$ locale
LANG=ja_JP.eucJP
LC_CTYPE="ja_JP.eucJP"
LC_NUMERIC=C
LC_TIME=C
LC_COLLATE="ja_JP.eucJP"
LC_MONETARY="ja_JP.eucJP"
LC_MESSAGES=C
LC_PAPER="ja_JP.eucJP"
LC_NAME="ja_JP.eucJP"
LC_ADDRESS="ja_JP.eucJP"
LC_TELEPHONE="ja_JP.eucJP"
LC_MEASUREMENT="ja_JP.eucJP"
LC_IDENTIFICATION="ja_JP.eucJP"
LC_ALL=
$ LC_ALL=da_DK printf "%'d\n" "123456789"
123456789
$ LC_ALL=da_DK bash
$ locale
LANG=ja_JP.eucJP
LC_CTYPE="da_DK"
(省略)
LC_ALL=da_DK
$ printf "%'d\n" "123456789"
123.456.789
616名無しさん@お腹いっぱい。:2009/11/23(月) 06:55:47
$ printf "%'d" "123456789"
printf: %': invalid directive
617名無しさん@お腹いっぱい。:2009/11/23(月) 13:08:26
>>615
>>$ LC_ALL=da_DK printf "%'d\n" "123456789"

LC_ALL を LC_NUMERIC にしてもダメ?
618名無しさん@お腹いっぱい。:2009/11/23(月) 15:32:07
(優先される)強さは、
強 LC_ALL > LC_個別 > LANG 弱
のはずだから、LC_ALL があってダメなら LC_NUMERIC でもダメな希ガス。

619名無しさん@お腹いっぱい。:2009/11/23(月) 15:44:54
>>617
ダメでした。
というかlocale(7)に書いてあるロケールの決定順序を見る限り
$ LC_ALL=da_DK printf "%'d\n" "123456789"
で動かなければ、LC_NUMERICを使っても同じなのではないかと。

ところで、
$ LC_ALL=da_DK locale
の結果は$ LC_ALL=da_DK bashで作ったシェル上でlocaleした
(参考>>615の2個目のlocale)のと同じ結果になります。
(つまりLC_ALLも、LC_NUMERICもda_DK)

その癖に、
$ LC_ALL=da_DK printf "%s\n" "$LC_NUMERIC" と
$ LC_ALL=da_DK echo "$LC_NUMERIC" はどちらも「C」が出力
(参考>>615の1個目のlocale)になるんですよね。LC_ALLはもちろん、改行のみです。
環境変数の伝わり方が変ですよね?

つまり、
localeだとLC_ALL(もしくはLC_NUMERIC)がexportされてて、
printfとechoはexportされない。

それと、
>>615で「組み込みコマンドだと・・・」といいましたが、
$ type -a echo したら、builtinと/bin/echoの2つのエントリがあったので、
どちらも試してみましたが、exportされませんでした。
どういうメカニズムでこうなっちゃうんでしょう。
620名無しさん@お腹いっぱい。:2009/11/23(月) 15:54:16
>>618 とレスが一部被ってしまった

連レスですみませんが、
コマンドの前に環境変数定義をつけるシンタックスって
なんという名前で呼ばれていますか?

そもそもどういうものなのかを調べたいのですが、ググりづらくて。
621名無しさん@お腹いっぱい。:2009/11/23(月) 16:04:31
>>620
shじゃなくてbashのマニュアルで申し訳ないが、
A simple command is a sequence of optional variable assignments
followed by blank-separated words and redirections, and terminated
by a control operator.
だそうな。
optional variable assignments (省略可能な変数代入)
622608,612,615,619:2009/11/23(月) 18:22:28
>>621 ありがとう。man bash読みました。
組み込みコマンドでの、optional variable assignmentの挙動についてまとめてみました。

COMMAND EXECUTION ENVIRONMENT節に以下の記述があります。
When a simple command other than a builtin or shell function is to be
executed, it is invoked in a separate execution environment

つまり組み込みコマンドはseparate execution environmentで呼び出されない。
これは当たり前のことで、組み込みコマンドは別シェルで実行されないということですよね。
そして個人的に新たに知ったのは、optional variable assignmentは別シェルにしか
伝えられないということです。(現在のシェル変数には代入されない)
だから、>>615で $ LC_ALL=da_DK printf "%'d\n" "123456789"
がコンマ区切りにならなかったんですね。

だったら、敢えてシェル変数を伝えられた実行環境を作って、printfするとどうなるか。
#include <stdlib.h>
int main()
{
 system("printf \"%s\n\" \"$LC_NUMERIC\"");
 system("printf \"%'d\n\" \"123456789\"");
 return 0;
}
をコンパイルしたa.outに対して試してみました。
(a.outは組み込みコマンドではないので別シェルで実行され、
optional variable assignmentが伝えられる)
623608,612,615,619,622:2009/11/23(月) 18:25:17
$ ./a.out
C
123456789
$ LC_NUMERIC=da_DK ./a.out
da_DK
123.456.789
$ LC_ALL=da_DK ./a.out
C
123.456.789
となりました。

>>615の後半のようにLC_ALL=da_DK bashで環境作ってからやる方が楽なので、
本末転倒になりましたが。。。


ところで、これで興味深いのは、LC_ALLはLC_NUMERICに影響を及ぼさないことです。
>>615では LC_ALL=da_DK bash 後にlocaleすると、LC_ALL=LC_NUMERIC=da_DKになりますが、
bashの初期化処理でLC_ALLの値をLC_NUMERICにコピーしているのかも?


最後に。619の訂正。
SIMPLE COMMAND EXPANSIONの節の 4.にあるように、
parameter expansionされてからコマンドが実行されるようなので、
$ LC_NUMERIC=da_DK printf "%s\n" "$LC_NUMERIC"
はコマンドが実行される前に引数の$LC_NUMERICが「C」(参考>>615)と展開される。
そのため、Cが表示される。


長文失礼しました。
624名無しさん@お腹いっぱい。:2009/11/23(月) 18:52:34
組み込みコマンドがseparate execution environmentで呼び出されないのは
bashの場合の話。

kshでは組み込みコマンドでもseparate execution environmentで動作する。
625名無しさん@お腹いっぱい。:2009/11/23(月) 19:12:34
やはり、sh系といえども、何を使っているかは明示すべきなんだな。
626名無しさん@お腹いっぱい。:2009/11/23(月) 19:17:36
確かにその通りですね。
上は全部>>608の環境で試してた。
627名無しさん@お腹いっぱい。:2009/11/26(木) 14:47:50
"aa-1125.txt" "aa-0001.txt"
"aa bb-1125.txt" "aa bb-0001.txt"
"aa bb cc-1125.txt" "aa bb cc-0001.txt"
同じディレクトリにこの6ファイルがあるとします。
この中から「aa bb-????.txt」の形式で且つ最も新しいファイルを
探したいんですが、
(当然のことですが)ls -ltr "aa bb-????.txt"|tail -1とやるとエラーになってしまいます。
どうすればいいでしょうか?シェルはbashです。
628名無しさん@お腹いっぱい。:2009/11/26(木) 15:01:32
ls -ltr (ここに6個のファイル名を羅列)|tail -1
629名無しさん@お腹いっぱい。:2009/11/26(木) 15:01:41
ls -lt aa\ bb-????.txt | head -1
630名無しさん@お腹いっぱい。:2009/11/26(木) 15:14:14
bbの無いファイルもあるぞ
631名無しさん@お腹いっぱい。:2009/11/26(木) 15:28:45
あるよ
だから?
632名無しさん@お腹いっぱい。:2009/11/26(木) 15:49:56
申し遅れましたが、
実際にはファイル数、ハイフンより前の部分のファイル名は不定です。
>>627は単純化した例です。
>>627の時点で知りたかったことは自動でエスケイプする方法もしくはそのコマンドです。
633名無しさん@お腹いっぱい。:2009/11/26(木) 16:00:11
一体何がしたいんだよ
何とマッチさせたいんだ?
634名無しさん@お腹いっぱい。:2009/11/26(木) 16:07:04
>>627の下から2行めをエスケイプしたものが
>>629なわけですが、(実質的に)
そのようなことをスクリプト内で自動でおこないたいということです。
sed,awkを使うのかなと思いますが、インタラクティブだと[tab]キーを押すと
できるようなことなので、bash内部でも出来ないかなとも思います。
635名無しさん@お腹いっぱい。:2009/11/26(木) 16:13:40
ハイフンより前にスペースが含まれていようがいまいが
*-????.txt で>>627の6ファイル全てにマッチするんだけど
それで何か困るのか
636名無しさん@お腹いっぱい。:2009/11/26(木) 17:03:15
unix超ど素人です。
本を参照しても見つからないので、
質問させてください。
ちなみにここで推奨されてないcshを使っています。

例えば80.0というように小数点がある数字を
80といった整数に書き直すスクリプトをつくりたいのですが、
うまくいきません。

#!/bin/csh
set y_info = 80.0
echo int($y_info) > aaa.dat
どうすれば解決できますでしょうか?
637名無しさん@お腹いっぱい。:2009/11/26(木) 17:23:05
解決の第一歩は、cshを捨てる事だ。
638名無しさん@お腹いっぱい。:2009/11/26(木) 17:24:52
>>627
スペースだけをクォートすればいい。シングルクォートの方がお勧め

ls -ltr ??' '??-????.txt | tail -1
639名無しさん@お腹いっぱい。:2009/11/26(木) 17:30:24
>>636
cshは捨てさせていただくので、shでどうぞ。

#!/bin/sh
y_info=80.0
printf '%.0f¥n' $y_info
640名無しさん@お腹いっぱい。:2009/11/26(木) 20:10:12
>>636
cshなら拡張子を削る機能が組み込まれてるので、
悪くないチョイスだよ

#!/bin/csh
set y_info=80.0
echo $y_inf:r > aaa.dat

なんと :r を付けるだけで小数点以下を削れるんだぜ
641名無しさん@お腹いっぱい。:2009/11/26(木) 20:11:11
echo $y_info:r > aaa.dat
のミス
642名無しさん@お腹いっぱい。:2009/11/26(木) 20:13:04
あと、csh スクリプトは
#!/bin/csh -f
にした方がなにかと幸せ
643名無しさん@お腹いっぱい。:2009/11/26(木) 20:30:51
>>640
それだと、 .5 みたいに頭の 0が省略されてる小数で誤動作する。
644名無しさん@お腹いっぱい。:2009/11/26(木) 20:34:08
>>640
(数値じゃなく)拡張子とみなして削る方式なら shでもできる。

#!/bin/sh
y_info=80.0
echo ${y_info%.*}


csh(笑)の出番なし。
645636:2009/11/26(木) 21:13:03
>>640
うまくいきました
トンクス

他の方もレスありがとうございます

シミュレーションで得られたデータを出力する際にスクリプトを使用しています。
周りがcsh使ってたので、それを使ってましたが、
shの方が問題点が少なそうなので、
そっちにシフトしてみようと思います。


646名無しさん@お腹いっぱい。:2009/11/26(木) 21:16:33
半導体屋か? あいつら何でcsh好きなんだ?
647名無しさん@お腹いっぱい。:2009/11/26(木) 21:19:13
>>640 だと四捨五入されない。>>639 がお勧め。
648名無しさん@お腹いっぱい。:2009/11/28(土) 11:45:22
以前にcshで作って、それですんでりゃそうなるだろう。
649名無しさん@お腹いっぱい。:2009/11/28(土) 12:14:17
tcsh以外に便利なインタラクティブシェルがなかった時代の負債といえようか
650名無しさん@お腹いっぱい。:2009/11/28(土) 12:33:23
ちょっとしたスクリプトの場合、cshの方が書きやすい場合もある。
四則演算が出来るとか配列が使えるとか、要はケースバイケース
651名無しさん@お腹いっぱい。:2009/11/28(土) 12:38:06
>>650
四則演算も配列も、今時のsh(系)でできる。
652名無しさん@お腹いっぱい。:2009/11/28(土) 12:46:50
ケースバイケースでcshスクリプトなんて混ぜられちゃ迷惑だ
653名無しさん@お腹いっぱい。:2009/11/28(土) 13:18:36
コピペで数千行を超えるのcshスクリプト作るんだぜ。
ちょっとしたを遥かに超越している。
654名無しさん@お腹いっぱい。:2009/11/28(土) 13:23:31
実績があります、とか言ったりなんかしちゃったりして
655名無しさん@お腹いっぱい。:2009/11/28(土) 17:21:38
UNIXド素人です。
手詰り状態なのでアドバイス頂けると幸いです。

◆処理内容
 Aディレクトリから、Bディレクトリにファイルをコピーする。
 (コピーオプション:-p -f)

◆コピー条件
 Bディレクトリのファイルの更新時間とAディレクトリのファイルの
 更新時間が異なる場合。

◆その他
 更新時間が異ならない場合は、エラーとし、1を戻り値とする。

上記のようなスクリプトを作成したいのですが
どのような処理にしたらよろしいのでしょうか?


656名無しさん@お腹いっぱい。:2009/11/28(土) 18:05:43
書いてあるとおりに処理しよう
657655:2009/11/28(土) 18:21:04
すいません。。
意味わからない質問になっていました。。

やり方がわからない処理は「更新時間を比較する」点です。
お互いの更新時間を変数に入れ、同じ場合と違う場合で処理を決めれば
いいことはわかるのですが、更新時間を比較することなどできるので
しょうか?
658名無しさん@お腹いっぱい。:2009/11/28(土) 18:23:44
>>655
要点だけ書くよ。

if [ "$file1" -nt "$file2" ]; then
cp -pf "$file1" "$file2"
fi
659655:2009/11/28(土) 18:43:33
>>658

ありがとうございます。
ファイルが更新された場合、サイズや更新時間で比較するしかないと思われるのですが
更新時間や、ファイルの詳細?を変数に格納することは可能なのでしょうか?
660名無しさん@お腹いっぱい。:2009/11/28(土) 18:47:33
>>659
md5sumとかでハッシュ値を見たら?
661名無しさん@お腹いっぱい。:2009/11/28(土) 18:54:17
>>659
せっかく回答もらってるのに意味をちゃんと理解しろよ。

[ A -nt B ]
ってやったら、これで更新時間を比較してるんだよ。
別に更新時間を変数に入れる必要なんかない。

-nt は、"newer than" ね。
662655:2009/11/28(土) 19:16:35
>>658 >>661

そういうことですね!!
ファイルの更新時間ではなく、ファイル自体を比較すればいいのですね!!

理解力が無く、ご迷惑おかけいたしました・・・
アドバイスを参考にスクリプトを作成してみたいと思います。
ありがとうございました。
663名無しさん@お腹いっぱい。:2009/11/28(土) 19:19:11
>>662
違うよ。

ファイル自体なんて比較してない。
更新時間を比較してるの。

if [ fileA -nt fileB ]; then ...

ってやると、fileA と fileBの更新時刻を比較して、
その結果で動作が決まるんだよ。
fileA/fileBの中身は読んでない。
664名無しさん@お腹いっぱい。:2009/11/28(土) 19:23:46
665名無しさん@お腹いっぱい。:2009/11/28(土) 19:28:45
md5sumとかハッシュとか言ってる回答者の言うことはここでは無視しとけ。
単純にシェルスクリプトから [ ] (testコマンド)で時刻比較できるんだから。
666名無しさん@お腹いっぱい。:2009/11/28(土) 19:33:06
>>662は日本語読解力からしてダメだな。
667名無しさん@お腹いっぱい。:2009/11/28(土) 19:36:34
更新時刻が異なる場合、なのに、newer than だけでいいんだろうか
668655:2009/11/28(土) 19:36:40
>>663

少し調べてみましたところ、ファイルのタイムスタンプ、つまり更新時間
を比較しているのですね。

ファイルの比較には -nt -ot の2種類があるようですが
"="や"!="で比較することは無理と理解してよろしいのでしょうか?
669名無しさん@お腹いっぱい。:2009/11/28(土) 19:42:39
>>667
だから>>658 は「要点だけ」って言ってるんだよ。

せっかく >>668 が -nt と -ot を調べたんだから、
それを -o すれば 時刻の "!=" を条件を記述できることに気づくはず。
670名無しさん@お腹いっぱい。:2009/11/28(土) 21:50:23
>>668
> ファイルの比較には -nt -ot の2種類があるようですが

>>663を読み直せ…

671名無しさん@お腹いっぱい。:2009/11/28(土) 22:22:24
rsync 使え、で終わる気がする
672名無しさん@お腹いっぱい。:2009/11/29(日) 00:01:55
>>668
> "="や"!="で比較することは無理と理解してよろしいのでしょうか?
そう考えていいよ。「異なる場合」って言ってるんだから、
「「新しい場合」または「古い場合」」
っていう条件が必要なんでしょ?
それぞれ>>663の書式を使って-ntと-otでできるよ。君の言うとおりだよ。
あとは二つをつなぐ「または」を調べてみてごらん。>>669もそう言ってるけどね。

>>671 俺もそう思う。
673655:2009/11/29(日) 00:32:15
>>672

if [ FILE1 -nt FILE2 -o FILE1 -ot FILE2 ] ; then
cp -p -f …
exit 0
else
exit 1
fi
とすればいいのですね!

>>658 >>663 そこまで読み取ることができず、ご迷惑おかけいたしました。。
674名無しさん@お腹いっぱい。:2009/12/04(金) 21:09:44
$ echo "http://aaa.kp//////a/bbb//ccc///ddd/////" | sed -e 's@//*@/@g' -e 's@http:/@http://@g'
http://aaa.kp/a/bbb/ccc/ddd/

一応目的の動作は達成しているのですが、sedがマヌケです。


もうちょっと素敵な方法はありますか?
675名無しさん@お腹いっぱい。:2009/12/04(金) 21:32:24
676名無しさん@お腹いっぱい。:2009/12/05(土) 00:35:32
sed -e 's@\([^:]\)//*@\1/@g'
677名無しさん@お腹いっぱい。:2009/12/05(土) 00:49:25
マジキチ
678名無しさん@お腹いっぱい。:2009/12/05(土) 19:23:28
複雑多数のサブディレクトリを持つディレクトリAを複製したい
但し、いくつかのサブディレクトリについては複製対象外としたい。
現状以下のようにやってます。
cp -rp A B
rm -rf B/a/b/c
rm -rf B/bb/aa/cc
・・・消したい対象分ひたすら羅列。

サブディレクトリ内のサイズが大きく、cp,rmで余計な時間が掛かってしまいます。
AをBとして複製する場合に、「このサブディレクトリ以外すべてコピー」
またいな記述方法はありますでしょうか?
sh,bashでお願いします。
679名無しさん@お腹いっぱい。:2009/12/05(土) 19:40:24
cd A
tar cf - . --exclude a/b/c --exclude bb/aa/cc | tar xf - -C /path/to/B
680名無しさん@お腹いっぱい。:2009/12/05(土) 19:49:17
>>679

なるほど、tarのアーカイブファイルを経由させるのですね。
ありがとう。やってみます。
681名無しさん@お腹いっぱい。:2009/12/05(土) 22:18:32
find . -print |egrep -f exlude-pattern-file |cpio -pumd destdir

さらに、コピーでなくてハードリンクで済ませられるなら、高速、省スペース。
find . -print |egrep -f exlude-pattern-file |cpio -pumdl destdir
682名無しさん@お腹いっぱい。:2009/12/05(土) 23:09:18
ありがとう。一考してみます。
683名無しさん@お腹いっぱい。:2009/12/06(日) 23:26:04

>>676
規制で書けかなった。ありがとう。
684名無しさん@お腹いっぱい。:2009/12/10(木) 10:18:03
findの判別式を単独のファイルに適用して、真偽値だけほしいんだけど
どうしたらいい?
685名無しさん@お腹いっぱい。:2009/12/10(木) 10:27:52
例えば

[ -n "`find /path/to/file -mtime 7 ...`" ]

みたいな感じか?
686名無しさん@お腹いっぱい。:2009/12/10(木) 10:34:08
いや、

find /path/to/file -mtime 7 2> /dev/null; echo $?

だろ。
687名無しさん@お腹いっぱい。:2009/12/10(木) 10:39:11
ファイルが正常に処理されれば、判定結果にかかわらず戻り値はいつも0だよ
688名無しさん@お腹いっぱい。:2009/12/10(木) 10:42:01
>>686
マッチしてもしなくても$?は0なのよ

>>685
なるほど文字列の長さを見るのか
とりあえずこれでやってみるわ超サンクス
689名無しさん@お腹いっぱい。:2009/12/10(木) 19:44:25
他サーバ上のtar.gzファイルを解凍する方法はないでしょうか?
690名無しさん@お腹いっぱい。:2009/12/10(木) 20:28:24
sshとか可能なら普通に解凍できるから、そうじゃない質問だとして、
エスパー募集だな
691名無しさん@お腹いっぱい。:2009/12/10(木) 20:55:52
>>690
たとえばftpで他サーバに接続して、gzip -cd | tar xvf -
のようなことはできないでしょうか?
692名無しさん@お腹いっぱい。:2009/12/10(木) 20:59:06
693名無しさん@お腹いっぱい。:2009/12/10(木) 21:08:14
>>692
ありがとうございます。
ちょっと試してみます。
694名無しさん@お腹いっぱい。:2009/12/12(土) 13:37:48
http://v6shell.org/
にてるような、変わっているような。
695名無しさん@お腹いっぱい。:2009/12/20(日) 13:17:58
すみません、スクリプト内で使用されている変数について教えてください。
使用しているOSはCentOS5.3です。

今、勉強がてら/etc/init.d/functionsを読んでいるのですが、
functions内で使用されている変数$LSBの意味がわかりません。

使用例 :[ "$BOOTUP" = "verbose" -a -z "${LSB:-}" ] のように記述されています。

例えば、上記例の$BOOTUPは、/etc/sysconfig/init内で定義されているのを確認できました。
しかし$LSBは/etc/sysconfigや、/etc内のファイルをざっと検索してみても大本の定義が発見できません。
setにもenvにもありません。

$LSBは、意味ありげに見えるだけで、単になんでもない、普通の変数なんでしょうか?
それとも、ちゃんとどこかで定義されているんでしょうか?
もしかしたら、変数ではなく別のものなんでしょうか?

しょうもない質問で申し訳ありませんが、ご教授ください。よろしくお願いします。
696名無しさん@お腹いっぱい。:2009/12/20(日) 14:00:20
教授はあげません。
697名無しさん@お腹いっぱい。:2009/12/20(日) 14:33:04
Linux Standard Base準拠なら定義しておく、ってやつかな?

698名無しさん@お腹いっぱい。:2009/12/20(日) 15:05:57
「ご教授」で正しいんだよ。
699名無しさん@お腹いっぱい。:2009/12/20(日) 15:28:33
そして、それに対する>>696の返しは絶妙だったな。
700名無しさん@お腹いっぱい。:2009/12/20(日) 15:42:03
いや、正しくない。
「教授する」というのは体系だててきちんと教えるという意味なので、
どこの馬の骨かわからない匿名掲示板の単発質問者には「教授」しない。
701名無しさん@お腹いっぱい。:2009/12/20(日) 15:53:37
>>700
だから「体系だててきちんと教え」てください、って >>695 が言ってるんだから
言葉として正しいじゃん。

それに対して、>>696 は「教授する」自体が間違いだと勘違いして
恥を晒しちゃったね。
702名無しさん@お腹いっぱい。:2009/12/20(日) 16:04:02
恥を晒してる奴がいると思うとすかさず飛びつく奴って流石だよな。
楽しい休日の午後のひとときって感じ。
703名無しさん@お腹いっぱい。:2009/12/20(日) 17:18:06
>>701
メクラ? >>695のどこに「体系だててきちんと教えてください」と書いてあるんだ?
揚げ足とったつもりが恥晒して惨め過ぎ。
704名無しさん@お腹いっぱい。:2009/12/20(日) 17:51:05
>>695
定義してない可能性があるから:-なんやで!
705名無しさん@お腹いっぱい。:2009/12/20(日) 18:08:34
>>703
「ご教授ください」=「体系だててきちんと教えてください」(同値)

>>695 には「ご教授ください」と書いてある、
イコール
>>695 は「体系だててきちんと教えてください」と言っている
706名無しさん@お腹いっぱい。:2009/12/20(日) 18:46:44
けんかをやめて〜
ふたりをとめて〜
わたし〜の〜ために〜
あらそ〜わない〜で
もう こ〜れ〜い〜じょ〜う〜♪
707名無しさん@お腹いっぱい。:2009/12/20(日) 18:50:49
じゃあ体系だてて回答してやれ
708名無しさん@お腹いっぱい。:2009/12/20(日) 19:44:15
695です。皆さまなんだかお騒がせしてすみませんでした。
>>697 >>704
ありがとうございます、Linux Standard Baseですか。規格だとしか捉えていなかったので、
関係あるとは想像もしていませんでした。

$BOOTUP=verboseだとold-style bootupらしいので、
加えてLinux Standard Base準拠でないことを確認したいとかなんでしょうかね。

Linux Standard Baseのページには、
「個々のライブラリのインターフェースの装備、および、、各インターフェースに関連したデータ構造・定数を規定しています」
とあったので、どこかで何か定義されているんでしょうね。以下のページを見つけたのですが探しきれませんでした。

http://dev.linux-foundation.org/betaspecs/booksets/LSB-Core-generic/LSB-Core-generic.html

実体がわからないのは残念ですが、私自身が納得できたので、先に進むことができそうです。
皆さま、本当にありがとうございました!
709名無しさん@お腹いっぱい。:2009/12/20(日) 21:01:27
${LSB:-}

:- ってどういう意味?だれか教えて。

#一瞬 :-) かと思ったけど違ったので :-p
710名無しさん@お腹いっぱい。:2009/12/20(日) 21:03:54
・・・と書いておいてなんだけど、man bashに書いてあった

${parameter:-word}
デフォルトの値を使います。 parameter が設定されていないか空文 字
列であれば、 word を展開したものに置換されます。そうでなければ、
parameter の値に置換されます。

へー。しらなかった。
711名無しさん@お腹いっぱい。:2009/12/20(日) 21:06:40
:-)
712名無しさん@お腹いっぱい。:2009/12/20(日) 23:43:43
>>705
バカメ。「ご教授ください」と「体系だててきちんと教えてください」は同値だが、
>>695は誤用だから同値じゃ無いという指摘だ。

論理的思考の出来ないバカは恥を晒すだけだから引っ込んでろ。
713名無しさん@お腹いっぱい。:2009/12/20(日) 23:58:55
日曜日最後のレスがそれじゃあな…
714名無しさん@お腹いっぱい。:2009/12/21(月) 00:50:09
ご教示ください
とすればおkだったような予感w
715名無しさん@お腹いっぱい。:2009/12/21(月) 02:38:22
>>714
ご教授くださいだろ、バーカ!
こんな展開だと予想
716名無しさん@お腹いっぱい。:2009/12/21(月) 07:41:23
>>712
そうじゃなくて、
あくまで誤用であって、「ご教授する」という言葉は日本語として正しい、
というのが主張。
(誤用だけど、言葉自体は正しいの)


ところが、>>696 曰く、
>教授はあげません。

という突っ込みは、「ご教授する」という言葉自体も間違っていると
思い込んでいる。

もし、「誤用」に対する突っ込みなら、
「(こんな掲示版では)ご教授はできません」
となるはずで、
「教授はあげません」みたいには言わないはず。

よって、
>>696 は、「ご教授する」という言葉自体を知らなかったという天で
恥を晒したんだよ。
717名無しさん@お腹いっぱい。:2009/12/21(月) 11:12:52
なにそれこわい
718名無しさん@お腹いっぱい。:2009/12/21(月) 13:14:13
うわ、まだ続けてるのかよ
719名無しさん@お腹いっぱい。:2009/12/21(月) 18:25:12
>>716
アホ丸出しの言い訳止めろ。>>695の用法も正しいと言うのがお前の主張(>>705)。
>>696はオレじゃないが、誤用に対して「あげない」とからかっている。
お前は用法を知らずに揚げ足とったつもりで恥を晒したうえに、小学生並みの見苦
しい言い逃れを続けている単なるバカ。お前の負け。

>>705
> 「ご教授ください」=「体系だててきちんと教えてください」(同値)
> >>695 には「ご教授ください」と書いてある、
> イコール
> >>695 は「体系だててきちんと教えてください」と言っている
720名無しさん@お腹いっぱい。:2009/12/21(月) 19:46:10
関係ない話はくだらないからやめようぜ。
>>695の質問の本質はLSBはどんな意味をもつ変数なの?ってことだろ
LSBについてまともに答えてるの>>697くらいじゃねーか
721名無しさん@お腹いっぱい。:2009/12/21(月) 20:31:51
レスありがとうございます
と書くだけでスレが荒れるのと同じだな
722名無しさん@お腹いっぱい。:2009/12/21(月) 21:02:19
>>721
FreeBSDって何???
723名無しさん@お腹いっぱい。:2009/12/21(月) 22:46:41
>>722
http://www.freebsd.org/

荒したいならスペースが足らぬわ
724名無しさん@お腹いっぱい。:2009/12/23(水) 17:35:56
cshについて質問させてください
変数の中身が文字列か数字か判断して処理をしたいのですがどうやったらわかりますか?
if ($1 == [0-9]*)
こんな感じでいけるのかなっておもったけどうまくいかずで…
725名無しさん@お腹いっぱい。:2009/12/23(水) 17:40:30
回答が欲しいなら「ご教授ください」って書かないと誰も答えないよ。
726名無しさん@お腹いっぱい。:2009/12/23(水) 19:16:51
パイプラインについて質問です.
% ls
foo.txt bar.txt baz.txt
の状態で,
% ls | wc -l
とやると3が返ってきます.
これは,パイプラインを通すとlsの結果に改行が挿入されるということなのでしょうか?
% ls | xargs echo | wc -l
とすると1が返ってくるので,この結果の違いが不思議です.
727名無しさん@お腹いっぱい。:2009/12/23(水) 19:24:28
まずは ls | cat して確かめてみなさい

一応、はまりそうなので正解を言っておくと、ls が、出力先がパイプか端末かを
調べて、出力を変えています。パイプが変えてるのではありません。
728名無しさん@お腹いっぱい。:2009/12/23(水) 19:26:27
724です。
是非ともご教授いただきたいです。
よろしくお願いいたします。
729名無しさん@お腹いっぱい。:2009/12/23(水) 20:19:56
>>724
先頭が数字かどうかなら 
 if ( $1 =~ [0-9]* )
でいけるけど、より正確に数値かどうか判定するとなると
cshでは難しいかもしれない

教授は付けないほうがいい
730名無しさん@お腹いっぱい。:2009/12/23(水) 20:37:33
「ご教授」で正しいんだよ。
731名無しさん@お腹いっぱい。:2009/12/23(水) 20:38:39
>>727
lsが状況に応じて出力を変えてるとは思いませんでした.
ありがとうございます.
732724:2009/12/23(水) 20:42:48
>729さん
cshでは難しいですか。。。

回答ありがとうございます。
733名無しさん@お腹いっぱい。:2009/12/23(水) 20:46:57
>724
if ( { ( echo -n "$1" | grep '^[0-9][0-9]*$' > /dev/null ) } ) echo yes,yes,yes
734名無しさん@お腹いっぱい。:2009/12/23(水) 23:37:25
>>724にかなり近いのですが、質問します。

kshで「変数の中身が半角英数14桁」であることを確認したいのですが、上手くいきません。

if [ `expr $hoge : [a-zA-Z0-9]+` -ne 14 ] ; then
# 半角英数14桁以外
fi

と書いてみたのですが、+が正規表現になってくれず。
[a-zA-Z0-9][a-zA-Z0-9]*も最初2桁分しかチェックできず。

上手く正規表現でチェックできる術はないでしょうか?
お分かりの方、ご教授お願いします。
735名無しさん@お腹いっぱい。:2009/12/24(木) 01:15:38
$ echo "foo" | if egrep -qs '^[a-zA-Z0-9]+$'; then echo yes; fi
yes
$ echo "_foo" | if egrep -qs '^[a-zA-Z0-9]+$'; then echo yes; fi
$
736名無しさん@お腹いっぱい。:2009/12/24(木) 04:12:15
>>734
if [ `expr $hoge : "[a-zA-Z0-9]\+"` -ne 14 ]


737734:2009/12/25(金) 07:48:46
>>735
>>736
アドバイスありがとうございます。
見た目に単純な736の記述を試して上手く動作したので、この形で実装したいと思います。

\でエスケープすると正規表現になるとは知りませんでした。完全に逆だと思ってました。
エスケープもダブルクオートも試したのですが、両方やるとは思いつかず…

ありがとうございました。
738名無しさん@お腹いっぱい。:2009/12/26(土) 18:19:46
えーと、複数ファイルを結合したいのですが、

・ファイル名の一部が一致している
・結合すべきファイルの数は分かっている
・一致している部分の文字数、箇所も分かっている
・このようなファイルの組がディレクトリ内に複数組ある

というような条件で、例えば

file01abc.txt
file02abc.txt
file03abc.txt

file01def.txt
file02def.txt
file03def.txt

file......

で、わざわざ
cat file??abc.txt > fileabc.txt
cat file??def.txt > fileabc.txt
cat............

などと書かずに一致部分を判別して全ての組を結合させたいのです。うまく出来る方法はあるでしょうか?
739名無しさん@お腹いっぱい。:2009/12/26(土) 18:35:08
>>738
普通に、

for f in abc def
do
cat file??"$f".txt > file"$f".txt
done
740名無しさん@お腹いっぱい。:2009/12/26(土) 19:13:07
すみません、ちょっと説明足りませんでした。
そのabc、defってのが異なる組がかなり大量にあって、かつその文字列が
そこそこ長いこと、毎回その生成される文字列が異なることから、いちいちinの後の部分を
書き出さずに出来るようにしたいのです。つまりこの場合、7,8,9文字目が
(具体的な文字列は何だか分からないけれど)一致しているファイル全てを結合する、
というような指定は出来ないでしょうか?
741名無しさん@お腹いっぱい。:2009/12/26(土) 19:19:01
>>738
普通に、

for ff in *
do
f=${ff:6:3}
cat file??"$f".txt > file"$f".txt
done
742名無しさん@お腹いっぱい。:2009/12/26(土) 19:35:08
>>740
これで合ってる?

ls | sed -n 's/^......//p' | sed 's/....$//' | sort | uniq | while read i
do cat file*${i}.txt > file${i}.txt
done
743名無しさん@お腹いっぱい。:2009/12/26(土) 19:36:00
10
22
3
11
25
90
12




ってあるTextで平均から飛び出る奴(今回は90)切りたいんだけど
ヒントないっすか?
744名無しさん@お腹いっぱい。:2009/12/26(土) 19:38:28
偏差値求めて標準偏差の何倍とかで検出だな
745名無しさん@お腹いっぱい。:2009/12/26(土) 20:34:25
>>741
>>742
ありがとうございます。どっちも動作は完璧です。
さらにお手数をおかけしますが後学のために、
軽く何をやってるのか教えてもらえないでしょうか。

741はワイルドカードの挙動がよく分からないので3行目の時点で
ffに何が入っているのかよくわかりません。ffの6バイト目から3文字分を
fに代入し直しているって理解は合っていますか?

742は-n以降何をやってるか全く分かりません…
特に並んでいるドットの意味を教えてもらえないでしょうか?
察するに文字数ですよね?
746名無しさん@お腹いっぱい。:2009/12/26(土) 20:50:17
>>745
>ffに何が入っているのかよくわかりません。ffの6バイト目から3文字分を
>fに代入し直しているって理解は合っていますか?

あってる

>742は-n以降何をやってるか全く分かりません…
>特に並んでいるドットの意味を教えてもらえないでしょうか?

sedの正規表現です
747名無しさん@お腹いっぱい。:2009/12/26(土) 21:01:15
>>745
's/^......//p'

s は sbustitution == 文字の置換。s/aaa/bbb/ で aaa を bbb に置き換える。
^...... は正規表現。^ は行頭を表していて、. は文字一つ分を表している。
p は print == 印字。s で置き換えた後の文字列を表示する。

sed 's/....$//'

さっきと基本は同じ。
$ は行末を表している。....$ は行末の任意の4文字にマッチする正規表現。

sort | uniq

入力をソートして重複を除去する。
ここまでの処理結果は abc, def 等がファイル数分重複しているので、
重複を取り除く。

while read i; do ...

read で一行ずつ読み込んで、変数 i に格納する。i には abc や def 等が入る。

シェルスクリプトは普段それほど使っていないので、多分、もっと良い
方法があると思います。
748名無しさん@お腹いっぱい。:2009/12/26(土) 21:09:21
スマソ。
s/sbustitution/substitution/
749名無しさん@お腹いっぱい。:2009/12/26(土) 21:15:50
>>746
>>747
度々御丁寧にありがとうございます。よく分かりました。
750名無しさん@お腹いっぱい。:2009/12/27(日) 15:16:39
>>744
そか、いったん合計して偏差値出すしかないか
d
751正月前:2009/12/29(火) 21:51:50
シェルスクリプトの中で以下のようにperlで重複部分の文字を削除する場合は、最後の文字は消されない理由はなんでしょうか?
perlの中で同じことをすると、最後の文字は消されるのに。
教えて頂ければ、ありがたいです。
--------------------------
hoge='a:b:c:d:a:b:c:d:a'
echo $hoge
echo " "
echo $hoge | perl -F: -ane 'chop;foreach(@F){$s{$_}++ or push(@b,$_)}print join(":",@b)'
echo " "


--------------------------
752名無しさん@お腹いっぱい。:2009/12/29(火) 22:24:22
>>751
echo -n
753正月前:2009/12/29(火) 22:45:31
ありがとうございました!!!
perlの中でchopではだめで、echo -n で改行を消さないといけないんですね!
754名無しさん@お腹いっぱい。:2009/12/30(水) 00:24:04
auto-split後だからchopするとしたら
chop($F[$#F]);
755名無しさん@お腹いっぱい。:2010/01/07(木) 21:10:23
run.shファイルの中で、script_file.shをsourceした場合。
sourceされているscript_fileの中でscript_file自身の絶対パスを得る方法を調べています。

bashの場合はscript_fileの中で$BASH_SOURCEから得られるが、他のシェル(zsh/tcsh/ksh)でscript_file.shのパスを得られる方法を
教えていただけませんか?

>>>>>>>>>>>>>>>>>>>>>>
script_file.shファイルのある場所
/path/to/script_file.sh
>>>>>>>>>>>>>>>>>>>>>>

実行例:
%./run.sh

期待結果:
/path/to/


ファイル <run.sh>の中身
-------------
#!/bin/(sh/zsh/tcsh...)
source $path/script_file.sh
-------------

ファイル script_file:
-------------
script_file_path=`******`
echo $script_file_path;
-------------

756名無しさん@お腹いっぱい。:2010/01/07(木) 21:31:48
>>755
他のシェルのソースを改造して $BASH_SOURCEの機能を実装すれば桶。
757名無しさん@お腹いっぱい。:2010/01/07(木) 21:50:29
>>756
早速のレスありがとうございます。今環境がないので明日試してみます。
758名無しさん@お腹いっぱい。:2010/01/07(木) 22:13:18
こりゃ、わかって無いな。
759名無しさん@お腹いっぱい。:2010/01/08(金) 13:35:29
制限時間を設定して、2つのプロセスを実行して、時間内に1つでもプロセスが終了しなかったら2つともキルして、もう一度最初から実行するにはどのように記述すれば良いのでしょうか?
ご教授ねがいます
760名無しさん@お腹いっぱい。:2010/01/08(金) 14:04:43
どこの馬の骨かわからん奴に教授はしない。
761名無しさん@お腹いっぱい。:2010/01/08(金) 14:41:28
>>759
同条件で、最初から再実行したら、また時間内に
プロセスが終了しないのでループしちゃうのでは?
762名無しさん@お腹いっぱい。:2010/01/08(金) 14:52:01
>>716
ループしてもいいから、まずはやり方を教授しろよ
763名無しさん@お腹いっぱい。:2010/01/08(金) 14:57:34
>>761
ネットとか、I/Oポートとか、外的要因が絡んでるのなら
同条件で、最初から再実行してもループしない。
764名無しさん@お腹いっぱい。:2010/01/08(金) 15:00:24
>>762
だから、誤用だけど言葉として正しい
と言ってるだろバカ
765名無しさん@お腹いっぱい。:2010/01/08(金) 18:36:31
>>764
誤用する奴には教えないと言っているのだ。バカ。
766名無しさん@お腹いっぱい。:2010/01/08(金) 18:43:35
うるせー馬鹿
767名無しさん@お腹いっぱい。:2010/01/08(金) 18:53:46
いい加減ウザイよ。
768名無しさん@お腹いっぱい。:2010/01/08(金) 19:02:39
>>765
仮に誤用してなかったとしても肝心の質問の答を知らないくせに
769名無しさん@お腹いっぱい。:2010/01/08(金) 19:22:50
煽って答えがもらえるのは小学生まで
770名無しさん@お腹いっぱい。:2010/01/08(金) 19:24:23
>>768
惨めだなあ。馬鹿丸出しの言い逃れを↓で完璧にのされたのを忘れてまた出てきやがった。

From: [719] 名無しさん@お腹いっぱい。 <sage>
Date: 2009/12/21(月) 18:25:12

>>716
アホ丸出しの言い訳止めろ。>>695の用法も正しいと言うのがお前の主張(>>705)。
>>696はオレじゃないが、誤用に対して「あげない」とからかっている。
お前は用法を知らずに揚げ足とったつもりで恥を晒したうえに、小学生並みの見苦
しい言い逃れを続けている単なるバカ。お前の負け。

>>705
> 「ご教授ください」=「体系だててきちんと教えてください」(同値)
> >>695 には「ご教授ください」と書いてある、
> イコール
> >>695 は「体系だててきちんと教えてください」と言っている
771名無しさん@お腹いっぱい。:2010/01/08(金) 21:13:41
>>759

#!/bin/sh
program1 &
p1=$!
program2 &
p2=$!

sleep 60

kill -0 $p1; is_p1=$?
kill -0 $p2; is_p2=$?
if [ $is_p1 = 0 -o $is_p2 = 0 ]
then
   kill -9 $p1 $p2
   sh $0
fi
772名無しさん@お腹いっぱい。:2010/01/08(金) 21:24:43
1 SIGKILLは安易に使ってはいけない。
2 exec sh $0
773名無しさん@お腹いっぱい。:2010/01/08(金) 21:57:52
シェルをexecし直すのは効率が悪い。while文で書ける。

#!/bin/sh
while :
do
program1 &
p1=$!
program2 &
p2=$!

sleep 60

kill -0 $p1; is_p1=$?
kill -0 $p2; is_p2=$?
if [ $is_p1 = 0 -o $is_p2 = 0 ]
then
kill -9 $p1 $p2
continue
fi
break
done
774名無しさん@お腹いっぱい。:2010/01/08(金) 22:06:04
SIGTERM と SIGINT のどちらを使うべきか
いまだによくわからないのはオレだけでいい
775名無しさん@お腹いっぱい。:2010/01/08(金) 22:11:32
SIGKILLでおk
776名無しさん@お腹いっぱい。:2010/01/08(金) 22:19:31
>>771 >>773
program1やprogram2が 60秒以内に正常終了した場合には、
sleep 60 せずにスクリプトもすぐ終了したいんですが、、
777名無しさん@お腹いっぱい。:2010/01/08(金) 22:45:57
「ご教授ねがいます」なんていう奴は、これだよ
778名無しさん@お腹いっぱい。:2010/01/08(金) 22:56:17
ご教授ねがえります
779名無しさん@お腹いっぱい。:2010/01/08(金) 23:06:34
ご教授ねがえったか
780名無しさん@お腹いっぱい。:2010/01/08(金) 23:47:21
謀反でござる!
謀反でござる!
781名無しさん@お腹いっぱい。:2010/01/09(土) 05:41:48
女教授おながいします
782名無しさん@お腹いっぱい。:2010/01/09(土) 07:47:50
質問 >>759 >>776 について、
「ご教授」の突っ込みと誤答ばかりで、

==== ここまで正解ゼロ ====
783名無しさん@お腹いっぱい。:2010/01/09(土) 11:58:33
釣り板の釣りスレでマジ回答したら負け
784771:2010/01/09(土) 14:46:50
>>776
sleep 60の代わりに、それらのプロセスが終了したか
チェックすればいい

   t=0
   while t=`expr $t + 1`; [ $t -lt 60 ]
   do
        kill -0 $p1; is_p1=$? 
        kill -0 $p2; is_p2=$? 
        if [ $is_p1 != 0 -a $is_p2 != 0 ] 
        then 
              break
         fi
        sleep 1
    done
785名無しさん@お腹いっぱい。:2010/01/09(土) 15:03:34
お題を良く読みましょう。「制限時間」
オレはご教授しないけどな。
786名無しさん@お腹いっぱい。:2010/01/09(土) 15:06:52
>>784
それ、1秒間隔でポーリングしてるだけなので、
やっぱり最大1秒遅れるので、ダメです。
787名無しさん@お腹いっぱい。:2010/01/09(土) 19:46:58
#!/bin/sh
T1=`date "+%s"`
T2=0
T3=0
STS=1

while t=`expr $T3 - $T1`; [ $t -lt 最大制限時間 ]
do
program1 &
p1=$!
program2 &
p2=$!
T2=`date "+%s"`
T3=0

while t=`expr $T3 - $T2`; [ $t -lt 制限時間 ]
do
kill -0 $p1; is_p1=$?
kill -0 $p2; is_p2=$?
if [ $is_p1 != 0 -a $is_p2 != 0 ]; then
STS=0
break 2
fi
T3=`date "+%s"`
done
kill -9 $p1 $p2
done
exit $STS

もっとスマートに書けると思う ご教授しる
788名無しさん@お腹いっぱい。:2010/01/09(土) 19:47:22
いやです
789名無しさん@お腹いっぱい。:2010/01/09(土) 20:33:37
>>787
それ、ビージーループになってて重いのでNGです
790名無しさん@お腹いっぱい。:2010/01/09(土) 22:00:20
waitすればいいやん
sleep 60 &して、これも含めた三つのpidをwait。
コードは書かないでおくが。
791名無しさん@お腹いっぱい。:2010/01/09(土) 22:03:13
>>790
複数のプロセスをwaitすると、全部が終了するまで返って来ないという仕様なのでNG
792名無しさん@お腹いっぱい。:2010/01/09(土) 22:34:21
ソケット通信でprogram1,2の終了を
管理プロセスに通知する仕組みにすれば
何とかなるかもしれないが、
シェルだけでは無理だね
793名無しさん@お腹いっぱい。:2010/01/09(土) 22:38:41
んなぁこたー無いが、ご教授はしない。
794名無しさん@お腹いっぱい。:2010/01/11(月) 01:17:26
下の input.txt から output.txt を作るにはどうすればよいでしょうか?
input.txt は1列のデータで、output.txt は、
input.txt の1列目から1行目を削除して2列目に並べたものです
perl か何かに全部読み込んで・・・という方法しか思いつかないのですが
ワンライナーでさくっとやる方法あったら教えてください

### input.txt
1
2
3
5
6

### output.txt
1 2
2 3
3 5
5 6
795名無しさん@お腹いっぱい。:2010/01/11(月) 01:25:06
(read a; while read b; do echo $a $b; a=$b; done) <input.txt >output.txt
796名無しさん@お腹いっぱい。:2010/01/11(月) 01:53:40
>>795
ありがとうございます
目から鱗です
797名無しさん@お腹いっぱい。:2010/01/11(月) 12:54:30
>>794
横方向に連結する場合、 paste を使うのが基本
paste - - < input.txt
798名無しさん@お腹いっぱい。:2010/01/11(月) 12:59:32
あ、よく読んでなかった。こうか
# tail -n +2 input.txt | paste input.txt - > output.txt
799名無しさん@お腹いっぱい。:2010/01/11(月) 13:27:17
>>798
なぜ #プロンプト…
800名無しさん@お腹いっぱい。:2010/01/11(月) 13:49:45
あ、いや、特に考え無しに・・。 $ が一般ユーザで、# が root だっけ
801759:2010/01/11(月) 14:32:31
放置してしまってすみません。
みなさんありがとうございます。
>>776さんは自分ではありません、まったくレスしていないので逆に失礼ですが。
802名無しさん@お腹いっぱい。:2010/01/11(月) 19:14:45
>>800
古くはさらに、$と%をそれぞれBourne ShellとC Shellの一般ユーザー
プロンプトとしたものだけれど、いまはそこまで厳密に使う人はいない
かもなー。
zshは基本的には$系のはずなのにデフォルトが%なのはちょっと不思議。
803名無しさん@お腹いっぱい。:2010/01/11(月) 23:07:53
以下の処理のリダイレクトについて教えていただけますでしょうか?
もしくは、よくある処理のようなので解説しているサイトを教えていただけますでしょうか?

commandの結果を取得しつつ、画面及びファイルに出力
status=`exec 3>&1; { command 2>&1 3>&-; echo $? 1>&3; } | tee command.log 1>&2 3>&-`
echo $status

@execにより3で1を指した後にcommand実行時に3を閉じてるのは何故でしょうか?
必要性がよくわからないです。
同時に1が閉じられることはないですよね?

Aどういう経路でcommandの結果はstatusに格納されているのでしょうか?

Btee実行時に行っているリダイレクトの意味はどのようなものでしょうか?

正直言って全体的によく分からないです。
804名無しさん@お腹いっぱい。:2010/01/11(月) 23:22:23
>>803
機種依存文字は書き換えました

(1)commandが3に出力しないように念のため

(2) echo $? が 3に出る。3には、あらかじめexec 3>&1 によって、
パイプではなく、コマンド置換(バッククォート)に通じる標準出力が
複製されている。よって、echoが 3に出せば 変数statusに入る。

(3)teeがcommandの出力をcommand.logに書くと同時に
同じものを 1に出そうとするが、1にそのまま出すと変数statusに入ってしまうので
2にリダイレクトして画面に表示されるようにしている。
3>&-は(1)と同じく念のため。


以上、ご教授しましたw
805名無しさん@お腹いっぱい。:2010/01/11(月) 23:49:50
>>804
ありがとうございました。

command時に3を閉じてるので、echo時に1>&3としても出力されないと勘違いしておりました。

それと(3)について、command時に2>&1としていますが、
これはtee時の2には引き継がれないのでしょうか?
引き継がれていると、1>&2とすると元に戻って1に出力して
statusに上書きしてしまうように見えます。
806名無しさん@お腹いっぱい。:2010/01/12(火) 06:29:53
>>805
commandとechoは無関係。
exec 3>&1したものが、commandとechoに並列して引き継がれる。
command側では3は不要なので閉じてるだけ。

commandの2とteeの2は無関係。
commandの1はパイプにつながっているので、
commandの2もパイプに流すためにcommand 2>&1 してるだけ。
teeはそのパイプを0で受けとる。
teeの1や2はcommandとは無関係で、デフォルトのまま。
そこで tee 1>&2 で画面に出す。

以上、俺もご教授しましたw
807名無しさん@お腹いっぱい。:2010/01/12(火) 09:40:26
>>806
ありがとうございました。
全て理解できました。
808名無しさん@お腹いっぱい。:2010/01/12(火) 18:20:04
つまり要約すると「ご教授」で正しかったのですね。
全て理解できました。
809名無しさん@お腹いっぱい。:2010/01/12(火) 18:37:12
つまり要約すると「ご教授」で正しかったのですね。
全て理解できました。
810名無しさん@お腹いっぱい。:2010/01/12(火) 19:15:58
大事なことなので二度言いましたよ
811名無しさん@お腹いっぱい。:2010/01/12(火) 19:41:07
>>803ではありませんが・・・

パイプがあっても1 2ともにデフォルト
(パイプの左側で1 2が書き換えられていても、右側ではデフォルトに戻る)
ただし新しいfdが作られていると、その先も残ったまま。
(パイプの左側で3が作られていると、右側でも3が作られている状態)

パイプの左側では標準出力がパイプに渡される
パイプの右側ではパイプから標準入力を受け取る

コマンド置換は、最初のパイプの前までの標準出力を受け取る

これで理解できてますか?
812名無しさん@お腹いっぱい。:2010/01/12(火) 20:32:25
>>811
違うね。

>(パイプの左側で1 2が書き換えられていても、右側ではデフォルトに戻る)

「右側ではデフォルトに戻る」のではなく、
そもそも最初からデフォルトのまま変化しない。


>ただし新しいfdが作られていると、その先も残ったまま。

パイプの左側で新しいfdが作られても、その先には無関係(残らない)。
>>803 では、あらかじめ execでfdを作っているから、
それを全体が受け継いでいるだけ。これと混同してはいけない。


>コマンド置換は、最初のパイプの前までの標準出力を受け取る

「最初のパイプの前」じゃなく、パイプラインの最後のコマンドの標準出力を受け取る


で、お約束の「ご教授しました」
813名無しさん@お腹いっぱい。:2010/01/12(火) 21:37:11
誤教授しましたと言うべき。
814名無しさん@お腹いっぱい。:2010/01/12(火) 22:00:01
>>812 thx
おおよそ理解しましたが、
2個目と3個目のレスが気になります。
> パイプの左側で新しいfdが作られても
新しいfdを作るにはexecしかないと思っていたのですが、これ以外で作れるのですか? ・・@
それとも、シェルから呼び出されたコマンドの中で作られたfdでは
> 無関係(残らない)
だけど、execで作っているときは受け継ぐという意味ですか?・・・・・・・・・・・・・・・・・・・・・・・・・A

それと
> それを全体が受け継いでいるだけ。
というのはそのシェル内で n>&- するまで有効という意味でよいですか?・・・・・・・・・・・・・・B
更にサブシェルにも受け継がれますか?・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・C

3個目の方は
> パイプラインの最後のコマンドの標準出力
とありますが、これはteeの標準出力ではないのですか?・・・・・・・・・・・・・・・・・・・・・・・・・・・・・D
(でも1>&2しているので、どうなるんだろう。teeは標準出力がなくなるので、3に書き込んだechoということなのかしら)

質問ばかりですみません。
815名無しさん@お腹いっぱい。:2010/01/12(火) 22:02:31
C更にサブシェルにも受け継がれますか?
forkするプログラム書いたことあるのを思い出しました。
たしか親からfd受け継いだはずなので、これは受け継がれますよね。
816名無しさん@お腹いっぱい。:2010/01/12(火) 22:23:58
>>814
だから、機種依存文字を使うなと、、

(1)exec以外でも勝手に新しいfdを使えるよ。
ただ、そのコマンド1つだけに有効になる。
(ここでいうコマンドには、サブシェルなどのコマンド群全体も含む)

(2)execでは、シェル自体のfdが変わるので、以降のコマンドすべてに影響。
(ただし、サブシェル内でexecした時はそのサブシェル内のみ)

(3)いいよ。あと、n>&-だけじゃなく、n>&mで別の値を複製しなおすと
execの影響は無関係になる。

(4)サブシェルにも受け継がれる

(5)teeの標準出力だよ。で、標準出力に出ないように 1>&2してる。
3に書き込んだechoもパイプライン全体の標準出力だからコマンド置換に取り込まれる。
teeで1>&2するのと、echoとは無関係。
817名無しさん@お腹いっぱい。:2010/01/13(水) 18:38:41
丁寧なご説明ありがとうございます!
818名無しさん@お腹いっぱい。:2010/01/13(水) 23:59:12
しかしほんとに「機種」依存文字なのか?

乗っかってるソフトウェア依存文字じゃないのか?
とりあえず俺は読めるし、歴史的に俺の使っている機種が
Cを表示できるはずは無いのだけれど、表示出来ているわけよ。
(どのようにタイプしたらその字が出せるか解らんが、とりあえずコピペは出来る)

FreeBSD で LANG eucJP なのだが、2ちゃんねるビューワだとCが読めるし
コピペで転記できるよ。(書き方は不明)

ほんとに機種に依存するの?
819名無しさん@お腹いっぱい。:2010/01/14(木) 00:04:36
ググレカス
820名無しさん@お腹いっぱい。:2010/01/14(木) 00:38:24
丸数字やローマ数字を機種依存文字と呼ぶのは
おかんが家庭用ゲーム機ならPS3も360もファミコンと呼ぶのと同じで
言葉にこだわる必要はありません
821名無しさん@お腹いっぱい。:2010/01/14(木) 00:52:50
丸数字が機種依存とか言われたのは歴史的経緯だわな
今や機種依存どころかUnicodeというれっきとした国際標準に含まれてる

2chで今更丸数字使うなっても化石じみてて何だかな
822名無しさん@お腹いっぱい。:2010/01/14(木) 00:55:09
2chが化石Shift_JIS使ってるかぎり言われつづける
823名無しさん@お腹いっぱい。:2010/01/14(木) 03:41:02
2chはcp932だろ
824名無しさん@お腹いっぱい。:2010/01/14(木) 04:14:23
時代は UTF-8 ですよ
825名無しさん@お腹いっぱい。:2010/01/14(木) 04:16:28
いまどきの機種依存文字といえば「〜」かな
826名無しさん@お腹いっぱい。:2010/01/14(木) 08:28:32
>>825
誰もがWindows-31JとShift_JISの区別を付けるようになれば
片が付くのにね……
827名無しさん@お腹いっぱい。:2010/01/14(木) 09:05:59
うちのMacちゃんでは2chのカキコのローマ数字が化けるざんす。
828名無しさん@お腹いっぱい。:2010/01/14(木) 09:44:45
この板の住人ならOSは関係ないってことくらい分かるだろ
MacJapaneseの代わりにWindows-31Jで処理するようなライブラリ使って
FirefoxでもChromiumでも何でもビルドすればいいだけ
829名無しさん@お腹いっぱい。:2010/01/14(木) 21:53:24
半角カナは使ってもいいと思う
830名無しさん@お腹いっぱい。:2010/01/14(木) 23:02:10
>>828
じゃあsafariをビルドする方法を教えてください。
831名無しさん@お腹いっぱい。:2010/01/14(木) 23:41:43
フィルタリングプロキシを立てて
Windows_31JくさいShift_JISなページをUTF-8に変換してやるのが楽じゃないかな
832名無しさん@お腹いっぱい。:2010/01/15(金) 00:12:46
それはクライアント側でフォントいじれよっていうのと等価では?
833名無しさん@お腹いっぱい。:2010/01/15(金) 00:29:34
丸数字使うな。カス。と言う方が楽だしecoだな。
834名無しさん@お腹いっぱい。:2010/01/15(金) 01:08:33
エコロジストならスレ違いネタでスレを消費しないでくれ
835名無しさん@お腹いっぱい。:2010/01/16(土) 01:23:40
bashでif〜とする時、[ と [[ ができますが
[ は 外部のtestコマンドで、[[が内部コマンドなんですよね?

[ ではなく [[ を使った方が
速度が速いのでしょうか?
836名無しさん@お腹いっぱい。:2010/01/16(土) 01:50:26
bash の [ と test は builtin。[[ は compound command。
[[、[、外部コマンドの test の順に速い。
外部コマンドを呼んだ場合がダントツで遅くて、他の50倍ぐらい遅い。[[ と [ は大して変わらん。
837835:2010/01/16(土) 02:16:10
お答えありがとう。
838名無しさん@お腹いっぱい。:2010/01/16(土) 12:01:06
>>834
富豪プログラマのスレです。
839名無しさん@お腹いっぱい。:2010/01/26(火) 12:21:42
●やりたいこと
カレントディレクトリ以下の全ファイル(レギュラーファイル,かなり大量,何百万単位)を
検索し,ファイル名,ファイルサイズ,MD5ハッシュ値を出力したい。
1ファイルにつき1行。

※効率よくやりたいのでファイルの数ごとにstatやmd5プロセスを起動する,という
ことは避けたい。

●やったこと
ファイルサイズだけ,とかMD5だけなら下記の方法で満足な早さで出力が得られます。
環境はMac OS Xです。
find . -type f | xargs stat -f '%N,%z' > outputfile.txt
find . -type f | xargs md5 $1 | sed -E 's/^MD5 \((.*)\) = (.*)/\1,\2/' > outputfile.txt

上の二つを合わせたようなことをしたいのですが,うまい方法を教えて下さい。

840名無しさん@お腹いっぱい。:2010/01/26(火) 12:24:01
補足
各行が
ファイル名,ファイルサイズ,MD5ハッシュ値
という出力にしたいです。
841名無しさん@お腹いっぱい。:2010/01/26(火) 12:27:06
コピペミスです。>>839の2つ目のfindは正しくは
find . -type f | xargs md5 | sed -E 's/^MD5 \((.*)\) = (.*)/\1,\2/' > outputfile.txt
でした。
842名無しさん@お腹いっぱい。:2010/01/26(火) 12:49:51
perlかpythonかrubyで書きなよ。
843名無しさん@お腹いっぱい。:2010/01/26(火) 12:52:31
●解答
joinすればいいだけ。

●補足
箇条書での質問は失礼
844名無しさん@お腹いっぱい。:2010/01/26(火) 13:01:19
●傍観者の感想
ワロタ
845名無しさん@お腹いっぱい。:2010/01/26(火) 13:31:04
pasteというコマンドがあってだな。

846名無しさん@お腹いっぱい。:2010/01/26(火) 14:55:29
sed が起動するのは気にならないのかw
847名無しさん@お腹いっぱい。:2010/01/26(火) 15:05:51
>>846
そりゃ、sedは1回しか起動しないし
848名無しさん@お腹いっぱい。:2010/01/26(火) 16:46:34
次スレのテンプレに↓入れとけよ

●解答
perlかpythonかrubyで書きなよ。
849名無しさん@お腹いっぱい。:2010/01/26(火) 16:50:45
>>848
>>1

・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。

Pythonも入れればよいわけだな。
850名無しさん@お腹いっぱい。:2010/01/26(火) 16:52:39
で、今回の質問の場合 perlもpythonもruby関係なくて、
joinかpasteで済む問題だったわけだが、、
851名無しさん@お腹いっぱい。:2010/01/26(火) 17:03:54
join, pasteは中間ファイルを作るわけだが、数百万ファイルになるとかなりのオーバーヘッドになる。
実行時間はファイルIOが支配的なのでインタプリタが消費するCPUは隠される。

従ってLLでの実装を勧めたわけだが、初心者にはわからないらしい。覚えておく事だ。
852名無しさん@お腹いっぱい。:2010/01/26(火) 17:35:37
>>851
中間ファイルを作らずにnamed pipeでやる方法を知らない初心者らしい、、
853名無しさん@お腹いっぱい。:2010/01/26(火) 18:31:25
この件では I/O にかかる時間でいちばん支配的なのは
find, md5, stat,(+ join を使う場合は sort)であって、
中間ファイルを使うことによるオーバーヘッドなんぞ誤差にしかならんよ。
854名無しさん@お腹いっぱい。:2010/01/26(火) 18:34:04
中間ファイルって、MS-DOSじゃないんだから・・・
855名無しさん@お腹いっぱい。:2010/01/26(火) 18:40:42
find × 2 → named pipe → paste

で、中間ファイルなしでメデタシメデタシ
856名無しさん@お腹いっぱい。:2010/01/26(火) 19:28:25
一部のシェルの
diff <(command) <(command2)
みたいなのは中間ファイル作るのかしらん?
857名無しさん@お腹いっぱい。:2010/01/26(火) 19:30:24
>>856
だから、それが named pipeなんだよw
858名無しさん@お腹いっぱい。:2010/01/26(火) 19:31:07
mknod で作らなくてもいいのかー
859名無しさん@お腹いっぱい。:2010/01/26(火) 22:34:39
findは全てのファイルにstatかけるのを知らない初心者? w
860名無しさん@お腹いっぱい。:2010/01/26(火) 22:37:15
っつーか >>839>>842 をそれぞれ時間計測して比べりゃすむ話だろ
漏れは後者の勝ちだと思う
861名無しさん@お腹いっぱい。:2010/01/26(火) 22:38:26
>>854-855
パイプのIOは発生するだろ。バカ。
862名無しさん@お腹いっぱい。:2010/01/26(火) 22:38:31
漏れww
863名無しさん@お腹いっぱい。:2010/01/27(水) 00:35:27
2ch初心者発見。

漏れ、とかで煽られても、、、
半年ROMってれば。
864名無しさん@お腹いっぱい。:2010/01/27(水) 00:52:28
2ch上級者(;´Д`)
865名無しさん@お腹いっぱい。:2010/01/27(水) 01:11:09
今時漏れなんて使わねぇよw
866名無しさん@お腹いっぱい。:2010/01/27(水) 06:54:47
>>839 自身、find×2 を個別に実行した状態で
「満足な早さで出力が得られます」
と言っているのだから、それがすべて。
問題はそこじゃなくて、2つの出力を効率良くまとめる方法が質問点。
で、そのベストアンサーはpaste。
867名無しさん@お腹いっぱい。:2010/01/27(水) 11:51:49
自演乙
868名無しさん@お腹いっぱい。:2010/01/27(水) 12:54:46
>>866
負け犬の何とか…
869名無しさん@お腹いっぱい。:2010/01/27(水) 13:17:04
>>859
ここではstatは問題にならないんだよ、初心者クン

>>860
>後者の勝ちだと思う
「思う」だけじゃ間違ったことでも言えてしまうねw

>>861
パイプのI/Oでは物理I/Oは発生しないんだよ、初心者クン
870名無しさん@お腹いっぱい。:2010/01/27(水) 13:26:19
>>869
前言撤回? w
871名無しさん@お腹いっぱい。:2010/01/27(水) 13:28:37
>>870
良く良め。869 は 「named pipe+paste の方が速い」という主張を一貫してしてるぞ
872名無しさん@お腹いっぱい。:2010/01/27(水) 13:40:18
(1)シェルスクリプトでの多少高度な質問がなされる

(2)「それはPerlかPythonかRuby使った方が速い」と誰かが投稿

(3)別の人からシェルスクリプトでのマトモな回答が投稿される

(4)質問者、傍観者とも納得

(5) (2)が発狂 ← 今ココ
873名無しさん@お腹いっぱい。:2010/01/27(水) 13:50:58
>>871 アルツハイマー?

>>853
> find, md5, stat,(+ join を使う場合は sort)であって、
874名無しさん@お腹いっぱい。:2010/01/27(水) 13:53:01
>>869>>853 じゃないよ。
875名無しさん@お腹いっぱい。:2010/01/27(水) 13:57:01
>>853 が言ってる statは、xargsから起動されるstatコマンドのことであって、
find内部のstatのことじゃないだろ。
876名無しさん@お腹いっぱい。:2010/01/27(水) 14:22:00
LL:
ディレクトリ読み込み 1回
stat(i-node読み込み) ファイル個数
MD5 ファイル個数
出力

paste:
ディレクトリ読み込み 2回
stat(i-node読み込み) ファイル個数×3
MD5 ファイル個数
中間ファイル(パイプ)書き出し/読み込み
出力

ファイル数が多くてiノードのキャッシュは期待できない。
MD5はCでの実装もあるから、インタープリターのオーバー
ヘッド見込んでも、おそらくLLの方が速いね。
877名無しさん@お腹いっぱい。:2010/01/27(水) 14:26:16
>>876
はいはい、「おそらく」と書いとけば何でも言えるねw

perl/python/ruby自体のオーバーヘッド(結構大きい)も良く考えて出直してね
878名無しさん@お腹いっぱい。:2010/01/27(水) 14:31:44
マルチコアなCPU環境だと、
同じことやる場合でもパイプで複数のプロセスに分けた方がかえって速かったりする
879名無しさん@お腹いっぱい。:2010/01/27(水) 14:48:09
議論してる時間で問題を解決してしまった人の勝ち。
880名無しさん@お腹いっぱい。:2010/01/27(水) 15:07:26
>>877
ぷぷっ。そのレスはそのまま返してやるよ。w
881名無しさん@お腹いっぱい。:2010/01/27(水) 15:11:54
find ->(パイプ)-> md5
の場合、ファイル1個あたりにかかる時間はmd5の方がはるかに大きく、
find自体の動作はmd5の実行の裏プロセス(別CPU)で行なうから、
findの実行時間はすべてmd5の実行時間内に吸収されてしまって、
結局findの時間は無関係になる。

例: sleep 1 | sleep 10 ってやると、10秒で終了する。
左側のsleep 1は無関係になる。

もう1本のfindの、
find ->(パイプ)-> statコマンド
の方は、find->md5の方よりはるかに速いから、
2つのfindを名前付きパイプでpasteに接続する場合、
実行速度は遅い方の上流パイプであるmd5だけによって決まる。

よって、stat云々は一切関係なくなり、
名前付きパイプ+pasteが高速で動作する。
882名無しさん@お腹いっぱい。:2010/01/27(水) 15:18:31
LLが遅いと因縁つけてる奴は実測して証拠出せよ。w
883名無しさん@お腹いっぱい。:2010/01/27(水) 15:34:47
>>860が言うようにtimeで計測すれば済む話なのになぜ誰もやらないのか
あ、俺はrubyとか知らないからパスね^^
誰かfindとperl/python/rubyでベンチ取ってよ
884名無しさん@お腹いっぱい。:2010/01/27(水) 16:40:18
適当に試してみたよ http://pastebin.com/f1130c0e8
$ time test.bash >/dev/null
real 1m50.762s
user 0m17.992s
sys 0m4.473s
$ time test.py >/dev/null
real 1m49.994s
user 0m19.045s
sys 0m5.523s
885名無しさん@お腹いっぱい。:2010/01/28(木) 01:38:29
>>884
そのPythonのソースだと、各ファイルに対してstat()が最大3回呼ばれるのかな
886名無しさん@お腹いっぱい。:2010/01/28(木) 01:58:11
ま、どう考えてもMD5sum取る部分のI/O律速になるので
stat()の回数減らしたところで誤差程度だろうけど
887名無しさん@お腹いっぱい。:2010/01/28(木) 03:34:55
1000倍以上違うだろうね
888名無しさん@お腹いっぱい。:2010/01/28(木) 11:54:30
>>839
> find . -type f | xargs stat -f '%N,%z' > outputfile.txt
> find . -type f | xargs md5 $1 | sed -E 's/^MD5 \((.*)\) = (.*)/\1,\2/' > outputfile.txt

findは -print0でxrgsに渡し、xargsは -0で受け取るようにしましょう。

> find . -type f -print0 | xargs -0 stat -f '%N,%z' > outputfile.txt
> find . -type f | xargs -0 md5 | sed -E 's/^MD5 \((.*)\) = (.*)/\1,\2/' > outputfile.txt

http://www.otsune.com/diary/2007/03/29/1.html
889名無しさん@お腹いっぱい。:2010/01/28(木) 17:51:27
こんなのfind + perl のワンライナーでいいじゃん
> find . -type f -print | perl -l0ne 'use Digest::MD5 qw(md5_hex);$s=-s $_;print $_ ." $s " . md5_hex($_) ."\n"'
890名無しさん@お腹いっぱい。:2010/01/28(木) 18:10:27
>>889
アフォか、ファイル名の md5 計算してどうする www
891名無しさん@お腹いっぱい。:2010/01/28(木) 18:13:23
>>888
日記だからある意味しょうがないのだが。そういう古臭いページなんとかならないもんかね。
892名無しさん@お腹いっぱい。:2010/01/28(木) 18:22:57
>>890
おー、いまperldocしたら 
calculate the MD5 digest of this "message"
ってかいてあったwwはずかしいwwwしぬかも
893名無しさん@お腹いっぱい。:2010/01/28(木) 19:05:07
>>891
どこがどう古臭いんだ?
894名無しさん@お腹いっぱい。:2010/01/28(木) 19:22:17
今書くなら「xargs捨てろ。 -exec {} +使え」
895名無しさん@お腹いっぱい。:2010/01/28(木) 19:22:36
>>894
一緒じゃないの?
896名無しさん@お腹いっぱい。:2010/01/28(木) 20:27:35
-exec だと正しく受け取れないファイルがある。
-print0 |xargs -0のほうが安全
897名無しさん@お腹いっぱい。:2010/01/28(木) 21:09:21
へー知らんかった
898名無しさん@お腹いっぱい。:2010/01/28(木) 21:11:42
>>896
原理的に有り得ないんだけど。
899名無しさん@お腹いっぱい。:2010/01/28(木) 21:13:42
どっちだよ気になるだろ
900名無しさん@お腹いっぱい。:2010/01/28(木) 21:37:46
-exec の + ターミネータ(;でなく)を知らないで答えていたりしてな。
901名無しさん@お腹いっぱい。:2010/01/28(木) 21:52:49
それにしても「正しく受け取れない」は原理的にない。
902名無しさん@お腹いっぱい。:2010/01/28(木) 22:08:06
いや、あるから -0 オプションが後から追加されたんですが。
903名無しさん@お腹いっぱい。:2010/01/28(木) 22:08:48
って、xargs じゃなくて find の方か。ならないや。ごめん。
904名無しさん@お腹いっぱい。:2010/01/28(木) 22:17:25
結局>>896は本当なのかどうなのか答えてくれ
つまり実際に-exec +だと受けとれないファイルがあるのか
それとも単に-exec ;と-exec +を混同してただけなのか

それと>>894の-exec +のほうが良いという根拠は何だ?
-print0 | xargs -0じゃいかんのか?

このままじゃ気になって寝れやしない
905名無しさん@お腹いっぱい。:2010/01/28(木) 22:42:34
>>904
> それと>>894の-exec +のほうが良いという根拠は何だ?
exec +がある環境ならxargsはレガシーコマンド。webで解説する必要は無い。

そもそも、exec +が無い環境がレガシー。 xargsはジジイの胸の奥にしまっておいてくれ。
906名無しさん@お腹いっぱい。:2010/01/28(木) 22:49:15
GNU findutilsにxargs付いてくるじゃない
907名無しさん@お腹いっぱい。:2010/01/28(木) 22:51:58
ジジイの懐古趣味
908名無しさん@お腹いっぱい。:2010/01/29(金) 01:55:18
xargs がいつobsolete になったの?
なんか文書ある?
909名無しさん@お腹いっぱい。:2010/01/29(金) 12:12:24
-exec + のデメリット
コマンドに渡すファイルの数を制御できない(xargs -n)
並列実行できない(xargs -P)

-exec + のメリット
find でひっかかったファイルが存在しなければコマンドが実行されない
(GNU xargs は入力がゼロでもなぜか1回は実行する; xargs -r で抑制可)

つーか、
ps ax | awk '/なんか条件/{print $1}' | xargs -r kill
みたいに find とは無関係に使う場合も多いから、obsolete のはずがない。
910名無しさん@お腹いっぱい。:2010/01/29(金) 16:58:01
findの-execはひとつひとつ実行するから遅いだろ。
grep /dev/null というバッドノウハウもアレだけど。(-h使えって?)
911名無しさん@お腹いっぱい。:2010/01/29(金) 17:01:35
>>910
find -exec + の 「+」の意味を理解していない方は発言を御遠慮ください
912名無しさん@お腹いっぱい。:2010/01/30(土) 09:34:03
>>910
レガシーちゃんキター
913名無しさん@お腹いっぱい。:2010/01/30(土) 09:38:13
MacのTimeMachineのようなことをするスクリプトを教えて
914名無しさん@お腹いっぱい。:2010/01/30(土) 10:01:33
pdumpfs
Rubyスクリプトだけどな。
915名無しさん@お腹いっぱい。:2010/01/30(土) 20:34:25
> -exec utility [argument ...] {} +
> Same as -exec, except that ``{}'' is replaced with as many path-
> names as possible for each invocation of utility. This behaviour
> is similar to that of xargs(1).

うおっ。-execに+なんて何時からあったんだ。
916名無しさん@お腹いっぱい。:2010/01/30(土) 20:41:41
917名無しさん@お腹いっぱい。:2010/01/30(土) 21:09:21
-exec {} + テンプレに入ってるじゃねえかww
918名無しさん@お腹いっぱい。:2010/01/30(土) 22:00:29
ほんとだ。テンプレにあるな。
>findは -exec command {} + を推奨。
>他に -print0、xargsは -0オプションという方法もあるがSolaris非対応)

まるで -exec + ならば solaris でも使えるように書いてあるが、
実際は使えなかったような記憶が…
919名無しさん@お腹いっぱい。:2010/01/31(日) 02:34:28
920名無しさん@お腹いっぱい。:2010/01/31(日) 20:50:42
921名無しさん@お腹いっぱい。:2010/01/31(日) 21:09:07
>>920
そのマニュアル、肝心なところを誤訳してるね。
日本語訳マニュアルは信用してはいけない。
922名無しさん@お腹いっぱい。:2010/01/31(日) 21:19:36
sunでもあるんだな。日本誤訳マニュアル
923名無しさん@お腹いっぱい。:2010/02/01(月) 01:46:35
原語は技術者が書いてても
翻訳は非技術者に丸投げだからね
924名無しさん@お腹いっぱい。:2010/02/02(火) 23:57:42
このスレ参考にファイル数が膨大なディレクトリで
paste -d, <(find $i -type f -exec stat -f '%N,%z' {} +) \
<(find $i -type f -exec md5 {} + | sed -E 's/^MD5 \(.*\) = (.*)/\1/') \
> output.txt
やったら
find: fts_read cannot allocate memory
出ました。Mac OSX

なぜ? find のバグ?
925名無しさん@お腹いっぱい。:2010/02/03(水) 00:03:47
libftsのバグじゃね?
926名無しさん@お腹いっぱい。:2010/02/07(日) 01:25:32
ファイルAのタイムスタンプとファイルBのタイムスタンプを一致させるには?
927名無しさん@お腹いっぱい。:2010/02/07(日) 01:37:53
touch -r でatimeとmtimeは設定できるよ。ctimeはできないけど
928名無しさん@お腹いっぱい。:2010/02/08(月) 11:41:37
複数の数字に,同じ四則演算(+,−,*,/)を繰り返した計算結果を表示するシェルスクリプトを,cshシェルスクリプトで書け。
(基本仕様)
@ コマンドとして実行できる.(シェルコマンドである.)
A 入力した数字を計算できる.
B 入力できる数字の個数は2以上とする.
C 四則演算子(+,−,*,/)を選択,または直接入力して
数字1□数字2□・・・□数字N (□=+ or − or * or /,N≧2)
の計算結果を出力する.
D 四則演算子以外の記号が入力された場合,エラーメッセージを出力する.
(ポイント)
? シェルコマンドにするには,スクリプトの最初に(#!で始まる)おまじないを書く.
? 標準入力から文字列を入力するには $< を用いる.
? コマンドラインに引数を指定した場合は,その引数は変数$argvに格納されている.その各要素を参照するには,$argv[1],$argv[2](または$1,$2)などとする.
? 四則演算には @ コマンドが使用できる.(ただし,整数しか扱えない.)

誰かわかるひとおねがいします
929名無しさん@お腹いっぱい。:2010/02/08(月) 11:51:32
cshで宿題出すって時代遅れな専門学校だなw
930名無しさん@お腹いっぱい。:2010/02/08(月) 12:11:54
>>928
どこまで書けた?
931名無しさん@お腹いっぱい。:2010/02/08(月) 12:16:09
>>928
偶然にも、プログラミング質問スレに同じ問題抱えてる人がいるから、
彼と協力して解くと良いと思うよ。
932名無しさん@お腹いっぱい。:2010/02/08(月) 12:49:05
#!/usr/bin/csh
exec bc
933名無しさん@お腹いっぱい。:2010/02/08(月) 13:08:31
'`,、'`,、'`,、'`,、(´▽`) '`,、'`,、'`,、'`,、
934名無しさん@お腹いっぱい。:2010/02/08(月) 16:39:41
>>929
文脈上は「*shの基本機能だけ使え」っていう意味しかないでしょ。
特に問題は無いんじゃないか?
zsh使えとか言い出すキチガイよりはマシでしょう。田中、おめーだよ
935名無しさん@お腹いっぱい。:2010/02/08(月) 16:44:01
シェルスクリプトだったとは思うんだが
スターウォーズっぽい物語を文字ベースでやってるのなかったっけ
探してるんだが見つからない
936名無しさん@お腹いっぱい。:2010/02/08(月) 16:44:06
>>934 欲嫁w

>>928 より、
> 四則演算には @ コマンドが使用できる.

どう見ても cshです。本当にありがとうございました。
937935:2010/02/08(月) 16:48:38
あ、自己解決したw
シェルスクリプトじゃなかった。。
ttp://takepsp.blog121.fc2.com/blog-entry-784.html
失礼しました。
938名無しさん@お腹いっぱい。:2010/02/08(月) 16:51:21
あまりCシェルを目の敵にしなくても良いんだよ。
ちゃんと理解して、欠点に関わらない範囲で使えばいいんだし。
さらにCの利点も生かせば良い。
Cシェルで組まれた多くのスクリプトは何十年も問題なく
多くの処理をしてるのも事実なんだから、それを否定する
こたぁない。

コンパクトなスプリクトでこまけーこたぁ良いんだよ。
血眼になってボーンに拘る方が痛い

939名無しさん@お腹いっぱい。:2010/02/08(月) 16:56:28
>>938
今のOSの起動スクリプトとか、/usr/binその他にインストールされてる
スクリプトコマンドで、cshで書かれてるのはひとつもありませんが、、
(もちろん、/bin/shスクリプトは多数存在)

あ、ヘボなシステム管理者が何十年も前に書いたまま放置されてる
ローカルなスクリプトのことは知らんけどねw
940名無しさん@お腹いっぱい。:2010/02/08(月) 17:01:59
>>939
で?
何十年も前に書いたまま放置されたスクリプトに何の
問題があるんだ?
Bシェルで書き換えないと不味いのか?

多くのスクリプトは、日常のローカルツールという
位置づけでもあるだろ?
数値を代入して四則演算をしたり(w

必要があれば適材適所でシェルを使い分ければ良いんだよ。
941名無しさん@お腹いっぱい。:2010/02/08(月) 17:05:54
>>940
おまえ、cshの擁護してるが、cshについてもよく知らないで言ってるだろ。

>>928 で、
> 標準入力から文字列を入力するには $< を用いる.
> 四則演算には @ コマンドが使用できる.

みたいにはっきりcsh独自機能について書いてるのに、

>>934 では、
>文脈上は「*shの基本機能だけ使え」っていう意味しかないでしょ。

みたいな大間違い、見当外れ、馬鹿丸出し、なこと言ってるし、、
942名無しさん@お腹いっぱい。:2010/02/08(月) 17:29:27
943名無しさん@お腹いっぱい。:2010/02/08(月) 17:33:37
クズ学生が通うクズ大学ではcshを教材に使うという事実が明らかになった。
944名無しさん@お腹いっぱい。:2010/02/08(月) 17:47:02
>>928 みたいな奴のせいで最近規制ラッシュなんだな
945名無しさん@お腹いっぱい。:2010/02/08(月) 19:27:58
たぶん,両方で対応状況を比較してみてるんだよ.
どれくらいで解が出せるかとか(笑)
946名無しさん@お腹いっぱい。:2010/02/08(月) 19:30:37
ならなんで投稿時刻ずらしてるんだろ。
947名無しさん@お腹いっぱい。:2010/02/08(月) 19:34:37
スレッドを探し歩いていたとかね
948名無しさん@お腹いっぱい。:2010/02/08(月) 23:38:43
928ですすいません。
よくわからないんですが、一応国立大学です。
誰か答えわかりませんか?
949名無しさん@お腹いっぱい。:2010/02/09(火) 00:13:25
950名無しさん@お腹いっぱい。:2010/02/09(火) 02:09:12
>>949
まじめにこたえてください
951名無しさん@お腹いっぱい。:2010/02/09(火) 02:31:57
>>941
Cの機能使わなければCシェル使う意味無いだろ
952名無しさん@お腹いっぱい。:2010/02/09(火) 03:04:06
cshの機能つかったら練習問題の意味ないだろ
953名無しさん@お腹いっぱい。:2010/02/09(火) 05:35:47
アイディアを求めるとか、どうしても解決できないバグがあるってなら話しわかるけど
問題(仕様)丸投げして他人にスクリプト書いてください、なんて頼んでる時点でプログラマやSEの資質はないし
大学入れても社会に出てから技術屋としては使い物にならんクチだな
954名無しさん@お腹いっぱい。:2010/02/09(火) 05:52:16
授業でほとんど答えみたいのやってたのに
情報処理概論は必修なんだからがんばれよ

955名無しさん@お腹いっぱい。:2010/02/09(火) 06:24:19
必修科目で csh 教えてるのか…
どこの大学?
956名無しさん@お腹いっぱい。:2010/02/09(火) 06:37:16
北関東の納豆がおいしいあたりです。
957名無しさん@お腹いっぱい。:2010/02/09(火) 06:37:23
国立大学と言っても、地方の国立大学だろ
958名無しさん@お腹いっぱい。:2010/02/09(火) 09:54:44
>>953
逆だよ、技術屋だって管理職も要るし
効率も必要。
丸投げで処理できる人間が最後には勝つ。

オマエの廻りを見てみ
高収入で一流の技術屋=丸投げだから。
959名無しさん@お腹いっぱい。:2010/02/09(火) 10:00:14
>>958
わかったからこのスレから出て行けよ
ここはシェルスクリプトのスレだ
960名無しさん@お腹いっぱい。:2010/02/09(火) 10:22:49
>>959
勇気を出して>>953も批判しような
961名無しさん@お腹いっぱい。:2010/02/09(火) 11:34:43
丸投げだとその場はよくてもあとあと困るよ。
962名無しさん@お腹いっぱい。:2010/02/09(火) 11:42:11
マルハゲだとどうなりますか?
963名無しさん@お腹いっぱい。:2010/02/09(火) 15:20:55
>>958
禿堂
964名無しさん@お腹いっぱい。:2010/02/09(火) 15:30:09
>>963
シェルスクリプトがなんだか解らない、覚える気もない
=丸投げ

シェルスクリプトについて少しは理解している、細部は分からない
=外注

シェルスクリプトを理解しているが、自分で書くとコスト(時間、金額)が合わない
=アウトソーシング
965名無しさん@お腹いっぱい。:2010/02/09(火) 15:58:28
つーか
このての技術屋って結局は誰かに、丸投げ仕事ありませんか?って
仕事貰って喰ってるんだよね。
丸投げがなかったら餓死してる。
丸投げを蔑視してるやつは結局のところ技術屋じゃない。
966名無しさん@お腹いっぱい。:2010/02/09(火) 16:39:24
粘着くん、さっさと別スレに移動してくれや
967名無しさん@お腹いっぱい。:2010/02/09(火) 16:46:52
>>966
PC土方君。ガンガレ
968名無しさん@お腹いっぱい。:2010/02/09(火) 16:52:28
 ―┼‐         ノ     /   |  --ヒ_/     /   \ヽヽ    ー―''7
   `」   ┼,   二Z二   レ   /  /´レ' \ ―7 ̄}  |  ー-、   /
 (__  (|フ)   (__ノ  _ノ  ∨`  ノ  /  /     _ノ    \_

    ─┼-        /   |   ‐┼-   |     ー|―
    ─┼─ |   \ レ  /   ̄Tー  /      ノ -─
   (二フヽ  \/    _ノ   (二フ\  ヽ_ノ   / 、__

     i';i
    /__Y
     ||真||                   /⌒彡
  _ ||露||         /⌒\     /冫、 ) ・・・・・・。
  \ ||  || ̄ ̄ ̄ ̄ ̄ ̄ ̄\ `./⌒ i `  /ゝ    _,,..,,,,_
  ||\`~~´  (十万石)     \( >     ('\\  ./ ,' 3 `ヽーっ ・・・・・・。
  ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄\`つ    ⌒ _) l   ⊃ ⌒_つ
     .|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||                `'ー---‐
( 'A) ・・・。 〃∩ ∧_∧        <⌒/ヽ___
/(ヘ)ヘ    ⊂⌒(  ・ω・) ・・・。  <_/____/ zzzz・・・
         `ヽ_っ⌒/⌒c
969名無しさん@お腹いっぱい。:2010/02/09(火) 17:01:33
はじめまして。
簡単な収益計算のスクリプトを書きたいのですが。

Aは1回仕事を請け負うと6時間1万円がカウントされます。
必要経費は6%掛かります。

Bは1回仕事を請け負うと8時間2万円がカウントされます。
必要経費は9%掛かります

Cは1回仕事を発注すると15分かかります。
発注の口銭は50%乗りますのでAには0.5万、Bには1万の口銭が
入ります。
必要経費は0.1%です。

この時、C氏がA,Bに発注する回数を指定して
三者の収益と作業時間を表示するスクリプトが書きたいです。
970名無しさん@お腹いっぱい。:2010/02/09(火) 18:31:20
線形計画法か?
971名無しさん@お腹いっぱい。:2010/02/09(火) 18:52:39
>>969
マジエクセルの出番
972名無しさん@お腹いっぱい。:2010/02/10(水) 02:49:55
>>971
そりゃそうだw
973名無しさん@お腹いっぱい。:2010/02/11(木) 04:03:41
>>965
自己紹介乙
974名無しさん@お腹いっぱい。:2010/02/12(金) 15:09:03
>>969
shellよりJavaScriptで書いてブラウザで実行するのが使いやすいと思う。
975名無しさん@お腹いっぱい。:2010/02/16(火) 17:44:26
すみません。質問させてください。

hoo.csvというテキストファイルがあるとします。内容は:

alpha, num
A, 1
B, 2
C, 3

だとします。このCSVファイルに"hoo.csv"といったファイル名のコラムを付け加えたいです。
つまり:

alpha, num, file
A, 1, hoo.csv
B, 2, hoo.csv
C, 3, hoo.csv

もしくは、

file, alpha, num
hoo.csv, A, 1
hoo.csv, B, 2
hoo.csv, C, 3

になるといいです。

そして、このようなファイルが100ぐらいあるので、自動的に全てのCSVにファイル名の
コラムが入るようにしたいです。

エキスパートの方、よろしくお願いいたします。
976名無しさん@お腹いっぱい。:2010/02/16(火) 17:54:49
>>975
できたよ。ただしGNU sedが使える環境で実行すること。


#!/bin/sh

for f in *.csv
do
sed -i '1s/$/, file/; 2,$s/$/, '"$f"'/' "$f"
done
977名無しさん@お腹いっぱい。:2010/02/16(火) 19:02:27
>>976

エキスパート様、ありがとうございます。

sedの環境はありますので、試してみます。

結果は後ほど、報告いたします。

978975:2010/02/16(火) 21:46:24
>>976

思ったとおりのアウトプットが得られました。

自分で何時間も試行錯誤していたのが、数分で終わり、なんだったのか思いました。

再度、ありがとうございます。
979名無しさん@お腹いっぱい。:2010/02/16(火) 22:51:02
カラムな
980名無しさん@お腹いっぱい。:2010/02/17(水) 00:04:02
同じだな

そういや、こないだツリー状って論文に書いたら、
トリー状に直して掲載しやがったぜまったく
981名無しさん@お腹いっぱい。:2010/02/17(水) 00:31:45
ググってみたら Tree をトリーと書く人も居るんだね
どうせ正確な音写なんて出来ないんだから、一般的じゃない書き方をしても混乱するだけの様な…

まぁ、自分は Trie の読み方がトリーだと思ってたけどw
982名無しさん@お腹いっぱい。:2010/02/17(水) 00:50:11
何を言うTrieはトライじゃ
983名無しさん@お腹いっぱい。:2010/02/17(水) 00:51:49
>>982
そうみたいね。それさっき初めて知ったんだ…
984名無しさん@お腹いっぱい。:2010/02/17(水) 01:16:57
NULL、Trie、Alt、ISA、false・・・

英語って言語はできが悪いんじゃないか・・・
985名無しさん@お腹いっぱい。:2010/02/17(水) 01:32:37
何をいまさら
単語レベルの綴りと読みの例外の多さは異常
986名無しさん@お腹いっぱい。:2010/02/17(水) 01:34:54
英語も元々は発音と綴りが一致してたらしいけどね
普段ネイティブとの接触が少ない日本人には辛いわな
987名無しさん@お腹いっぱい。:2010/02/17(水) 08:20:44
昔は name と書いて ナーメだった、とかね。

活版印刷の発明で書き言葉が普及(固定化)するタイミングと、
発音の大きな変化タイミングが重なった不幸な結果らしい。
988名無しさん@お腹いっぱい。:2010/02/17(水) 14:11:57
He
989名無しさん@お腹いっぱい。:2010/02/17(水) 14:33:51
まず英語を耳で聞いて、口で話して
その後に記述を覚えるとき、その文字法則に発音と
違和感が出るのだろうが、そんなのは漢字を覚える
労力に比べたらたやすい
990名無しさん@お腹いっぱい。:2010/02/17(水) 14:45:59
意味不明もいいとこ
991名無しさん@お腹いっぱい。:2010/02/18(木) 00:10:41
英語がめちゃくちゃなのは
ドイツ語とフランス語とウェールズ語とアイルランド語が混ざってるから
って学校の先生が逝ってた
992名無しさん@お腹いっぱい。:2010/02/18(木) 06:26:42
ラテン語とギリシャ語もいれろ。
993名無しさん@お腹いっぱい。:2010/02/18(木) 09:31:37
ラテン語の語彙はだいたいフランス語経由だな。
ノルマンコンクェストばんじゃーい。
994これってbashのバグ?:2010/02/18(木) 17:05:24
#!/usr/local/bin/bash

count=1

while [ $count -lt 16 ];do

let num=`printf %02d ${count}`

echo num=${num}

sleep 1

let count="${count}+1"

done
995名無しさん@お腹いっぱい。:2010/02/18(木) 17:26:08
>>994
printf "%d\n" 08
が文句言うのはバグか、ってこと?
だとしたら、バグじゃないよ。
http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html#lbBQ
996名無しさん@お腹いっぱい。:2010/02/18(木) 17:28:02
違う、
let num=08
か。
997名無しさん@お腹いっぱい。:2010/02/18(木) 17:59:45
bashだと0で始まる数値はoctalとして扱われるから。

echo $(( 010 ))

としてみると判る
998名無しさん@お腹いっぱい。:2010/02/18(木) 18:30:11
10# を前置すればいいじゃん
999名無しさん@お腹いっぱい。:2010/02/18(木) 18:34:26
>>994
理解した?
1000名無しさん@お腹いっぱい。:2010/02/18(木) 18:52:51
.
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。