シェルスクリプト総合@LINUX Part3
■ このスレッドは過去ログ倉庫に格納されています
0001login:Penguin
2007/07/10(火) 23:17:13ID:qGthZdMEまあそれはそれとして、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あたりに色々と。
0540login:Penguin
2008/01/30(水) 23:05:38ID:j0KqLeiLhttp://www.redout.net/data/osietekun.html
0541login:Penguin
2008/01/30(水) 23:39:48ID:KwdpVGiVGUIのシェルってのはそう最近でもないと思う。
DOSSHELLとか、X68kのVS.Xとかあったじゃないか。
0542login:Penguin
2008/01/31(木) 00:54:52ID:5zXcU2rlうわーきもい。シェルを作るという表現はおかしい
シェルの作り方って、VBの作り方、Javaの作り方
聞いているのと同じ。それをKY言うのは異常。
for文とifを組み合わせれてループさせれば。
0543login:Penguin
2008/01/31(木) 05:38:28ID:sRx07lee>わからないなら無理にレスしなくていいです。
たぶんここの人は9割以上わかっていると思う。
0544login:Penguin
2008/01/31(木) 05:47:16ID:sRx07lee態度の豹変に腹が立つ。
mv -i `neko a.list` a
mv -i `neko b.list` b
mv -i `neko c.list` c
0545login:Penguin
2008/01/31(木) 13:37:31ID:zeMbksrC単純にnukoするよりもls -1 | grep -f a.list
とかしてより分けた方が良くないか?
0546login:Penguin
2008/01/31(木) 19:50:10ID:/M27f8tado
echo $変数名
done
この構文の変数名ってなんでもいいんですか?
あとこれを実行すると
10
20
30
になりますよね?
0547login:Penguin
2008/01/31(木) 20:53:32ID:p8W84r95変数名に使える文字は英字と数字、アンダースコアのみな。
0548login:Penguin
2008/01/31(木) 21:07:34ID:Ih8EaxE5$ for 9_var in 10 20 30; do echo $9_var; done
bash: `9_var': not a valid identifier
0549login:Penguin
2008/01/31(木) 21:49:51ID:g7asi3X7こんなところで釣りなんかすんなよ...
もし釣りじゃなくってバカなんだったら、せめてmanするとかググるセンセに聞くとか、な?
0551login:Penguin
2008/01/31(木) 23:25:56ID:g7asi3X7う゛、勘違いとかtypoとか。いかんな、落ち着かんと。
でもってマヂレスしとくと、変数の1文字目は数字じゃダメな。
0552login:Penguin
2008/02/01(金) 20:50:34ID:aG/PrNJ9STRING1 を含んでいて、かつ STRING2も含んでいる行だけを
印字しようとおもうのですが、
grep STRING1 kakikomi.txt| grep STRING2
くらいしか思いつきません。二度手間な気がします。
もう少しいい方法ありませんか?
0553login:Penguin
2008/02/01(金) 20:57:02ID:IKSH1LNN0554login:Penguin
2008/02/01(金) 21:42:25ID:KLEwAeBFそれ前スレ(UNIX板のほうだったかも試練)で話題になったな
「STRING1とSTRING2を『順不同で』含む行をイッパツで引っ掛けようとしたら
egrep '(STRING1.+STRING2)|(STRING2.+STRING1)'
となってしまう。2個ならまだいいが、3個、4個...と増えていくと正規表現がキモいことになってしまう。
順不同という条件なら、>>552のやり方が一番シンプル
0555login:Penguin
2008/02/01(金) 22:20:29ID:9CGaNXUyとか。
0556login:Penguin
2008/02/01(金) 23:10:27ID:aG/PrNJ9ありがとうございました。
最近暇なので本でいろいろ勉強してみます。
0557login:Penguin
2008/02/02(土) 02:58:37ID:jQtmOvcuhttp://www.sexydesktop.co.uk/youko.htm
ここには全部で4ページ分48種類の松金洋子の画像がある。
## このサイトの画像はすべてデスクトップ用の壁紙を目的としているので、
## 一つの画像に関して数種類の解像度・縦横比の画像が用意されており、
## アクセスしてきた人の使っているディスプレイ解像度を検出しては、
## 最適な解像度のものを優先的にプッシュするようになっている。
## また、画像ファイルの命名ルールは非常に単純かつ形式的で、
## たとえば例に挙げた松金洋子の画像の場合、
## まず画像の名前を表す youko1 から youko48 までの48種類の画像が用意されている。
## さらにそれぞれの解像度を表す 1280x800 や 800x600 の文字列が続き、
## 最後に拡張子 .jpg が付けられている。
## 注意する点があるとすると、例えば youko48 に対して youko01 だとか、
## 1280x1024 に対して 0800x0600 といった「桁数合わせ」が一切行われていないということ。
0558557
2008/02/02(土) 02:59:35ID:jQtmOvcu1). サイトがプッシュしてくるこちらのディスプレイ解像度に関係なく、
すべての画像について、解像度のより大きいバージョンを、
番号の一番若いものから古いものまで全種類取って来たい。
2). その際、取って来た画像のファイル名を修正して、
youko48 に対しては youko01 、1280x1024 に対して 0800x0600 などの「桁数合わせ」をしたい。
3). さらに、ファイル名の中の画像名を表す文字列と、解像度を表す文字列とを _ で結ぶようにしたい。
具体的には、youko11600x1200.jpg と名付けられた youko1 という画像の 1600x1200 版のファイル名を、youko01_1600x1200.jpg としたい。同様に、youko481280x1024.jpg と名付けられた youko48 という画像の
1280x1024 版のファイル名を youko48_1280x1024.jpg としたい。
以上をまとめると、参考例の松金洋子の画像で言えば、
youko11600x1200.jpg から youko481280x1024.jpg までの画像を、
youko01_1600x1200.jpg から youko48_1280x1024.jpg として保存したい。
これを実現するスクリプトをどう書けばいいでしょうか?
なお、好みのタレントの画像が何種類用意されているか(松金洋子の場合は48種類)については、
ダウンロードを開始する前に手作業で調べることとします。
0559login:Penguin
2008/02/02(土) 03:11:26ID:BYWZpRq/まずお前が考えて出来たスクリプトをうpしろ
話はそれからだ
0560557-558
2008/02/02(土) 03:17:30ID:jQtmOvcu後で手作業で仕分けする、みたいな超バカなことしかできんのです。
だからエロい人に教えてほしいんです。。
ダメならヒントだけでもいいので下さい。
0561login:Penguin
2008/02/02(土) 03:19:54ID:BYWZpRq/ほらよ
っ google.co.jp
0562login:Penguin
2008/02/02(土) 07:40:21ID:QLk1rUEbたぶんリネーム関連はperlか何か使ったほうがラクじゃね?
0563login:Penguin
2008/02/02(土) 08:38:47ID:VQl51rL60564login:Penguin
2008/02/02(土) 10:16:29ID:2Gx0/Givaaaaaaaaaaaaaaaaaaaaaaaaaa
+bbbbbbbbbb
cccccccccccccccccccccccc
+ddddddddddddddd
長い行は先頭に+をつけて折り返しているという内容のファイルを
$cat test.txt
aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbb
cccccccccccccccccccccccc ddddddddddddddd
というように+の折り返しを前の行の後ろに空白付で結合させるにはどうすればいいでしょう?
0565login:Penguin
2008/02/02(土) 10:19:50ID:QLk1rUEb0566login:Penguin
2008/02/02(土) 10:34:51ID:2Gx0/Giv実行したら
$cat test.txt
aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbb cccccccccccccccccccccccc ddddddddddddddd
みたいになりましたが
$cat test.txt
aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbb
cccccccccccccccccccccccc ddddddddddddddd
これが出力としてほしいです。
\nと+が別で判断されているのでしょうか・・・
0567login:Penguin
2008/02/02(土) 10:37:11ID:QLk1rUEb0568login:Penguin
2008/02/02(土) 10:39:50ID:QLk1rUEb0569login:Penguin
2008/02/02(土) 10:41:24ID:2Gx0/Giv同じ結果でしたw
レスありがとう!
0570557-558
2008/02/02(土) 10:50:34ID:jQtmOvcuどうもです。
えー、そういう名前のファイルは存在しないので考えてもみませんでした。
>>562
もし $name$no1024x768$suffix がある時 $name$no1024x0768$suffix にせよ、
みたいなことを延々とやる、ということなんでしょうか?(←無知)
うーん。。。
0571login:Penguin
2008/02/02(土) 11:02:51ID:jHuzpaacif 先頭が+じゃない then
echo ""
else
echo -n " "
fi
echo -n 行
0572login:Penguin
2008/02/02(土) 12:30:06ID:A3vIBKBised 'N;s/\n+/ /;t;P;D'
0573login:Penguin
2008/02/02(土) 14:09:27ID:2Gx0/Givありがとうございます!!
0574login:Penguin
2008/02/05(火) 19:10:25ID:E60rvXpxそこからディレクトリ名だけを切り取りたいと考えています。
/tmpには a b c というディレクトリがあるとして
$ find /tmp -type d -maxdepth 1 -mindepth 1 | xargs awk -F/ '{print $NF}'
を実行すると a だけが出力されてしまいます。
望んでいる出力は a b c なのでうまく出力されるようにしたいです。
findのみを実行すると
/tmp/a
/tmp/b
/tmp/c
と出力されることは確認しました。
申し訳ないのですが良い方法をご教授ください。
0575login:Penguin
2008/02/05(火) 19:18:42ID:DHgW4Gk4find /tmp -maxdepth 1 -mindepth 1 -type d | sed -e 's/.*\///'
find /tmp -maxdepth 1 -mindepth 1 -type d -exec basename {} \;
0576574
2008/02/05(火) 19:21:21ID:E60rvXpx$ find /tmp -type d -maxdepth 1 -mindepth 1 | xargs echo | awk -F/ '{print $NF}'
の間違いでした。
よろしくおねがいします。
0578login:Penguin
2008/02/06(水) 21:11:41ID:Qs2nEtFk($Fはlsの結果が入る)
if expr "$F" : '[[:alunum:]_-]\+$' > /dev/null 2>&1; then ...
特に : '[[:alunum]_-]\+$'の箇所が分かりません
自分で調べて分かったのは
[:alunum:]が数値を表すPOSIX準拠の文字クラスであること
:はヌルコマンド
[]が正規表現とすると[[:alnum:]_-]\+$は以下のいずれかという意味でしょうか
数値+$
_+$
-+$
だとしても前半の:とのつながりもよく分からないです..
0579login:Penguin
2008/02/06(水) 21:39:32ID:2Q3KS/FBヌルコマンドではない。
[[:alnum]]_-]¥+$ は、
「英数もしくは _ もしくは -」([[:alnum]]_-])の繰り返し(¥+)で末尾になる($)パターン。
つまり$Fが↑のパターンにマッチするかで判断するif文だな。
出力を/dev/nullに捨てている理由は、exprの動作を調べればわかる。
0580login:Penguin
2008/02/06(水) 22:12:35ID:Qs2nEtFkexprについては、nullまたは0を返した際に0を返すという仕様のため
/dev/nullに出力していることはすぐ分かったんですが
「:」もexprの構文だったんですね
ずっとシェルのパターンマッチの構文として「:」を調べていたため
ハマってました,thx!
0581login:Penguin
2008/02/07(木) 17:29:04ID:SojUAx7O??? | head -n xx | tail -n xx 以外に良い方法はあるでしょうか
0582login:Penguin
2008/02/07(木) 18:31:29ID:K+RTjMO0もういちど確認した方がよいと思われ
0583login:Penguin
2008/02/08(金) 08:15:13ID:D8JF1iVIsed -n '5,$p' file.txt | tac | sed -n '5,$p' | tac
…意義が見出せない。。。
0585login:Penguin
2008/02/08(金) 15:38:14ID:Yg3sGZTq白紙で出せば...
0586login:Penguin
2008/02/08(金) 16:08:13ID:z5e2UbEF0587login:Penguin
2008/02/08(金) 16:57:33ID:rygBoGE60588login:Penguin
2008/02/08(金) 19:53:27ID:8gRlFmfx>他になwwwwいですか?www
のように、wを適当にまぶすスクリプトを誰か考えてくれ。
0589login:Penguin
2008/02/08(金) 21:34:44ID:Z8wDJkcZこんなwwのを作っwwwwてみたんwwだがww
どうだろうかwww
とりあえずwwwwちゃんwwと動いてるよwwうだがwwww
どんな例外wwがあるwwかわからんwww
#!/bin/sh
CHAR='w'
insertw() {
i=0
w=`expr $RANDOM % 3 + 2`
while [ $i -lt $w ]; do
i=`expr $i + 1`
echo -n $CHAR
done
}
while read LINE ;do
while [ "$LINE" ]; do
r=`expr $RANDOM % 6 + 2`
echo -n `echo $LINE | cut -c -${r}`
insertw
r=`expr $r + 1`
LINE=`echo $LINE | cut -c ${r}-`
done
echo ""
done
0590589
2008/02/08(金) 21:45:59ID:Z8wDJkcZ$RANDwwwwOM使wwってるのwwwで本wwww当のshではww動かなwwwいはずだけど,wwwここはwwLinux板wwwってことwwwで許wwwwしてもらえるwwよね?
0591login:Penguin
2008/02/09(土) 21:05:58ID:sA/Tx79N[a-z]で小文字のアルファベット全てにマッチですよね。
ならば
[あ-ん]でひらがな全てにマッチしますか?
0592login:Penguin
2008/02/09(土) 21:44:35ID:y7ESpv1X0593login:Penguin
2008/02/10(日) 00:32:01ID:HzElnwAKそれはそうと、多バイト文字の正規表現って、大抵のアプリケーションで普通に使えるものなのか。
知らなんだ。
0594login:Penguin
2008/02/10(日) 01:02:27ID:bq0IfXwT% cat file1
aaa%sbbbccc
% cat file2
ZZZ
% hoge %s file2 < file1
aaaZZZbbbccc
のような動作を期待しています。
挿入するファイルは少し長めなのでsedで置換ではできない気がしています。
awkあたりでfile1を%sが出るまで出力 -> file2を出力 -> file1の%s以降を出力
という方法を考えていますが、もし専門のコマンドがあれば教えてください。
0595594
2008/02/10(日) 01:12:39ID:bq0IfXwT一旦使ってみます
0596login:Penguin
2008/02/10(日) 01:14:06ID:AyxHcvsn0597login:Penguin
2008/02/10(日) 01:52:24ID:EflaE009おまえFedoraすれにいなかったか?
0598login:Penguin
2008/02/10(日) 06:29:30ID:7q9QRaK3printf "`cat file1`\n" `cat file2`
0599login:Penguin
2008/02/11(月) 23:47:20ID:wSzjm7y4grep でやってみたらマッチしやがったよ。
0600login:Penguin
2008/02/12(火) 02:36:00ID:NhGbxXsu全角文字も一文字として扱える、というのとでは意味がぜんぜん違う。
0601login:Penguin
2008/02/13(水) 03:57:10ID:Z8x6psMH0602login:Penguin
2008/02/13(水) 23:44:52ID:3LjmFUstMS-Windowsとの可搬性に最も富むスクリプトは何ですか?
ただし、cygwin環境とperlは除外して。
0603login:Penguin
2008/02/13(水) 23:58:15ID:jHUDsaVWjavascriptに一票
0604login:Penguin
2008/02/14(木) 00:56:22ID:axFZQkw/awk,ruby,Python つーかなんでperlダメなの?
たしかにWinのperlめんどいけどね。
0605login:Penguin
2008/02/14(木) 20:13:50ID:oi3zsBt5指定されたファイルを再生するスクリプトを考えてみました。
これだとファイル表示の見た目がいまいちなんですが、カラムを揃えて
表示するようなうまいやり方はありますか?
i=1
for file in *.mp3
do
#3カラムで出力する
x=`expr $i % 3`
if [ $x -eq 0 ]
then echo -e "\033[1;31m$i\033[0m.$file"
else
echo -en "\033[1;31m$i\033[0m.$file "
fi
a[i]=$file
(( i=i+1 ))
done
echo -n "number? >"
read n
if [ -f "${a[n]}" ]
then mplayer "${a[n]}"
else
echo "ファイルがありません"
fi
0606login:Penguin
2008/02/14(木) 21:53:57ID:gBoeKdqH#!/bin/sh
FS=`zenity --file-selection`
#このままだと動画なんかもいけるけど、どうしても*.mp3のみにしたい場合は↑行を
#コメントアウトして↓行を有効にする
#FS=`ls *.mp3 | zenity --list --column "Files"`
if [ -z "${FS}" ]
then
exit
fi
mplayer "$FS"
なんつってってねw
0607login:Penguin
2008/02/14(木) 22:01:12ID:vsXOhty30608login:Penguin
2008/02/14(木) 22:52:41ID:fZu2vsjDperl.exeの他に色々MS-Windows側に入れなきゃならないものがあるので可搬性に欠けるという理由を考えてみましたが、実は嫌いなだけです。
>>605
3列にこだわらないのなら、bashのselectはどうでしょう。
#!/bin/bash
select name in *.mp3
do
echo "mplayer ${name}"
#break
done
0609login:Penguin
2008/02/15(金) 02:46:55ID:4QUqq28Iprintf で頑張るという選択肢もある。
0610605
2008/02/15(金) 19:02:00ID:BuE7cyMUselectを使うのが簡単でイメージどおりなので、それでいきたいと思います。
0611login:Penguin
2008/02/16(土) 14:41:12ID:rUKDlildキモいね
0612login:Penguin
2008/02/16(土) 14:52:30ID:TWToK0Vy0613login:Penguin
2008/02/16(土) 15:09:40ID:hFdiJNir0614login:Penguin
2008/02/16(土) 15:14:02ID:TWToK0Vy0615login:Penguin
2008/02/16(土) 15:25:59ID:hFdiJNir> if [ $KIMOI ]; then
> echo kimoi
> else kimokunai
> fi
kimoi
となります.助けてください><
0616login:Penguin
2008/02/16(土) 16:57:40ID:TCXFbGKjif $KIMOI; then
0617login:Penguin
2008/02/16(土) 19:13:59ID:TWToK0Vyexport KIMOI=
が正解なのだ。
0618login:Penguin
2008/02/17(日) 01:08:38ID:iw9ufgAVなぜそうなるか素人の私にも解説してくだされぇ〜
0619login:Penguin
2008/02/17(日) 01:11:52ID:slw092IT0620login:Penguin
2008/02/17(日) 01:27:34ID:PyTcVmai0621login:Penguin
2008/02/17(日) 03:00:02ID:tnXxiXa8if文やwhile文の条件部に書くのは、実はコマンド。
コマンドの終了コードが0なら条件が成立したとみなされる。
で、true(0を返す)やfalse(1(非0)を返す)というコマンドがあるわけだな。
ちなみに [ もコマンドだ。
0622login:Penguin
2008/02/17(日) 09:32:32ID:OGJD7PPY$KIMOIに"false"という文字列を代入してるだけ。
0623login:Penguin
2008/02/17(日) 14:07:35ID:4A7UiB6D俺らはゴーストですか
0624login:Penguin
2008/02/17(日) 14:21:15ID:slw092ITネットは広大だよな
0625login:Penguin
2008/02/17(日) 14:29:38ID:uY7SK9GA否、貴腐人間かもw
0626login:Penguin
2008/02/17(日) 14:38:41ID:slw092IT元ネタwkrn
0627login:Penguin
2008/02/17(日) 14:42:27ID:uY7SK9GA0628login:Penguin
2008/02/17(日) 14:44:26ID:slw092ITtnks
0629login:Penguin
2008/02/18(月) 07:12:54ID:AGIm4SRV0630login:Penguin
2008/02/18(月) 11:55:16ID:VgIMGwkB(cd /; zenity --file-selection)
0631login:Penguin
2008/02/18(月) 13:16:10ID:AGIm4SRVありがとうございます。
やってみます。
0632login:Penguin
2008/02/19(火) 08:50:21ID:90boQwVS0633login:Penguin
2008/02/19(火) 09:00:32ID:7ADZuvq7ルーチンワークで楽できる(場合がある)
0634login:Penguin
2008/02/19(火) 16:05:41ID:VrKwqWf/作業の自動化や、例えばユーザを100人登録しないといけないとか言う、膨大な作業を
物凄い速度で短時間で終わらせる事が出来るようになるとか。
0635login:Penguin
2008/02/19(火) 17:25:49ID:90boQwVSほほぅ、ありがとうございます。
0636login:Penguin
2008/02/19(火) 19:54:38ID:oWc/fsPo高級な紙と鉛筆だとしか思ってなさげな人。たまにいるけど……。
0637login:Penguin
2008/02/19(火) 19:56:54ID:7ADZuvq70638login:Penguin
2008/02/19(火) 23:07:22ID:VrKwqWf/どんなにそれが重労働だろうが難しい計算をしないといけなかろうが、
忠実に高速かつ正確、大量に実行させる事が出来るから凄いよ・・・。
ただし、その仕事の仕方を教える(アルゴリズムを教える)のがかなり苦労するんだけどな・・・。
0639login:Penguin
2008/02/20(水) 03:07:58ID:eOYCs3Nz0640login:Penguin
2008/02/20(水) 03:37:12ID:Z0UaqwNw基本的に人間には絶対できない、ということを知らない者は>>639だけだというだけの話かと。
■ このスレッドは過去ログ倉庫に格納されています