シェルスクリプト総合 その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:26bashがスクリプト中でalias使えるか知らないが、
#!/bin/bash
alias ls='gls'
alias stat='gstat'
. そのシェルスクリプト
0760名無しさん@お腹いっぱい。
2009/05/07(木) 11:49:17そのような実装のfindが無いことを証明出来るなら採用。
0761名無しさん@お腹いっぱい。
2009/05/07(木) 11:51:39いきなりchdirすると、それがディレクトリへのシンボリックリンクだった場合に困る。
(-followオプションを付けていないのにsymlinkをたどっては行けないから)
だからいきなりchdirする実装はあり得ない。
0762名無しさん@お腹いっぱい。
2009/05/07(木) 12:29:240763名無しさん@お腹いっぱい。
2009/05/07(木) 12:35:530764名無しさん@お腹いっぱい。
2009/05/07(木) 16:42:560765名無しさん@お腹いっぱい。
2009/05/07(木) 18:24:100766名無しさん@お腹いっぱい。
2009/05/07(木) 18:24:380767名無しさん@お腹いっぱい。
2009/05/07(木) 18:53:47ttp://www.youtube.com/watch?v=h2mnwAJJDxY
ttp://www.youtube.com/watch?v=bfEVoJhxPPE
0768名無しさん@お腹いっぱい。
2009/05/07(木) 23:15:48readdir()すると、
ファイル名とi-node番号だけじゃなくて、
struct direntの中でファイルタイプも返すUNIXがある。
e.g. FreeBSD
0769名無しさん@お腹いっぱい。
2009/05/07(木) 23:20:140770名無しさん@お腹いっぱい。
2009/05/08(金) 04:01:23お前ら、レベル高いな、、、
ぜんぜん、この話題ついていけねぇ、、、orz
どうやったら、そんな高いレベルになるのか教えてくれ。
何かお勧めの本とか。
0771名無しさん@お腹いっぱい。
2009/05/08(金) 06:55:30その場合はreaddir()だけでファイル名もファイルタイプも得られるから、
findの-nameや-type fの有無にかかわらず、結局stat(2)の回数は増えない、でFA?
0772名無しさん@お腹いっぱい。
2009/05/08(金) 07:38:55GNU findは#ifdefで、
ファイルタイプ返すreaddirに対応している。
0773名無しさん@お腹いっぱい。
2009/05/08(金) 13:50:32OJTって知っている?
ひたすら仕事をすればいいんだよ。
0774名無しさん@お腹いっぱい。
2009/05/08(金) 17:42:350775名無しさん@お腹いっぱい。
2009/05/09(土) 08:38:090776名無しさん@お腹いっぱい。
2009/05/10(日) 18:00:18doneは皆さん何と読んでいますでしょうか?
人によって、ダーン、ドーン、ドネ、ディーオーエヌイーなどと呼んでいるのですが、
専門家の方はどう読むのでしょうか?
0777名無しさん@お腹いっぱい。
2009/05/10(日) 18:07:04「ドーン」じゃ人名
0778名無しさん@お腹いっぱい。
2009/05/10(日) 18:23:180779名無しさん@お腹いっぱい。
2009/05/10(日) 18:52:14小学生乙。
0780名無しさん@お腹いっぱい。
2009/05/10(日) 19:04:30http://pc12.2ch.net/test/read.cgi/unix/1001358861/
0781名無しさん@お腹いっぱい。
2009/05/10(日) 19:09:450782名無しさん@お腹いっぱい。
2009/05/10(日) 19:25:120783名無しさん@お腹いっぱい。
2009/05/10(日) 19:53:43ボーンじゃなくてブールネが正しいって聞いたことがあるんだが。
0784名無しさん@お腹いっぱい。
2009/05/10(日) 20:22:03だーんって読んだら笑われるぞ
英語じゃないんだから
>>776
ドーンが正解です
ドンでもいいですよ
0785名無しさん@お腹いっぱい。
2009/05/10(日) 21:36:26denyもデニーですよね。
0786名無しさん@お腹いっぱい。
2009/05/11(月) 13:33:520787名無しさん@お腹いっぱい。
2009/05/11(月) 16:18:470788名無しさん@お腹いっぱい。
2009/05/12(火) 08:11:17i did it
done
アメリカ行って聞いて故意w
0789名無しさん@お腹いっぱい。
2009/05/12(火) 08:11:58>ドーンが正解です
>ドンでもいいですよ
それなら
dawn
だなwぷけら
0790名無しさん@お腹いっぱい。
2009/05/14(木) 02:26:34これに関連して、全てのマニュアルの英単語の数を計算し、多い順にソートしたいのですが、
いい方法はありますでしょうか?
(#使われている頻度が多い英単語から覚えれば、効率的かなと。。)
0791名無しさん@お腹いっぱい。
2009/05/14(木) 02:36:44lsのマニュアルだけなら、これでできるよ。
--------------------------------
~$ 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:48zcat /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> ハリポタでもなんでもいいけど、興味の有る映画とかの本のほうが勉強に成ると思う。
ノベライズ(小説)は、難しいと聞くなあ
あと読んで(input)、誰かに書いて(output)ってしにくそう
コンピュータ(例えば、Linux)分野寄りの話なら、最初は大変だけど、メーリングリストに投げるなり、フォーラムに投稿するなり
できるし、書いた英文が不適切でも、コマンドと標準出力、エラーログを添付すれば、意味は通じるからね
コンピュータ寄りだけど英語の勉強になるし、楽しいよ
リスニングに関しては、海外ドラマDVDを家にいるときは字幕なしで流しっぱなしにしているのがいい感じ
単語がわからなくても、表情や動作で意味が伝わってくるからね
映画は連続ドラマに比べて、映画の性質上、無駄なくシーンがポンポン変わるからちょっときつい感じ
>>790
聞いてみるもんだね、簡単にできるんだね
0795名無しさん@お腹いっぱい。
2009/05/14(木) 06:32:55ノベライズは小説化だよ。
0796名無しさん@お腹いっぱい。
2009/05/14(木) 06:34:11シェルスクリプトのスレなんだからシェルスクリプトで答えればいいんだよ。
英語の勉強法なら別の板なりスレなりに誘導すればいいだけじゃないか。
0797名無しさん@お腹いっぱい。
2009/05/14(木) 06:49:22中間ファイル作るの無駄過ぎ。一発でできる。
man ls | col -b | tr ' ' '¥n' | tr '¥t' '¥n' | sort| uniq -c | sort -nr
0798名無しさん@お腹いっぱい。
2009/05/14(木) 06:53:30/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:51Cron
-------
rsync -auvz --delete /var/www /media/disk-1/www-backup
-------
世代バックアップってできましたっけ?
0802名無しさん@お腹いっぱい。
2009/05/14(木) 11:34:430803名無しさん@お腹いっぱい。
2009/05/14(木) 11:40:09trを2個も重ねるの無駄過ぎ。一発でできる。
man ls | col -b | tr ' ¥t' '¥n¥n' | sort | uniq -c | sort -nr
0804名無しさん@お腹いっぱい。
2009/05/14(木) 12:03:06tar cf - `find ... -print` | (cd $dest; tar xpf -)
みたいなのはどうだろうか?findの結果が多い場合は`...`やめて-Tで
ファイル渡しで。
0805名無しさん@お腹いっぱい。
2009/05/14(木) 12:19:08ヒントだけ書くけど、
-exec cp -arp {} $dest{} ?
の前に、
mkdir -p `dirname $dest{}`
を実行すればいい。
find の -execに直接書くのはややこしいので、
ここだけ別のスクリプトにして、-execから呼び出した方がいいかも。
あと、cp -a オプションは、-pも-rも含んでるので、
cp -arp なんてやっても cp -a と同じだよ。
0807名無しさん@お腹いっぱい。
2009/05/14(木) 13:33:32find /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
むう・・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> コピーパスモードでは、 cpio はファイルをあるディレクトリから別のディレ
> クトリにコピーします。実際に は、アーカイブファイルを用いて、コピーア
> ウトモードとコピーインモードを 組み合わせて実行するような形になります。
> cpioは、コピーするファイルリストを標準入力から受けとります。これらの
> ファイルのコピー先のディレクトリについては、オプション以外の引数で与え
> られ ます。
ありがとうございました!
0812名無しさん@お腹いっぱい。
2009/05/14(木) 16:25:34http://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宣伝したいならvectorにでも行って登録しなさい。
0815名無しさん@お腹いっぱい。
2009/05/15(金) 19:08:260816名無しさん@お腹いっぱい。
2009/05/15(金) 19:11:57どうにもならんな
0817名無しさん@お腹いっぱい。
2009/05/15(金) 19:38:17How 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:360820名無しさん@お腹いっぱい。
2009/05/15(金) 20:19:440821名無しさん@お腹いっぱい。
2009/05/15(金) 22:14:520822名無しさん@お腹いっぱい。
2009/05/16(土) 03:55:450823名無しさん@お腹いっぱい。
2009/05/16(土) 08:21:230824名無しさん@お腹いっぱい。
2009/05/22(金) 17:38:26array=( word1 )
echo ${array[0]}
これを実行すると、Thisって表示される。
array[0]にThis is a penを格納したいんだけど、どうすればいいですか?
0825名無しさん@お腹いっぱい。
2009/05/22(金) 17:43:48array=( "$word1" )
0826名無しさん@お腹いっぱい。
2009/05/22(金) 17:47:220827名無しさん@お腹いっぱい。
2009/05/22(金) 18:00:47できました!
ありがとうございました。
0828名無しさん@お腹いっぱい。
2009/05/25(月) 20:19:1405 06 07 08 09
というような内容のファイルを
0 1 2 3 4
5 6 7 8 9
という内容に変換するにはどうやったらいい?
0829名無しさん@お腹いっぱい。
2009/05/25(月) 20:22:32tr -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最初の0が残らないぞ。
0832名無しさん@お腹いっぱい。
2009/05/25(月) 20:43:52それだと、102 とかが 12 になってしまう。
0833名無しさん@お腹いっぱい。
2009/05/25(月) 20:49:29ゼロサプレスをもう少しちゃんとやるとすると、こうか?
sed 's/¥<0*¥([^0]¥)/¥1/g'
0834名無しさん@お腹いっぱい。
2009/05/25(月) 20:50:46それ、今度は 00 が 00 のままになる。
0835名無しさん@お腹いっぱい。
2009/05/25(月) 20:58:1900
だけの行があると
00
のままになるよ。
ハイ、やり直し。
0836名無しさん@お腹いっぱい。
2009/05/25(月) 21:02:20sed 's/¥<0*¥([^0]¥)/¥1/g;s/¥<00*¥>/0/g'
0837名無しさん@お腹いっぱい。
2009/05/25(月) 21:05:22対応できてませんけどw
0838名無しさん@お腹いっぱい。
2009/05/25(月) 21:13:12元ファイル:
04 03 02 01 00
結果:
4 3 2 1 00
0839名無しさん@お腹いっぱい。
2009/05/25(月) 21:17:400840名無しさん@お腹いっぱい。
2009/05/25(月) 21:22:45それを実行してるFreeBSDのバージョンは?
0841名無しさん@お腹いっぱい。
2009/05/25(月) 21:57:51質問した本人は言い辛いと思うので(ていうかもう見てないか)言っておくが、
書いても君には答えられない。
そもそも書く意味がほとんど無いから書いてない。
0842名無しさん@お腹いっぱい。
2009/05/26(火) 01:14:33間違ってはいたけど建設的なのは一人だけ、まぁ全てが自演かもしれんけど
こんなんでどうだろう?
sed -e 's/0*\([0-9]*[0-9]\)/\1/g' hoge.txt
0843名無しさん@お腹いっぱい。
2009/05/26(火) 02:38:050844名無しさん@お腹いっぱい。
2009/05/26(火) 06:10:050845名無しさん@お腹いっぱい。
2009/05/26(火) 07:38:19もとの質問の「仕様」が不明確だから何とも言えないけど、
A00B みたいなのが A0B に変換されてしまうのはいいんだよな??
0846名無しさん@お腹いっぱい。
2009/05/26(火) 12:26:350847名無しさん@お腹いっぱい。
2009/05/26(火) 13:06:05sed 's/\b0*\([0-9]\)/\1/g'
0848名無しさん@お腹いっぱい。
2009/05/26(火) 14:14:490849名無しさん@お腹いっぱい。
2009/05/26(火) 17:51:35ところで、文章が書き込まれているテキストファイルを1行に1文字づつに変換するには
どのコマンドを使用するべきだと思います?
0850名無しさん@お腹いっぱい。
2009/05/26(火) 18:00:32fold -1
0851名無しさん@お腹いっぱい。
2009/05/26(火) 18:25:19ファイルに出力したくなかったので助かりました、ありがとうございます
0852名無しさん@お腹いっぱい。
2009/05/26(火) 22:09:36ls コマンドが次のように定義されています。
ls ()
{
/bin/ls ${1+"$@"}
}
わざわざ ${1+"$@"} にしている理由は何でしょうか?
/bin/ls "$@" にした時との差異がわかりません。
0853名無しさん@お腹いっぱい。
2009/05/26(火) 22:38:27command "$@"はcommand ""と同じだった。それを避けるための記法。
0854名無しさん@お腹いっぱい。
2009/05/26(火) 22:38:35AAAA(タブ)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:26echo "$LINE"
というオチか
ダブルクォートが無いと、echoした時、せっかくのタブがスペースになってしまう。
0858名無しさん@お腹いっぱい。
2009/05/27(水) 02:02:24■ このスレッドは過去ログ倉庫に格納されています