トップページunix
1001コメント305KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。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 でトレースしましょう。

前スレ落ちたみたいなのでリンク省略。
0759名無しさん@お腹いっぱい。2009/05/07(木) 11:48:26
>>753
bashがスクリプト中でalias使えるか知らないが、

#!/bin/bash
alias ls='gls'
alias stat='gstat'
. そのシェルスクリプト
0760名無しさん@お腹いっぱい。2009/05/07(木) 11:49:17
>>758
そのような実装のfindが無いことを証明出来るなら採用。
0761名無しさん@お腹いっぱい。2009/05/07(木) 11:51:39
>>760
いきなりchdirすると、それがディレクトリへのシンボリックリンクだった場合に困る。
(-followオプションを付けていないのにsymlinkをたどっては行けないから)

だからいきなりchdirする実装はあり得ない。
0762名無しさん@お腹いっぱい。2009/05/07(木) 12:29:24
無いことを証明することを相手に求めるの男の人って…
0763名無しさん@お腹いっぱい。2009/05/07(木) 12:35:53
証明された後で、無いことの証明は不可能と主張する男の人って…
0764名無しさん@お腹いっぱい。2009/05/07(木) 16:42:56
背理法...?
0765名無しさん@お腹いっぱい。2009/05/07(木) 18:24:10
はいーりはーいりふれ背理法ー
0766名無しさん@お腹いっぱい。2009/05/07(木) 18:24:38
アルプスの少女ハイリ
0767名無しさん@お腹いっぱい。2009/05/07(木) 18:53:47
海胆板はじじい板
ttp://www.youtube.com/watch?v=h2mnwAJJDxY
ttp://www.youtube.com/watch?v=bfEVoJhxPPE
0768名無しさん@お腹いっぱい。2009/05/07(木) 23:15:48
豆知識:
readdir()すると、
ファイル名とi-node番号だけじゃなくて、
struct direntの中でファイルタイプも返すUNIXがある。
e.g. FreeBSD
0769名無しさん@お腹いっぱい。2009/05/07(木) 23:20:14
FS依存
0770名無しさん@お腹いっぱい。2009/05/08(金) 04:01:23
>>768
お前ら、レベル高いな、、、
ぜんぜん、この話題ついていけねぇ、、、orz

どうやったら、そんな高いレベルになるのか教えてくれ。
何かお勧めの本とか。
0771名無しさん@お腹いっぱい。2009/05/08(金) 06:55:30
>>768
その場合はreaddir()だけでファイル名もファイルタイプも得られるから、
findの-nameや-type fの有無にかかわらず、結局stat(2)の回数は増えない、でFA?
0772名無しさん@お腹いっぱい。2009/05/08(金) 07:38:55
>>771
GNU findは#ifdefで、
ファイルタイプ返すreaddirに対応している。
0773名無しさん@お腹いっぱい。2009/05/08(金) 13:50:32
>>770
OJTって知っている?
ひたすら仕事をすればいいんだよ。
0774名無しさん@お腹いっぱい。2009/05/08(金) 17:42:35
ソースを使え、ルーク
0775名無しさん@お腹いっぱい。2009/05/09(土) 08:38:09
ソースコードに埋め込んで計測すれば良いのにwww
0776名無しさん@お腹いっぱい。2009/05/10(日) 18:00:18
do 〜 doneで、doはドゥーですよね。
doneは皆さん何と読んでいますでしょうか?
人によって、ダーン、ドーン、ドネ、ディーオーエヌイーなどと呼んでいるのですが、
専門家の方はどう読むのでしょうか?
0777名無しさん@お腹いっぱい。2009/05/10(日) 18:07:04
http://dictionary.goo.ne.jp/leaf/ej/done/m0u/done/
「ドーン」じゃ人名
0778名無しさん@お腹いっぱい。2009/05/10(日) 18:23:18
do/did/done の done だろ?
0779名無しさん@お腹いっぱい。2009/05/10(日) 18:52:14
>>776
小学生乙。
0780名無しさん@お腹いっぱい。2009/05/10(日) 19:04:30
UNIXに関する言葉のひらがな読みスレッド
http://pc12.2ch.net/test/read.cgi/unix/1001358861/
0781名無しさん@お腹いっぱい。2009/05/10(日) 19:09:45
やはりここでも意見が分かれますね。
0782名無しさん@お腹いっぱい。2009/05/10(日) 19:25:12
だん、か、だーん、だろ上皇
0783名無しさん@お腹いっぱい。2009/05/10(日) 19:53:43
ところで、Bourneはどう読んでる?
ボーンじゃなくてブールネが正しいって聞いたことがあるんだが。
0784名無しさん@お腹いっぱい。2009/05/10(日) 20:22:03
>>782
だーんって読んだら笑われるぞ
英語じゃないんだから

>>776
ドーンが正解です
ドンでもいいですよ
0785名無しさん@お腹いっぱい。2009/05/10(日) 21:36:26
>>784
denyもデニーですよね。
0786名無しさん@お腹いっぱい。2009/05/11(月) 13:33:52
esacもスーケですよね
0787名無しさん@お腹いっぱい。2009/05/11(月) 16:18:47
イーザック・アジモフ
0788名無しさん@お腹いっぱい。2009/05/12(火) 08:11:17
>>782

i did it

done

アメリカ行って聞いて故意w
0789名無しさん@お腹いっぱい。2009/05/12(火) 08:11:58
>>784

>ドーンが正解です
>ドンでもいいですよ

それなら
 dawn
だなwぷけら
0790名無しさん@お腹いっぱい。2009/05/14(木) 02:26:34
unixのマニュアル(man)で英語の勉強をしているのですが、

これに関連して、全てのマニュアルの英単語の数を計算し、多い順にソートしたいのですが、
いい方法はありますでしょうか?
(#使われている頻度が多い英単語から覚えれば、効率的かなと。。)

0791名無しさん@お腹いっぱい。2009/05/14(木) 02:36:44
>>790

lsのマニュアルだけなら、これでできるよ。
--------------------------------
~$ man ls | col -b > words.txt
~$ for word in `cat words.txt`; do echo $word; done > words2.txt
~$ sort words2.txt | uniq -c | sort -n -k 1 -r | head
138 the
69 is
40 a
39 to
38 of
38 file
36 The
34 and
33 in
25 are
--------------------------------

全てのマニュアルってことになるとどうするんだろ。
0792名無しさん@お腹いっぱい。2009/05/14(木) 04:32:48
>>791
zcat /usr/local/man/man{1..9}/*.gz | nroff | col -b > /tmp/manuals.txt

以下同じ。
0793名無しさん@お腹いっぱい。2009/05/14(木) 05:04:44
そもそも英語の技術文書が英語の勉強に成るかどうかを検証したほうが。
ハリポタでもなんでもいいけど、興味の有る映画とかの本のほうが勉強に成ると思う。
0794名無しさん@お腹いっぱい。2009/05/14(木) 06:18:10
>>793
> ハリポタでもなんでもいいけど、興味の有る映画とかの本のほうが勉強に成ると思う。
ノベライズ(小説)は、難しいと聞くなあ
あと読んで(input)、誰かに書いて(output)ってしにくそう

コンピュータ(例えば、Linux)分野寄りの話なら、最初は大変だけど、メーリングリストに投げるなり、フォーラムに投稿するなり
できるし、書いた英文が不適切でも、コマンドと標準出力、エラーログを添付すれば、意味は通じるからね
コンピュータ寄りだけど英語の勉強になるし、楽しいよ

リスニングに関しては、海外ドラマDVDを家にいるときは字幕なしで流しっぱなしにしているのがいい感じ
単語がわからなくても、表情や動作で意味が伝わってくるからね
映画は連続ドラマに比べて、映画の性質上、無駄なくシーンがポンポン変わるからちょっときつい感じ
>>790
聞いてみるもんだね、簡単にできるんだね
0795名無しさん@お腹いっぱい。2009/05/14(木) 06:32:55
>>794
ノベライズは小説化だよ。
0796名無しさん@お腹いっぱい。2009/05/14(木) 06:34:11
>>793
シェルスクリプトのスレなんだからシェルスクリプトで答えればいいんだよ。
英語の勉強法なら別の板なりスレなりに誘導すればいいだけじゃないか。
0797名無しさん@お腹いっぱい。2009/05/14(木) 06:49:22
>>791
中間ファイル作るの無駄過ぎ。一発でできる。

man ls | col -b | tr ' ' '¥n' | tr '¥t' '¥n' | sort| uniq -c | sort -nr
0798名無しさん@お腹いっぱい。2009/05/14(木) 06:53:30
0799名無しさん@お腹いっぱい。NGNG?2BP(0)
質問です。
/var/wwwの、PHPの過去1日分の変更点だけのバックアップを取りたいのですが

-------------------------------
#!/bin/sh
dest=/var/www_bk/`date +%F`
mkdir $dest
chmod 777 $dest
find /var/www -mtime -1 -name "*.php" -exec cp -arp {} $dest \;
-------------------------------

これだと、フォルダの構造もなく、同一ファイルも重なってしまうためうまくありません。
(せいぜい-bつけるぐらい)
-------------------------------
#!/bin/sh
dest=/var/www_bk/`date +%F`
mkdir $dest
chmod 777 $dest
find /var/www -mtime -1 -name "*.php" -exec cp -arp {} $dest{} \;
-------------------------------
これだと「そんなフォルダねーよ」と蹴られてしまいます。
フォルダの階層ごとコピーがしたいですが、何か方法はありますでしょうか?


0800名無しさん@お腹いっぱい。2009/05/14(木) 11:14:51
rsyncでも使えば?
0801名無しさん@お腹いっぱい。NGNG?2BP(0)
rsyncは使ってますが

Cron
-------
rsync -auvz --delete /var/www /media/disk-1/www-backup
-------

世代バックアップってできましたっけ?
0802名無しさん@お腹いっぱい。2009/05/14(木) 11:34:43
ああ
0803名無しさん@お腹いっぱい。2009/05/14(木) 11:40:09
>>797
trを2個も重ねるの無駄過ぎ。一発でできる。

man ls | col -b | tr ' ¥t' '¥n¥n' | sort | uniq -c | sort -nr
0804名無しさん@お腹いっぱい。2009/05/14(木) 12:03:06
>>799

tar cf - `find ... -print` | (cd $dest; tar xpf -)

みたいなのはどうだろうか?findの結果が多い場合は`...`やめて-Tで
ファイル渡しで。
0805名無しさん@お腹いっぱい。2009/05/14(木) 12:19:08
>>799
ヒントだけ書くけど、
-exec cp -arp {} $dest{} ?
の前に、
mkdir -p `dirname $dest{}`
を実行すればいい。
find の -execに直接書くのはややこしいので、
ここだけ別のスクリプトにして、-execから呼び出した方がいいかも。

あと、cp -a オプションは、-pも-rも含んでるので、
cp -arp なんてやっても cp -a と同じだよ。
0806名無しさん@お腹いっぱい。NGNG?2BP(0)
>>804
tarは考えましたけど
ソースを追う時に解凍作業を繰り返すのが大変そうでやめました

>>805
うお、クールだ!
早速やってみます
0807名無しさん@お腹いっぱい。2009/05/14(木) 13:33:32
cpio使え
find /var/www -mtime -1 -name "*.php" | cpio -pumd $dest
0808名無しさん@お腹いっぱい。2009/05/14(木) 13:37:32
うるさいのがいるのを忘れてたぜ。

ファイル名が改行などの特殊文字含む可能性がある場合はGNU cpioで
find /var/www -mtime -1 -name "*.php" -print0 | cpio -0 -pumd $dest
0809名無しさん@お腹いっぱい。NGNG?2BP(0)
>>805
むう・・dirnameが走らない・・・
find /var/www -mtime -1 -name "*.php" -exec mkdir -p `dirname $dest{}` \;

なんか根本から間違ってる気がした
・・・でも

-----------
>>808
#!/bin/sh
dest=/var/www_bk/`date +%F`
mkdir $dest
#find /var/www -mtime -1 -name "*.php" -exec mkdir -p `dirname $dest{}` \;
#find /var/www -mtime -1 -name "*.php" -exec cp -a {} $dest{} \;
find /var/www -mtime -1 -name "*.php" -print0 | cpio -0 -pumd $dest
#tar cf - `find ... -print` | (cd $dest; tar xpf -)
chmod -R 777 $dest
-------
これで確かにいけました
なぜアーカイブが存在しないのにcpioが動くのか・・・
よ・・よくわからねーが、そのうち質問者は考えるのをやめた
0810名無しさん@お腹いっぱい。2009/05/14(木) 14:00:12
http://www.linux.or.jp/JM/html/GNU_cpio/man1/cpio.1.html
> コピーパスモードでは、 cpio はファイルをあるディレクトリから別のディレ
> クトリにコピーします。実際に は、アーカイブファイルを用いて、コピーア
> ウトモードとコピーインモードを 組み合わせて実行するような形になります。
> cpioは、コピーするファイルリストを標準入力から受けとります。これらの
> ファイルのコピー先のディレクトリについては、オプション以外の引数で与え
> られ ます。
0811名無しさん@お腹いっぱい。NGNG?2BP(0)
ごめんね、そもそもcpioの存在を知らなかったんだ

ありがとうございました!
0812名無しさん@お腹いっぱい。2009/05/14(木) 16:25:34
gnu系だしな。

http://pc11.2ch.net/test/read.cgi/linux/1238764663/
シェルスクリプト総合@LINUX Part5
0813名無しさん@お腹いっぱい。2009/05/15(金) 18:34:05
バッチのシェルを作りました。
このシェルをTELNeTに関連付けるにはどうしたらいいですか?
毎回シェルのKEYINが必要なのですか?
0814名無しさん@お腹いっぱい。2009/05/15(金) 18:49:38
バッチのシェル? cmd.exeでも自作したのか?
宣伝したいならvectorにでも行って登録しなさい。
0815名無しさん@お腹いっぱい。2009/05/15(金) 19:08:26
相手しちゃいかんよ。
0816名無しさん@お腹いっぱい。2009/05/15(金) 19:11:57
せめて言葉が通じるぐらいのところまでは勉強してもらわないと
どうにもならんな
0817名無しさん@お腹いっぱい。2009/05/15(金) 19:38:17
I made a shell of batch.
How can I associate this shell with TELNeT ?
Do I need to KEYIN for shell every time ?
0818名無しさん@お腹いっぱい。2009/05/15(金) 19:42:26
私はバッチのシェルをした。
このシェルはどうすればTelnetを関連付けることができますか?
私は毎回KEYINシェルのためには必要ですか?
0819名無しさん@お腹いっぱい。2009/05/15(金) 20:10:36
ラテン語でおk
0820名無しさん@お腹いっぱい。2009/05/15(金) 20:19:44
?κανα ?να κοχ?λι τη? batch. Π?? μπορ? να συνδ?σω αυτ? το κοχ?λι με Telnet; Χρει?ζομαι σε KEYIN για το κοχ?λι κ?θε φορ?
0821名無しさん@お腹いっぱい。2009/05/15(金) 22:14:52
引っぱりすぎ。
0822名無しさん@お腹いっぱい。2009/05/16(土) 03:55:45
そりゃギリシャ文字
0823名無しさん@お腹いっぱい。2009/05/16(土) 08:21:23
正直どうでも良い。
0824名無しさん@お腹いっぱい。2009/05/22(金) 17:38:26
word1="This is a pen"
array=( word1 )

echo ${array[0]}

これを実行すると、Thisって表示される。

array[0]にThis is a penを格納したいんだけど、どうすればいいですか?
0825名無しさん@お腹いっぱい。2009/05/22(金) 17:43:48
>>824
array=( "$word1" )
0826名無しさん@お腹いっぱい。2009/05/22(金) 17:47:22
罰腫胃損乙
0827名無しさん@お腹いっぱい。2009/05/22(金) 18:00:47
>>825
できました!

ありがとうございました。
0828名無しさん@お腹いっぱい。2009/05/25(月) 20:19:14
00 01 02 03 04
05 06 07 08 09

というような内容のファイルを

0 1 2 3 4
5 6 7 8 9

という内容に変換するにはどうやったらいい?
0829名無しさん@お腹いっぱい。2009/05/25(月) 20:22:32
>>828
tr -d 0
0830名無しさん@お腹いっぱい。2009/05/25(月) 20:25:13
おれでも答えられそうな低級レベルの質問きたー
$ cat hoge.txt
00 01 02 03 04
05 06 07 08 09
$ sed -e 's/0\([^0]\)/\1/g' hoge.txt
0 1 2 3 4
5 6 7 8 9
0831名無しさん@お腹いっぱい。2009/05/25(月) 20:26:09
>>829
最初の0が残らないぞ。
0832名無しさん@お腹いっぱい。2009/05/25(月) 20:43:52
>>830
それだと、102 とかが 12 になってしまう。
0833名無しさん@お腹いっぱい。2009/05/25(月) 20:49:29
0203 とか 0052 とかの対応も含めて
ゼロサプレスをもう少しちゃんとやるとすると、こうか?

sed 's/¥<0*¥([^0]¥)/¥1/g'
0834名無しさん@お腹いっぱい。2009/05/25(月) 20:50:46
>>833
それ、今度は 00 が 00 のままになる。
0835名無しさん@お腹いっぱい。2009/05/25(月) 20:58:19
>>830 も、単独の
00
だけの行があると
00
のままになるよ。

ハイ、やり直し。
0836名無しさん@お腹いっぱい。2009/05/25(月) 21:02:20
00だけ別対応だな。

sed 's/¥<0*¥([^0]¥)/¥1/g;s/¥<00*¥>/0/g'
0837名無しさん@お腹いっぱい。2009/05/25(月) 21:05:22
>>836
対応できてませんけどw
0838名無しさん@お腹いっぱい。2009/05/25(月) 21:13:12
>>830
元ファイル:
04 03 02 01 00

結果:
4 3 2 1 00
0839名無しさん@お腹いっぱい。2009/05/25(月) 21:17:40
フルボッコw
0840名無しさん@お腹いっぱい。2009/05/25(月) 21:22:45
>>828
それを実行してるFreeBSDのバージョンは?
0841名無しさん@お腹いっぱい。2009/05/25(月) 21:57:51
>>840
質問した本人は言い辛いと思うので(ていうかもう見てないか)言っておくが、
書いても君には答えられない。
そもそも書く意味がほとんど無いから書いてない。
0842名無しさん@お腹いっぱい。2009/05/26(火) 01:14:33
3日ぶりの質問に群がるレスは煽りと否定ばかり
間違ってはいたけど建設的なのは一人だけ、まぁ全てが自演かもしれんけど
こんなんでどうだろう?

sed -e 's/0*\([0-9]*[0-9]\)/\1/g' hoge.txt
0843名無しさん@お腹いっぱい。2009/05/26(火) 02:38:05
多分>>830>>833 = >>836だろ
0844名無しさん@お腹いっぱい。2009/05/26(火) 06:10:05
シェルスクリプトというよりsedスレ化してるな。
0845名無しさん@お腹いっぱい。2009/05/26(火) 07:38:19
>>842
もとの質問の「仕様」が不明確だから何とも言えないけど、

A00B みたいなのが A0B に変換されてしまうのはいいんだよな??
0846名無しさん@お腹いっぱい。2009/05/26(火) 12:26:35
sed 's/^/ /;s/ 0*\([0-9]\)/ \1/g;s/^ //'
0847名無しさん@お腹いっぱい。2009/05/26(火) 13:06:05
いまどきのsedなら\bあるんじゃね?

sed 's/\b0*\([0-9]\)/\1/g'
0848名無しさん@お腹いっぱい。2009/05/26(火) 14:14:49
いまどきの sed とぼかさずに、はっきり GNU sed と言ったら?
0849名無しさん@お腹いっぱい。2009/05/26(火) 17:51:35
sedだと改行が難しいんですよねー

ところで、文章が書き込まれているテキストファイルを1行に1文字づつに変換するには
どのコマンドを使用するべきだと思います?
0850名無しさん@お腹いっぱい。2009/05/26(火) 18:00:32
>>849

fold -1
0851名無しさん@お腹いっぱい。2009/05/26(火) 18:25:19
>>850

ファイルに出力したくなかったので助かりました、ありがとうございます
0852名無しさん@お腹いっぱい。2009/05/26(火) 22:09:36
質問です。 bash です。

ls コマンドが次のように定義されています。
ls ()
{
/bin/ls ${1+"$@"}
}

わざわざ ${1+"$@"} にしている理由は何でしょうか?
/bin/ls "$@" にした時との差異がわかりません。
0853名無しさん@お腹いっぱい。2009/05/26(火) 22:38:27
古いshでは引数が与えられていない時の
command "$@"はcommand ""と同じだった。それを避けるための記法。
0854名無しさん@お腹いっぱい。2009/05/26(火) 22:38:35
bashで質問なのですがこういうタブ区切りのファイルがあります。
AAAA(タブ)BBBB(タブ)CCCC
DDDD(タブ)EEEE(タブ)FFFF

このファイルを1行ずつ読み込んでタブ区切りで分割し
配列に取り込みたいのですがどうやればいいんでしょうか?

自分が考えたのが次のようなやり方だったんですが
どうもうまく行きません。
while read LINE;do
DATA1=`echo $LINE | cut -f 1`
DATA2=`echo $LINE | cut -f 2`
done
データにはスペースが入ることもあるのでどうしてもタブで分割させたいんですが、
いいやり方ってないでしょうか?
0855名無しさん@お腹いっぱい。2009/05/26(火) 22:51:26
>>854
echo "$LINE"
というオチか

ダブルクォートが無いと、echoした時、せっかくのタブがスペースになってしまう。
08568522009/05/26(火) 23:07:25
>>853
ありがとうございます。
納得しました。
08578542009/05/26(火) 23:35:03
>>855
そんな簡単な理由だったとは・・・orz
ありがとうございます!明日早速試してみます
0858名無しさん@お腹いっぱい。2009/05/27(水) 02:02:24
ファイルの3行目から10行目を表示というのをかっこよく書くとどうなりますか?
■ このスレッドは過去ログ倉庫に格納されています