5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :名無しさん@お腹いっぱい。:2009/01/29(木) 06:54:48
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。

前スレ落ちたみたいなのでリンク省略。

2 :名無しさん@お腹いっぱい。:2009/01/29(木) 06:55:25
□関連スレ:
sed
http://pc11.2ch.net/test/read.cgi/unix/1085730992/
正規表現
http://pc11.2ch.net/test/read.cgi/unix/1039165754/
おまえら! shell は何を使っているんですか?
http://pc11.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc11.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/01/29(木) 06:56:21
□参考リンク:
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/01/29(木) 06:57:24
□最近のシェルスクリプト本(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/01/29(木) 06:58:02
□関連書籍と関連リンク:
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/01/29(木) 07:56:09
>>1


7 :名無しさん@お腹いっぱい。:2009/01/29(木) 08:11:03
いちおう前スレ

シェルスクリプト総合 その13
http://pc11.2ch.net/test/read.cgi/unix/1224085718/

8 :名無しさん@お腹いっぱい。:2009/01/29(木) 12:03:55
freeコマンドのないOSでも実行できるような、
freeコマンド相当のシェルを作りたいと思っています。
具体的にはどう書けばいいですか?

できれば、bashに依存せず、汎用シェルになるようにお願いします。

9 :名無しさん@お腹いっぱい。:2009/01/29(木) 12:48:30
シェルってゆうな。クズ。


10 :名無しさん@お腹いっぱい。:2009/01/29(木) 12:53:43
テンプレ終了。では質問どうぞ。

11 :名無しさん@お腹いっぱい。:2009/01/29(木) 18:16:43
>>8
busyboxというシェルが組み込みのfreeコマンドを持っています。

12 :名無しさん@お腹いっぱい。:2009/01/29(木) 18:19:55
>>11
そのbosyboxとかいうシェルを具体的に書いて下さい。
1行目は
#!/bin/shでお願いします。

2行目以降は?

13 :名無しさん@お腹いっぱい。:2009/01/29(木) 18:43:09
exit 0

14 :名無しさん@お腹いっぱい。:2009/01/29(木) 18:44:53
>>12
#!/bin/sh
busybox free

15 :名無しさん@お腹いっぱい。:2009/01/29(木) 18:49:36
引数も渡すならこんな感じ
#!/bin/sh
busybox free $*

16 :名無しさん@お腹いっぱい。:2009/01/29(木) 18:52:52
>>14
えっと、何か勘違いされてますか?
シェル名はなんでもいいんですが、bosyboxとして

$ cat bosybox
#!/bin/sh
この行をお願いします
この行をお願いします
この行をお願いします
:


$ ./bosybox
…実行結果…


ということですが、、

17 :名無しさん@お腹いっぱい。:2009/01/29(木) 19:01:29
vmstatあたりを sed awkして船山に登れば医院じゃないの?

18 :名無しさん@お腹いっぱい。:2009/01/29(木) 19:08:49

なないかかんちがいてまちぇんでちゅか?


19 :名無しさん@お腹いっぱい。:2009/01/29(木) 19:08:49
>>16
$ cat busybox
#!/bin/sh
/bin/busybox $*

$./busybox free
...

20 :名無しさん@お腹いっぱい。:2009/01/29(木) 19:16:00
>>19
/bin/busybox というのはbash依存、またはOS依存だと思います。
どのOSにもあるコマンドだけを組み合わせてfree相当のシェルを作って下さい。

21 :名無しさん@お腹いっぱい。:2009/01/29(木) 19:17:55
>>20
busyboxはbash依存でもなければOS依存でもありません。
freeが組み込まれたシェルです。

22 :名無しさん@お腹いっぱい。:2009/01/29(木) 19:21:59
>>15
busybox内部の freeコマンドは、引数に対応してない。
あと、引数を渡すにしても $* で渡してはいけない。
(シェルスクリプトのコーディングルールとして)

よって失格。

23 :名無しさん@お腹いっぱい。:2009/01/29(木) 19:24:23
>>22
そうなのか。フォローthx

24 :名無しさん@お腹いっぱい。:2009/01/29(木) 19:25:16
>>20
無理

25 :名無しさん@お腹いっぱい。:2009/01/30(金) 07:27:08
diffコマンドで2つのテキストファイルの中身を比較して、
一緒だったら次のAというコマンドを、違ったらBというコマンドを実行するには
どう書いたらいいですか?

26 :名無しさん@お腹いっぱい。:2009/01/30(金) 07:35:41
>>25

if diff hoge.txt boke.txt > /dev/null
then
commandA
else
commandB
fi

27 :名無しさん@お腹いっぱい。:2009/01/30(金) 07:42:04
完全一致でいいなら、diff >/dev/null よりも、cmp -s


28 :名無しさん@お腹いっぱい。:2009/01/30(金) 07:45:05
>>27
>>25 「diffコマンドで」

29 :名無しさん@お腹いっぱい。:2009/01/30(金) 07:50:34
>>26
diff文が使えるようなシェルってあるんですか?

うちのシェルはif文は if [ ... ] みたいに書く普通のシェルです。
普通のシェルでお願いします。

30 :名無しさん@お腹いっぱい。:2009/01/30(金) 07:53:55
20/100点

31 :名無しさん@お腹いっぱい。:2009/01/30(金) 07:58:05
if [ `diff a.txt b.txt | wc -c` == 0 ]; then
comA
else
comB
fi

だろ?

32 :名無しさん@お腹いっぱい。:2009/01/30(金) 10:12:43
つまらんスレだな、ここは

33 :名無しさん@お腹いっぱい。:2009/01/30(金) 10:58:24
>>29
その [ ... ] が何を示すのか勉強しなおしてこい

34 :名無しさん@お腹いっぱい。:2009/01/30(金) 16:59:25
>>33
条件文を表してるのは知ってますよ

35 :名無しさん@お腹いっぱい。:2009/01/30(金) 19:21:23
[ もdiffもコマンドってことじゃないかな
[ ... ]っつー見かけに惑わされちゃいかん

36 :名無しさん@お腹いっぱい。:2009/01/30(金) 22:19:18
% where '['
[: shell built-in command
/bin/[

37 :名無しさん@お腹いっぱい。:2009/01/30(金) 22:32:56
質問です。
2つのコマンド、commandA と commandB の標準出力同士を、
テンポラリファイルを作らずに diffコマンドで比較したい時、
bashなら、

diff <(commandA) <(commandB)

でできますが、
これを標準シェルでやるにはどうすればいいですか?

38 :名無しさん@お腹いっぱい。:2009/01/30(金) 22:41:36
>>37
commandA | (commandB | diff /dev/fd/3 -) 3<&0

39 :名無しさん@お腹いっぱい。:2009/01/30(金) 22:42:34
>>37
無理。
bash使うか、一旦ファイルに落せ。

40 :名無しさん@お腹いっぱい。:2009/01/30(金) 22:47:41
答が出たあとで、無理とか言ってる奴ってなんなの?

41 :名無しさん@お腹いっぱい。:2009/01/30(金) 22:57:08
>>38
おおでけた。THX!

42 :名無しさん@お腹いっぱい。:2009/01/30(金) 23:32:55
>>34
その昔は、 /bin/[ なんてのが有ったんだがなぁ。


43 :名無しさん@お腹いっぱい。:2009/01/30(金) 23:34:28
>>42
今でもあるだろ



44 :名無しさん@お腹いっぱい。:2009/01/30(金) 23:38:21
>>42
今でもあるだろw

$ which '['
/usr/bin/[

45 :名無しさん@お腹いっぱい。:2009/01/30(金) 23:50:58
Bシェルなのに which使う奴ってなんなの?

46 :名無しさん@お腹いっぱい。:2009/01/30(金) 23:52:10
>>45
すまん、BSD育ちなんだw

47 :名無しさん@お腹いっぱい。:2009/01/30(金) 23:59:24
昔はshにtypeなんてなく、whichは外部コマンドだった。
cshはaliasとかがあるせいでwhichを内部コマンドに持った。

48 :名無しさん@お腹いっぱい。:2009/01/31(土) 07:29:55
>>38
/dev/fd/3 って純正シェルでも使えるの??

49 :名無しさん@お腹いっぱい。:2009/01/31(土) 13:15:29
シェルじゃなくてOSだろ?

50 :名無しさん@お腹いっぱい。:2009/01/31(土) 13:41:51
>>49
なんでもいいから、結局使えるの??

51 :名無しさん@お腹いっぱい。:2009/01/31(土) 13:58:32
レスしたら負けだ。

52 :名無しさん@お腹いっぱい。:2009/01/31(土) 19:54:54
これは釣りですよね?
いくらなんでもそんな質問しないもんね?

53 :名無しさん@お腹いっぱい。:2009/01/31(土) 20:15:42
一般論として、/dev以下のファイルはシェルによって特別扱いされることが
あり得る。

例えば、bashだと、/dev/stdout とかは、実際の /dev/stdoutを読まずに
シェルが /dev/stdoutという文字列を特別扱いして動作する。

そのことを考慮すれば、/dev/fd/n がシェルに依存しているかも知れないと
考えることにも一定の合理性が認められる。

54 :名無しさん@お腹いっぱい。:2009/01/31(土) 20:59:54
無いからもう寝ろ

55 :名無しさん@お腹いっぱい。:2009/02/01(日) 00:46:46
こうしてスレに平和が戻った。。。end

56 :名無しさん@お腹いっぱい。:2009/02/01(日) 02:18:13
[ を条件文だと言ったり、/dev/fd/3 がシェルに依存していると言ったり、
面白い人が増えたなw

57 :名無しさん@お腹いっぱい。:2009/02/01(日) 08:04:35
>>56
/dev/fd/3 がシェルに依存してるのは本当だよ。

58 :名無しさん@お腹いっぱい。:2009/02/01(日) 08:23:14
>>56

man bash | less -p /dev/fd/fd

man zshmisc | less -p /dev/fd/n

if file is of the form `/dev/fd/n',
where n is an integer, then the test applied to the open file whose
descriptor number is n, even if the underlying system does not support
the /dev/fd directory.


> even if the underlying system does not support the /dev/fd directory
> even if the underlying system does not support the /dev/fd directory
> even if the underlying system does not support the /dev/fd directory
> even if the underlying system does not support the /dev/fd directory

59 :名無しさん@お腹いっぱい。:2009/02/01(日) 22:53:38
日本語でおk

60 :名無しさん@お腹いっぱい。:2009/02/02(月) 04:47:50
bash(Fedora10)のシェルスクリプトでMS-DOSのバッチファイルのpuaseみたいな動作を
させるにはどのようにしたらいいですか?

61 :名無しさん@お腹いっぱい。:2009/02/02(月) 06:25:59
>>60
read

62 :名無しさん@お腹いっぱい。:2009/02/02(月) 10:24:22
>>60
bashの場合は read -n 1 の方がよりpauseの動作に近いかと

63 :名無しさん@お腹いっぱい。:2009/02/02(月) 22:25:23
>>61-62
質問欲嫁。それはpauseの動作。>>60 の質問はpuaseの動作。

64 :名無しさん@お腹いっぱい。:2009/02/03(火) 00:09:20
アプリケーションを実行した時に入力を求められるような場合
どう処理すればよいのでしょうか?
応答に対して入力する値(番号など)決まっているという前提でお願いします

65 :名無しさん@お腹いっぱい。:2009/02/03(火) 00:12:58
echo 1 | app

66 :名無しさん@お腹いっぱい。:2009/02/03(火) 00:25:53
$ ttyrec x
$ app

$ exit
$ ttyplay x


67 :60:2009/02/03(火) 02:44:31
レスありがとうございます

>>61-62
read -n 1が良さそうなのでこれを使ってみます

>>63
すみません。タイプミスですorz
正しくは「pause」です

68 :名無しさん@お腹いっぱい。:2009/02/03(火) 09:03:27
>>64
expect

69 :名無しさん@お腹いっぱい。:2009/02/03(火) 15:36:11
expect使うけどセキュリティ考えたら微妙

70 :名無しさん@お腹いっぱい。:2009/02/05(木) 00:30:20
bashで多重配列って使えますか?

71 :名無しさん@お腹いっぱい。:2009/02/05(木) 00:35:26
>>64
conquerer -bj --creeping-deth

72 :名無しさん@お腹いっぱい。:2009/02/05(木) 06:38:09
>>70
多次元配列という意味なら、使えない。

73 :名無しさん@お腹いっぱい。:2009/02/05(木) 18:40:06
速度という観点でsh、bashそれとperl、pythonを比較するとどうなんでしょう。
起動コストは抜きにして
とりあえずディレクトリーをたぐりながら正規表現での文字列探索みたいなジャンルで
好みでもかまわないので意見がききたいです。


74 :名無しさん@お腹いっぱい。:2009/02/05(木) 18:52:19
>>73
実際にやってみればいいじゃん。
まあシェルスクリプトは速度を求めるものじゃないけどね。

75 :名無しさん@お腹いっぱい。:2009/02/05(木) 18:53:41
>>73
速い順に、
sh > perl > bash > python
で、大体合ってる

76 :名無しさん@お腹いっぱい。:2009/02/05(木) 19:03:08
sh, bashは他のプログラムをfork, execしなきゃならないから
perl, python > sh, bash だろ。JK

77 :名無しさん@お腹いっぱい。:2009/02/05(木) 20:23:44
シェルにもなって正規表現爆速のTcl最強って話ですね、わかります

78 :名無しさん@お腹いっぱい。:2009/02/06(金) 12:09:09
Command-line Fu < The best UNIX commands on the web
http://www.commandlinefu.com/commands/browse

79 :名無しさん@お腹いっぱい。:2009/02/06(金) 12:18:34
-Fuってどういう由来の語なんだろうね

80 :名無しさん@お腹いっぱい。:2009/02/06(金) 12:19:50
符じゃないか?

護符とかの。

81 :名無しさん@お腹いっぱい。:2009/02/06(金) 12:51:06
http://ja.wikipedia.org/wiki/GIMP
なお、Script-Fuの名はカンフー(Kung-fu)からきている。

82 :名無しさん@お腹いっぱい。:2009/02/06(金) 15:28:51
夫は男らしいさまを表す字です。
偉丈夫、気丈夫、大丈夫

83 :名無しさん@お腹いっぱい。:2009/02/06(金) 15:34:19
PC的にアレかもね

84 :名無しさん@お腹いっぱい。:2009/02/06(金) 15:57:59
例えばfindやgrepをshが呼び出す場合別プロセスで使っていたら
起動コスト安くなりませんか?めんどいけど
Tclってきるつもりだったけれどある程度の機能がセットになっているのならば
選択肢なのかなぁ。
でも要するにざっくりとみたら対さないんだったら素直にperl使うのが楽なんですかね、

85 :名無しさん@お腹いっぱい。:2009/02/06(金) 16:11:31
tcl, perl
いつの人ですか?
ここ3年くらい使ったことないよ!

86 :名無しさん@お腹いっぱい。:2009/02/06(金) 17:36:19
tcl なんぞより Bourne Shell の方がよっぽど古いぞと問い詰めたい


87 :名無しさん@お腹いっぱい。:2009/02/06(金) 23:17:30
echo < hoge
これってhogeの内容がechoに渡されると思うんだけど、
なんで何も表示されないんですか?

88 :名無しさん@お腹いっぱい。:2009/02/06(金) 23:30:30
echoはコマンド引数を表示するように作られていて、標準入力は読まないからです。

89 :名無しさん@お腹いっぱい。:2009/02/06(金) 23:45:25
>>88
了解しました

[ana@coppola ~]$ echo <(ls)
/proc/self/fd/63

ではこうなるのはいったいなぜですか?
というか、
/proc/self/fd/63
って?


90 :名無しさん@お腹いっぱい。:2009/02/07(土) 00:16:57
/dev/fd/#は#に対応するファイルディスクリプタに名前が付いたものと思えばいいです。
<(command)はprocess substitutionというbashの特殊な記法でファイルディスクリプタ
ファイル(/dev/fd/#)名に置換されます。

91 :名無しさん@お腹いっぱい。:2009/02/07(土) 00:43:49
初期のシェルにもその記法はあったが、
曖昧さがあるので|記法に変った。

92 :ミジンコ未満:2009/02/07(土) 01:17:25
bashのスクリプトでDVD/CDドライブにメディアが挿入されている場合に
コマンドを実行する。なんてことをするにはどうすればいいですか

93 :名無しさん@お腹いっぱい。:2009/02/07(土) 01:32:22
Linuxならここの/procで。
http://www.linux.or.jp/JF/JFdocs/SCSI-2.4-HOWTO/sr.html

94 :名無しさん@お腹いっぱい。:2009/02/07(土) 11:06:58
>>92

head -c 1 /dev/cdrom > /dev/null 2>&1 && command


>>93
そのリンク見ても、メディアが挿入されてるかどうかの判定はできないよ。

95 :名無しさん@お腹いっぱい。:2009/02/08(日) 00:47:14
あるフォルダに複数のファイルが入っていて、その中から
暗号化zipを別のフォルダに分けるっていう事、どうやればいいでしょうか

96 :名無しさん@お腹いっぱい。:2009/02/08(日) 00:49:33
お前、その質問を他人から受けてやりたい事が解るのか?

97 :92:2009/02/08(日) 01:19:09
>>93-94
ありがと
なんとかなりそうです

98 :名無しさん@お腹いっぱい。:2009/02/08(日) 02:15:27
2つのディレクトリ内のファイルの更新日時を比較するにはみなさんどうしていますか?
現状では、2つのディレクトリ内のファイルは同期が取れていますが、たまに異なる更新日時のファイルが出来ます。
その同期の取れていないファイルはできれば抜き出したいです。
ファイルは全部で5000件くらいあります。

1.ls -ltでディレクトリ内一覧情報を出してファイルに出力
2.出したファイルから不要な情報を削除(ユーザー名とか)して時間とファイル名だけにしぼる
3.上の1と2を両ディレクトリで行う
4.diffでファイル同士比較
5.偏った情報を出力

これをシェルでやらせようと思ってますが、どうも効率を悪い気がします。

99 :名無しさん@お腹いっぱい。:2009/02/08(日) 03:18:26
結局何をしたいのか
ところどころ日本語も意味不明

更新日時の比較なら、ls -lt の結果を比較すればいいし
ファイル内容の比較をしたいのなら、diff や dircmp で
ディレクトリを指定すればいい


100 :98:2009/02/08(日) 04:46:20
>>99
ありがとうございます。
おとなしく更新日時を取ってきてdiffで比較します。

101 :名無しさん@お腹いっぱい。:2009/02/08(日) 07:23:22
>>98
なぜ同期ツールを始めから使わないのか?
e.g. rsync等

102 :名無しさん@お腹いっぱい。:2009/02/08(日) 16:13:21
readlinkコマンドがないOSで、
readlink相当のことをシェルでやるには、
どうやるのが定番ですか?

シンボリックリンクの中にはスペースや特殊記号等、
すべてアリの状態でお願いします。

103 :名無しさん@お腹いっぱい。:2009/02/08(日) 16:17:18
シェルってゆうな。クズ。

104 :名無しさん@お腹いっぱい。:2009/02/08(日) 16:26:43
ls -l で行末を読むとか

105 :名無しさん@お腹いっぱい。:2009/02/08(日) 16:57:46
>>104
> シンボリックリンクの中にはスペースや特殊記号等、
> すべてアリの状態でお願いします。

106 :名無しさん@お腹いっぱい。:2009/02/08(日) 17:05:41
>>104

$ ln -s 'hoge -> hage' 'boke -> kasu'
$ ls -l
lrwxrwxrwx 1 guest guest 12 Feb 8 17:05 boke -> kasu -> hoge -> hage

こういう状態で、どうやって判定するのかね?

107 :名無しさん@お腹いっぱい。:2009/02/08(日) 18:26:11
>>102
perl -e "print readlink ファイル名;"
でどう?
perl はたいてい入ってるし

108 :名無しさん@お腹いっぱい。:2009/02/08(日) 22:41:27
>>104
lrwxrwxrwx
一文字目の l はどういう意味?

109 :名無しさん@お腹いっぱい。:2009/02/08(日) 22:45:41
>>108
お前、>>105 が言わんとしてることをわかってない

boke -> kasu -> hoge -> hage

この部分を見て、どこがシンボリックリンクの中身か判読できないだろw

110 :名無しさん@お腹いっぱい。:2009/02/08(日) 22:50:11
>>108
>>106 を良く読め、

ls -lの結果が、 boke -> kasu -> hoge -> hage となった場合、

「hage」を指している 「boke -> kasu -> hoge」と言うsymlinkかも知れないし、
「hoge -> hage」と言うファイルを指している 「boke -> kasu」と言うsymlinkかも知れないし、
「kasu -> hoge -> hage」と言うファイルを指している 「boke」と言うsymlinkかも知れない、
ということだな。

111 :名無しさん@お腹いっぱい。:2009/02/08(日) 23:26:17
わかってない奴が湧いてるな

112 :名無しさん@お腹いっぱい。:2009/02/09(月) 00:30:15
#!/bin/sh
(
echo a
echo b
)

これと

#!/bin/sh
{
echo a
echo b
}

これってなんか違いあります?

113 :名無しさん@お腹いっぱい。:2009/02/09(月) 04:42:06
プロセスを起動するかどうか

114 :名無しさん@お腹いっぱい。:2009/02/09(月) 06:32:24
>>113
実際にはシェル内部で最適化されるから、
( ) を使ってもプロセスは起動されない。

>>112
これだけだと違いは起きない。
( ) や { } 以外の他の部分の記述によっては違いが出ることもあるというだけ。

115 :名無しさん@お腹いっぱい。:2009/02/09(月) 23:28:32
>>106
ls -l と ls -lF の結果を比較すればできそうだから、あとはまかせた。

116 :名無しさん@お腹いっぱい。:2009/02/10(火) 04:06:30
readlink(1)ってのもあるよ。

117 :名無しさん@お腹いっぱい。:2009/02/10(火) 06:44:56
>>116
>>102
「readlinkコマンドがないOSで、」

最近、質問をちゃんと読まない人多いね

118 :名無しさん@お腹いっぱい。:2009/02/10(火) 09:48:36
ほんと、問題を良く読まないのが沢山いるな。
>>102はreadlink相当のことをビルトインコマンドとして持っているシェルを
探しているんだぞ。

>>102
> readlink相当のことをシェルでやるには、


119 :名無しさん@お腹いっぱい。:2009/02/10(火) 09:58:01
readlink がなければ stat -f %Y を使えばいいじゃない

120 :名無しさん@お腹いっぱい。:2009/02/10(火) 10:00:52
>>119
readlinkがないOSにはstatもないと考えるのが妥当。

あと、stat -f というオプションはFreeBSD方言だから気を付けろ。

121 :名無しさん@お腹いっぱい。:2009/02/10(火) 11:04:50
stat --printfの"%N"はシェルスクリプトで使いづらいよな。

$ stat --printf "%n\n" /vmlinuz
/vmlinuz
$ stat --printf "%N\n" /vmlinuz
`/vmlinuz' -> `boot/vmlinuz-2.6.27-11-generic'

->とかquoteとかいらねーよ

122 :名無しさん@お腹いっぱい。:2009/02/10(火) 13:20:19
>>120
マリー アントワネットにマジレスする不粋

123 :名無しさん@お腹いっぱい。:2009/02/10(火) 15:07:27
>>122
おれには>>119 がマジで stat -f %Y が他のOSでも使えると思い込んでるように見えるが、

124 :名無しさん@お腹いっぱい。:2009/02/10(火) 15:15:42
ビルトインコマンドとしてstat -fを持ってるシェルはどれだ?

125 :名無しさん@お腹いっぱい。:2009/02/10(火) 15:46:31
>>123
しゅぎょーが足らないな

126 :名無しさん@お腹いっぱい。:2009/02/10(火) 16:08:23
>>125
言い訳見苦しい。本当に知らなかったんだねw

127 :名無しさん@お腹いっぱい。:2009/02/10(火) 16:12:10
readlink って、ファイル名がわかっているときしか使えないんだろ。
ファイル名がわかってるなら、ls -l を解析できるんじゃないか?

lrwxrwxrwx 1 guest guest 12 Feb 8 17:05 boke -> kasu -> hoge -> hage
ファイル名が boke ならば 'kasu -> hoge -> hage'
ファイル名が 'boke -> kasu' ならば、 'hoge -> hage'
が取り出せればいいんじゃないの?



128 :名無しさん@お腹いっぱい。:2009/02/10(火) 21:01:33
シェルはリロードには対応してないんでしょうか?
たとえば、lsって打ちますよね、
で、hoge1 hoge2 とか表示されます。
そのあと、rm hoge1 ってやっても、
上の ls のところのシェルには hoge1 が表示されたままになります。
もう一回 ls を売っても、下の画面に2重に出てきて、
上のシェルの ls が更新されません

129 :名無しさん@お腹いっぱい。:2009/02/10(火) 21:17:20
ひねりが足りない要努力

130 :名無しさん@お腹いっぱい。:2009/02/10(火) 21:18:01
シェルに表示されたままという意味がよくわかりませんが、
端末の画面上ということですね。

CUIの端末の元祖はテレタイプです。
これはキーボードとプリンタがくっついたものです。
プリンタで打ち出されたlsの結果がいつのまにか変化するようなことはありません。
画面に表示するようになった現在でも同じです。

131 :名無しさん@お腹いっぱい。:2009/02/10(火) 21:30:20
>>130
プリンターは繋いでいません。
プリーンターを繋げばリロードが治るんでしょうか?
良くわかりませんが??

132 :名無しさん@お腹いっぱい。:2009/02/10(火) 21:37:26
ttp://homepage1.nifty.com/plusworld/TTY/TTYALL.GIF
こういうのを購入して接続するとリロードが治るはずです。
どこで売ってるかは知らないので、がんばって探してください。
なければあきらめましょう。

133 :名無しさん@お腹いっぱい。:2009/02/11(水) 00:05:14
ダイヤルなつかしい

134 :名無しさん@お腹いっぱい。:2009/02/11(水) 09:36:33
>>102

#!/bin/sh

echo 'b[9];main(int c,char**v){printf("%.*s?n",readlink(v[1],b,36),b);}'|gcc -xc - 2>/dev/null;./a.out "$1";rm a.out

135 :名無しさん@お腹いっぱい。:2009/02/11(水) 09:37:18
あはははははは

136 :名無しさん@お腹いっぱい。:2009/02/11(水) 10:46:40
>>134
ソースにじかに "$1" を入れ込めばもっと短くなるだろ

echo 'b[9];main(){printf("%.*s\n",readlink("'"$1"'",b,36),b);}'|gcc -xc - 2>/dev/null;./a.out;rm a.out

137 :名無しさん@お腹いっぱい。:2009/02/11(水) 13:06:27
>>136
> 2>/dev/null

書き込めないcurrent directoryで、

/usr/bin/ld: cannot open output file a.out: Permission denied

すら見られませんが…

138 :名無しさん@お腹いっぱい。:2009/02/12(木) 16:45:07
#!/usr/bin/tcc -run
b[9];main(int c,char**v){printf("%.*s\n",readlink(v[1],b,36),b);}

139 :名無しさん@お腹いっぱい。:2009/02/14(土) 18:30:52
cpu使用率を出力するコマンドが欲しいんですがtopの出力を加工する感じになりますか?

140 :名無しさん@お腹いっぱい。:2009/02/14(土) 18:32:02
>>139
uptime

141 :名無しさん@お腹いっぱい。:2009/02/15(日) 01:04:50
vmstatとかじゃだめ?

142 :名無しさん@お腹いっぱい。:2009/02/15(日) 02:12:42
>>139
/proc/statのcpu行の最初の三つがCPUタイム

143 :名無しさん@お腹いっぱい。:2009/02/15(日) 09:42:44
ハードリンク先を求めるのに、findで探す以外に効率的なシェルって作れないんですか?

144 :名無しさん@お腹いっぱい。:2009/02/15(日) 09:44:20
シェルってゆうな。クズ。

145 :名無しさん@お腹いっぱい。:2009/02/15(日) 09:56:36
To find the hard links, is there some way to make an efficient shell without find ?

146 :名無しさん@お腹いっぱい。:2009/02/15(日) 10:30:18
ファイルから全文を読み込んで、別ファイルに(追記で)書き込むにはどんな記述を
すればいいですか?
phpで言えば
$hen01 = $_POST["読み込んだ文字"];
$fp = fopen('書き込み先.txt', 'a+');
flock($fp, LOCK_EX);
$return = fputs($fp,"$hen01\n");
flock($fp, LOCK_UN);
fclose($fp);
こんな感じで一旦あるテキストファイルの文字列を全部読み込んで、別のファイルに
追記書き込みの処理をしたいんです。



147 :名無しさん@お腹いっぱい。:2009/02/15(日) 10:40:05
cat aaa >> bbb

148 :名無しさん@お腹いっぱい。:2009/02/15(日) 10:47:30
>>147

なるほどcatを使うんですね、即レスありがとうございました。

149 :名無しさん@お腹いっぱい。:2009/02/15(日) 11:00:11
">>"がキモだとわかっているのだろうか。

150 :名無しさん@お腹いっぱい。:2009/02/15(日) 11:12:06
ふむ、慣れない内はシェルに>の動作を制限させとった方がいいかも?
でも制限させたらさせたで面倒なんだよな。
仕事で使うんならいざしらず、遊びで使うんなら
少々飛ばそうが関係ないし。

151 :名無しさん@お腹いっぱい。:2009/02/15(日) 11:18:56
シェルの話はスレ違い

152 :名無しさん@お腹いっぱい。:2009/02/15(日) 11:23:28
>>147
それだと、>>146 のphpでやってる flock の処理が出来てないと思うが。
同時にプロセス起動されたら出力がぐちゃぐちゃに混ざる。

153 :名無しさん@お腹いっぱい。:2009/02/15(日) 11:30:38
phpは知らんが146はロックできなかった場合の処理をしてないようなので
147でいいんじゃないの?

154 :名無しさん@お腹いっぱい。:2009/02/15(日) 11:35:22
>>153
ロックできなかった場合はflockのところでロック解除になるまで待たされる。
だから、ロックの処理はちゃんと行なわれている。

よって >>147 ではダメ。

155 :名無しさん@お腹いっぱい。:2009/02/15(日) 11:43:02
>>153
>phpは知らんが

知らないのに突っ込むと恥をかくという典型例ですな

156 :名無しさん@お腹いっぱい。:2009/02/15(日) 11:50:00
そもそも >>146 の文章とコード例がずれてるのが原因のような

157 :名無しさん@お腹いっぱい。:2009/02/15(日) 12:01:31
lockf bbb sh -c "cat aaa >>bbb"

lockf(1)が無かったら作れ。

158 :名無しさん@お腹いっぱい。:2009/02/15(日) 12:04:49
>>146
flock(1)が存在するOS (Linux)なら、

flock out.txt cat in.txt >> out.txt

159 :名無しさん@お腹いっぱい。:2009/02/15(日) 12:18:35
凄く細かいことを言うと、
>>157のスタイルの方が>>158のスタイルより、
ファイルロック以前に書き込まれる恐れがない。

160 :名無しさん@お腹いっぱい。:2009/02/15(日) 12:21:59
おれも、それを指摘しようと思ったがアペンドだから問題ないので止めた。
>>158が知っていたのかはわからない。

161 :名無しさん@お腹いっぱい。:2009/02/15(日) 12:26:13
158 だが、知ってた上で無駄な sh -c を外したんだよ。

162 :名無しさん@お腹いっぱい。:2009/02/15(日) 12:28:31
無駄ではなく、過剰仕様というのなら分かるが…

163 :名無しさん@お腹いっぱい。:2009/02/15(日) 12:32:41
>>162
いや、仕様とか品質とか関係なく無駄。

アペンドで先にオープンされるだけであって、
実際の書き込みはロック取得後に行なわれるから、
sh -c なしで全く問題ない。

164 :名無しさん@お腹いっぱい。:2009/02/15(日) 12:35:16
>>157
それだと、実行後に bbbが削除されるだろ(笑)

>>158
こっちは合格。

165 :名無しさん@お腹いっぱい。:2009/02/15(日) 17:50:43
146です。もう一つお尋ねしたいのですが次のような処理をシェルスクリプトで
する事は可能でしょうか?

1、a.txtの中に文字列「/var/log/maillog」が記述されている

2、シェルスクリプトを使って「/var/log/maillog」を記憶(変数にセット?)

3、b.txtに記憶した「/var/log/maillog」の文字列を追記したい

なおa.txtの内容は、
/var/log/maillogだったり/var/log/http_error_logだったりしますが、原則一行であり、
後ろの文字列は変わることはあっても先頭部分の/var/log/は不変です。


166 :名無しさん@お腹いっぱい。:2009/02/15(日) 17:56:26
>>165
一旦変数に記憶させたいという要求なのかな?
だとすると、

file=`cat a.txt`
echo "$file" >> b.txt

なお、変数に記憶させる必要がなければもちろん、
cat a.txt >> b.txt でよい。

167 :名無しさん@お腹いっぱい。:2009/02/15(日) 19:20:20
>>166
ありがとうございました、少し形を変えましたが思っていた事ができました。
こういう場合は``でくくるのですね。また一つ勉強になりました。

168 :143:2009/02/15(日) 20:48:50
答えまだですか?

169 :名無しさん@お腹いっぱい。:2009/02/15(日) 21:44:12
>>143
>>144

170 :名無しさん@お腹いっぱい。:2009/02/15(日) 23:20:16
>>168
diagostini --autumn-leaves

171 :名無しさん@お腹いっぱい。:2009/02/15(日) 23:42:59
>>168 >>143 ハードリンク先を求める
所詮、指してる先は i-node だから
ls -i 元ファイルのパス
じゃ、だめなのか


172 :名無しさん@お腹いっぱい。:2009/02/15(日) 23:54:35
わかってない人は黙っているように。

173 :名無しさん@お腹いっぱい。:2009/02/16(月) 00:31:33
自己解決しました。ありがとうございました。

174 :名無しさん@お腹いっぱい。:2009/02/16(月) 09:15:29
スレ違いな気もしますが、解る方が居たらお願いします。
ユーザー登録用にシェルスクリプトを書いて、手動で実行すると普通に通るんですが
cronで実行すれば通らないんです。

ユーザー登録用のuseradd.shの内容は以下になります。

while read LINE
do
USER=`echo $LINE | sed -e 's/:.*$//'`
useradd $USER
echo $LINE | chpasswd
done < /home/xxxx/public_html/user_add.txt
exit

登録すべきユーザーの読み込み元のuser_add.txtはuser:passの形式でして、
手動でuseradd.shを走らせると普通に登録してくれるんですが、cron経由だと
ウンともスンとも言わず・・・

ただ、試行錯誤の末に気づいたんですが、デーモン再読み込みをさせる.shのの書き方で
service named reloadと書いて、手動で.shを実行すればOK、このスクリプトを
cronから実行すればNGだったんですが、/etc/rc.d/init.d/named reloadに書き直して
みたらcronから実行でも通りました。

rootで実行させて、かつパーミも権限あります。cronログはこのようになりました。
Feb 16 09:02:01 xxx crond[10113]: (root) CMD (/root/useradd.sh)

又、他の単純な.shは手動でもcronでも動きますので多分、cronは適正だと思います。
となると、やはりuseradd.shの記述がおかしい可能性が高いと思いますので、間違いなど
あればご指導お願いします。

175 :名無しさん@お腹いっぱい。:2009/02/16(月) 09:35:31
#! /bin/sh -x
して何が起ってるか調べろ

176 :名無しさん@お腹いっぱい。:2009/02/16(月) 09:37:07
たぶん$PATH

177 :名無しさん@お腹いっぱい。:2009/02/16(月) 10:42:27
>>175-176
ありがとうございます、>>176の仰るとおり$pathでした。
useraddを絶対パスに指定してやって/usr/sbin/useraddにすればOKでした。


178 :名無しさん@お腹いっぱい。:2009/02/16(月) 16:28:19
確かにスレ違いなんだが、
cronに書いてなかったっけ、$PASSの事。

179 :名無しさん@お腹いっぱい。:2009/02/16(月) 16:37:59
$PASSの事は書いてない。

180 :名無しさん@お腹いっぱい。:2009/02/16(月) 16:43:40
cronよりも、at使った方が楽で確実だよ。
コマンドライン上での実行時のPATHその他の環境変数が
実行時と同じように引き継がれて実行されるし。

181 :名無しさん@お腹いっぱい。:2009/02/16(月) 16:51:37
>>179
確かに書いてなかった。

182 :名無しさん@お腹いっぱい。:2009/02/17(火) 01:20:42
aaa,111
bbb,222
ccc,333

みたいな、1対1のデータ定義のテーブルを作って、
これを1行ずつ
コマンド aaa 111
コマンド bbb 222
コマンド ccc 333
のように実行していきたいんですが、かっこよくかけなくてこんな感じになりました。

#!/bin/sh

list=" aaa,111 \
bbb,222 \
ccc,333 "

for n in $list
do
sono1=`echo $n | cut -d, -f1`
sono2=`echo $n | cut -d, -f2`

command $sono1 $sono2
done

特にcutがださいと思ってます。
美しい書き方教えてください

183 :名無しさん@お腹いっぱい。:2009/02/17(火) 01:30:15
>>182
command `echo $n | sed 's/,/ /'`


184 :名無しさん@お腹いっぱい。:2009/02/17(火) 01:31:59
for n in $list
do
IFS=,
echo $n | { read sono1 sono2 ; command $sono1 $sono2; }
done

185 :名無しさん@お腹いっぱい。:2009/02/17(火) 02:15:31
>>184
すいません

186 :名無しさん@お腹いっぱい。:2009/02/17(火) 02:16:40
途中送信しちゃた
>>184
{}これでくくっている意味がわからんのですけどなんででしょう?

187 :名無しさん@お腹いっぱい。:2009/02/17(火) 06:29:27
>>186
{ }で括らなかったら echoのパイプが左のreadだけにしかかからないだろ
( )でもいいけどさ。

188 :名無しさん@お腹いっぱい。:2009/02/17(火) 06:31:27
>>184
わざわざreadしなくていいよ。

IFS=,
command $n

だけで桶。

189 :名無しさん@お腹いっぱい。:2009/02/17(火) 21:27:45
list定義の部分はかっこよくできないすかね?
hashとか構造体風な感じ

190 :名無しさん@お腹いっぱい。:2009/02/17(火) 22:08:31
>>189
list= の部分も自分で自由に決めていいなら、
カンマにこだわらずに、↓ みたいにすればいいのでは。


#!/bin/sh

list='
aaa 111
bbb 222
ccc 333
'

set $list
while [ $# -ne 0 ]; do
command $1 $2
shift 2
done


一旦位置パラメータに setして、forじゃなくてwhileで、
shift 2で2つずつ回すのがポイント。

191 :名無しさん@お腹いっぱい。:2009/02/17(火) 22:12:37
IFS=,
cat <<EOF | while read x y; do echo $x $y; done
aaa,111
bbb,222
ccc,333
EOF


192 :名無しさん@お腹いっぱい。:2009/02/17(火) 22:18:34
IFSの仕様が良くわからん。

193 :名無しさん@お腹いっぱい。:2009/02/17(火) 22:20:38
#!/bin/sh

list='aaa bbb ccc'
aaa=111
bbb=222
ccc=333

for arg in $list
do
eval command $arg \$$arg
done


194 :名無しさん@お腹いっぱい。:2009/02/17(火) 22:23:19
>>190
>>191
ありがとうございます。

ちなみに、
>>191のような場合のwhileは

cat <<EOF | while read xy
do
echo $x $y
done
aaa,111
bbb,222
ccc,333
EOF


のようにインデント、改行つきでかけないもんでしょうか?



195 :名無しさん@お腹いっぱい。:2009/02/17(火) 22:25:16
>>194
継続行使えばOK

cat <<EOF | while read xy \
do \
echo $x $y \

196 :名無しさん@お腹いっぱい。:2009/02/17(火) 22:28:51
>>195
アフォか。\ などイラン。

あと、お前の解答の cat <<EOFは無駄。
無駄を省くと、



IFS=,
while read x y
do
echo $x $y
done << EOF
aaa,111
bbb,222
ccc,333
EOF


それより、>>190 方式がお勧め。

197 :名無しさん@お腹いっぱい。:2009/02/17(火) 22:47:54
コードとデータが分離してるとかっこいいよね

#!/bin/sh

# aaa,111
# bbb,222
# ccc,333

IFS=,
grep '^# ' $0 | sed 's/^# //' | while read a b
do
command $a $b
done


198 :名無しさん@お腹いっぱい。:2009/02/17(火) 22:51:14
元の質問 >>182 で、外部コマンドの cut がかっこ悪いって言ってるんだから、
>>197 はもっとカッコ悪い。grepもsedも使うなんて。

199 :名無しさん@お腹いっぱい。:2009/02/17(火) 22:56:31
>>197 を添削してやるよ。
外部コマンドなしでできる。

#!/bin/sh

# aaa 111
# bbb 222
# ccc 333

while read a b c
do
if [ "$a" = '#' ]; then
echo $b $c
fi
done < $0

200 :名無しさん@お腹いっぱい。:2009/02/17(火) 23:00:28
どっちにしても、うっかりコメント書いて、えらいことになりそうな

201 :名無しさん@お腹いっぱい。:2009/02/17(火) 23:02:54
あははは

202 :名無しさん@お腹いっぱい。:2009/02/17(火) 23:04:31
#define aaa 111
#define bbb 222
#define ccc 333
とかにする?

203 :名無しさん@お腹いっぱい。:2009/02/17(火) 23:07:14
データをコードよりも後ろに持ってくれば、
コメントアウトする必要なくなるぞ。


#!/bin/sh

exec < $0
while read a; [ "$a" != exit ]; do :; done

while read a b
do
if [ "$a" != '' ]; then
echo $a $b
fi
done

exit

aaa 111
bbb 222
ccc 333

204 :名無しさん@お腹いっぱい。:2009/02/17(火) 23:16:47
>>197
これはかっこいいですね!

でも使いたいけど、仕事のだから気がひけるなぁ


205 :名無しさん@お腹いっぱい。:2009/02/18(水) 01:28:19
スクリプトの中からコマンドを抜き出す方法ってありますか?
たとえば、以下のようなスクリプトがあるとします

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

echo hello
echo hello | grep hello
echo goodby | sed 's/goodby/hello/'
----------------------------

この中からコマンドをあらわす単語だけを抜き出したいんです。
(この場合だと、echoとgrepとsedがそれにあたりますが、これ以外のコマンドが存在する可能性もあります。


206 :名無しさん@お腹いっぱい。:2009/02/18(水) 01:40:50
>>205
作ってみた
-----------------------
~$ cat test.sh
#!/bin/sh
echo hello
echo hello | grep hello
echo goodby | sed 's/goodby/hello/'
-----------------------
~$ cat hoge.sh
#!/bin/sh
for word in `cat test.sh`
do
type "$word" > /dev/null
if [ $? -eq 0 ]; then
echo "$word"
fi
done
-----------------------
~$ ./hoge.sh
#!/bin/sh
echo
echo
grep
echo
sed
's/goodby/hello/'
-----------------------
うーん、コマンドでないものまで出力されてる、、、


207 :名無しさん@お腹いっぱい。:2009/02/18(水) 02:17:05
たとえば、
echo dog cat man
という行があったらどうするとか、
eval ls
という行があったらどうするとか、
l=l; s=s; $l$s
という行があったらどうするとか。




208 :名無しさん@お腹いっぱい。:2009/02/18(水) 22:30:53
yes,
test,
[,
ummm,,,,

209 :名無しさん@お腹いっぱい。:2009/02/18(水) 23:02:58
-xの出力を加工することを考えたけど、パイプ等で並列実行すると混じるので断念した。

210 :名無しさん@お腹いっぱい。:2009/02/20(金) 22:59:42
質問ですがシェルスクリプトを用いて、aaa.txtの2行目にbbb.txtの文字を追記で
書き込みをするにはどんな感じに書けばいいのですか?

aaa.txt
1行目 名前はAAAです

bbb.txt
1行目 名前は関口です
2行目 名前は川原です
3行目 名前は遠藤です
これをシェルスクリプトを使用してbbb.txtを次のようにしたいのですが・・。
1行目 名前は関口です
2行目 名前はAAAです
3行目 名前は川原です
4行目 名前は遠藤です

説明が下手なのでわかりにくいですがよろしくお願いします。

211 :名無しさん@お腹いっぱい。:2009/02/20(金) 23:01:30
>>205
一回実行してよいなら簡単に抜ける。
exec(2)をフックして、引数を調べれるか、OSによっては
/procみれば即判る。

212 :名無しさん@お腹いっぱい。:2009/02/20(金) 23:05:35
実行結果で条件分岐してたら、実行させないとトレース出来ない。

213 :名無しさん@お腹いっぱい。:2009/02/20(金) 23:54:56
>>210
text=`cat aaa.txt`
sed "2i$text" bbb.txt

あるいは

printf "2i\n$text\n.\nwq\n" | ed bbb.txt

214 :名無しさん@お腹いっぱい。:2009/02/21(土) 07:17:26
>>211
それだと、if文とかcaseとかの分岐があった場合に
分岐しなかった方が抜き出せない。
内部コマンドが抜き出せない。

215 :名無しさん@お腹いっぱい。:2009/02/21(土) 07:21:51
>>210
(head -1 bbb.txt; cat aaa.txt; tail -n +2 bbb.txt) > outfile.txt


>>213
sedのiの直後に改行がなくてもOKなのはGNU sed依存。

216 :名無しさん@お腹いっぱい。:2009/02/21(土) 12:03:48
>>213 >>215
ありがとー!出来ました。今後応用していろいろとがんばってみます。

217 :名無しさん@お腹いっぱい。:2009/02/21(土) 12:15:58
いわゆる「指定文字列探索」をshで(findとかsedとか組み合わせて)ささっとやるのは
どんな感じでやるのがよいのでしょう。
ループ組まないでやる方法があればベターです。
とりあえずそのディレクトリー内で得に拡張子はとわず
英文(例えばソース中の関数名とか#includeとか)程度でいいです。


218 :名無しさん@お腹いっぱい。:2009/02/21(土) 12:17:59
>>217
grep -r のことか?

219 :名無しさん@お腹いっぱい。:2009/02/21(土) 13:48:39
grep ってファイル自体を探索できるんですか
勘違いしていた。orz。良くmanよみますたい

220 :名無しさん@お腹いっぱい。:2009/02/21(土) 14:02:15
「ファイル自体」って考えを止めて、
stdioによるストリームデータとして捉えてください。
シェルスクリプト処理の主な対象は。

221 :名無しさん@お腹いっぱい。:2009/02/21(土) 14:06:18
>>220
意味がわからない

222 :名無しさん@お腹いっぱい。:2009/02/21(土) 14:07:05
-rは純正grepには無いので使用禁止。

223 :名無しさん@お腹いっぱい。:2009/02/21(土) 14:09:29
>>217
find . -type f -exec grep pattern {} +

ちっともシェルスクリプトじゃないな。find総合スレが必要? w

224 :名無しさん@お腹いっぱい。:2009/02/21(土) 14:44:09
Solarisはいつになったら grep に -r を実装するんだろう。
あ、全員がopensolarisに移行すれば解決するのか。

225 :名無しさん@お腹いっぱい。:2009/02/21(土) 15:07:19
SunOSもHP-UXも「どうせみんなGNUtools入れてんでしょウヒヒ」という姿勢だから

226 :名無しさん@お腹いっぱい。:2009/02/21(土) 18:20:07
>>220 わかりやすい表現で書いただけなり
取り合えず同じディレクトリーないでいいので

grep -a 'キーワード' *.txt
みたいにしてみたんだけれど
これってshで書けば日本語通るけれどターミナルだと打てないのが不便

あとマッチしたファイル名を一回だけ表示したらファイル名だけ探索して次にいくようにするにはいかに書けば良いなり?

227 :名無しさん@お腹いっぱい。:2009/02/21(土) 18:22:07
>>226
grep -rl 'キーワード' .

228 :名無しさん@お腹いっぱい。:2009/02/21(土) 18:24:32
>>223 どこにキーワード入れていいのかわからん。orz

229 :名無しさん@お腹いっぱい。:2009/02/21(土) 18:29:39
>>227 それそれ。ありやとうやんした。
日本語を探索する場合 いちいちshに書くの面倒なんだけど
どうやってんでしょう。各々方は

230 :名無しさん@お腹いっぱい。:2009/02/21(土) 18:31:06
普通にコマンドラインから。
文字コードがアレな時はlgrep使ってる。

231 :名無しさん@お腹いっぱい。:2009/02/21(土) 18:40:37
>>229
普通にコマンドラインに日本語入力してるけど。

逆に、なんでコマンドラインに日本語入力できないの?

232 :名無しさん@お腹いっぱい。:2009/02/21(土) 19:05:15
>>231

x 入れてなきゃ出来ないだろ。
鯖なら普通いれてない。

まあ、鯖でコマンドラインから日本語をいれにゃならんのも想像しにくいが。

233 :名無しさん@お腹いっぱい。:2009/02/21(土) 19:08:07
>>232
X 入れてなくても日本語入力できてるけど、、

あと、>>229 で、「shに書く」なら出来てるんだよね?
どうやって shに書いてるの?
それと同じ方法でコマンドラインに日本語入力するだけだが、、

234 :232:2009/02/21(土) 19:24:51
>>233

>>229 がどうしてるのかは知らんが、
x の入っているマシンで書いて、scpだ。

これと同じ方法でコマンドライン入力するとなると、
ssh comannd args ってなことになるが、リモートでシェルの補完機能が
使えない状況ではその気になれない。

235 :名無しさん@お腹いっぱい。:2009/02/21(土) 19:35:06
>>234
どんくさいね。

236 :229:2009/02/21(土) 19:49:28
普通にデスクトップ環境です。(xfce)
これもfirefoxでカキコしてるし
gnome-terminal,Terminal,xtermいずれも日本語は表示するので
shの実行結果では日本語表示されます。

anthyでの変換画面はでるけれど変換終了すると日本語部分は表示されません。(ぴっとかはねられる)
コピペでもセレクションコピーでも同様
ただしnano等起動すればターミナル内でも日本語変換できます。
ちょっとスレの趣旨と別枠だけれど世間とは違うのですか。

237 :229:2009/02/21(土) 19:50:59
むろんガチでダイアログ出すこともできるしperlを使う手もあるけれど
grepにそれはないでしょうということで一応質問しているわけであります。

238 :名無しさん@お腹いっぱい。:2009/02/21(土) 19:58:16
>>236
ロケール設定とshellの設定とターミナルの設定の問題だが、
スレ違いなんで、くだ質スレで、
「コマンドラインで日本語入力したい」ときいてみてくれ。


239 :名無しさん@お腹いっぱい。:2009/02/21(土) 20:09:13
>>234
その、Xが入ってるというマシンで日本語入力できてるなら、
xtermとかktermとか開いて、その中からsshでログインして、
ログイン先のシェルのコマンドラインに、ローカルのXの
いつもの入力方法で日本語入力できるだろ。

240 :名無しさん@お腹いっぱい。:2009/02/21(土) 20:15:44
>>226
shってゆうな。クズ。

241 :232:2009/02/21(土) 20:39:48
>>235

なら、どんくさくない方法を提示しろやカス。

242 :名無しさん@お腹いっぱい。:2009/02/21(土) 20:40:57
canuumという単語を思い出したが意味は忘れた

243 :名無しさん@お腹いっぱい。:2009/02/21(土) 20:48:37
>>236
> 変換終了すると日本語部分は表示されません。(ぴっとかはねられる)

というのは、ログイン先でLANG(またはLC_ALLとかLC_CTYPE)が
ちゃんと設定されてないのが原因。

EUC環境なら LANG=ja_JP.eucJPに、
UTF-8環境なら LANG=ja_JP.UTF-8に設定しろ。


あと、これとは別件だが、canuumやuumがある環境なら、
Xが全くなくてもcanuumを起動すれば直接日本語入力できる。

244 :名無しさん@お腹いっぱい。:2009/02/21(土) 21:29:42
>>243
環境変数LANGによらず、シェルが8ビットコードに対応してないと
はじかれる。Solarisだと/bin/tcshは8ビット入力できなかった。

>>236 は別のシェルを使ってみるといいと思う

ただ、>>229 の「日本語を探索する場合」って漢字コードが混在していると
非常にやっかいなんだんだよね。昔 jgrep だか ngrep だかが fj.sources に
流れたような記憶があるけど、ああゆう漢字コードを変換する grep が欲しいかも

245 :名無しさん@お腹いっぱい。:2009/02/21(土) 21:38:48
>>241
「なら」ってなんだよ。つながってねーぞ。クズ。

246 :名無しさん@お腹いっぱい。:2009/02/21(土) 22:03:10
テラターム使って日本語入力すればぁ?
どうせUNIXはサーバー専用なんだろ?

247 :名無しさん@お腹いっぱい。:2009/02/21(土) 22:04:20
>236だす
>>243 環境変数は全部(LANGもLC_ALLもLC_CTYPEも)ja_JP.UTF-8なり
アプリだと入力できるのでターミナルソフトの問題ではなく>>244
いうようにシェルの問題だと思ったのだけれど

ふと思いついてsudo xterm(sh)するとなぜかコピペはできて変換はできず
su(csh)だとコピペも入力もできた。
原因は解明できていないしファイラーからターミナル開いて探索ということはやりにくいけれど
オラ個人の設定の問題の様なのでこの件はもうきにしないでくれ
grepの基本がわかっただけでも充分に前進したよ。


248 :名無しさん@お腹いっぱい。:2009/02/21(土) 22:06:00
>>246 UNIXはゲームしたり文章書いたりブラウジングしたりするパソコン用OS

249 :名無しさん@お腹いっぱい。:2009/02/21(土) 22:09:04
UNIXはゲームサーバーになったり書いた文章保存するサンバサーバーだったり
ブラウジング用ウェブサーバーだったりするサーバー用OS

250 :名無しさん@お腹いっぱい。:2009/02/21(土) 22:52:42
ちなみにターミナルで日本語打ち込めない対策はさすがにsuとか使えないので
perlで<STDIN>使うという最低の方法に逃げたです。これだとクリック起動で文字入力待ちしてPerlで組めばいいのに``でgrep呼んでしまいました。
単純な探索の場合処理的にはファイルをたぐるループ分perlで直接書くより速いと思います。

251 :名無しさん@お腹いっぱい。:2009/02/21(土) 23:04:53
>>250
$ grep -f - -rl .

ってやれよ。すると、標準入力から読み込んだキーワードがgrepに使われる。
シェルのコマンド行じゃない標準入力なら日本語は通るはず。
日本語打った後は、改行直後に Ctrl-Dで終了。

252 :名無しさん@お腹いっぱい。:2009/02/22(日) 00:34:27
>>244
だからlgrepがあるつーの。

253 :名無しさん@お腹いっぱい。:2009/02/24(火) 23:14:27
シェルの中でexpectを使ってwinにtelnetしてbatを実行してるんですが、
当然文字コードが違う(EUCとSJIS)ので化けます。

LANGを途中変えても変わらないです。(ターミナルのせいだと思いますが)

化けないようにできますか?

254 :名無しさん@お腹いっぱい。:2009/02/24(火) 23:19:46
>>253
・標準出力にパイプで | nkf -Se をかます
・ktermをSJISモードで開く

好きな方選べ

255 :名無しさん@お腹いっぱい。:2009/02/24(火) 23:30:46
| iconv -f EUC-JP -t Shift_JIS


256 :名無しさん@お腹いっぱい。:2009/02/24(火) 23:42:35
シェルってゆうな。クズ。

257 :名無しさん@お腹いっぱい。:2009/02/25(水) 06:36:32
>>255
それ、-t と -f 逆だろ。

258 :名無しさん@お腹いっぱい。:2009/02/25(水) 10:09:23
>>251 ほとんどすれ違いネタになっていたのにありがとうございます
grep -f - -rl .
後の日本語入力→改行→ctrl+dで探索スタートできました。(xterm)


259 :名無しさん@お腹いっぱい。:2009/02/25(水) 15:12:52
ディレクトリ内にひとつしかファイルorディレクトリがない場合に
コマンドを実行しようと思い、

for dir in `find . -type d -maxdepth 1`
do
    test $(ls -1 $dir | wc -l) -eq 1 && command
done

このように書いてみたのですが、ディレクトリ名が空白で区切られて
しまいうまく動きません。
どのように対処したらいいでしょうか?

260 :名無しさん@お腹いっぱい。:2009/02/25(水) 15:17:13
find . -type d -maxdepth 1 | while read dir
do
test $(ls -1 "$dir" | wc -l) -eq 1 && command
done


261 :名無しさん@お腹いっぱい。:2009/02/25(水) 15:28:47
>>259

find . -maxdepth 1 -type d \
-exec sh -c 'for d;do [ $(ls "$d"| wc -l) -eq 1 ] && command; done' dummy {} +

262 :名無しさん@お腹いっぱい。:2009/02/25(水) 16:21:38
>>260
ありがとうございます。readを使うと良いんですね。
無事目的の動作をさせることができました。

>>261
ありがとうございます。
-execはあまり使ったことがないのですが、最後の
done' dummy {} +
の意味がいまいち理解できませんでした。
よろしければ教えていただけますか?

263 :名無しさん@お腹いっぱい。:2009/02/25(水) 16:26:36
readを使うと、\ を含むディレクトリ名が読めないとか、
(途中じゃなく)頭にスペースが付いてるディレクトリ名が読めないとか
問題が残るんだな。
その点も含めて解決するとなると、>>261 の解になる。

264 :名無しさん@お腹いっぱい。:2009/02/25(水) 17:34:24
>readを使うと、\ を含むディレクトリ名が読めないとか、
>(途中じゃなく)頭にスペースが付いてるディレクトリ名が読めないとか

IFS= read -r


265 :名無しさん@お腹いっぱい。:2009/02/25(水) 17:36:23
>>264
read -r は bash依存。

で、それやっても「改行入り」ディレクトリ名が正しく処理されない。
結局 >>261 一択。

266 :名無しさん@お腹いっぱい。:2009/02/25(水) 17:48:53
read -r は posix じゃね?


267 :名無しさん@お腹いっぱい。:2009/02/28(土) 18:54:04
基本的なことかも知れませんが、
キーボードを読んで分岐するバッチはどう書けば医院でしょうか?

268 :名無しさん@お腹いっぱい。:2009/02/28(土) 19:04:18
バッチならset /pですね。でも板違いなので出てってください。

269 :名無しさん@お腹いっぱい。:2009/03/01(日) 02:23:56
>>268
MSDOSのバッチスクリプトしか知らない人?
バッチって、バッチ処理等の普通名詞だろう

270 :名無しさん@お腹いっぱい。:2009/03/01(日) 03:26:52
パスワードがかかってないzipファイルにパスワードをかけていきたいんですが、
そもそもパスワードがかかってないか判定するすべはありますか?

271 :名無しさん@お腹いっぱい。:2009/03/01(日) 06:54:24
>>270
unzip -Zv *.zip | grep 'file security status'

272 :名無しさん@お腹いっぱい。:2009/03/01(日) 08:06:08
cronもatも使えない環境で、指定日時時刻にシェルを実行するバッチって書けますか?

273 :名無しさん@お腹いっぱい。:2009/03/01(日) 11:17:51
>>269
普通名詞のバッチ処理はユーザーからの入力待ちは行えない。必要な入力データは
あらかじめ用意しておく処理。対話処理とは対極的なもの。
ユーザーからの入力によって処理を変えたい「バッチ」というならMSDOSのバッチに他ならない。

274 :名無しさん@お腹いっぱい。:2009/03/01(日) 11:20:52
>>272
指定時刻までの時間を計算してsleepする。

275 :名無しさん@お腹いっぱい。:2009/03/01(日) 11:27:52
>>274
それはわかってますよ。その具体的なシェルを質問してるんですが。

276 :名無しさん@お腹いっぱい。:2009/03/01(日) 11:29:40
echo -n 'xx時xx分xx秒までの時間を入力してください '
read t
sleep $t
command

277 :名無しさん@お腹いっぱい。:2009/03/01(日) 11:32:04
すみませんが、詳しくご存知の方のみ御回答をお願いします

278 :名無しさん@お腹いっぱい。:2009/03/01(日) 12:34:37
>>277
お前、何様のつもり?


279 :名無しさん@お腹いっぱい。:2009/03/01(日) 12:42:54
こういうのがはやってるみたいよ

280 :名無しさん@お腹いっぱい。:2009/03/01(日) 13:14:31
ttp://pc11.2ch.net/test/read.cgi/db/1057136328/188

これってシェルスクリプトで出来るんですか?

281 :名無しさん@お腹いっぱい。:2009/03/01(日) 16:28:03
>>277 は多分質問者じゃない。
こういう荒らしを楽しんでる奴が最近いる。

282 :名無しさん@お腹いっぱい。:2009/03/01(日) 18:03:41
そらできるよ

283 :名無しさん@お腹いっぱい。:2009/03/01(日) 19:27:53
bashとawkって書いてあるじゃん

284 :名無しさん@お腹いっぱい。:2009/03/01(日) 20:10:39
bashはわかりますが、awkって何ですか? bashのプラグインみたいなものとは思いますが


285 :名無しさん@お腹いっぱい。:2009/03/01(日) 20:44:21
その認識でおk

286 :名無しさん@お腹いっぱい。:2009/03/01(日) 21:02:50
工エエェ(´д`)ェエエ工

287 :名無しさん@お腹いっぱい。:2009/03/01(日) 21:03:02
bashとawkでGUIができるの?

288 :名無しさん@お腹いっぱい。:2009/03/01(日) 23:21:15
久々に笑った。
まさかbashのプラグインと来るなんてねえ。

289 :名無しさん@お腹いっぱい。:2009/03/02(月) 09:25:51
>>287
GUI とhttp通信は別コマンドじゃないかな
awkを書いたのはCSVのparseに使ってるからだろうね

290 :名無しさん@お腹いっぱい。:2009/03/02(月) 15:07:18
すみませんが、まったくの素人の方のみ御回答をお願いします

291 :名無しさん@お腹いっぱい。:2009/03/03(火) 10:58:08
$ echo abcd def | read a
$ echo $a


echo の結果を read では変数にセットできない?

292 :名無しさん@お腹いっぱい。:2009/03/03(火) 11:05:13
できるよ。
ただ、| のうしろはサブシェルになるので、
セットしてすぐサブシェルが終了して忘れるだけ。

echo abcd def | { read a; echo $a; }

ksh だとサブシェルにならないので↑のようにしなくてもふつーに動く。


293 :名無しさん@お腹いっぱい。:2009/03/03(火) 11:43:30
なるほど、ありがと。
大人しくバッククォートで実行の結果使います。

294 :名無しさん@お腹いっぱい。:2009/03/04(水) 23:31:09
cshのこと聞いてもいいですか?

295 :名無しさん@お腹いっぱい。:2009/03/05(木) 00:18:50
>>1を読んでて答える人がいればいいんじゃない?
俺はcshは分からんが。

296 :名無しさん@お腹いっぱい。:2009/03/05(木) 02:03:59
変数の最後入っている改行コードを取り除く方法ってありますか?
Perl の chomp をシェルでやりたいのです。

297 :名無しさん@お腹いっぱい。:2009/03/05(木) 02:18:18
b="`echo $a`"

298 :名無しさん@お腹いっぱい。:2009/03/05(木) 02:21:31
b="$(printf "%s" "$a")"すると連続した空白も保存

299 :名無しさん@お腹いっぱい。:2009/03/05(木) 06:46:31
>>297 だとスペースが保存されないし、* とかの特殊記号が展開される。

b=`echo "$a"`
で桶。

300 :名無しさん@お腹いっぱい。:2009/03/06(金) 00:52:11
>>295
ではだめもとで。

配列の
array=( "a 1" "b 2" "b 3")
をforで1要素づつ使いたい場合

for d in ${array[@]}
do
echo $d
done

とかできますよね

これをcshでやること可能ですか?


301 :名無しさん@お腹いっぱい。:2009/03/06(金) 01:36:18
間違えた
for d in "${array[@]}"
do
echo $d
done

こうです。

302 :名無しさん@お腹いっぱい。:2009/03/06(金) 06:41:00
foreach i ($array)
echo $i
end
だろ。

303 :名無しさん@お腹いっぱい。:2009/03/06(金) 06:48:04
csh(笑)の質問はこっちでやれ
http://pc11.2ch.net/test/read.cgi/unix/1094041299/

>>302
それだと、要素の中のスペースで分割されてしまうからダメ。
例: "a 1" が a と 1 に別れてしまう。

304 :名無しさん@お腹いっぱい。:2009/03/06(金) 09:42:48
そんなこと言うならbash()笑の質問もこっちでやれってことになるぞw
http://pc11.2ch.net/test/read.cgi/linux/1210999497/

305 :名無しさん@お腹いっぱい。:2009/03/06(金) 22:26:43
>>300
cshなら配列使えばいいのでは?

#!/bin/csh -f
set a = ("a 1" "b 2" "c 3");

set i=1
while ( $i <= $#a )
   echo $a[$i]
   @ i = $i + 1
end


306 :名無しさん@お腹いっぱい。:2009/03/07(土) 00:49:25
set name = value
とかイコール前後にスペース付けられるあたりはcsh悪くないよね

というかスペースを許さないbashの代入がちょっとどうかと思う。

307 :名無しさん@お腹いっぱい。:2009/03/07(土) 01:10:08
なぜそこでbash

308 :名無しさん@お腹いっぱい。:2009/03/07(土) 03:17:01
とつぜんbashがきたので・・・

309 :名無しさん@お腹いっぱい。:2009/03/07(土) 07:01:04
>>306
算術式ならbashでもスペースを入れられるよ。

((i = 123))
echo $i

310 :名無しさん@お腹いっぱい。:2009/03/08(日) 04:05:42
(())ってなんなの?

311 :名無しさん@お腹いっぱい。:2009/03/08(日) 05:48:05
ま○こ

312 :名無しさん@お腹いっぱい。:2009/03/09(月) 19:53:57
まi = 123こ
echo $i

313 :名無しさん@お腹いっぱい。:2009/03/10(火) 07:44:38
sh, bashでシェル変数の値を変数名とするシェル変数を定義して
代入したいのですがどうすればよいでしょうか?
eval "$A=B"

eval "$A"=B
と書くと、意図通りに代入と判断されるシェル(最近のLinuxのbashやSolarisのsh)も
有ればコマンドと判断されてcommand not foundとなってしまう
シェルもあって、困っています。


314 :名無しさん@お腹いっぱい。:2009/03/10(火) 08:24:35
>>313
一般的には、代入する値のスペースや記号の解釈を避けるには、

eval $A=?''代入する値'?'

と書いておけば桶。evalを含めた2回の解釈を回避するために、
シングルクォートを2回ネスティングする。
$Aの方は、中身は単純な変数名が入っているため、
裸の $A のままクォートしなくても桶。

Solarisのshで動くならそれが標準と考えて良い。
これで動かないようなシェルは捨てるべき。

315 :名無しさん@お腹いっぱい。:2009/03/10(火) 08:27:12
>>313
わ、なぜかこの環境から書き込むと、
半角の\が?に化ける。(なんで?)
>>313 の?はバックスラッシュに読み変えてね。

316 :名無しさん@お腹いっぱい。:2009/03/10(火) 08:59:21
>>313
具体的にどのシェルか言えよ
そのときだけ"$A"にスペースが入ってんじゃないの?

317 :名無しさん@お腹いっぱい。:2009/03/10(火) 18:05:12
シェルスクリプトってOOじゃないんでしょ?
ダサっ

318 :名無しさん@お腹いっぱい。:2009/03/10(火) 18:37:45
>>313
困っています、じゃあ独り言にしかなってないぞ。
動かない場合の代わりの方法が欲しいのか、
ネタを流してるのかハッキリしろ。

319 :名無しさん@お腹いっぱい。:2009/03/10(火) 20:10:54
last(1)を去年の11月から今日まで出したいのですがどうすれば
いいでしょうか。

320 :名無しさん@お腹いっぱい。:2009/03/10(火) 20:30:06
cat /var/log/wtmp.3 /var/log/wtmp.2 /var/log/wtmp.1 /var/log/wtmp.0 /var/log/wtmp >/tmp/wtmp
last -f /tmp/wtmp
rm -f /tmp/wtmp

場所が違えば適宜探すこと。
圧縮されてたら適宜伸長すること。
11月の分が存在しなければ諦めること。

321 :名無しさん@お腹いっぱい。:2009/03/11(水) 02:00:46
>>314-315
ありがとうございます。
が、試してみたところエラーとなりました。

XX=YY形式の設定ファイルをIFS="="として、
while readで読み込んで、環境変数XX=値YYとしています。
whileブロックの外ではエラーがでないので、
IFS="="が悪さをしているのではないかとふと思いつきました。
明日試してみます。

>>316,318
bash3.2.25です。


322 :名無しさん@お腹いっぱい。:2009/03/11(水) 06:29:23
>>321
エラーになってあたりまえだ。

IFS="=" にすれば、コマンド上では = が消えてしまう。
XX=YY は、実際には XX YY という風に実行され、エラーになる。

これは、「シェル変数の値を変数名とするシェル変数を定義して代入」
以前の問題。

「シェル変数の値を変数名とするシェル変数を定義して代入」の問題なら、
>>314-315 の回答で合ってる。

あと、bash-3.2.25かどうかは関係ないと思うぞ。
エラーが出るなら他のシェルでもエラーになるはず。

323 :名無しさん@お腹いっぱい。:2009/03/11(水) 09:45:54
Windows PowerShellはOOなのに
シェルスクリプトはOOじゃないんだよね
時代遅れだね

324 :名無しさん@お腹いっぱい。:2009/03/12(木) 07:21:25
>>323
PowerShell は最近生まれたものなんだから当然だろ。
比較するなら PowerShell と同時期に生まれたシェルと比較しろ。

325 :名無しさん@お腹いっぱい。:2009/03/14(土) 01:53:46
jpgファイルのサイズを知りたいんですが、調べられますか?

326 :名無しさん@お腹いっぱい。:2009/03/14(土) 02:09:29
はい

327 :名無しさん@お腹いっぱい。:2009/03/14(土) 02:14:51
>>324
彼はLinux板のシェルスクリプトのところでも同じことを書いてたから。

328 :名無しさん@お腹いっぱい。:2009/03/14(土) 02:20:53
>>325
imagemagickのidentifyコマンド


329 :名無しさん@お腹いっぱい。:2009/03/14(土) 12:03:01
ls -lとかじゃないのか。

330 :名無しさん@お腹いっぱい。:2009/03/14(土) 12:32:29
echo "jpgファイル" | wc -c

331 :名無しさん@お腹いっぱい。:2009/03/14(土) 23:02:45
>>328
ありがとうございます。できました。

>>329
>>330
すいません。サイズという表現微妙でした。
解像度?1280x1024とかの値の話でした。

332 :名無しさん@お腹いっぱい。:2009/03/17(火) 22:56:18
かなりてきとーだけど。

while read l; do
for w in $l; do
type $w > /dev/null 2>&1 && echo $w
done
done < (ファイル) | sort | uniq

333 :名無しさん@お腹いっぱい。:2009/03/18(水) 19:31:29
>>325 >>331 X環境ならば
xfceのthunarだと画像ファイルを選ぶとステータスバーにサイズを表示する。
あとImageMagickいれるならば関連付けでdisplayにすれば良い
あとはperlなりcなりでperlmagickなりmagickwandなりでやりたい放題。

但しexifはdisplayでは対応しているけれどImageMagickのライブラリーは対応していないので
libexifとかexiftool入れると良いと思う

334 :名無しさん@お腹いっぱい。:2009/03/18(水) 19:32:16
>>333 つまりこのスレ的にはexiftoolの返しをいかに削るかということだと思う

335 :328:2009/03/18(水) 20:35:04
つ identify -verbose

336 :名無しさん@お腹いっぱい。:2009/03/19(木) 01:52:23
削るとかよりも素直に
WIDTH=`identify -format '%w' image.jpg`
HEIGHT=`identify -format '%h' image.ipg`
じゃない?

337 :名無しさん@お腹いっぱい。:2009/03/21(土) 00:05:33
>>336 元質問者の調べる楽しみを奪っちゃダメだよ。 >>335くらいでとどめておくのが良い
exifに手を出せばいろいろおもしろいんだから、すぐにmanとかで分かるし。
ijgのおまけの返しから削る手だってある。
ノーヒントならともかく「わかった」という喜びを与えてあげよう
それにshell script的には削って置換した方がおもろい。
選択肢が多く汎用性のあるものはいかにおもろいかが重要。

338 :名無しさん@お腹いっぱい。:2009/03/22(日) 04:07:52
shcでできたCソースからshに戻すというのは楽しいですか?

339 :名無しさん@お腹いっぱい。:2009/03/22(日) 08:11:40
>>338
俺がお前に聞きたいわ。

340 :名無しさん@お腹いっぱい。:2009/03/22(日) 23:38:38
shcってechoはsystem("echo");とかに変えるんだろうか?

341 :名無しさん@お腹いっぱい。:2009/03/25(水) 18:48:49
過去ログ見終わって今来た。ふぅ。

cshでさ、cshrcで
set path = (${path} ${TOMCAT_HOME}/bin)
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${TOMCAT_HOME}/lib
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${TOMCAT_HOME}/ROOT/WEB-INF/classes
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${TOMCAT_HOME}/ctx/lib:${TOMCAT_HOME}/jdbc/lib
って設定してて、気がつくと、
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin
LD_LIBRARY_PATH=:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib
:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib
:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib
:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib
みたいなことになってるけど、重複した同じパスの解消ってスクリプトで出来る?
なんだか検索で遅くなりそうだが、気にしないが現実的?

83 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)