シェルスクリプト総合 その10at UNIX
シェルスクリプト総合 その10 - 暇つぶし2ch1:名無しさん@お腹いっぱい。
08/02/11 19:21:07
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


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

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

前スレ
シェルスクリプト総合 その9
スレリンク(unix板)

2:名無しさん@お腹いっぱい。
08/02/11 19:22:34
□過去スレ:
シェルスクリプト総合 その8
スレリンク(unix板)
シェルスクリプト総合 その7
スレリンク(unix板)
シェルスクリプト総合 その6
スレリンク(unix板)
シェルスクリプト総合 その5
スレリンク(unix板)
シェルスクリプト総合 その4
スレリンク(unix板)
シェルスクリプト総合 その3
スレリンク(unix板)
シェルスクリプト総合 その2
スレリンク(unix板)
シェルスクリプト総合 その1
スレリンク(unix板)

□関連スレ:
sed
スレリンク(unix板)
正規表現
スレリンク(unix板)
おまえら! shell は何を使っているんですか?
スレリンク(unix板)
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
スレリンク(unix板)

3:名無しさん@お腹いっぱい。
08/02/11 19:23:16
□初心者向けリンク
「誰にでも」シリーズ
URLリンク(kanji.zinbun.kyoto-u.ac.jp)
/bin/shプログラミング入門
URLリンク(freebooks.info.nara-k.ac.jp)
シェルを使おう - 導入からプログラミングまで -
URLリンク(www.netfort.gr.jp)

□入門者向け書籍:
プロフェショナルシェルプログラミング
URLリンク(www.amazon.co.jp)
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
URLリンク(www.amazon.co.jp)
UNIXシェルプログラミング徹底解説
URLリンク(www.amazon.co.jp)
入門Kornシェル
URLリンク(www.amazon.co.jp)
入門bash
URLリンク(www.amazon.co.jp)

□参考リンク:
UNIXの部屋 (沢山のコマンドの簡単な紹介など)
URLリンク(x68000.q-e-d.net)
POSIX: Shell & Utilities (標準規格)
URLリンク(www.opengroup.org)

4:名無しさん@お腹いっぱい。
08/02/11 19:23:40
□最近のシェルスクリプト本(1)

(2004/03) UNIXシェルスクリプトハンドブック 関根 達夫 (著)
URLリンク(amazon.co.jp)
(2004/10) UNIXシェルスクリプト逆引き大全333の極意 中橋 一朗 (著)
URLリンク(amazon.co.jp)
(2004/11) 仕事に使えるLinuxシェルスクリプト 千葉 真人 (著)
URLリンク(amazon.co.jp)
(2004/12) UNIXシェルスクリプトサンプルブック デイブ・テイラー (著)
URLリンク(amazon.co.jp)
(2005/02) シェルスクリプト基本リファレンス 山森 丈範 (著)
URLリンク(amazon.co.jp)
(2005/04) LinuxWorldスクリプト 月刊リナックス・ワールド総集編 月刊LinuxWorld特別 (著)
URLリンク(amazon.co.jp)
(2005/05) UNIXシェルスクリプトコマンドブック 山下 哲典 (著)
URLリンク(amazon.co.jp)
(2005/05) わかる&使える UNIX基礎講座 シェルスクリプト編 中井 獏 (著)
URLリンク(amazon.co.jp)

5:名無しさん@お腹いっぱい。
08/02/11 19:24:05
□最近のシェルスクリプト本(2)

(2005/07) UNIX シェルスクリプト辞典 川井 義治 (著)
URLリンク(amazon.co.jp)
(2005/08) シェルスクリプト ポケットリファレンス bash編 宮原 徹 (著), 川原 龍人 (著)
URLリンク(www.amazon.co.jp)
(2005/12) 図解でわかるLinuxシェルスクリプト・正規表現 小泉 修 (著)
URLリンク(www.amazon.co.jp)
(2006/01)詳解 シェルスクリプト アーノルド ロビンス (著), ネルソン・H.F. ベーブ(著), Arnold Robbins (原著), Nelson H.F. Beebe (原著), 日向 あおい (翻訳)
URLリンク(www.amazon.co.jp)
(2007/3) Linuxシェルスクリプトユーザー便利帳―bash2/bash3対応 伊藤 幸夫 (著), 寒川 陽美 (著)
URLリンク(www.amazon.co.jp)

6:名無しさん@お腹いっぱい。
08/02/11 19:24:29
□関連書籍と関連リンク:

FreeBSD Hypertext Man Pages
URLリンク(www.freebsd.org)

Linux JF (Japanese FAQ) Project.
URLリンク(www.linux.or.jp)

Unix Programming Frequently Asked Questions 日本語訳
URLリンク(www.adl.nii.ac.jp)

UNIXプログラミング環境
URLリンク(www.amazon.co.jp)

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

□シェルスクリプトでよく使うコマンド:
制御・条件判定系: [,test,expr,true,false,yes,getopts
テキスト処理系: cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join
ファイル検索系: find,xargs
(スペースなどを含むファイル名を正しく処理するため、
findは -print0、xargsは -0オプションを常に付けることを推奨
ただし、Solarisでは未対応。どうするんだろ?)
ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl

7:名無しさん@お腹いっぱい。
08/02/11 19:32:22
このへんも追加か?
□最近のシェルスクリプト本(3)

(2007/10) UNIX/Linuxシェルスクリプトマスタリングハンドブック 野川 准子
URLリンク(www.amazon.co.jp)
(2007/9) ゲームで極める シェルスクリプトスーパーテクニック 山森 丈範
URLリンク(www.amazon.co.jp)

8:名無しさん@お腹いっぱい。
08/02/11 19:40:21
シェルにはAシェル系、Bシェル系、Cシェル系、と種類があるようですが、
僕のPCのシェルはXtermというものみたいです。
これは、シェル系に当てはめると何シェル系なんでしょうか?

9:名無しさん@お腹いっぱい。
08/02/11 19:43:19
>>8
X系。                                のターミナルエミュレータ

10:名無しさん@お腹いっぱい。
08/02/11 19:47:36
>>8
むずかしい質問ですね
Xtermを含めた操作環境という意味ではグラフィカルシェルと言えるのではないでしょうか

11:名無しさん@お腹いっぱい。
08/02/11 20:26:04
>>9

そういや昔、東京大学出版会だかの「ワークステーション入門(だったかな?)」で、まじに「X窓系」って言葉に出会ったときはかなり脱力したなぁ。
そしてそれ以上の脱力感にみまわれたのが「窓管理人」。

思い起こせばいい本だったのかもしれん。

スレ痴ですまん。

12:名無しさん@お腹いっぱい。
08/02/11 20:45:55
算譜(Program)はまだ分かるが、連糸(String)は勘弁して欲しいと思ったハタチの夏。


13:名無しさん@お腹いっぱい。
08/02/11 20:47:50
>>12
あれで勉強するんじゃなくて、英語勉強して原書嫁。


14:名無しさん@お腹いっぱい。
08/02/11 20:53:54
連糸って書かれるとthreadかと思うな

15:名無しさん@お腹いっぱい。
08/02/11 20:58:40
リリアンだよ

16:名無しさん@お腹いっぱい。
08/02/11 21:01:24
>>14
当時はスレッドという概念は多分なかったから・・・

17:名無しさん@お腹いっぱい。
08/02/11 21:22:23
連系と言われると連文節変換でしょ。

18:名無しさん@お腹いっぱい。
08/02/11 21:28:40
しむらー、糸、糸。


19:名無しさん@お腹いっぱい。
08/02/12 11:01:33
おしえてください。

1,2,3,4 .. 100 のような数字を 0001,0002,0003,0004 .. 0100 という風に
正規化したいと思っています。
シェルスクリプトで行うにはどんな方法が有るのでしょうか。

具体的には、引数で渡された番号に従って、
0000.sh ~ 0300.sh のようなシェルスクリプトを実行する
スクリプトを作りたいと思っています。

20:名無しさん@お腹いっぱい。
08/02/12 11:03:11
意味がわからん

21:名無しさん@お腹いっぱい。
08/02/12 11:22:15
>>19
ただ…正規化…?
シェルスクリプトうんぬんはわからないが
printf %04d
とか使ったらどうよ?

22:名無しさん@お腹いっぱい。
08/02/12 11:32:17
>>19

for arg in "$@"
do
file=`printf %04d $arg`
./$file.sh
done

↑ってことか?


23:名無しさん@お腹いっぱい。
08/02/12 12:15:28
>>20-22
いけました!ふつーにprintfが有ったんですね!盲点でした!
ありがとうございました!

24:名無しさん@お腹いっぱい。
08/02/12 12:17:24
man printf
って、やったことないのか…

25:名無しさん@お腹いっぱい。
08/02/12 12:28:00
はい・・・
最悪出来なかったら、Cかperlでprintfだけするプログラムを
作ろうと思ってました。アホですいません・・・

26:名無しさん@お腹いっぱい。
08/02/12 12:40:06
printfコマンドが一般的になったのはまだ割りと最近のこと。
Solarisのちょっと前のバージョンとかではprintfコマンドはない。
そういう場合のポータブルな方法としては、exprを使う。
expr 000$arg : '.*\(....\)$'
とかね。

27:名無しさん@お腹いっぱい。
08/02/12 12:53:14
>>20 もありがたかったのか?w

28:名無しさん@お腹いっぱい。
08/02/12 23:54:32
サーバのバックアップが
20080212
20080211
20080210
20080209
20080208



というディレクトリにあるのですが、今はfindとrmを使って60日以上経ったディレクトリ

find ディレクトリ -type d -mtime +60 -maxdepth 1 -exec rm -Rtv "{}" \;
として、60日以上経ったディレクトリを消しているのですが、HDDの容量が
厳しくなってきたので、

残すディレクトリを

1日前
2日前
3日前
1週間前の1日
2週間前の1日
3週間前の1日



2ヶ月前の1日

として、それ以外のディレクトリを消したいと考えています。
 どのようにしたらいいでしょうか?

29:名無しさん@お腹いっぱい。
08/02/13 00:01:03
8日前のを消してしまったら、2週間前の1日は残せないと思うのだが、、、

30:名無しさん@お腹いっぱい。
08/02/13 00:08:10
えーと、直近3日とかは毎日残したいのですが、それ以前のものは一週間のうち
何曜日でもいいから1日だけバックアップを残したいという意味です。

31:名無しさん@お腹いっぱい。
08/02/13 00:09:35
うむ。
毎日3日前~1週間前までのを消してたら、すぐに全部消える罠。

頭使え

32:名無しさん@お腹いっぱい。
08/02/13 00:25:58
>>30
3(4か?)日後には、その日残すべきモノが前日までの処理で消えている状態になるんだぞ。


33:名無しさん@お腹いっぱい。
08/02/13 00:29:28
言葉は悪いが>>31が良いレス。

34:名無しさん@お腹いっぱい。
08/02/13 00:34:21
>>28
週一回別な場所にもバックアップとるとか。
4日前のを消すスクリプトを日曜以外毎日動かすとか。

35:名無しさん@お腹いっぱい。
08/02/13 00:43:41
消す条件を
(一週間以上前 and not 日曜日) or 二ヶ月以上前

これシェルスクリプト関係ある?

36:名無しさん@お腹いっぱい。
08/02/13 00:46:31
すみません。やっと皆さんの言ってる意味がわかりました。
毎日動かすとか、そういうのを気にしないで常に>>30の状態になってれば
いいんですが、なんかいい方法ないですか?
スクリプトは毎週一回動かして、直近一週間は残すけどそれ以前は1週間に
1日だけ残すとかでもいいんです。

37:名無しさん@お腹いっぱい。
08/02/13 00:48:05
>>35は理解できない?

38:名無しさん@お腹いっぱい。
08/02/13 00:48:13
>>35
ああ、それでいいんですけどシェルスクリプトで書く方法がわかりません…
もう、他のスクリプト言語でも使ってしまえばいいんですが、サーバにあまり
いらないものインストールもしたくないので。

39:名無しさん@お腹いっぱい。
08/02/13 00:48:13
すいません、env TZ=GMT-15 `date +%b%d`

としても、2月12日とでてしまうのですが…。
日付を

Feb 12 と出したいので…orz

40:名無しさん@お腹いっぱい。
08/02/13 00:49:42
>>39
env LC_ALL=C TZ=GMT-15 date +%b%d


41:名無しさん@お腹いっぱい。
08/02/13 00:50:15
シェルスクリプトであるディレクトリの下のディレクトリひとつひとつに対して
作成日時 or 曜日を判断できて、rmを実行できれば解決です。

42:名無しさん@お腹いっぱい。
08/02/13 00:51:15
>>38
スクリプト一発でなんとかするんじゃなく
>>34じゃだめなん?

43:名無しさん@お腹いっぱい。
08/02/13 00:55:34
>40

ありがとうございます。
今までcsh使ってて、混乱していました…orz

44:名無しさん@お腹いっぱい。
08/02/13 00:56:42
>>42
> 4日前のを消すスクリプトを日曜以外毎日動かすとか。
を見逃してました
これでいいですw

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

45:名無しさん@お腹いっぱい。
08/02/13 01:05:06
GNU dateがあれば、

dir=20080213
s=`date --date=$dir '+%s'`
nows=`date '+%s'`
diff=`expr "$nows" - "$s"`
w=`date --date=$dir '+w'`
if [ "$w" -eq 0 -and "$diff" -gt 604800 ]; then # 60*60*24*7
  remove;
elif [ "$diff" -gt 36288000 ]; then # 60*60*24*7*30*2
  remove
fi

なければ、perlで同様のコードを。

46:名無しさん@お腹いっぱい。
08/02/13 01:06:52
"$w" -ne 0
でした。

47:39-43
08/02/13 01:26:33
さらにすいません…。

env LC_ALL=C TZ=GMT-15 date '+%b %e'

で望みどおりでたんですが、これをAAAに入れて検索条件にしたいんですが、

AAA=`env LC_ALL=C TZ=GMT-15 date '+%b %e'`

としても昨日にならなくて困っています。。。

48:名無しさん@お腹いっぱい。
08/02/13 01:29:20
GNU dateがあれば、

date --date=yesterday

なければ、perlで同様のコードを。


49:47
08/02/13 01:39:46
>48
ありがとうございます。やっぱりそうですか…。


50:名無しさん@お腹いっぱい。
08/02/19 06:22:53
初心者ですみませんが質問させてください。
aaa
bbb
と書いてあるa.txtをtrコマンドでxxxに置換して保存したいのですが
tr 'aaa\nbbb' 'xxx' < a.txt
を実行すると画面に表示されてa.txtに保存できません。
しかもxxxxxxxxと表示されている・・・
どうやってうまい具合にa.txtに保存できますでしょうか?

51:名無しさん@お腹いっぱい。
08/02/19 07:05:45
>>50
そもそも trコマンドを勘違いしてる。
それだと、aaa改行bbbという並びに関係なく、
aまたはbまたは改行がすべて xに変換される。
例えばファイル内容が abab改行 だったとしても xxxxx に変換される。

同じファイルに出力する方法はまた次の段階で。

52:50
08/02/19 07:16:41
>>51
なるほど。
trでもsedでもいいのですが
aaa
bbb

xxx
に変換したいのです。
うーん。何でどうやったらいいのだろう。。

53:名無しさん@お腹いっぱい。
08/02/19 07:29:35
>>50
ほれ、考えてやったぞ。

(rm a.txt; sed 'N; s/aaa\nbbb/xxx/; P; D' > a.txt) < a.txt

54:名無しさん@お腹いっぱい。
08/02/19 18:05:08
chmod で
ディレクトリは0755、ファイルは0644に
簡単にする方法教えてくださいませ

55:名無しさん@お腹いっぱい。
08/02/19 18:09:23
findでがんばれ

56:名無しさん@お腹いっぱい。
08/02/19 18:23:48
>>54
もともとディレクトリが700、通常ファイルが600になっているなら、
トップディレクトリで chmod -R go+u-w . で一発。

57:名無しさん@お腹いっぱい。
08/02/19 20:28:04
単にこういうことしたいみたいな質問はくだ質にいって欲しいなあ。
英作文スレで単語を質問してるようなもんだ。

58:名無しさん@お腹いっぱい。
08/02/19 23:13:05
>>53

もっと簡単に出きるとオモ

>>54

umask

59:名無しさん@お腹いっぱい。
08/02/19 23:14:22
>>53
どうも。LINUX環境ですが実行しても空のファイルが作られるだけでした。

もう1度質問させてください。
複数行の文字列をsedで置換できるようなのですがやり方がわかりません。
マニュアル見ましたがNオプションとやらでできるみたいなのですが
初心者なので理解に苦しんでます。どうやったらできますか・・・


60:名無しさん@お腹いっぱい。
08/02/19 23:19:19
>>58
あふぉちゃう? umaskではすでに存在するファイルのパーミッションは変わらない。

61:名無しさん@お腹いっぱい。
08/02/19 23:22:33
>>59
はい、Linuxなら板違い。
ちなみに UNIXだと >>53 でちゃんと動作するよ。

62:名無しさん@お腹いっぱい。
08/02/19 23:30:40
>>59
>>53 が書いているコマンドラインを1字1句そのままコピペして実行したか?
Linuxでも >>53 でちゃんと動作したよ。
rm a.txt の部分とか、( ) で囲んでるところとかが重要なんだけど、
自分で勝手に解釈して rm a.txtを省略したりしてないかな?
rm a.txtを省略すると同じファイルに上書きされるので
空のファイルができる現象が起こるはず。

あと、環境限定になるが、sed -i を使えば、( )の中で rm するトリックは不要になる。

63:名無しさん@お腹いっぱい。
08/02/20 05:44:43
>>62
どうも。がんばってみます。
てかLINUXは板違いなの?
テンプレにLINUXもいいようなこと書いてあったのですが板違いなら失礼しました。


64:名無しさん@お腹いっぱい。
08/02/20 09:54:16
> てかLINUXは板違いなの?
板違いでは無いと思うけど、unixのシェルスクリプトスレよりも
Linuxの初心者質問スレに行った方が良いんじゃない?

65:名無しさん@お腹いっぱい。
08/02/20 12:35:24
>>61はアホだから放置で。

66:名無しさん@お腹いっぱい。
08/02/22 16:26:31
うーん、UNIXの授業という授業でLinuxを動かしてるんですけど、
この場合どちらで聴いたらいいですか?
来週までにレポート出さないと単位がやばいのです

67:名無しさん@お腹いっぱい。
08/02/22 16:31:41
>>66
宿題禁止なのでどっちも駄目。単位落して再履修が本人のため。

68:名無しさん@お腹いっぱい。
08/02/22 16:32:23
シェルスクリプトはここで聞けばいいよ。
けど宿題は自分でやりなよ。

69:名無しさん@お腹いっぱい。
08/02/22 19:04:37
バッシュで使えてボーンで使えないシェル記法を10個挙げるとすると
何になりますか? 端的に解答をお願いします。

70:名無しさん@お腹いっぱい。
08/02/22 19:42:40
>>69
エクレアみたいな名前のコマンドが使えませんでした。

71:名無しさん@お腹いっぱい。
08/02/22 19:43:30
Appendix B Major Differences From The Bourne Shell
URLリンク(www.gnu.org)

72:名無しさん@お腹いっぱい。
08/02/22 20:01:34
>>70
10個、具体的にお願いします。

>>71
日本語でお願いします。

あ、来週月曜までにお願いします。

73:名無しさん@お腹いっぱい。
08/02/22 20:08:40
>>72
エクレア?みたいな名前のコマンドが使えませんでした。


74:名無しさん@お腹いっぱい。
08/02/22 21:16:55
rsh で、リモート側の戻り値 $? を取得することは可能でしょうか?

75:名無しさん@お腹いっぱい。
08/02/22 21:20:21
>>74
不可能。sshなら可能。

76:名無しさん@お腹いっぱい。
08/02/23 16:28:51
あるディレクトリ中でファイルのタイムスタンプの新しい順にls表示するには
ls -lt でできますが、
これを、あるディレクトリ以下のサブディレクトリを全部含めて、かつ、
どのディレクトリにあるかに関係無しにタイムスタンプの新しい順にls表示するには
どうしたらいいでしょう?
ls -ltR では、ディレクトリごとにしかソートされません。

なるべく簡単な方法(コマンドラインにすぐ打てる程度)を希望します。

77:名無しさん@お腹いっぱい。
08/02/23 16:38:18
そういうのはくだ質へ行ってください。

78:名無しさん@お腹いっぱい。
08/02/23 16:40:07
>>77
くだ質へ行ったところでお前答えられるのかよw

79:名無しさん@お腹いっぱい。
08/02/23 17:04:11
ls -lR | sort では駄目なの?
sort条件の設定がめんどくさそうだけど。

80:名無しさん@お腹いっぱい。
08/02/23 17:18:23
>>79
はい、だめです。

81:名無しさん@お腹いっぱい。
08/02/23 17:20:44
>>80
それじゃ他の板行って。ここはスクリプトの板であって、コマンドの板ではないから。

82:名無しさん@お腹いっぱい。
08/02/23 17:24:19
>>81
そのコマンドをシェルスクリプト中に書きます。

83:名無しさん@お腹いっぱい。
08/02/23 17:27:08
>>82
>>6

84:名無しさん@お腹いっぱい。
08/02/23 17:32:50
まずはコマンドとして実行してみて確認するためと、
今後とも定石として覚えやすいように、なるべく簡単な方法を聞いたまでです。
目的はシェルスクリプトに書くことです。コマンドの使い方の質問ではありません。

では、よく知っている方、解答をどうぞ、



85:名無しさん@お腹いっぱい。
08/02/23 17:39:21
手当たり次第man

86:名無しさん@お腹いっぱい。
08/02/23 17:41:00
お前アホだろ。

perl scriptで、
mtimeのepochTime ファイル名
と出力させてsort -nr

87:名無しさん@お腹いっぱい。
08/02/23 17:42:59
屁理屈だけは一人前だな。
しかし、お前の屁理屈を受け入れる必要は全然無い。
残念だなあ、くだ質でなら答えてやったのに。

88:名無しさん@お腹いっぱい。
08/02/23 17:44:11
lsとコマンド組み合わせで行けそうだし、
>なるべく簡単な方法(コマンドラインにすぐ打てる程度)を希望します。
これはaliasか、これ用のシェルスクリプト書けば行けるけど、
考えれば考えるほど>>77が正しく思えるようになってきたw

89:名無しさん@お腹いっぱい。
08/02/23 17:44:21
>>86
perlを使わずにお願いします。

90:名無しさん@お腹いっぱい。
08/02/23 17:46:29
PATTERNS="*.jpg *.gif" のような、globパタンを空白で区切って並べた
変数が与えられたとして、
ディレクトリ $dir に存在するファイルでこれにマッチするものを
処理するにはどう書くのがいい?
cd $dir; for f in $PATTERNS
だと、$dirにcdできないといけないのがちょっといやかな、と。

91:名無しさん@お腹いっぱい。
08/02/23 17:49:41
>>90
cd || exit
って感じでcdできなかったら例外処理するようにしたら?

92:名無しさん@お腹いっぱい。
08/02/23 17:50:42
ふつー
cd $dir&& for f in $PATTERNS

93:名無しさん@お腹いっぱい。
08/02/23 17:54:28
そういうことを言ってるんじゃなくて、
cdをしたくないんじゃないのかな?

94:名無しさん@お腹いっぱい。
08/02/23 17:55:37
ああ、確かにw ではちょっと訂正させていただいて。

cd "$dir" && for f in $PATTERNS
だと$dirにcdできないといけないけど、ディレクトリにrパーミッションが
出ていてxが出ていない場合も処理できる書き方ができたらいいなと。

95:名無しさん@お腹いっぱい。
08/02/23 17:55:43
じゃあfindとか

96:名無しさん@お腹いっぱい。
08/02/23 18:06:34
>>93
そういう意味です

>>95
ちょっと思いつかなかった。有望かも。
でもfindの-nameはパタン一つしかとれない。
echo "$PATTERNS"|sed -E 's/^[[:space:]]*//
s/[[:space:]]*$//
s/[[:space:]]+/ -name /g
s/^/-name /'
ぐらいでいいのかな?

97:名無しさん@お腹いっぱい。
08/02/23 18:06:35
>>84

find . -print0 | xargs -0 stat -t %s

の出力をどうにかすればいいんじゃない?


98:名無しさん@お腹いっぱい。
08/02/23 18:11:55
>>94
xないとパターン展開できないんだけど? (direcotry listing属性)
rのみで問題ないのは既にパスが分かっているときだけ。

だからx立っているの前提で、

FILES=`(cd $dir; echo $PATTERNS)'`

99:名無しさん@お腹いっぱい。
08/02/23 18:16:26
逆だろ。rがないとリスティング出来ない。
ただxがないとアクセスできないから意味ないんじゃね? >>94
かなり特殊なケースでリスティングだけ出きればいいのかも知れないが。

100:名無しさん@お腹いっぱい。
08/02/23 18:39:23
xなくてもrが有ればパターン展開は出来る。
ループ内でset +xしてるのがダサいな。

set -f
for f in $(for p in $pat; do set +f; [ "$(echo ${dir}/${p})" = "${dir}/${p}" ] || echo ${dir}/${p};done); do basename "${f}";done

101:名無しさん@お腹いっぱい。
08/02/23 18:50:53
パターンがglobパターンじゃない場合に見つけられなかった。

set -f
for f in $(for p in $pat; do set +f; [ "$(echo ${dir}/${p}*)" = "${dir}/${p}*" ] || echo ${dir}/${p};done); do basename "${f}";done

102:名無しさん@お腹いっぱい。
08/02/24 07:19:02
>>96
find . \( -name '*.[ch]' -or -name '*.asm' \) ... とかできないか?


103:名無しさん@お腹いっぱい。
08/02/29 15:55:20
犬糞厨はこっちへ

シェルスクリプト総合@LINUX Part3
スレリンク(linux板)

104:名無しさん@お腹いっぱい。
08/03/01 23:48:31
●質問
/hoge/ 以下にあるディレクトリ群の中身のファイルリストを
フルパス形式で各ディレクトリ毎に作りたいです。

●自分なりに調べた結果
findコマンドを使うとフルパスで結果が返ってくる事がわかりました。
こうしました。
$find /hoge -name "*.txt" > hoge.list
ですがこれだと全てのディレクトリの.txtまでのパスが書かれてしまいますので
これを各ディレクトリ毎に作りたいんです。そしてそれを~/listに保存したいです。

手作業でもいいのですがOSに不慣れなうえディレクトリが120ほどあり困っています
お力お借り出来ませんでしょうか?よろしくおねがいします。

丸投げするつもりはないです 知恵を貸してほしいです。

105:名無しさん@お腹いっぱい。
08/03/01 23:52:48
ls -Rオススメ

106:104
08/03/02 00:14:25
>>105
ありがとうございます。

すみません自分の説明が下手でした・・

$cat a_list
/hoge/a/hoge1.txt
/hoge/a/hoge2.txt

$cat b_list
/hoge/b/hage.txt
/hoge/b/hage.txt

伝わりますでしょうか・・。

107:名無しさん@お腹いっぱい。
08/03/02 00:50:58
こんなんかな

find . -depth 1 -type d | while read dir
do
ls -lR $dir > ./tmp/${dir}_list
done


108:名無しさん@お腹いっぱい。
08/03/02 00:53:54
あ、出力がフルパスじゃないや。

まぁ、なんかこんな感じでできそうな希ガス。

109:名無しさん@お腹いっぱい。
08/03/02 00:58:29
find . -depth 1 -type d | while read dir
do
find /path/to/hoge/ > ~/list${dir}_list
done

こんなんか。3連カキコすんまそん。

110:名無しさん@お腹いっぱい。
08/03/02 01:33:33
サブディレクトリもあるのかとか、
*.txt 以外のファイルもあるのかあれば表示してもいいのかとか、
ちと条件不足

111:104
08/03/02 01:41:01
ありがとうございます。

>>109
/path/to/hoge/を書き換えしmkdir ~/listしたうえで実行してみました。
以下のようになります。

find: パスは評価式の前におかなければならない
Usage: find [-H] [-L] [-P] [path...] [expression]

>>110
条件ですか・・。
サブディレクトリはないです。*.txt以外表示はしたくないです。
*.txt以外のファイルも混在しています。

112:名無しさん@お腹いっぱい。
08/03/02 01:59:50
find の行にほかに何か書いたんじゃ?
find /path/to/hoge -name "*.txt" > ~/list${dir}_list
かなぁ。

find /path/to/hoge/ てすると結果が /path/to/hoge//dir になるぽい。
ちょっと今Macしか手元にないのでちょっと挙動が違うかもね。
俺もあんまり詳しくないんでw

113:104
08/03/02 02:28:31
>>112
何も書いてないですね。自分に出来るかわからないですけど教えてもらったのを
参考に弄ってみたいと思います。

Macもコマンド使えるんですかー 知りませんでしたw

ありがとうございました。一旦、スレを離れます。

114:名無しさん@お腹いっぱい。
08/03/05 00:49:41
HOGE=20080302022831
たとえば2008年3月2日 2時28分31秒を意味する
みたいな環境変数あったとして、
これに180秒足すとか、
時刻の加減算したいのだけどなんかいい方法ない?



115:名無しさん@お腹いっぱい。
08/03/05 01:14:43
date -j -f %s $(($(date -j -f %Y%m%d%H%M%S "$HOGE" +%s) + 180)) +%Y%m%d%H%M%S
みたいな?OSというかdateによるけど。

116:名無しさん@お腹いっぱい。
08/03/05 04:26:24
UNIX epochは素晴らしい。
64bitにした時signedにしてないシステムがあるのは嘆かわしい。

117:名無しさん@お腹いっぱい。
08/03/05 14:50:47
dateコマンドはシステムによって違いすぎるから、ほとんどの日付計算はperlに丸投げ

118:名無しさん@お腹いっぱい。
08/03/06 13:08:35
ある
テキストファイルに"aaa"という文字列が入っていたら[処理A]を
テキストファイルに"bbb"という文字列が入っていたら[処理B]を
ってシェルスクリプトだけでできるかな?
bashで。


119:名無しさん@お腹いっぱい。
08/03/06 13:19:01
bashは知らんがshで

case $(cat x.txt) in
  *aaa*) echo 'do A';;
  *bbb*) echo 'do B';;
esac

120:名無しさん@お腹いっぱい。
08/03/06 13:23:09
両方入っていたら?

121:名無しさん@お腹いっぱい。
08/03/06 13:25:03
>>119
すげえ!頭の構造が違う!
ありがとう。


122:名無しさん@お腹いっぱい。
08/03/06 13:25:45
>>120
泣きながら修正する

123:名無しさん@お腹いっぱい。
08/03/06 14:12:58
>>119
ファイルサイズがでかいとつらそうだな

124:名無しさん@お腹いっぱい。
08/03/06 14:15:27
grep -s aaa file && echo 処理A
grep -s bbb file && echo 処理B

125:名無しさん@お腹いっぱい。
08/03/06 15:36:21
>>119
それ bash。
純正 shでは動かん。

126:名無しさん@お腹いっぱい。
08/03/06 15:41:02
>>125
すげー理屈だな。

127:名無しさん@お腹いっぱい。
08/03/06 15:43:33
まぁbashで動くならいいんじゃね。

128:名無しさん@お腹いっぱい。
08/03/06 15:49:49
純正 shって何?

129:名無しさん@お腹いっぱい。
08/03/06 16:02:36
Version 7 あたりか

130:名無しさん@お腹いっぱい。
08/03/06 16:34:24
俺は124みたいな方法が好み
$( )が動くのはkshからか?

131:名無しさん@お腹いっぱい。
08/03/06 16:49:43
>>124
それだと今のgrepでは行が表示されちゃうよ。
骨董品のような環境しか使ってないことバレますよw

132:名無しさん@お腹いっぱい。
08/03/06 17:59:52
*BSDユーザはbash依存にはうるさいが、ash依存「$( )とかexport A=aとか」には
無頓着な傾向があるな。

133:名無しさん@お腹いっぱい。
08/03/06 18:27:06
export A=aはkshでも出来るからどうでも良い

134:名無しさん@お腹いっぱい。
08/03/06 18:41:48
現実に純正shとやらが載ってる環境なんて今時滅多になかろうし、
テンプレにある議論の基準として参照できそうなのもPOSIXの仕様くらいなので
仕方ない面もあると思う。
>>132は*BSDユーザに何をみてshの仕様を判断することを期待しているの?

135:名無しさん@お腹いっぱい。
08/03/06 19:02:35
そもそも「純正 sh」って表現が意味わからん。

136:名無しさん@お腹いっぱい。
08/03/06 19:04:57
そうですか。Solarisは今時滅多にないですか、、

137:名無しさん@お腹いっぱい。
08/03/06 19:07:57
>>134
「純正 sh」なんて言わないで
「FreeBSD の /bin/sh で試した」とか言えばいいじゃん。

138:名無しさん@お腹いっぱい。
08/03/06 19:09:10
はいはいashash

139:名無しさん@お腹いっぱい。
08/03/06 19:10:00
>>137 は勘違いしてるね。
FreeBSD の /bin/sh は 純正 sh じゃない。(ashだから)
だから、FreeBSD の /bin/sh では >>119 が動いてしまう。
純正 shでは動かないけど。

140:名無しさん@お腹いっぱい。
08/03/06 19:35:26
>>139
純正shって結局何? System 7のshが純正ってことでいい?

>>137
それじゃ一般化した議論ができないよ。
まず、$( )とかexport A=aとかが純正shとやらにはありません、
ということを*BSDユーザに対して説得力ある説明をするにはどうするの?

141:名無しさん@お腹いっぱい。
08/03/06 19:42:05
>>140
別に一般化しなくていいと思うけどな。
「(OS 名) の /bin/sh では動かないよ」でいいじゃん。

142:名無しさん@お腹いっぱい。
08/03/06 20:20:17
「Solarisの/bin/shには$( )とかexport A=aとかがありません」これでいい?

143:名無しさん@お腹いっぱい。
08/03/06 20:33:05
その調子で、Solaris以外も全部列挙していってくれ。

144:名無しさん@お腹いっぱい。
08/03/06 20:42:22
Solarisはいまどきめったにないです

145:名無しさん@お腹いっぱい。
08/03/06 21:13:15
多くの商用UNIXは互換のために古いshが残されてる。
Solarisの場合、多くのスクリプトがkshベースになってるけどな。

146:名無しさん@お腹いっぱい。
08/03/06 21:21:53
商用UNIXがもうそれほど多くないです

147:名無しさん@お腹いっぱい。
08/03/06 21:25:27
しょうよねぇ

148:名無しさん@お腹いっぱい。
08/03/06 22:24:07
HP-UXは11iでbourneは完全になくなった


149:名無しさん@お腹いっぱい。
08/03/07 06:51:44
実装とmanだけで、ちゃんとした仕様がないんだから、
純正shなんて言っても始まらない。
今はPOSIXが標準。

>>1
>・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。

なんて馬鹿げてる。

150:名無しさん@お腹いっぱい。
08/03/07 07:01:33
POSIX sh や ksh を前提にしてもいいかもね

151:名無しさん@お腹いっぱい。
08/03/07 07:14:25
よくないだろw

152:名無しさん@お腹いっぱい。
08/03/07 07:22:03
そう?
Bourne Shellを前提にするよりはいろいろと有効だとおもうけど

153:名無しさん@お腹いっぱい。
08/03/07 08:22:29
正直、AT&Tの純正/bin/shが使える環境の方が特殊。
原理主義者は別スレ立ててそこでやってくれ。
そこで永遠に添削してれば良かろう。

つ 【純正/bin/shが】シェルスクリプト【唯一の正当なsh】

154:名無しさん@お腹いっぱい。
08/03/07 08:46:54
いやだから、Solarisの/bin/shが現存するんだって。Solarisももう特殊なのか?

155:名無しさん@お腹いっぱい。
08/03/07 09:13:02
特殊な部類と言われてもそれほど驚かないけど。
/bin/shをposix shに置き換えていないのはまだ生きているものの中ではsolarisぐらい?

156:名無しさん@お腹いっぱい。
08/03/07 09:48:19
使用シェルを明示すればいいだけのような気がする。
それでも差異を知っておくのは別に悪いことじゃないと思うんだけど、
特定のOSしか相手にしない連中ならそれでもいいか。

157:名無しさん@お腹いっぱい。
08/03/07 09:58:02
つまり純正shとかいってたのは、Solarisで動かないのは認めねーってのがホンネかw

158:名無しさん@お腹いっぱい。
08/03/07 10:20:04
Solarisなんて現場ではもうほとんど使われてないだろ。
使われているのは昔のマシンで、移行が面倒だからそのまま動いてるだけのもの。
そういうマシンは保守のみで、新規にスクリプトを書くことはないので、
結局Solaris用のスクリプトなんてもう書くことはない。

159:名無しさん@お腹いっぱい。
08/03/07 10:25:19
自分の場合、Solarisに限らず古めの商用UNIXをお守りすることがある。
入れ替えろつってもムリな環境ってのはあるから。装置の一部になってるとか。
OSのアップグレードすらムリだったり。

若い連中には/bin/shと書いておきながらbash前提のスクリプト書くやつが
いたりするんだが、犬以外の作業ではまっていたりする。
そんなやつは知識が足りてないから、なかなか解決できないのが笑えるよ。

160:名無しさん@お腹いっぱい。
08/03/07 10:25:56
>>158
自分の知ってる世界がすべてだと思わない方がいいよ。

161:名無しさん@お腹いっぱい。
08/03/07 10:50:13
Bourne shを前提にすればSolarisのshすら拡張されている。

162:名無しさん@お腹いっぱい。
08/03/07 10:51:15
>>160
こういうふうに、反論する(反例を示す)わけでもなく、
一般論だけ言って本人は反論したつもりになってるのって間違ってるよな。

163:名無しさん@お腹いっぱい。
08/03/07 10:57:52
>>161
じゃあ、Solarisの/bin/shで使えて、Bourne shでは使えない例を1つ以上挙げて。
あらかじめ言っとくけど、あくまでシェルスクリプトとしてね。
インタラクティブモードでの拡張は別。(set -mでjob controlが使えるようになるとか)

164:名無しさん@お腹いっぱい。
08/03/07 11:16:01
^ がパイプとして動くshはまだどっかにある?

165:名無しさん@お腹いっぱい。
08/03/07 11:23:50
>>163
関数。

166:名無しさん@お腹いっぱい。
08/03/07 11:28:01
オリジナルBourne shellって一体どのバージョンのこと指しているの?
POSIXなら仕様のversionでどれかはっきりするけども。
オリジナルBourne shellって言っても、どれか特定すら出来ないでしょ。
後から行われたバグフィックスは含むのか含まないのか。

167:名無しさん@お腹いっぱい。
08/03/07 11:39:06
>>164
Solarisの/bin/sh は ^ がパイプとして機能する。Bourne sh踏襲のため。

168:名無しさん@お腹いっぱい。
08/03/07 11:58:56
反例ないようだし、実質 Solaris /bin/sh基準でいいんじゃね?

169:名無しさん@お腹いっぱい。
08/03/07 12:04:57
可哀想に、耄碌して目も見えなくなったのか……

170:名無しさん@お腹いっぱい。
08/03/07 12:07:54
基準なんているか?
質問者の環境で動けばいいじゃん。

171:名無しさん@お腹いっぱい。
08/03/07 12:17:05
そういうことにしてしまうとbashを排除する口実がなくなる。

172:名無しさん@お腹いっぱい。
08/03/07 12:38:31
実質POSIX sh基準でよさそうだな。SUSv3と一体化したし。

173:名無しさん@お腹いっぱい。
08/03/07 12:40:50
だから、それじゃSolarisで動かないとあれほど、、

174:名無しさん@お腹いっぱい。
08/03/07 12:43:10
Solaris爺様には必要なときにSolarisではどうするかと質問してもらうということでいいんじゃない。

175:名無しさん@お腹いっぱい。
08/03/07 12:44:44
Solarisはkshがあるから、POSIXのコード渡されても問題ないでしょ。

176:名無しさん@お腹いっぱい。
08/03/07 12:44:57
POSIX信者もbashと同様にウザイことに最近気がついた。

177:名無しさん@お腹いっぱい。
08/03/07 12:46:14
Bourne shell原理主義者もな。

178:名無しさん@お腹いっぱい。
08/03/07 12:47:28
学生のときSolarisにお世話になった俺は心情的にはSolaris使える人を維持できるよう
このスレも気を配った方がいいとは思うのだが、昨日からの流れ見てると
到底このスレのSolaris使いを擁護する気にはなれないwww もうPOSIX shスレでいーよ。

179:名無しさん@お腹いっぱい。
08/03/07 12:53:45
せっかくだからPOSIXと由緒正しいBourne shellの違いを上げてみる?

[[ 新test式 ]]
$(( 算術式 ))
引数がない場合の"$@"問題


180:名無しさん@お腹いっぱい。
08/03/07 13:00:43
そもそもtestがbuiltinだ、ボケ

181:名無しさん@お腹いっぱい。
08/03/07 13:01:17
そもそもtestがbuiltinじゃないだ、ボケ

182:名無しさん@お腹いっぱい。
08/03/07 13:01:43
建設的な話のもっていきかただとは思うが、まず

> 由緒正しいBourne shell

とやらを特定しようぜ。できればSolaris以外のソースで頼むわ。
Solarisのshをもってきてこれが純正だっつーならバージョンも明記でな。

いまのところ、Version 7のshがそれということになりかねない。

183:名無しさん@お腹いっぱい。
08/03/07 13:04:09
なりつつある、の方が適当だったか。

184:名無しさん@お腹いっぱい。
08/03/07 13:11:16
人は皆、理想のシェルを追い続ける旅人のようなものさ。

185:名無しさん@お腹いっぱい。
08/03/07 13:18:46
$( コマンド ) < POSIX

186:名無しさん@お腹いっぱい。
08/03/07 13:30:45
>>184
理想でいえば、rc はなかなかいいよ(単なるまぜっかえし)

187:名無しさん@お腹いっぱい。
08/03/07 13:35:48
仮にPOSIXで桶にしてしまうと、
print hoge (printfじゃないよ、読み間違えるなよ)
なんてのも桶になってしまう。
POSIX的にはechoは非推奨で、printに書き換えなきゃならないからな。
で、*BSDユーザーからは printなんてコマンドねーよ、って話になる。

188:名無しさん@お腹いっぱい。
08/03/07 13:42:10
>>187
はつみみなのでソースよろ。

189:名無しさん@お腹いっぱい。
08/03/07 13:56:56
echoはプラットフォームごとに違いが大きいからなあ。


190:名無しさん@お腹いっぱい。
08/03/07 14:10:08
Solarisに至っては内蔵コマンドなのにPATHによって挙動が変化するしね

191:名無しさん@お腹いっぱい。
08/03/07 16:36:46
POSIXにprintコマンドなどない。

POSIXについてすら>>187のように妄想を語り出す奴がいるようでは
仕様を特定できないBourne shでは到底基準にならないな。

192:名無しさん@お腹いっぱい。
08/03/07 16:51:06
とりあえず、間を取ってkshぐらいで動けばまぁ文句も出にくいかと。

193:名無しさん@お腹いっぱい。
08/03/07 17:39:04
>>191
xpg4ってPOSIXじゃないの?

194:名無しさん@お腹いっぱい。
08/03/07 17:48:55
Unix95とかUnix2003(OSXのあれ)とかと同類。
はっきりいって一番どうでもいい規格w


195:名無しさん@お腹いっぱい。
08/03/07 21:06:07
仕様を手に入れやすいというメリットはあるね。

196:名無しさん@お腹いっぱい。
08/03/07 22:50:06
>>193
違うよ。

197:名無しさん@お腹いっぱい。
08/03/07 23:36:16
>>190
> Solarisに至っては内蔵コマンドなのにPATHによって挙動が変化するしね

マジ? ちょっと信じられないんだけど。

198:名無しさん@お腹いっぱい。
08/03/07 23:39:35
>>179
> せっかくだからPOSIXと由緒正しいBourne shellの違いを上げてみる?

関数が内部コマンドより優先 > POSIX

# [[ test式 ]] ってPOSIXだったかなあ…

199:名無しさん@お腹いっぱい。
08/03/08 01:38:57
>>163
${parameter##word}
${parameter#word}
${parameter%%word}
${parameter%word}

200:名無しさん@お腹いっぱい。
08/03/08 07:55:45
>>199
それはSolarisの/bin/sh でも使えない。よって例にならない。

201:名無しさん@お腹いっぱい。
08/03/08 08:21:28
POSIXだからといって [[ ]] を使ったりすると
*BSDユーザーが困るだろ。だからPOSIXを尺度にすることは事実上無理がある。

202:名無しさん@お腹いっぱい。
08/03/08 10:54:49
[[ ~ ]] はPOSIXじゃないのでその主張には無理がある。

203:名無しさん@お腹いっぱい。
08/03/08 11:11:35
>>197
$ sh -c 'type echo; echo -n hoge'
echo is a shell builtin
-n hoge

$ PATH="/usr/ucb:$PATH" sh -c 'type echo; echo -n hoge'
echo is a shell builtin
hoge (改行なし)

204:名無しさん@お腹いっぱい。
08/03/08 12:07:28
じゃあ、kshって結構 POSIXとはかけ離れてるんだ。

205:名無しさん@お腹いっぱい。
08/03/08 12:29:33
kshをフルに使って書いたものはPOSIX shで動かないという意味では。
kshにあってPOSIXで採用されなかったものとしては、select文もそうだね。

206:名無しさん@お腹いっぱい。
08/03/08 12:42:50
実際のスクリプトでは全く使われていないのに
参考出品のリファレンスみたいに /usr/xpg4/bin/sh
を置いてるSolarisって一体、、、
しかも、/usr/xpg4/bin/shはPOSIXじゃないし、
/usr/xpg4/bin/shが新標準だとしても
未だに/usr/xpg4/bin/shで /bin/shを置き換える気配もないし、、

207:X/Open
08/03/08 12:44:44
>>206
> しかも、/usr/xpg4/bin/shはPOSIXじゃないし、

( ゚д゚)ポカーン


208:名無しさん@お腹いっぱい。
08/03/08 12:54:38
>>207
>>196 ( >>193 )

209:名無しさん@お腹いっぱい。
08/03/08 12:55:25
>>207
>>194

210:X/Open
08/03/08 13:04:11
違うのは当たり前だろ
POSIXと違うとか
新標準とか
アホかと思う

211:名無しさん@お腹いっぱい。
08/03/08 13:06:00
/usr/xpg4/bin/shを置くなら、
なぜ /usr/posix/bin/sh を置かないのか、って話かな?

212:名無しさん@お腹いっぱい。
08/03/08 13:06:30
その違うのをどうしましょうって話じゃないですか。

213:名無しさん@お腹いっぱい。
08/03/08 13:22:56
XPG4準拠のが別途用意してあるのはいいことだ。
/bin/shと置き換えるとか、>>206は意味不明すぎ。

214:名無しさん@お腹いっぱい。
08/03/08 21:16:51
autotoolsの吐くconfigureで使われているか否か、は移植性の判定材料になるだろうか。


215:名無しさん@お腹いっぱい。
08/03/08 21:37:59
BSDヲタが騒ぐからautoconfは控えることw

216:名無しさん@お腹いっぱい。
08/03/08 21:43:42
Solarisの/usr/xpg4/bin/shも、HP-UX、AIXの/bin/shも実体はkshだっつうの。
で、kshはPOSIXに一応準拠している。というかPOSIXが後付でkshの仕様をパクっただけ。
ただし、仕様が曖昧なところが多いから、
POSIX志向が強いbashなんかとkshでも、結構挙動が違っているところがある。

217:名無しさん@お腹いっぱい。
08/03/08 21:49:08
実体一緒でもargv[0]が違えば挙動が違うでしょ。

218:名無しさん@お腹いっぱい。
08/03/13 15:52:12
Solarisでは/usr/xpg4/bin/shとkshは別バイナリだぞ。嘘書くな。
ハードリンクもしてないし、当然argv[0]も見てない。cmp比較してから書けよ。

219:名無しさん@お腹いっぱい。
08/03/13 16:29:01
ソースレベルでは99%同じだけどな。


220:名無しさん@お腹いっぱい。
08/03/14 19:19:44
指定フォルダ以下のファイル数を
findを使って調べたいのです。
どなたかヘルプおながいします

221:名無しさん@お腹いっぱい。
08/03/14 19:32:16
wc -l で行数を数えればいいんじゃねの

222:名無しさん@お腹いっぱい。
08/03/14 19:45:19
フォルダって何ですか?

223:名無しさん@お腹いっぱい。
08/03/14 22:03:10
>>222
> フォルダって何ですか?
わろた

224:名無しさん@お腹いっぱい。
08/03/14 22:11:38
>>222
素人さんにも通じるディレクトリの一般的な呼び方です。

225:名無しさん@お腹いっぱい。
08/03/14 23:57:27
質問です。

NETWORK |AAAA BBB CCCC
  |AAAA BBB CCCC
AAAA   |BBBB CCCC DDDD
BBBB   |UUUU DDDD FFFF

このような5000行のテキストからヘッダー以外の最初のカラムを抜き出したいのですが
ヘッダーと2行目の空白も抜き出してしまい、うまくいきません。
元のファイルをいじらず、うまくヘッダーを除いたカラムを抜き出せませんか?

どうか教えていただけないでしょうか?

226:名無しさん@お腹いっぱい。
08/03/15 00:15:30
sed -n 's/^[^|]*|//p' | awk '{ print $1 }'

sedは文字単位、awkはカラム単位と分担する

227:名無しさん@お腹いっぱい。
08/03/15 00:17:47
「ヘッダーと2行目の空白も抜き出し」た後に、先頭の2行を削ればいいのでは。

うんたらかんたら | { read x; read x; cat; }

228:名無しさん@お腹いっぱい。
08/03/15 00:22:25
sed -ne '3,$p' | ...



229:名無しさん@お腹いっぱい。
08/03/15 04:59:25
ヘッダってのは一カラム目の事なのか?
下手な説明だなw

230:名無しさん@お腹いっぱい。
08/03/15 05:15:04
>>225
sed '1,2 d; s/|.*//'

awk -F '|' 'NR > 2{ print $1 }'

cut -d '|' -f 1 | tail +3


231:名無しさん@お腹いっぱい。
08/03/15 09:23:42
>>226
sedでできることはすべてawkでもできるんだから、
awkを使うならsedは使っちゃ駄目。
1個のawkでできるのにsedと分担するのはバッドデザイン。

今回の場合は結局sedだけでできるんだから、
>>230 が最良回答だな。

232:名無しさん@お腹いっぱい。
08/03/15 09:32:56
>>230
> sed '1,2 d; s/|.*//'

できてないやんw

233:名無しさん@お腹いっぱい。
08/03/15 09:39:22
俺は仕様がわからんのだが…
二行目以外にも1カラム目が空白の行があるんじゃないのか?

それなら、
awk 'NR > 1 { if ($2 !~ /^\|/) print $1; }'


234:名無しさん@お腹いっぱい。
08/03/15 09:42:21
>>231

>>sedでできることはすべてawkでもできるんだから

それは違う。

また、仮に出来ることでも
分担させることで、何をやっているのか明確になるなら無問題。
決してバッドデザインなどでは無い。

235:名無しさん@お腹いっぱい。
08/03/15 09:49:07
>>234
それは awkプログラムになれていない者の考え。

236:名無しさん@お腹いっぱい。
08/03/15 09:51:13
>>232
できてるだろ。

237:名無しさん@お腹いっぱい。
08/03/15 09:54:56
というか、>>226 の sedの部分、間違ってるやん。
1カラム目を逆に削除してるww
sedすらロクに書けない者が「分担」ですかw
何をやっているのか明確になってるはずなのに、こんな明らかな間違いですかww

238:名無しさん@お腹いっぱい。
08/03/15 10:05:16
>>234
sed でできて awk でできないことってたとえば何?

239:名無しさん@お腹いっぱい。
08/03/15 10:52:44
>>237

おれは別に当人じゃないけど、
問題文を君とは違う解釈をしているだけで、
間違いではないと思う。

>>238

さあ?例えば出力の判定が遥か前方に有る場合とか?

240:名無しさん@お腹いっぱい。
08/03/15 10:59:45
>>235

なれていないの定義が良く解らんが、
シェルのラッパを被っただけのawkスクリプトを書くわけじゃなくて、
シェルスクリプトを書くためにはawkプログラムを知悉する必要は無いと思う。

当人がsedで書いた方が後でメンテをし易いと思うなら、
そうすべきと思うことを阻害する理由は何もない。

241:名無しさん@お腹いっぱい。
08/03/15 12:45:14
一行野郎でどっちも使ってるけどそれぞれに良さはあるよ。
置換処理は sed の方が簡単に書ける。
カラム指向の処理は awk が便利。

ただ、sed の出力を awk に食わせるのは無駄が多いと思う。
たいていはどちらかだけで書けるだろうから。
俺はややこしくなってきたら perl とか ruby に逃げちゃうし。w

シェルスクリプトで重要なのはメンテする人が分かりやすい事だと
思っているからこの考えを無理強いするつもりは無いけどな。

242:名無しさん@お腹いっぱい。
08/03/15 13:33:44
>>225を良く読むと、>>233が正解仕様のような気がするのだが…


243:名無しさん@お腹いっぱい。
08/03/15 14:43:31
awk -F"|" 'NR>1{print $1}'

244:名無しさん@お腹いっぱい。
08/03/15 14:47:46
それじゃ二行目の空白が出力される。
>>225はデータに全角空白が含まれるから仕様が良くわからん。

245:名無しさん@お腹いっぱい。
08/03/15 23:11:58
質問です。

二つのファイルがあります。
ファイルAには以下の内容。
-----------------------
aaa
bbb
ccc
ddd
eee
fff
ggg
-----------------------

ファイルBには以下の内容がかいてあります。
-----------------------
bbb
ccc
-----------------------

ファイルAからファイルBの内容を除去したファイルCを作りたいのですが、
どのようにすればよいでしょうか?
(ファイルAやファイルBの内容は、時々かわります。)



246:名無しさん@お腹いっぱい。
08/03/15 23:28:15
Bの各行が独立したパターンならgrep -f Bでよさそうだけど、
bbb
ccc
という塊で削除したいならそうもいかんよな。

diff -u A B | sed -n '1,/^@/d;/^-/s/^-//p'
とか?


247:名無しさん@お腹いっぱい。
08/03/15 23:29:04
おっと
×grep -f B
○grep -vf B


248:名無しさん@お腹いっぱい。
08/03/15 23:31:32
>>245
ほれ、作ってやったよ。

#!/bin/sh

cmd='cat fileA'

while read str
do
cmd="$cmd | grep -v $str"
done < fileB

eval $cmd

249:名無しさん@お腹いっぱい。
08/03/15 23:36:03
>>248
それだったら、grep -vf fileB fileA でいいじゃん。
>>247 がすでに答えてる。

250:名無しさん@お腹いっぱい。
08/03/16 14:52:28
ファイルA,Bの並びが同じで、ファイルAにだけある行があるという場合は
commが使える。

251:名無しさん@お腹いっぱい。
08/03/18 00:36:36
>>250
commって辞書順に並んでないと使えないよ。
たぶん、このケースはプログラムで一行づつチェックするしかないと思うんだ。


252:名無しさん@お腹いっぱい。
08/03/18 05:09:00
fgrepにした方が安全。-eも付けて。

253:名無しさん@お腹いっぱい。
08/03/18 10:25:45
solarisのシェルスクリプトで教えてください。
スクリプト内で自分自身が置かれているディレクトリの絶対パスを取得したいのですが上手くいきません。
$0にパスが格納されていると聞いて以下のコードをtest.shとして実行したのですが./testという結果しか返ってきません。

#!/bin/bash
/bin/echo $0


どうすれば絶対パスを取得できますか?

254:名無しさん@お腹いっぱい。
08/03/18 10:28:28
>>253
pwd

255:名無しさん@お腹いっぱい。
08/03/18 10:39:20
>>254
できましたー!
本当にありがとうございます。

256:名無しさん@お腹いっぱい。
08/03/18 10:48:09
( cd `dirname $0` && pwd )
が妥当では?

257:名無しさん@お腹いっぱい。
08/03/18 10:50:59
$0 書き替えて呼ばれたら無効だけどな。
URLリンク(www.nurs.or.jp)

258:名無しさん@お腹いっぱい。
08/03/18 11:08:19
>>255
>>254 は嘘回答だお。本当にありがたいかw
スクリプトが置かれているディレクトリじゃなくて、
スクリプトを実行したディレクトリが表示されるだけ。

259:名無しさん@お腹いっぱい。
08/03/18 11:09:29
回答っていうか、ヒントでしょ。
そのまま使うわけがない。

260:名無しさん@お腹いっぱい。
08/03/18 11:18:52
ヒントとしても質が低いな

261:255
08/03/18 11:26:10
すいません。
cronで動かしたら違うディレクトリを持ってきました。
どうすれば良いでしょうか。

262:名無しさん@お腹いっぱい。
08/03/18 11:38:23
>>261
だから言っただろ

263:255
08/03/18 11:44:49
>>262
迂闊でした。

264:名無しさん@お腹いっぱい。
08/03/18 11:50:16
その後のレスぜんぜん読んでないのな。

265:255
08/03/18 11:58:38
cd `dirname $0` && pwd でできました!
本当にありがとうございました。

266:名無しさん@お腹いっぱい。
08/03/18 12:11:02
次はスペース付きパスでハマるわけだな

267:255
08/03/18 13:01:56
かさねがさねすいません。
cd `dirname $0` && pwd

この結果、どうやれば変数に格納できますか?

268:名無しさん@お腹いっぱい。
08/03/18 13:46:23
>>267
` ` のネスティングの問題だな。

hoge=`cd \`dirname $0\` && pwd`

269:名無しさん@お腹いっぱい。
08/03/18 13:49:00
問題: >>268 を、スペースを含むPATHでも対応できるように書き直せ

270:名無しさん@お腹いっぱい。
08/03/18 13:59:14
hoge=$(cd "$(dirname $0)" && pwd) でお

271:名無しさん@お腹いっぱい。
08/03/18 14:06:30
>>270
不正解

272:名無しさん@お腹いっぱい。
08/03/18 14:13:19
>>271
なんで?

273:255
08/03/18 14:17:06
今度こそ本当にできました!
皆さん本当に本当にありがとうございました。


>>269
わ、わかりません。
もっと勉強して出直します。

274:名無しさん@お腹いっぱい。
08/03/18 14:25:44
>>272
$0 自体がスペースを含んでたら駄目だろ。実験すれば一発。

あと、$( ) じゃなくてあくまで ` ` で書いて欲しいな。

275:名無しさん@お腹いっぱい。
08/03/18 14:35:18
>>274
> $0 自体がスペースを含んでたら駄目だろ。実験すれば一発。
気づかんかった。
> あと、$( ) じゃなくてあくまで ` ` で書いて欲しいな。
エスケープが多いと見にくくない?

276:名無しさん@お腹いっぱい。
08/03/18 16:27:40
$( )で問題なし

277:名無しさん@お腹いっぱい。
08/03/18 16:34:22
>>276
あるだろ。

278:名無しさん@お腹いっぱい。
08/03/18 16:35:58
ヒント:元質問者のOS

279:名無しさん@お腹いっぱい。
08/03/18 16:36:10
最終的にカレントディレクトリもスペースを含むことを考えて、
hoge="`cd \"\\`dirname \\"$0\\"\\`\" && pwd`"
かな?

手許に環境がないから、誰か実験してw


280:名無しさん@お腹いっぱい。
08/03/18 16:43:31
>>279
不正解

281:名無しさん@お腹いっぱい。
08/03/18 16:44:53
$(cmd)はPOSIX shellにはあるから問題ないだろ

282:名無しさん@お腹いっぱい。
08/03/18 16:46:24
>>277
どんな問題があるの?

283:名無しさん@お腹いっぱい。
08/03/18 16:57:56
NGワード推奨「P○SIX」

284:名無しさん@お腹いっぱい。
08/03/18 16:59:32
回答してる奴に茶々入れる奴はうざいですねw

285:名無しさん@お腹いっぱい。
08/03/18 17:10:01
ろくな内容じゃないのにね。

286:名無しさん@お腹いっぱい。
08/03/18 17:36:34
>>280
そんなの見りゃわかる。
どうせ、書くならもっと有意義なことを書いてもらいたい。

287:名無しさん@お腹いっぱい。
08/03/18 17:37:38
否定以外書いたらそこの浅さがバレルじゃない

288:名無しさん@お腹いっぱい。
08/03/18 18:00:26
>>286
見りゃわかるならお前が正解書けばいいじゃないか。
本当はわからなかったんだろ?

289:名無しさん@お腹いっぱい。
08/03/18 18:06:15
と威勢だけは大変よろしいのでした

290:名無しさん@お腹いっぱい。
08/03/18 18:16:52
hoge=$(cd "$(dirname "$0")" && pwd)
dirname $0にスペースが含まれていてもok。

291:名無しさん@お腹いっぱい。
08/03/18 18:23:46
>>290
じゃあ、それを ` ` を使って書いた場合は?

292:名無しさん@お腹いっぱい。
08/03/18 18:25:01
290ですが、なんか妙なタイミングで書いちゃったみたいねw
私は290が今日はじめてなので念のため。

Solarisということなので``でも書いときます。たぶんこれでいいはず。
hoge=`cd "\`dirname "$0"\`" && pwd`

293:名無しさん@お腹いっぱい。
08/03/18 18:26:46
>>292
正解

294:名無しさん@お腹いっぱい。
08/03/18 18:32:07
Bシェル教えてください。
次のようなシェルがあり、関数func1のコードは変更せず、かつ画面に"aaa"と表示させたいんです。

<Bシェル>
func1(){
exit 1
}
func1
echo "aaa"

perlのevalみたいな制御ができれば嬉しいんですが、
Bシェルでこれを実現させる法ありませんか?

<perl>
eval{
func1;
};
if($?){

}


295:名無しさん@お腹いっぱい。
08/03/18 18:36:37
func1をサブシェルで実行。(func1)

296:名無しさん@お腹いっぱい。
08/03/18 18:36:59
・シェルスクリプトのことをシェルってゆーな

return 1



297:名無しさん@お腹いっぱい。
08/03/18 18:38:16
func1変更禁止かorz

298:名無しさん@お腹いっぱい。
08/03/18 19:34:19
func1(){
exit 1
}
echo "aaa"
func1
これで良いんじゃね?w

299:294
08/03/18 20:11:07
>>295
ありがとう。それでなんとかなりそう。

>>296
そうしたいのはやまやまなんですがね。

>>298
さすがにそれは無理。

300:名無しさん@お腹いっぱい。
08/03/18 20:17:01
呼び方変えるくらいすぐできるでしょ。

301:名無しさん@お腹いっぱい。
08/03/18 20:35:30
>>295 で解決済。それ以外の回答はハズレ。

302:名無しさん@お腹いっぱい。
08/03/18 21:50:16
はいはい

303:名無しさん@お腹いっぱい。
08/03/18 22:07:59
シェルの入門書を見て↓のようなシェルを書きましたが動きません。
原因は何ですか?

#!/bin/sh

echo Hoge World

304:名無しさん@お腹いっぱい。
08/03/18 22:34:38
#!/bin/sh

echo Hoge World

305:名無しさん@お腹いっぱい。
08/03/18 22:36:29
>>303
滑ってるよ

306:名無しさん@お腹いっぱい。
08/03/18 22:40:00
>>304
ええ、ですからそう書いたのですが、動かないんです、、

307:名無しさん@お腹いっぱい。
08/03/18 22:43:37
それOS windowsだよ

308:名無しさん@お腹いっぱい。
08/03/18 22:49:50
>>303
コンパイラは何使いましたか? バージョンによって使えない命令があります。

309:名無しさん@お腹いっぱい。
08/03/19 02:06:49
>>303
えすぱーくますた

chmod +x hoge.sh

./hoge.sh

じっこーけんげんじゃね?

310:名無しさん@お腹いっぱい。
08/03/19 03:43:04
全然違うなw

311:名無しさん@お腹いっぱい。
08/03/19 07:20:45
>>309
動きました
ありがとうございました!

312:名無しさん@お腹いっぱい。
08/03/19 07:44:57
>>311 はにせもの。
>>309 それはすでにやってます。まだ動きません。

313:名無しさん@お腹いっぱい。
08/03/19 08:14:54
「シェル」を書いてるんだから、それだけじゃ難しそうだな…
シェルスクリプトだとすると
echo の e が全角なのが気になるが実際は違うよな?

314:名無しさん@お腹いっぱい。
08/03/19 08:20:19
またシェル開発者ですね、わかります

315:名無しさん@お腹いっぱい。
08/03/19 08:39:01
そうです。開発に配属されたら、シェルを書けることが必須だったんです。
ちょっと焦ってます、、

316:名無しさん@お腹いっぱい。
08/03/19 08:41:15
天然だw

317:名無しさん@お腹いっぱい。
08/03/19 13:02:17
仕事でシェル書くの?

318:名無しさん@お腹いっぱい。
08/03/19 13:18:46
シェルスクリプトで引っかかってるようだと
開発部門でやっていくの大変じゃない?

319:初心者
08/03/19 14:36:50
すいませんシェルスクリプトで0から9を
横に0123456789
と表示したいのですが、数字を縦にしか表示できなくて。
どなたか教えてください。

320:名無しさん@お腹いっぱい。
08/03/19 14:38:59
>>319
for((i=0;i<=9;i++)){ echo -n $i;};echo

321:初心者
08/03/19 14:46:18
>>320
ありがとうございます。

for 変数 in リスト
do
処理
done

の形で書くことは出来るのでしょうか?
たびたびすいません。



322:名無しさん@お腹いっぱい。
08/03/19 14:47:41
>>321
for i in 0 1 2 3 4 5 6 7 8 9;do echo -n $i;done;echo

323:初心者
08/03/19 14:58:57
ありがとうございました。
処理の部分で使われている -n はどういった意味なのですか?

324:名無しさん@お腹いっぱい。
08/03/19 15:04:07
これは醜い

325:名無しさん@お腹いっぱい。
08/03/19 15:06:41
seq -s "" 0 9


326:名無しさん@お腹いっぱい。
08/03/19 15:10:11
これは酷い初心者です

327:初心者
08/03/19 15:11:07
すいません。酷いのはわかってますが、本当はじめたばかりで。
でも、ちゃんと意味も理解していかないとと思いましたので・・

328:名無しさん@お腹いっぱい。
08/03/19 15:21:49
>>325
seq: command not found

329:名無しさん@お腹いっぱい。
08/03/19 15:26:38
あのー(汗 どうしてこんなむずかしいことが出来るの? すごいよ。君たちは。感心してます^^。ガンバってくださいね。

330:名無しさん@お腹いっぱい。
08/03/19 15:57:41
>>323
man echo

331:名無しさん@お腹いっぱい。
08/03/19 16:10:09
>>322 の実行結果
-n 0
-n 1
-n 2
-n 3
-n 4
-n 5
-n 6
-n 7
-n 8
-n 9

??? なぜ?

332:初心者
08/03/19 16:10:44
>>330
ありがとうございました。

man コマンドを見るのを忘れてました。助かりました。

333:名無しさん@お腹いっぱい。
08/03/19 16:12:15
問題:
>>322 をOSに依存しないようにポータブルにせよ

334:名無しさん@お腹いっぱい。
08/03/19 16:15:05
printfを使えばよい

335:名無しさん@お腹いっぱい。
08/03/19 16:34:16
echo 0123456789

336:名無しさん@お腹いっぱい。
08/03/19 16:41:14
>>334 外部コマンドを使わずに
>>335 論外

337:名無しさん@お腹いっぱい。
08/03/19 16:50:16
>>334
printfがないOSもある

338:名無しさん@お腹いっぱい。
08/03/19 16:53:48
printfがだめならこれでどうだ

if [ "`echo -n`" = "-n" ]; then
    echon() { echo "$@\c"; }
else
    echon() { echo -n "$@"; }
fi
for i in 0 1 2 3 4 5 6 7 8 9; do echon $i; done; echo

339:名無しさん@お腹いっぱい。
08/03/19 16:57:15
out=;for i in 0 1 2 3 4 5 6 7 8 9; do out=$out$i;done;echo $out

340:名無しさん@お腹いっぱい。
08/03/19 17:08:07
dateコマンドってミリ秒の取得できますか?

341:名無しさん@お腹いっぱい。
08/03/19 17:11:17
>>340
GNU dateなら +%N でできる。

342:名無しさん@お腹いっぱい。
08/03/19 17:11:22
実装によるんじゃね

343:名無しさん@お腹いっぱい。
08/03/19 17:31:41
当日の日付をミリ秒まで取得したいです。ミリ秒の精度としては
3桁でよいみたいです。

344:名無しさん@お腹いっぱい。
08/03/19 17:33:48
人の話を聞かんやっちゃな。

345:名無しさん@お腹いっぱい。
08/03/19 17:35:27
申し訳ないです。
date +%Nでできたので、実際にやりたいことを書いてみました。

346:名無しさん@お腹いっぱい。
08/03/19 17:40:06
m=`date +%N | head -c 3`
date +'%Y年%m月%d日 %H:%M:%S.'"$m"

347:名無しさん@お腹いっぱい。
08/03/19 17:43:52
>>346
一旦変数に入れる意味ないやん。

date +'%Y年%m月%d日 %H:%M:%S.'`date +%N | head -c 3`

348:名無しさん@お腹いっぱい。
08/03/19 17:52:53
>>346-347
dateを2回起動してるのが無駄。

date +'%Y年%m月%d日 %H:%M:%S.%N'|head -c 27;echo

349:名無しさん@お腹いっぱい。
08/03/19 17:58:13
sed 's/......$//'

350:名無しさん@お腹いっぱい。
08/03/19 17:58:42
>>348
27文字で決め打ちしてると、年月日などの文字数が変わった時困る。

↓の方がエレガント
expr "`date +'%Y年%m月%d日 %H:%M:%S.%N'`" : '\(.*\....\)'

351:名無しさん@お腹いっぱい。
08/03/19 18:17:21
date +'%Y年%m月%d日 %H:%M:%S.%3N'

352:名無しさん@お腹いっぱい。
08/03/19 18:47:39
文字列処理の話はいいから、date +%Nが使えないOSではどうするんだよ?

353:名無しさん@お腹いっぱい。
08/03/19 18:48:36
泣き寝入りです。

354:名無しさん@お腹いっぱい。
08/03/19 20:18:36
GNU dateをインストールする

355:名無しさん@お腹いっぱい。
08/03/19 21:12:16
000でごまかす

356:名無しさん@お腹いっぱい。
08/03/19 22:16:36
>>317
周りにtclsh改造して自前のシェル作る奴いるからなきにしもあらず
#半導体業界のtcl好きは異常だと思う…

357:名無しさん@お腹いっぱい。
08/03/19 22:25:23
こんなプログラムを持ち運ぶ(精度はマイクロ秒だけど)

#include <stdio.h>
#include <sys/time.h>
int main(int argc, char **argv)
{
    struct timeval tv;
    if (gettimeofday(&tv, NULL))
        perror("error!\n");
    printf("%d\n", tv.tv_usec);
    return 0;
}

358:名無しさん@お腹いっぱい。
08/03/19 22:32:57
>>356
そのためのツールだし。> TCL

359:名無しさん@お腹いっぱい。
08/03/19 22:35:19
>>357
持ち運ぶなら、持ち運びやすいようにショートコーディングに徹しなさい。

#include<sys/time.h>
main(){struct timeval t;gettimeofday(&t,0);printf("%d\n",t.tv_usec);}

360:名無しさん@お腹いっぱい。
08/03/19 22:40:37
>>359
ショートコーディングというからには、#includeなんてしちゃ無駄だろ。

main(){int t[2];gettimeofday(t,0);printf("%0d\n",t[1]);}

%dは%0dに直しておいた。桁揃えのため。

361:名無しさん@お腹いっぱい。
08/03/19 22:47:45
>>360
もっと短くなるよ。int宣言も無駄だね。

main(t){gettimeofday(&t,0);printf("%0d\n",1[&t]);}

362:名無しさん@お腹いっぱい。
08/03/19 22:50:27
>>360
桁揃えは %06d じゃないのか?

363:名無しさん@お腹いっぱい。
08/03/19 22:58:39
やべえ。こいつら正気じゃねえ。

364:名無しさん@お腹いっぱい。
08/03/19 23:04:37
日頃古いshへの移植性で争ってるスレとは思えない

365:名無しさん@お腹いっぱい。
08/03/19 23:05:16
改行はむしろ余計なのではないか?

366:名無しさん@お腹いっぱい。
08/03/19 23:05:36
じゃあ、まとめるとこんな感じ?
↓ gccコンパイル込みでシェル関数にしたよ


#!/bin/sh

micro_sec() {
echo 'main(t){gettimeofday(&t,0);printf("%06d\n",1[&t]);}'|gcc -xc -
./a.out; rm a.out
}


hoge=`micro_sec`
echo $hoge

367:名無しさん@お腹いっぱい。
08/03/20 00:56:56
>>363 UNIX板は、やぱスゲーひといるよね
まだまだすごいことができるのだと思いますが
Cも知りたくなってきたw

368:名無しさん@お腹いっぱい。
08/03/20 01:44:52
スゲーんじゃなくて悪乗りしてるだけだと思うが

>>366
echo はいらんだろ?

369:名無しさん@お腹いっぱい。
08/03/20 02:49:33
#!/usr/bin/tcc -run
#include <sys/time.h>
void
main(void) {
  struct timeval tv;
  gettimeofday(&tv, NULL);
  printf("%.6d\n", tv.tv_usec);
}


370:名無しさん@お腹いっぱい。
08/03/20 04:21:02
>>321

$ for m in `jot 10 0`; do echo -n $m; done
0123456789

jotも知らんとは>>321よ、なさけない。


371:名無しさん@お腹いっぱい。
08/03/20 07:23:13
>>370
$ jot
jot: command not found

372:名無しさん@お腹いっぱい。
08/03/20 07:27:07
>>368
欲嫁。言いたいのはmicro_sec()の部分だけ。
下のechoとかはmicro_secの使い方の1例を挙げてるだけだろ。

直接表示なら micro_secを直接実行でいいし、
変数に入れたなら、変数に入っているという確認のためにechoしてるだけ。

373:名無しさん@お腹いっぱい。
08/03/20 07:29:18
>>369
/usr/bin/tcc: command not found

374:名無しさん@お腹いっぱい。
08/03/20 07:32:25
>>372
いや、そこではねくて

375:名無しさん@お腹いっぱい。
08/03/20 07:37:35
>>374
シェル関数の中のechoは必要だろ。gccの標準入力に食わせるために。
echoなしでヒアドキュメント( << )でやる方法は
一時ファイルができるから美しくない。

ヒアドキュメントを使わずに、echoも使わない方法ってある?

376:名無しさん@お腹いっぱい。
08/03/20 12:09:43
>>373
sudo aptitude install tcc

377:名無しさん@お腹いっぱい。
08/03/20 12:26:21
>>376
sudo: command not found

378:名無しさん@お腹いっぱい。
08/03/20 12:27:52
$ su
Enter password:
su: password incorecct.
$

379:名無しさん@お腹いっぱい。
08/03/20 14:52:56
なんかbashでcを組んでしまう勢いだなww

380:名無しさん@お腹いっぱい。
08/03/20 17:18:16
>>366
まあジョークだろうからどうでもいいが、


現在時刻をミリ秒単位の精度で得るために
まずその場でコンパイルを始めるってどういう設計だwww


381:名無しさん@お腹いっぱい。
08/03/20 21:28:00
tcc ってARM?

382:名無しさん@お腹いっぱい。
08/03/21 00:06:22
Tiny C Compiler
URLリンク(fabrice.bellard.free.fr)
TinyCC mailing list
URLリンク(mail.freesoftware.fsf.org)
Ubuntu
URLリンク(packages.ubuntu.com)
Debian
URLリンク(packages.debian.org)
RPM
URLリンク(fr2.rpmfind.net)

TinyCC Changelog
URLリンク(fabrice.bellard.free.fr)
version 0.9.21:
- ARM target support


383:あ
08/03/21 09:28:07
文字列のaからzを
for 変数 in リスト
の形で表すにはどうしたらよいのでしょうか?


384:名無しさん@お腹いっぱい。
08/03/21 10:12:32
$ for i in `seq 97 122`; do printf '\x'`echo "obase=16;$i" | bc`; done

seqなければwhile + exprで

385:名無しさん@お腹いっぱい。
08/03/21 10:42:58
>>383
for i in `perl -le 'print for a..z'`; do echo $i; done

386:名無しさん@お腹いっぱい。
08/03/21 10:49:30
>>384-385 という冗談はさておき、シェルスクリプトとしてやるにはどうしたらよいのでしょうか?

387:名無しさん@お腹いっぱい。
08/03/21 10:52:03
bashなら
for i in {a..z}; do echo $i; done

388:名無しさん@お腹いっぱい。
08/03/21 10:55:41
>>386
シェルスクリプトだろ。冗談はよせよ。

389:名無しさん@お腹いっぱい。
08/03/21 10:57:05
まあ、perl使うのは反則だわな

390:名無しさん@お腹いっぱい。
08/03/21 11:00:08
for i in a b c d e f g h i j k l m n o p q r s t u v w x y z

391:名無しさん@お腹いっぱい。
08/03/21 11:02:45
>>387
動くのか?

392:名無しさん@お腹いっぱい。
08/03/21 11:03:07
ボーンなら、
for i in `bash -c 'echo {a..z}'`; do echo $i; done

393:名無しさん@お腹いっぱい。
08/03/21 11:04:04
>>391
動くだろ。bash3以降だけどな。

394:名無しさん@お腹いっぱい。
08/03/21 11:07:09
つーか元の要求がよくわからん。

395:名無しさん@お腹いっぱい。
08/03/21 11:17:07
どれも>>390これとそれほどタイプ数がかわらないという

396:名無しさん@お腹いっぱい。
08/03/21 11:32:31
yes ''|cat -n|head -122|tail -26|while read i; do printf "%o¥n" $i;done|while read o;do printf "¥¥$o¥n";done

すごく無駄なことをやった気がする。


397:名無しさん@お腹いっぱい。
08/03/21 11:37:14
for i in \
`echo 'main(c){for(c=97;c<123;c++)printf("%c ",c);}'|gcc -xc -;./a.out;rm a.out`
do
echo $i
done


398:名無しさん@お腹いっぱい。
08/03/21 11:44:50
IOCCCみたいになってきたな

399:名無しさん@お腹いっぱい。
08/03/21 12:25:20
IOSSC International Obfuscated Shell Script Contest


400:名無しさん@お腹いっぱい。
08/03/21 14:19:42
むしろIntranational

401:名無しさん@お腹いっぱい。
08/03/23 04:35:19
すんまそ

date を使って
20080322123456
年月日時分秒の書式でファイルを作りたい

cmd 1 10000
第1引数 +n秒 (-1なら引く)
第2引数 第1引数を行ってm回繰り返す。

while (n<$2)

do
touch `date '+ expr $a'`

a=a+$1
done

みたいなことをしたいですが、どうすれば良いですか?


402:名無しさん@お腹いっぱい。
08/03/23 05:13:42
誰か翻訳頼む

403:名無しさん@お腹いっぱい。
08/03/23 08:39:07
>>401
できたよ


#!/bin/sh

n=$1
i=1
while [ "$i" -le "$2" ];
do
date +%Y%m%d%H%M%S -d "$n second"
n=`expr "$n" + "$1"`
i=`expr "$i" + 1`
done

ただし、GNU date必須。

補足:
>>402 わからないなら黙ってろ


404:名無しさん@お腹いっぱい。
08/03/23 08:41:55
>>403 で動作(表示)確認してから、
date +%Y%m%d%H%M%S -d "$n second"

touch `date +%Y%m%d%H%M%S -d "$n second"`
に直すとファイルが作れる。

405:401
08/03/25 01:16:11
ありがと

あしたやってみる。
感謝です。

406:名無しさん@お腹いっぱい。
08/03/25 23:05:33
GNU date必須なんて答で、恥ずかしくないの?

407:名無しさん@お腹いっぱい。
08/03/25 23:20:15
>>406
じゃ、お前、GNU date使わないバージョンの回答しろよな。

408:名無しさん@お腹いっぱい。
08/03/25 23:58:42
恥ずかしいなら黙ってればいいのに。

409:名無しさん@お腹いっぱい。
08/03/26 09:43:59
>>406
そんなコト言い出したらきりがない。
相手の環境が分かっていて、そこに GNU date が無いなら酷いが
質問者はそんな情報出した?

# なかったとしても「ぢゃGNU date 入れよ」ってなるかもシランがそれは知らん。

410:名無しさん@お腹いっぱい。
08/03/26 09:59:39
>>406
not speak, write scripts.

411:名無しさん@お腹いっぱい。
08/03/26 11:00:39
GNU date使わずにポータブルにやるなら、
awkあたり使った方がいい。

date +%Y%m%d%H%M%S -d "$n second"

を、

awk 'BEGIN{print strftime("%Y%m%d%H%M%S", systime()+'$n')}'

に書き直す。

>>406
答えられないなら黙ってろ。

412:名無しさん@お腹いっぱい。
08/03/26 11:37:03
>>411
それ、GNU awk必須だろw

413:名無しさん@お腹いっぱい。
08/03/26 12:13:04
2chで他人に黙ってろとかいう奴にろくな奴はいない。

414:名無しさん@お腹いっぱい。
08/03/26 12:36:48
ひとつの解を出す分だけ、貴殿よりマシだと思う

415:名無しさん@お腹いっぱい。
08/03/26 12:51:58
自分で設定した「ポータブルにやるなら」という問題に対して
出したものがポータブルじゃないのに解を出したことになるのだろうか。

416:名無しさん@お腹いっぱい。
08/03/26 14:23:46
まぁ>>406よりは随分マシw

417:名無しさん@お腹いっぱい。
08/03/26 14:51:14
これでどうだ。ポータブルだろw


#!/bin/sh

my_date()
{
echo 'main(t,b){t=time(0)+'$1';strftime(&b,16,"%Y%m%d%H%M%S\n",localtime(&t));printf(&b);}' | gcc -xc - 2>/dev/null
./a.out; rm a.out
}


n=$1
i=1
while [ "$i" -le "$2" ];
do
my_date "$n"
n=`expr "$n" + "$1"`
i=`expr "$i" + 1`
done


418:名無しさん@お腹いっぱい。
08/03/26 14:56:56
おしいな。
gccのところがccなら。

419:名無しさん@お腹いっぱい。
08/03/26 15:01:06
>>418
ccにすると、「language optional software package not installed」って出て
動かないOSがあるから、gccの方がポータブル。
~


420:名無しさん@お腹いっぱい。
08/03/26 16:48:33
strftimeのない昔のUNIXは切り捨て?

421:名無しさん@お腹いっぱい。
08/03/26 16:55:18
strftime()使わずに、struct tmの中身を直接printf()すればいいかな。

422:名無しさん@お腹いっぱい。
08/03/26 17:27:15
コード長くなっちゃうなぁ。
テストしやすいように、$1 $2 はデフォルトを入れるようにしておいた。


#!/bin/sh

my_date()
{
echo '
#include <time.h>
main(){struct tm *t;int i;i=time(0)+'$1';t=localtime(&i);
printf("%04d%02d%02d%02d%02d%02d\n",
t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);}
' | gcc -xc - 2>/dev/null
./a.out; rm a.out
}


set ${1-5} ${2-3}

n=$1
i=1
while [ "$i" -le "$2" ];
do
my_date "$n"
n=`expr "$n" + "$1"`
i=`expr "$i" + 1`
done


423:名無しさん@お腹いっぱい。
08/03/26 17:47:31
ネタひっぱりすぎ

424:名無しさん@お腹いっぱい。
08/03/28 00:31:20
日付関係はperlでやらないか。結構古くても入ってるでしょ、perl。

425:名無しさん@お腹いっぱい。
08/03/28 03:21:18
誰かshell scriptでDateTimeライブラリ書け。

426:401
08/03/28 05:18:13
できました。
ありがとう。

ひっぱって悪いですが>401の内容で

20080322123456FreeBSD
20080322123456NetBSD
20080322123456OpenBSD

のように第3引数を「FreeBSD」のようにしてファイル名に付けたい
です。
自分でやってみましたが
touch `date +%Y%m%d%H%M%S -d "$n second" `$3
とか

d=date +%Y%m%d%H%M%S -d "$n second"
f=$d$3
touch `echo $f`
としますが
invalid argumentなど出ます。

この場合は、どうしたらいいですか。
gnu dateですた

427:名無しさん@お腹いっぱい。
08/03/28 06:54:01
>>426
> touch `date +%Y%m%d%H%M%S -d "$n second" `$3
ここで date がエラーを吐いているのなら n に値を代入し忘れている可能性が高い。
まず $n の値を確認しろ。


428:401
08/03/28 07:10:23
すみません。

家で、今確認しました。
>>426で
touch `date +%Y%m%d%H%M%S -d "$n second" `$3
と書きましたが。

touch `date +%Y%m%d%H%M%S -d "$n second" $3`
のようにしてエラーが出ていました。
$3の前後に「`」を移動する

いま、>>426のようにしたら意図通りできました。
会社でもやってみます。
すんませーーーん

429:名無しさん@お腹いっぱい。
08/03/28 08:12:00
ここに来てる人、OSはUNIXだよね? (FreeBSDとかSolarisとか)
GNU dateって、わざわざインストールしてるの?
まさか犬じゃないよね?

430:名無しさん@お腹いっぱい。
08/03/28 09:45:54
してる。
GNU testも、gwakも。
犬がどうしたとかそんな馬鹿な偏見はないから。

431:名無しさん@お腹いっぱい。
08/03/28 11:59:03
>>429
FreeBSDはUNIXなの?

432:名無しさん@お腹いっぱい。
08/03/28 12:25:21
FreeBSD=unixで良いじゃん。
別に定義の話をしてるわけじゃなし。

433:名無しさん@お腹いっぱい。
08/03/28 12:33:51
FreeBSDをUNIXに含めるんであれば
Linuxを含めない理由ないでしょ。

434:名無しさん@お腹いっぱい。
08/03/28 12:55:21
LinuxはLinux板という専用の隔離板があるので、
そちらに行けば良いと思います。

435:名無しさん@お腹いっぱい。
08/03/28 13:36:03
そうなればそうなるわな

436:名無しさん@お腹いっぱい。
08/03/28 15:15:13
UNIX でも通用するポータブルなスクリプトを知りたいならここだと思ってた。

437:名無しさん@お腹いっぱい。
08/03/28 15:43:48
じゃあ GNU date使っちゃ駄目じゃん。

438:名無しさん@お腹いっぱい。
08/03/29 02:50:31
AIX4ばっかりの仕事の俺に愛の手を!GNU系でもインストールなんて許されてねぇ

439:名無しさん@お腹いっぱい。
08/03/29 04:06:52
Cもだめってこと?

440:名無しさん@お腹いっぱい。
08/03/29 10:57:42
--prefix=$HOMEで入れちまえ、とかなんとか。
でもコンパイラも入ってなかったりするのさ。



441:名無しさん@お腹いっぱい。
08/03/29 11:19:10
というわけでGNU date必須の回答を出して悦に入るのは恥知らず。

442:名無しさん@お腹いっぱい。
08/03/29 11:19:14
だったらいまあるものでなんとかすればいいじゃない

443:名無しさん@お腹いっぱい。
08/03/29 11:21:33
今回の場合、GNU以外のdateでは不可能。

444:名無しさん@お腹いっぱい。
08/03/29 13:18:57
dateというファイル名でperlで組めばお題は満足する。
安易に不可能とか言い切って恥ずかしくないの?

445:名無しさん@お腹いっぱい。
08/03/29 13:30:29
一時、awkが有料のUNIXあったよな。

446:名無しさん@お腹いっぱい。
08/03/29 13:33:30
>>444
perlを使ったらシェルスクリプトじゃない。
perlが非標準のUNIXもある。

447:名無しさん@お腹いっぱい。
08/03/29 13:36:23
perlが入っていればそれでいいけどねー

448:名無しさん@お腹いっぱい。
08/03/29 13:45:27
>>446
おまえの脳内定義の「シェルスクリプト」で使用可能なコマンドを列挙しろ。
そしてそれ以外は認めないというスレを立ててそっちに行け。

449:名無しさん@お腹いっぱい。
08/03/29 13:52:40
>>444
じゃあ、perl使ってGNU dateそっくりのスクリプト書いてみろよ。
どうせそれもできないのに知ったかで言ってるんだろ。

450:名無しさん@お腹いっぱい。
08/03/29 13:53:09
まあ当該質問の環境でperlが使えるかは未知数だから…

451:名無しさん@お腹いっぱい。
08/03/29 14:07:54
autoconfが生成するconfigureって移植性は相当意識してるらしいね。
autoconfの本(紙の)読んだらいろいろクドクドかいてあった。


452:名無しさん@お腹いっぱい。
08/03/29 14:08:44
GNU dateの互換である必要は全く無い。
こんな単純な事に気付かなくて恥ずかしくないの?

453:名無しさん@お腹いっぱい。
08/03/29 14:17:19
問題はそこじゃないから

454:名無しさん@お腹いっぱい。
08/03/29 14:30:54
うん、
> GNU date必須の回答を出して悦に入るのは恥知らず。
これに尽きるね。

455:名無しさん@お腹いっぱい。
08/03/29 15:03:37
>>452
GNU dateの互換である必要ないから、
回答例を1例でも挙げてみろよ。まだ1例も挙げてないじゃないか。
やっぱり知ったかなんだろ?

456:名無しさん@お腹いっぱい。
08/03/29 15:41:56
別解を提示する事と
> GNU date必須の回答を出して悦に入るのは恥知らず。
は、独立という事に気付かないって恥ずかしくないの?

457:名無しさん@お腹いっぱい。
08/03/29 16:00:12
なんだ、やっぱり解答できないんだ。

458:名無しさん@お腹いっぱい。
08/03/29 16:49:25
恥の上塗りしないで引っ込んでりゃいいのに。

459:名無しさん@お腹いっぱい。
08/03/29 18:30:19
GNU date が優秀なのは分かったから
それを使わないポータブルでエレガントな別解プリーズ

460:名無しさん@お腹いっぱい。
08/03/29 18:54:53
Perlだとこうか($nに秒単位の差分をいれてね)
perl -MPOSIX -le "print POSIX::strftime(q{%Y%m%d%H%M%S}, localtime($n+time))"

これは未検証だがどうだろうか
date -r $(expr $(date +%s) + $n) +%Y%m%d%H%M%S

461:名無しさん@お腹いっぱい。
08/03/29 18:58:27
POSIX dateには-uしかなかったからこれはポータブルじゃないね
次の人お願い

462:名無しさん@お腹いっぱい。
08/03/29 19:13:48
彼によるとGNU date以外の回答はシェルスクリプトじゃ無くなるようですよ。
何しろそれ以外の解は存在しないらしいですから。

463:名無しさん@お腹いっぱい。
08/03/29 19:14:47
>>462
糞粘着しねよ

464:名無しさん@お腹いっぱい。
08/03/29 19:41:47
ようやく恥というものがわかったのか?

465:名無しさん@お腹いっぱい。
08/03/29 21:11:30
正直dateとかどうでもいいよw いつまで続けんのw

466:名無しさん@お腹いっぱい。
08/03/29 21:50:26
もうテンプレにLinux禁止、GNUコマンド禁止って入れとけよ

467:名無しさん@お腹いっぱい。
08/03/29 22:04:49
じゃあ、perlもGNUモノだから禁止ですね。

468:名無しさん@お腹いっぱい。
08/03/29 22:13:41
>>467
?

469:名無しさん@お腹いっぱい。
08/03/29 22:14:53
恥ずかしいなら黙ってればいいのに。

470:名無しさん@お腹いっぱい。
08/03/29 22:16:35
perlはGPLであってGNUじゃないでしょ?
# Artistic Licenseも選択できる。

471:名無しさん@お腹いっぱい。
08/03/29 22:24:54
perlはもともとスレ違いだから禁止。
ときどき空気読まずにperlでの解答する香具師居るが、単にスレ違いが見過ごされているだけ。

472:名無しさん@お腹いっぱい。
08/03/29 23:27:53
質問者の環境で動けばそれでいいじゃない。

473:名無しさん@お腹いっぱい。
08/03/29 23:30:34
>>445
BSD拡張が有料だった時代もあったなあ。

474:名無しさん@お腹いっぱい。
08/03/29 23:37:41
>>439
Cもダメ。C必須のアプリを入れるならOKだけれど!かなしい!

475:名無しさん@お腹いっぱい。
08/03/29 23:40:00
>>472
そうだね

476:名無しさん@お腹いっぱい。
08/03/29 23:43:06
>>474
つ ハンドコンパイル

477:名無しさん@お腹いっぱい。
08/03/30 00:10:24
>>476
それだ!
よく考えたら、適当な環境でクロスコンパイルすればいいのか

478:名無しさん@お腹いっぱい。
08/03/30 00:11:22
風紀委員がうるさいから禁止事項にはしないほうが良い。

479:名無しさん@お腹いっぱい。
08/03/30 00:41:27
質問者の環境で動けばどうでもいいよ

480:名無しさん@お腹いっぱい。
08/03/30 03:56:12
既に遠い過去の>>428 で解決しててな

481:名無しさん@お腹いっぱい。
08/03/30 03:58:09
>>441
くだらん事書いて、刺された方が切れたんだろ?
おまえ、第三者から見て、評論家だけで役にたって無い気がするぞ。

空気悪くなってんだから、少し考えてはどうですか?

482:名無しさん@お腹いっぱい。
08/03/30 09:01:53
恥ずかしいなら黙ってればいいのに。 > 自称被害者

483:名無しさん@お腹いっぱい。
08/03/30 19:01:21
自覚なしに恥の上塗りをするのは勝手

484:名無しさん@お腹いっぱい。
08/03/30 20:43:35
svn help|sed -n '/^ \([a-z]\+\) \?.*/{s//\1/p}'
の出力をリストとして処理するんですが
改行をデリミタとして分解すると分解後のリストの中に""のような空の要素ができてしまいます
echoの-nオプションのように最終行の改行を出力しないようにする方法を教えてください
現在は分解する前に部分文字列を作る関数でsubstring(0, str.length())のようにして取り除いてます

485:名無しさん@お腹いっぱい。
08/03/30 21:22:52
>>484
コマンド置換で一旦変数に取り込めば最後の改行はカットされるけどな。
変数の値を参照する時も echo -n で参照。

hoge=`svn help|sed -n '/^ \([a-z]\+\) \?.*/{s//\1/p}'`
echo -n "$hoge"

486:名無しさん@お腹いっぱい。
08/03/30 21:53:57
どうもありがとうございました
なんかのソースに付いてるようなスクリプトでわざわざ代入しているのにはこういう理由もあったんですね

487:名無しさん@お腹いっぱい。
08/03/31 02:16:54
とりあえず正常化

仕切り直していきましょう

488:名無しさん@お腹いっぱい。
08/03/31 03:17:20
Mysqlバックアップ処理や別サーバへのFTP通信等を
行いたいのですが、
mysqldump -u root -p password
のようなコマンドを打つとpsなどで
パスワードがローカルユーザーに漏れる可能性があるかと思います。

何か良い隠ぺい策ってないでしょうか?

489:名無しさん@お腹いっぱい。
08/03/31 03:21:23
expectスクリプト

490:名無しさん@お腹いっぱい。
08/03/31 04:11:10
expect以外のよい方法ってないでしょうか?
パスワード遮蔽のみのために
expectを用いるのは結構つらいと感じましたので。。。。
すいません。。。。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch