トップページ⇒linux
988コメント336KB

シェルスクリプト総合@LINUX Part3

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001login:Penguin2007/07/10(火) 23:17:13ID:qGthZdME
UNIX板のスレを見ている方も多数おられるかと思いますが、
まあそれはそれとして、BASHウゼーとか言われる心配なく
平和にLINUX的スクリプト談義しましょうよ。

初めての自作スクリプト、自信ないから見てください。な初心者から
トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで
いろいろな人に参加して頂けると嬉しいです。

perlやらPythonやらの話が混ざっても良いんでない?

【sed】シェルスクリプト総合@LINUX Part2【awk】
http://pc11.2ch.net/test/read.cgi/linux/1154578200/
http://pc8.2ch.net/test/read.cgi/linux/1121994321/

>>2-5あたりに色々と。
0875login:Penguin2008/03/29(土) 22:48:22ID:6BdICwv7
シェルスクリプトで連番を振る際に
1から100を1、2、3…ではなく
001、002、003…と出力させたい場合どうしたらよいでしょう?

val=1
while $val lt 100
do
echo $val
val=expr`$val+1`
done
0876login:Penguin2008/03/29(土) 22:53:17ID:z7EKOxA5
>>875
for i in {0..9}; do printf "%03d\n" ${i}; done
0877login:Penguin2008/03/29(土) 22:57:09ID:ZodWq0Ht
printfが嫌なら echo "000$i" | sed 's/0*¥(...¥)$/¥1/'
08788742008/03/29(土) 23:01:58ID:Je2/7f5V
すみません。事故解決しました。 JM Project の bash(1) に記述されてました。
08798752008/03/29(土) 23:02:33ID:6BdICwv7
>>876-877
凄まじくソッコーのレス ありがとうございます。
形式を指定してるってことくらいは分かりました。
調べてきます!

ありがとございました。
0880login:Penguin2008/03/29(土) 23:06:18ID:z7EKOxA5
>>875
単純に、必要な個数の名前のリストがありゃいいだけなら、
これでもいいと思う。
seq -f "moe_ero_guro_%03g.png" 0 9
0881login:Penguin2008/03/29(土) 23:16:52ID:U1N+QPd9
>>876
{0..9} は bash3 じゃないと動かないはず。
まだ bash 2.05b の環境ってけっこうあるよね?
0882login:Penguin2008/03/29(土) 23:19:47ID:ZodWq0Ht
seqは、あーここLinux板だからまず間違いなく入ってるな。
0883login:Penguin2008/03/29(土) 23:23:13ID:ZodWq0Ht
seqだととびとびの値とかも作れるんだが、
単に連番がつくりたいとき個人的によくやるのは
yes '' | cat -n | sed 100q
とか。
0884login:Penguin2008/03/29(土) 23:30:36ID:WiwCN3W0
seqって便利だね。知らんかった。

seq -f %03g 1 100
0885login:Penguin2008/03/29(土) 23:33:55ID:z7EKOxA5
>>881
聞かれたから一応、答えておこう。そんな環境は知らん。
bash 2.05bなのはRHEL3かVineか、2005年ぐらいで閉鎖空間へ移行したやつだけだろ。
0886login:Penguin2008/03/29(土) 23:36:52ID:WiwCN3W0
そうなのか。ある意味Vine恐るべしだな。
08878742008/03/29(土) 23:41:18ID:Je2/7f5V
組込系だったりすると bash どころか busybox ん中の sh (ash) だったりもする。
La Fonera の seq は -f オプションなんか無いので
printf "%03d\n" `seq 1 10`
0888login:Penguin2008/03/30(日) 00:08:49ID:36hI9fyL
この仕様は初めて知ったw

$ printf "%03d%03d\n" 1 2 3 4 5
001002
003004
005000
0889login:Penguin2008/03/30(日) 00:34:47ID:91o/3wOF
おまいらのseq には -w ってオプション無いの?
seq -w 1 100
08908742008/03/30(日) 00:48:35ID:VLE1BQAD
BusyBox v1.1.3 (2006.11.21-19:49+0000) multi-call binary
Usage: seq [first [increment]] last
Print numbers from FIRST to LAST, in steps of INCREMENT.

-w ? そんなオプション見たこと無い。(笑)
0891login:Penguin2008/03/30(日) 15:18:36ID:AAKkqqTb
拡張子の変換ってどうやってる?俺は
for f in *.hoge; do
mv $f ${f%.hoge}.fuga
done
っていちいち打ち込んでるんだけど、なんかいい方法ない?
0892login:Penguin2008/03/30(日) 16:16:42ID:SBrBro/C
>>891
過去ログ読め。
0893login:Penguin2008/04/01(火) 00:07:30ID:mTzNKv6N
ニコ動の動画IDをwgetで落とせる直リンに変換するスクリプトないっすか?
0894login:Penguin2008/04/01(火) 00:12:45ID:+SHNTduy
>>893
仕様出てるだろ。
0895login:Penguin2008/04/01(火) 00:12:57ID:bWFHq2/G
>>893
nicovideo-dl
0896login:Penguin2008/04/01(火) 22:06:47ID:Mk5CpRwr
$ oppai
bash: oppai: command not found
0897login:Penguin2008/04/04(金) 13:09:23ID:Lie/X+/S
質問させて下さい。
ubuntu7.1 server を使用しています。
シェルスクリプトを勉強し始めてLinuxの設定セットアップシェルを作ろうとしています。

■入力受付状態を省略し、自動入力にするにはどのようにすればいいのでしょうか?
例えばsambaのコマンドですが
smbpasswd -a root
をするとパスワードの入力を求められます。
普段なら手動でxxxxと入力するのですが、この作業を自動化したいのです。

色々調べてsedの使い方等はわかりファイルの書き換えによる設定はおおむね出来たのですが
上記のやり方は見つけることができませんでした。
どうかアドバイス頂けないでしょうか?
宜しくお願い致します。
0898login:Penguin2008/04/04(金) 21:25:51ID:WDSwmhLm
>>897
Windowsから接続しているなら、TeraTermのマクロで何とかできるかもね。
ただユーザー名やパスワードが見えてしまう状態でファイルに保存するから
セキュリティ上には良くないかも

sambaの設定ファイルだけバックアップ取って
ユーザーとパスワードはその都度入力するのが無難かと
0899login:Penguin2008/04/05(土) 11:09:58ID:co3/wC9l
>>897
expectスクリプト
expectに突いてくるサンプルを読んで
0900login:Penguin2008/04/05(土) 11:16:23ID:co3/wC9l
すまん、サンプルついてないわ。
apt-get source expect
して、サンプル見て。
0901login:Penguin2008/04/06(日) 14:52:52ID:20te6qz4
シェルスクリプトできるけどPerlスクリプト出来ないやつなんなの?
0902login:Penguin2008/04/06(日) 15:42:41ID:6d0Si0sC
単にawkとかpythonが好きなんじゃないの?
0903login:Penguin2008/04/06(日) 17:08:40ID:Y81bdbYI
>>901
シェル・スクリプトは基本だが、perl は awk やら python やらのワン・オブ・ゼムに過ぎないので、それが普通。

MS-Windows95の頃、cgiはperlスクリプトでという謎の風潮があった名残で、あなたのような疑問が出て来るのだろう。
0904login:Penguin2008/04/07(月) 02:13:58ID:WGY+O99D
>>903
そうそう。
別に、cgiがシェルスクリプトでも問題ないし(使いにくいけど)、なんでもいい。

perlだろうが難だろうが、所詮手段なんだから、どうでもいいじゃんw
0905login:Penguin2008/04/07(月) 08:01:37ID:DKzh8iuy
>>901
多分、

同じ構造化手続き型言語なのに何で方言によって使える使えないみたいなこと言ってんの?

ということかと。

0906login:Penguin2008/04/07(月) 20:27:53ID:ky4RCRjO
>>905
そうなら「シェル」スクリプトスレで何言ってんだこのバカは?
ってな話しにしかならんからそれはなかろ。
0907login:Penguin2008/04/08(火) 00:22:25ID:xWC78uSv
つまり、シェルスクリプターはアホです。
0908login:Penguin2008/04/08(火) 21:18:54ID:mlftshp4
Aho氏

ttp://en.wikipedia.org/wiki/Alfred_V._Aho
0909login:Penguin2008/04/08(火) 21:20:29ID:L1HkWImv
ahoさんはawkの偉い人でしょ
0910login:Penguin2008/04/09(水) 01:18:06ID:8anDW64k
フィンランドではよくある名字。
0911login:Penguin2008/04/09(水) 01:40:20ID:vyKS0pT6
えっほ
0912login:Penguin2008/04/09(水) 02:03:59ID:JRgbXb6K
スキーでアホネンさんっていたな
この人もフィンランドだったな
0913login:Penguin2008/04/09(水) 13:12:39ID:vyKS0pT6
だれがあほやねん!
0914login:Penguin2008/04/09(水) 18:16:40ID:pjxRKuKN
>>911,913
しょーもないレスして悲しくなってこないか?
0915login:Penguin2008/04/09(水) 19:47:59ID:D07VbGXN
$ shoumo
bash: shoumo: command not found
0916login:Penguin2008/04/09(水) 21:12:29ID:HudBzGNB
$ which show
/usr/local/mh/bin/show

なんていう時代もありました。
0917login:Penguin2008/04/11(金) 16:25:19ID:3vnovWPW
000から999までリストを作りたいんですが、どうすればいいでしょう?
0918login:Penguin2008/04/11(金) 16:30:16ID:p4V9vMAs
seq -w 0 999
0919login:Penguin2008/04/11(金) 16:38:37ID:3vnovWPW
>>918
めちゃくちゃありがとうございます!!!
0920login:Penguin2008/04/11(金) 16:41:55ID:h4xwic1O
最近の bash なら
echo 00{0..9} 0{10..99} {100..999}

zsh なら
echo {000..999}
0921login:Penguin2008/04/13(日) 00:08:59ID:C50QhsEF
端末に他の端末から書き込むようなデーモンとクライアントが欲しいです
例として、mltermとurxvtを立ちあげ、
mltermでhogedを起動して、もうurxvtでhogec -e 'echo aaa'ってやったら
mltermの画面にaaaとか表示されるようなものです
同時に複数の作業をさせてるときにその進捗を1つのコンソールで見通せたらなとか思いまして…
0922login:Penguin2008/04/13(日) 00:37:03ID:tBy+WuAg
適当なログファイルに書き出して、端末の方にはtail -f (tailf)で流せば
0923login:Penguin2008/04/13(日) 08:41:28ID:LTuSsBD0
端末A $ echo 'term A' > /dev/console
端末B $ echo 'term B' > /dev/console
に類したことは、まれにやる。
0924login:Penguin2008/04/13(日) 09:11:42ID:DHms7wov
>>921
mlterm$ screen

urxvt$ screen -x
0925login:Penguin2008/04/13(日) 09:16:44ID:DHms7wov
つ ttysnoop
0926login:Penguin2008/04/13(日) 10:23:50ID:+bcR3tRW
>>921
wall
0927login:Penguin2008/04/13(日) 15:29:10ID:7nxEkg5V
>>924
それは違うんじゃね?
0928login:Penguin2008/04/14(月) 21:52:01ID:yIAGZ+M9
rm -rf /*


┐('〜`;)┌ モウツカレタ
0929login:Penguin2008/04/15(火) 07:03:22ID:KF+FiULr
dd if=/dev/zero of=/dev/hda
0930login:Penguin2008/04/18(金) 07:50:33ID:9axeonkq
運用しているマシンでちょっとした作業を行うとき、
nice bash したシェルで作業することがあるのですが、
いま自分が動かしているシェルの nice 値を簡単に
知る方法ってないですかね・・・
0931login:Penguin2008/04/18(金) 08:23:44ID:JZJIXmIH
$ ps -o %n $$

そんなことも知らない人がniceするの?
それに対話型のコマンドにniceはあまり意味がない。
0932login:Penguin2008/04/18(金) 09:08:39ID:9axeonkq
その中でmakeしまくるので
0933login:Penguin2008/04/18(金) 09:57:57ID:JZJIXmIH
alias make='nice --adjustment=-30 make'
0934login:Penguin2008/04/18(金) 11:45:33ID:u356hJZU
reniceじゃダメなんでしょうか?
0935login:Penguin2008/04/18(金) 20:06:00ID:xUbq9+ce
alias nice='ジャズ + クラシック / ロック'
0936login:Penguin2008/04/18(金) 23:11:33ID:cOa8NbkQ
nice boat.
0937login:Penguin2008/04/19(土) 13:43:25ID:khf4hkQE
>>934
>reniceじゃダメなんでしょうか?

topでもいいよな。
0938login:Penguin2008/04/19(土) 16:17:44ID:SCXXqtIf
bashのシェルスクリプトで、
文字列に正規表現のフィルタをかけたいのですが
以下の場合、なぜエラーになるかわかりません。
何が悪いですか?

expr `ps` : ".*"
-> expr: syntax error

var1="aaa"
expr $var1 : ".*"
-> expr: syntax error
0939login:Penguin2008/04/19(土) 18:02:41ID:XPjpMm+j
expr "`ps`" : ".*"

var1="aaa"
expr "$var1" : ".*"
0940login:Penguin2008/04/19(土) 20:46:24ID:SCXXqtIf
>>939
それで出来ました。ありがとうございます。
でも理由がいまいちわかりません。

” ”で囲っていない為 → 文字列型ではない為 → では$var1は何を返すのか?
0941login:Penguin2008/04/19(土) 21:02:50ID:SyasDtFa
hdやbdみたいに 2進数表示するプログラムありませんか?
0942login:Penguin2008/04/19(土) 22:41:34ID:QZlXANdf
>>941
od
0943login:Penguin2008/04/19(土) 22:50:17ID:SyasDtFa
odだと2進数は表示ですう。
もう自分で作っちゃいました・
0944login:Penguin2008/04/20(日) 10:43:22ID:C3cqRfnQ
>>940

>” ”で囲っていない為 → 文字列型ではない為 → では$va
>r1は何を返すのか?

確かに、おれも気になるぞ
0945login:Penguin2008/04/20(日) 13:49:25ID:yhaYk8sL
なんというか、このスレで話をするための最低限の知識レベルを、>>940や941は遥かに割り込んでいる気がするんだが。
0946login:Penguin2008/04/20(日) 14:55:30ID:3JVOMAOF
>>938は、自分なりに考えた結果、以下のような結論になりました。

シェルスクリプトは、型だのなんだのはなくて
C言語でいう単純なマクロの展開レベルのものしかしない。


例えば、先の例だと、
expr `ps` : ".*"
↓
expr PID TTY TIME CMD
2295 pts/1 00:00:00 bash
2407 pts/1 00:00:00 ps : '.*'
↓
シンタックスエラーでNG


""で囲うと、
expr "`ps`" : ".*"
↓
expr 'PID TTY TIME CMD
2295 pts/1 00:00:00 bash
2407 pts/1 00:00:00 ps' : '.*'
↓
OK

「echo "aaa " `ps`」が通るんで矛盾しているなぁと思っていたんですが
よく考えるとそんなことは無かったですね。
0947login:Penguin2008/04/20(日) 17:11:52ID:oNW0JD98
逆に文字列処理を一通りしてから実行させられるから、
>>938が最初考えていたみたいに単語区切りが強い場合より、
出来ることが増えるんだけどな。
その代わりプログラマがちゃんと構文構成の責任を持たないといけないけども。
0948login:Penguin2008/04/23(水) 22:57:21ID:xEICV4cP
grepの結果で AAAとBBBのOR検索をしたいのですが、

tail -f /var/log/maillog | grep [AAA|BBB]
とやってもだめでしたorz

どうすれば、OR検索ができるのでしょうか?
ANDは、パイプで追加すれば可能なのですが・・。
0949login:Penguin2008/04/23(水) 23:29:21ID:Y+58Od8z
なんで tail -f なんてする必要が有るんだ?
0950login:Penguin2008/04/23(水) 23:33:35ID:M4AkpEZt
>>948
grep -E "(AAA|BBB)" もしくは
egrep "(AAA|BBB)"
09519482008/04/24(木) 04:44:09ID:8uaGXJVC
>>950
egrepでしたか、ありがとうございます。

>>949
1秒に100行以上流れるログなので、速すぎて読めないのよねw
0952login:Penguin2008/04/24(木) 09:43:23ID:C5h8jkbM
一秒に100行以上流れるとか全然関係ないと思うぞ。
0953login:Penguin2008/04/24(木) 10:09:04ID:iBrwQJHF
そんなにおかしいか?
おれもよくやるけどな。
0954login:Penguin2008/04/24(木) 19:19:48ID:BuhR71Gk
>>952
logの監視は他にどんな手段でやってるの?
0955login:Penguin2008/04/24(木) 19:42:01ID:28W2p82+
tail -fしても速く流れるのは変わらないだろ?
大きなファイルの増分だけ見たい時は有効だけど。
0956login:Penguin2008/04/24(木) 19:54:48ID:iBrwQJHF
たとえば
tail -f access_log | grep 10.99.78.22
とかやっといて、10.99.78.22 からアクセスしながらログを見たりする。
tail -f access_log だけだとログが多過ぎるし
grep 10.99.78.22 access_log ではリアルタイムに見れない。

つーか、なんでそんなに否定したがるんだ?
0957login:Penguin2008/04/24(木) 20:51:49ID:PIJRHfrL
そんなのは常識。

tail -fするのは、増分を見たいからだろ?
速く流れるのは関係ない。それはgrepの役目。
>>949に対する>>951の答えはおかしい。

それが読み取れない>>953も疑問。
0958login:Penguin2008/04/24(木) 23:00:30ID:amh/02/G
>>956
基本だよな。それって。
0959login:Penguin2008/04/25(金) 01:12:52ID:05aUO6OC
役に立たないのは949,952,957のレスだろ
つegrep -v '(949|952|957)'
0960login:Penguin2008/04/26(土) 03:30:44ID:2buln9M4
ファイルを検索して、
ファイル名によって分岐させたいと思っています。
以下のようにスクリプトを書いたのですが、
if [ $file = *.o ]
がうまく動作してくれません。
どこが間違っているのでしょうか?

# $1はディレクトリ
for file in `find $1`
do
if [ -x $file ]; then
echo "x: Name=$file"
else
if [ $file = *.o ]; then # .oで終わるファイル
echo ".o: Name=$file"
else
echo "not .o: Name=$file"
fi
fi
done
0961login:Penguin2008/04/26(土) 03:41:55ID:l2xr5sbr
[ $file = *.o ] の * がパス名展開されるから。
こういう時は case 文使うと楽。

case "$file" in
*.o) echo ".o: Name=$file" ;;
*) echo "not .o: Name=$file" ;;
esac

09629602008/04/26(土) 04:22:04ID:2buln9M4
>>961
ありがとうございます!
>* がパス名展開される
なるほどです。

今後のためにお聞きしたいのですが、
このままifで処理するには
どのようにしたらよいのでしょうか?
0963login:Penguin2008/04/26(土) 05:02:51ID:+ITD/myA
expr でパターンマッチさせた結果を判定するのが常套手段だと思う。
でも解り易さで俺も>>961おすすめ。
shでなくbashやzshに依存するやり方で良いなら他にもあるので、manするとエエでがす。
09649602008/04/26(土) 11:07:16ID:2buln9M4
>>963
expr、なるほど。

C++やってるときも、caseなんてifがあるから要らね、
とか言ってるのをshにも持ち込んでしまったわけですが、
shではcaseを格上げします。

ありがとうございました。
0965login:Penguin2008/04/26(土) 11:09:05ID:zBt65CRz
>>964
ざけんな。switchの方がコードの見通しがよくなる場面が多々ある。
適材適所だ。
0966login:Penguin2008/04/27(日) 00:22:17ID:FoD+QJwV
一文字のみ、小文字を大文字に置換の方法、教えてください

_linux
から
_Linux
へ
(この場合、小文字lを大文字Lへ、一文字のみ)
trとかsedでぐぐってみましたが、すべての文字に適用される例のものばかりで。。。
0967login:Penguin2008/04/27(日) 00:31:12ID:mG61TWcx
echo _linux | sed -e 's/[a-z]/\U&/'
0968login:Penguin2008/04/27(日) 01:13:49ID:FoD+QJwV
>>967
ありがとうございます
期待通りの動作になりました、感謝
0969login:Penguin2008/04/27(日) 11:57:04ID:ETxngpCN
_liNux は出来ないのかな。>>967のようなスキっとした書き方で。
0970login:Penguin2008/04/27(日) 12:12:20ID:1cMdGQre
全部小文字化してから同じことしたらダメなん?
0971login:Penguin2008/04/27(日) 12:45:35ID:HcGhOMeC
>>970
誤爆?
0972login:Penguin2008/04/27(日) 22:02:04ID:q9kFxXww
>>971
誤爆?
09739712008/04/28(月) 00:36:22ID:Mw1Lj+jO
あ、いや、>>970が言うことの意味が解らんかったので誤爆と思ったんだが。
解るなら、少し噛み砕いて教えてくれまいか。
0974login:Penguin2008/04/28(月) 06:34:43ID:SsprEZLS
sedとか知らんのでperl風に。

a =~ tr/A-Z/a-z/;
if(a =~ /^[a-z]/){
}

ってことっしょ。
Cとかでは常套手段だね。
レス数が950を超えています。1000を超えると書き込みができなくなります。