07/10/12 17:40:09 sUVuIX9s
>>234
ごめん!間違った。
./shell.sh じゃなくて
. ./shell.sh でした。
. を打って1個スペース空けて シェルスクリプトファイル指定。
238:login:Penguin
07/10/12 17:46:35 5+kNLqtp
>>237
なんで ./ を付けるの?
239:login:Penguin
07/10/12 17:59:22 +Kk0eMQd
Yeah!めっちゃホリデイ
240:login:Penguin
07/10/15 14:50:05 NjtHefoB
特定のURLを一定時間に読み込むシェルスクリプトをつくりたいのです。
今のところwgetを使ってwget URLリンク(hogehoge) をクーロンで動かす予定ですが
もっとスマートなやりかたはありますか?
241:login:Penguin
07/10/15 22:15:04 yaqxWPIK
>>240
それでいいんじゃね?
242:login:Penguin
07/10/15 23:35:58 6xnjJ9Cn
>>241
じゃあ1分に1回よりも高頻度(30秒に1回とか、15秒に1回とか) やりたい場合はどうすれば?
243:login:Penguin
07/10/16 00:24:31 7lwU6GvW
アタックしたいのか?
244:login:Penguin
07/10/16 01:36:38 IhGBMLbJ
>>242
wget URLリンク(...;)<)
するスクリプトを毎分実行するとか。
245:login:Penguin
07/10/16 08:18:30 a72PxkLH
>>243
アタックしたいわけじゃないですよ。
ただcronって最高でも1分に1回しか実行できないはずなので、それよりももっと短い間隔で
処理をさせたい場合とかどうするのかなぁとふと疑問に思ったもので。
>>244
なるほど・・。 しかし wget URLリンク(...)<) がくるから、タイミングと言うか場合によっては
30分に1回キッチリ実行されるとは限りませんね。31分かかって、その後実行されて
今度は29分後に実行されるみたいなズレ方はしますよね。
246:login:Penguin
07/10/16 08:26:34 IhGBMLbJ
>>245
バックグラウンドで実行するとか。
つーか、何分もかかる処理を30秒ごとに実行していいのか?
247:login:Penguin
07/10/16 11:46:31 wfMufGFC
cronはプロセスが無限増殖するのを抑えるために、同時実行数に制限があるので注意
Solarisだと、確か同時実行数が100個を超えるとそれ以降は時刻が来ても起動しなくなる
LinuxだとOOMキラーが動いて刈り取られるかもしれん
cronの起動間隔 ≒ プロセスの実行時間
となるような長めのプロセス、特に通信関係とかで長めのタイムアウトが発生しそうな
プロセスをcronに仕込むときは、注意したほうがいい
248:229
07/10/16 13:58:23 EtpWijek
環境が手元にないもので、遅レスになってしまいすみません。
>>235
なるほどです。ありがとうございました。
>>236
ありがとう。aliasでも出来そうでした。
>>237
.の後に続けて入力したところ、うまくcdできました。
>>238
素人なのでよく分かりませんが、実行ファイルを実行するときに付けるんでは?
それでは、みなさんありがとうございました。
249:login:Penguin
07/10/16 14:09:44 IhGBMLbJ
>>248
. shell.sh
でもいっしょだよ。
やってみ。
250:login:Penguin
07/10/16 17:45:32 a72PxkLH
./ を つけるのは カレントディレクトリのファイルを指定する為。
つけないと 環境変数 $PATH の中から該当する物が無いかを探してなかったら
エラー返すので。 カレントディレクトリのファイルを指定する時にいちいち
./ をつけるのが面倒だからって $PATH に ./ も含めてしまうとセキュリティホールになるので
やらないでね。
251:login:Penguin
07/10/16 17:50:59 IhGBMLbJ
>>250
>>249
252:login:Penguin
07/10/16 18:39:11 tU6zGUOB
シェルスクリプトで端末の現在の行数を得るにはどうしたらいいですか
253:login:Penguin
07/10/16 19:18:04 iHfKM46h
stty -a とかかな。
254:login:Penguin
07/10/16 19:45:06 tU6zGUOB
>>253
情報ありがとうございます。
行数を表示するだけでなくて、
シェルスクリプトの中で行数を変数に格納して、
なんらかの処理を行いたいと思っているのですが
何かうまい方法はありますでしょうか
255:login:Penguin
07/10/16 21:12:10 pdm4T3SF
>>254
ROWS=`stty -a | tr ";" "\n" | grep rows | sed "s/.*rows //"`
256:login:Penguin
07/10/16 21:36:05 tU6zGUOB
>>255
できましたありがとうございました。
257:login:Penguin
07/10/16 23:32:43 sWAUZpv3
$LINES じゃだめなの?
258:login:Penguin
07/10/17 04:58:42 d5Vjha9K
シェルスクリプトの中で$LINESがとれるとでも?
259:login:Penguin
07/10/17 10:00:57 9KXOUzKW
ROWS=`tput lines`
COLS=`tput cols`
260:login:Penguin
07/10/17 22:15:42 VuOM9tU/
eval `resize`
echo $LINES $COLUMNS
261:login:Penguin
07/10/18 12:39:19 fyMSNeWa
>>260
resize は X がインストールされていない環境では使えない。
xterm の付属物なので。
262:login:Penguin
07/10/23 17:14:39 OMh5qn/O
ちょっと相談に乗ってください。
日付.pc名.サイト名_access_log
ex)
20071023.pc-local01.hoge_access_log
20071023.pc-local02.hoge_access_log
20071023.pc-local01.hagehoge_access_log
20071023.pc-local02.testhoge_access_log
と言うログファイルをサイト名別のフォルダに移動した後
1つのログファイルにマージさせるスクリプトを書きたいのですが。
とりあえず、スクリプト書いてみたのですが正直何がなんだか
分かりません。アドバイスを下さい。
#!/bin/sh
timestamp=`date +%Y%m%d`
log=`find /home/hoge/log -name $timestamp.*`
list=`echo "$log" | sed -e 's/_access_log//g' | cut -c57-`
スクリプトでは、今日のタイムスタンプを取ってlogファイルを検索し
その結果のサイト名以降の”_access_log”を消して、サイト名より前
も入らないので、表示させないようにする。これから、サイト別にフォルダを
作ってそこに移動させるのですが、mkdir "$list"では上手く行きません。
何かいいアドバイスを教えてください。よろしく御願いします。
263:login:Penguin
07/10/23 17:19:48 4jX2ZQqu
>>262
cut -c57- ってのは何?
264:login:Penguin
07/10/23 17:20:31 XqFIvlF4
>>262
シェルスクリプト以前の話だな。
まずは最終的に何をやりたいのかをはっきりしろ。
265:login:Penguin
07/10/23 17:26:06 4jX2ZQqu
>>262
$log にたくさんファイル名が入ってるのに
echo $log をいじろうとするのがよくわからんな。
>>264
まずは日本語の勉強からだな。
266:login:Penguin
07/10/23 17:50:56 OMh5qn/O
>>263
サイト名だけの文字を取りたかったので、cut -c57- としました。
>>264
申し訳御座いません。
ログファイル名からサイト名だけを文字を取り出して、取り出した文字
(サイト名)のフォルダを作って、作ったフォルダにそれぞれログを
振り分けてログファイルをマージさせたいです。
これで、少しは伝わりますでしょうか?
>>265
$logの結果からサイト名の文字だけ取りたかったので、echo $logを
いじっています。
267:login:Penguin
07/10/23 18:08:13 XqFIvlF4
>>266
プログラミングの論理部分を勉強したほうがいい。
「やりたいこと」と「実際のスクリプト」の間には
「ロジックを組み上げる」作業が必要になるが、
君はこの部分について全く理解できていないようだ。
まずは
「findで検索したファイルの一覧はどういう形で変数logに入っているのか」
「その変数logに対して繰り返し処理を行なうにはどうしたらよいか」
を調べてくるべし。
268:login:Penguin
07/10/23 18:09:14 4jX2ZQqu
そもそも find でうまくいかんな。
269:login:Penguin
07/10/23 18:17:19 OI+rqPpl
>>262
find . -type f -printf %f\\n|awk -F. '{gsub(/_access_log/,"",$3);print $2 "." $3}'|uniq >hostlist
for i in $(cat hostlist);do mkdir $i;done
あとawkで同じように
cp 20071023.pc-local02.testhoge_access_log pc-local02.testhoge
のようなlist作って実行
270:login:Penguin
07/10/23 18:18:51 OMh5qn/O
>>267
アドバイスありがとうございます。
正直、インフラ担当なのでプログラムさっぱりです(;´Д`)
とりあえず、ググって調べてみます。
>>268
もう少し調べてから、スクリプト書き直します。
ありがとうございました。
271:login:Penguin
07/10/23 18:20:53 OMh5qn/O
>>269
ありがとうございます。
参考にさせて頂きます。とりあえず、スクリプト周りを調べて
書いてみます。
272:login:Penguin
07/10/23 18:25:49 4jX2ZQqu
#!/bin/sh
cd /home/hoge/log
for i in `date +%Y%m%d`.*; do
dir=`echo $i | cut -f2 -d.`
[ -d $dir ] || mkdir $dir
mv $i $dir
done
ファイル数が多過ぎるとかヘンなファイル名とかは知らね。
273:login:Penguin
07/10/27 10:44:25 mm4VeEeL
IPアドレスを16進に変換したいです。
どうやりますか?
274:login:Penguin
07/10/27 13:17:13 D/VUEDKM
echo '192.168.0.1' | gawk -F. '{printf("%02x%02x%02x%02x\n", $1, $2, $3, $4)}'
275:login:Penguin
07/10/27 13:26:52 QMQXG4ov
>>274
俺のIPサンプルに使うなよ。晒されたら攻撃の的になるだろうが(´・ω・`)
276:login:Penguin
07/10/27 13:35:53 6kGxUA5U
>>274
ありがとうございました。
277:login:Penguin
07/10/27 14:33:40 NSYPc3Nw
>>275
ネットに繋がらないと思ったらお前のせいかー!
早く俺のIP返してくれよ(´・ω・`)
278:login:Penguin
07/10/27 15:34:59 XQQiaIjq
>>275
そうか、そんなにお望みなら今から的にしてやるよwww
タシロ砲とブラスターとあと手持ちの攻撃ツールの標的IPを全部セットして攻撃開s
279:login:Penguin
07/10/27 19:24:46 OFawlVSO
俺のIPは127.0.0.1だから攻撃するなよ
280:login:Penguin
07/10/27 21:20:28 jIwdHtQL
ひどいネタスレと化してるなココwwwwww
281:login:Penguin
07/10/29 10:48:36 AXA/ueYo
俺のIPは172.31.0.1だぞ。
282:login:Penguin
07/10/29 10:55:37 PqFYrP+5
もういいよ。
283:login:Penguin
07/10/29 11:01:37 F/RFN0ba
俺のIPは203.・・・・
いややめとく
284:login:Penguin
07/10/29 18:16:52 lN+2vPd7
じゃあオレも1個
オレのIPは
169.254.88.24だぞ。
285:login:Penguin
07/10/29 20:28:52 vqPZDaQA
あ、思い出した。
255.255.255.255 -> 0xffffffff
のように、IPv6表記を16進表記に変換する手続きを考えてくだちい。
f000::1 -> 0xf0000000_00000000_00000000_00000001 ("_"は不要)
ff::169.254.88.24 -> 0x00ff0000_00000000_00000000_a9fe5818
286:login:Penguin
07/10/29 23:28:48 Hdkrl+3D
完全に他人まかせだなぁ。
> ruby -rsocket -e 'p Socket.gethostbyname("ff::169.254.88.24")[3].unpack("C16").map{|c|format "%x",c}.join'
"00ff00000000000000000000a9fe5818"
287:login:Penguin
07/10/30 21:40:02 Hmkhn1Qf
あー、目鱗。
gethostbyname()等を使えばいいのか。
288:login:Penguin
07/11/06 00:15:33 vKEt0xzk
あるコマンド(hoge)の結果が・・・
(カラム位置) [col1 col2 col3 col4]
(コマンド出力) 0001 0002 * 0004
である場合にこの結果をset `hoge`で受けた場合、位置変数
$3に「*」が入ってくるようにbashのスクリプトを作成したい
のですが現状ではどうやってもカレントディレクトリ配下の
ファイル一覧が入ってきてしまいます。
何か良い手がありましたら教えて下さい。
289:login:Penguin
07/11/06 00:55:19 M5wBEVHJ
"`hoge`"
290:login:Penguin
07/11/09 03:25:37 r4+4tELy
>>289
オイオイ!w
マジレスすると
$ set -o noglob
じゃないの
291:login:Penguin
07/11/09 06:12:20 BEUM5jSj
>>300
zenity を使うとシェルスクリプトで手軽な GUI が作れるぞ
292:login:Penguin
07/11/09 08:21:31 kDM6jkym
URLリンク(www.google.co.jp)
でトップに出て来るページは、もしかしてケンカを売ってますか?
>最新のGnomeデスクトップを使っていても古いUnixユーザーはすぐにターミナルエミュレータを開いてしまいがちです。
293:login:Penguin
07/11/09 12:05:22 ei55nGr2
文章全体から見てポジティブな物言いだと思うが...
294:login:Penguin
07/11/10 01:20:06 5ErO5tFm
zenity の使用例: jpg と mp3 をあわせて avi を出力するスクリプト
音声ファイルをビデオホスティングサイトに投稿時に使用
====================================
#!/bin/sh
# mp3jpg2avi.sh
JPG_FILE=`zenity --title="JPG ファイルを選択してください" --file-selection`
MP3_FILE=`zenity --title="MP3 ファイルを選択してください" --file-selection`
zenity --title="質問" --question --text "変換開始しますか?"
if [ $? = 0 ];
then
ffmpeg -shortest \
-loop_input -f image2 -i $JPG_FILE \
-i $MP3_FILE \
-sameq output.avi
fi
====================================
295:login:Penguin
07/11/10 09:47:24 9Zj/zooJ
>>292
Linuxから入った人だけど、Gnomeなんてマルチウインドウ端末エミュレータ支援ソフト西か見えません
296:login:Penguin
07/11/10 11:07:23 vw7Wu+HW
マルチウインドウ端末エミュレータ支援ソフト西やら
マルチウインドウ端末エミュレータ支援ソフト力石やら
マルチウインドウ端末エミュレータ支援ソフトホセ=メンドーサやら知らん。
297:login:Penguin
07/11/10 11:19:14 9Zj/zooJ
>>296
一応ここでタオル投げときますね。つ~
298:login:Penguin
07/11/10 18:43:49 Skjd8N2z
そういやこの間表参道歩いていたら、
胸にでっかく
「マンモス西」
と書かれたTシャツを着たガイジンが
前からいきなり歩いてきてビビった。
東京は怖い街だよ。
299:login:Penguin
07/11/10 19:19:41 PRddAKpB
そんなアナタに
URLリンク(engrish.com)
300:login:Penguin
07/11/10 20:24:35 Skjd8N2z
そこのこの写真に、"Photo courtesy of Paul Gilbert"ってあるけど、
あのポールギルバートなんだろうか?
URLリンク(www.engrish.com)
日本に住んでたしなあ。
301:HhMiKdKNVb
07/11/12 01:38:17 J0HpIKvZ
hlUotX <a href="URLリンク(jtpkztrjwlma.com) [url=URLリンク(ykcooubrqrga.com) [link=URLリンク(tvapeckiqvbf.com) URLリンク(cygdvmjubaqg.com)
302:login:Penguin
07/11/13 02:33:43 tnRwnYpT
恥を忍んで質問なのですが
/home/me/ 以下にjpgファイルが数千有ります
中身はこんな感じなのですが
1082053423922.jpg
1082053508305.jpg
1082053537535.jpg
1082053614971.jpg
1082053699948.jpg
1082053732609.jpg
1082053763346.jpg
1082391828601.jpg
1082392563669.jpg
1083091232922.jpg
この数千の*.jpgのファイルをディレクトリから読み込んで以下タグの中にディレクトリから読み
インクリメンタルに全ての画像ファイルがリンク代入された状態で出力したいと思っています
<div id="myGallery">
<div class="imageElement">
<h3>Item 1 Title</h3>
<p>Item 1 Description</p>
<a href="mypage1.html" title="open image" class="open"></a>
<img src="images/foo/a.jpg" class="full" />
<img src="images/foo/a-thum.jpg" class="thumbnail" />
</div>
ディレクトリから読み込んだfileの名前a.jpgににファイルの中が無くなるまで
置換したいという意味なのですが..
どうか、助言願えないでしょうかm(__ __)m
303:login:Penguin
07/11/13 07:47:54 xB6HVDtO
まずは「この数千の……」以降の文章を推敲して他人に理解できるよう
書き換える。
304:login:Penguin
07/11/13 10:11:50 VZT+kd7x
>>302
zphoto でも使ったら?
305:login:Penguin
07/11/13 12:34:27 v1//zET/
こういうことか?
for f in `ls -1 /home/me` ; do echo '<img src="images/foo/'$f'" class="full" />'; done
for f in `ls -1 /home/me | gawk '{gsub("\\\.", "-thum.");print}'` ; do echo '<img src="images/foo/'$f'" class="full" />'; done
306:302
07/11/13 14:02:39 tnRwnYpT
>>303
深夜に回転数が落ちていまして申し訳ないですm(_ _)m
>>304
それも考えたのですが、出来ればこちらの方が良いなと思いまして..
>>305
バッチリ書き出せました、もの凄い感謝なのですが
thumとthum無しのイメージが交互に書き出すことが出来ると思います
教えていただいた物を各ディレクトリに置き換えたものが以下の物なのですが
for f in `ls -1 /www/web_dir/photo_album/images/foo/`; do echo '<img src="images/foo/'$f'" class="full" />'; done
for f in `ls -1 /www/web_dir/photo_album/images/foo/ | gawk '{gsub("\\\.", "-thum.");print}'` ; do echo '<img src="images/foo/'$f'" class="full" />'; done
1行目と2行目を並べて出力できるように努力したのですが...
gawkの部分で引っかかってしまいます、というか1行目しかループしてくれません(T.T)
補足いただければと思うのですが、よろしくお願いします マジ感謝感激です
shell sciptとawkの本もamazonしようと思っています
307:302
07/11/13 14:19:58 tnRwnYpT
もうちょっとで出来そう...
308:302
07/11/13 15:05:30 tnRwnYpT
出来ました ありがとうございましたm(__ __)m
309:login:Penguin
07/11/13 15:14:48 MuKLiZO1
最終的にどうやりましたか?
報告して下さい。
310:302
07/11/13 15:32:02 tnRwnYpT
ディレクトリを作りthumnail入れてこれで出力できました
for f in `ls -1 /www/web_dir/photo_album/images/foo/`;
do
echo '<div id="myGallery">';
echo '<div class="imageElement">'
echo '<h3>Item 1 Title</h3>'
echo '<p>Item 1 Description</p>'
echo '<img src="images/foo/'$f'" class="full" />';
echo '<img src="images/foo-thum/'$f'" class="full" />';
echo'</div>';
echo ' ';
done
311:login:Penguin
07/11/13 15:42:18 MuKLiZO1
ちなみにサムネールは thumnail じゃなくて thumbnail ね。
312:302
07/11/13 16:02:23 tnRwnYpT
はい、ありがとうございました^^
313:login:Penguin
07/11/13 18:23:44 v1//zET/
>>306
ls -1 /www/web_dir/photo_album/images/foo/ | gawk '{gsub("\\\.", "-thum.");print}'
ここだけ実行するとどうなるの?
314:login:Penguin
07/11/16 18:50:01 q8UeZNS0
ls -d /a/b/c/d/*/
のようにコマンドを打ち込むと
/a/b/c/d/hoge1
/a/b/c/d/hoge2
/a/b/c/d/hoge3
のように出力が帰ってきますよね。この中から
hoge1, hoge2, hoge3 の部分のみ、つまり ディレクトリ階層の一番深い部分のディレクトリ名
のみを得る為にはどうすれば良いのでしょうか?シェルスクリプト内で必要なのですが
分かりません。教えてください。
自分で調べた限りだと basename とか dirname がそれに近そうだったのですが、
ちょっと違うようです。他には見つけることが出来ませんでした。
315:login:Penguin
07/11/16 18:54:10 PPFIsM3H
>>314
> のように出力が帰ってきますよね。
いいえ。
316:login:Penguin
07/11/16 19:44:27 q8UeZNS0
>>315
/a/b/c/d/hoge1
/a/b/c/d/hoge2
/a/b/c/d/hoge3
じゃなくて
/a/b/c/d/hoge1/
/a/b/c/d/hoge2/
/a/b/c/d/hoge3/
の間違いでした。 このリストから hoge1, hoge2, hoge3を抜き出したい。
hoge1/ の最後の "/" も切り落としてしまいたいのですが、どうすれば良いでしょうか?
317:login:Penguin
07/11/16 19:51:40 PPFIsM3H
>>316
sed なり awk なりで切り出せると思うけど、
最初から
find /a/b/c/d -mindepth 1 -maxdepth 1 -type d -printf "%f\n"
とかじゃだめなん?
318:login:Penguin
07/11/16 20:01:17 gAB+KHmJ
>>316
for i in ls -d /a/b/c/d/*/; do basename $i; done
319:login:Penguin
07/11/16 20:10:36 PPFIsM3H
>>318
for i in `ls -d /a/b/c/d/*/`; do basename $i; done
と言いたいんだろうが、
for i in /a/b/c/d/*/; do basename $i; done
でいいな。
空白とか入ってなければ。
320:login:Penguin
07/11/16 20:14:17 q8UeZNS0
>>317
レスありがとうございました。
しかしfindコマンドに詳しくない為自分ではよく分かりません。それ・・・。
>>318
レスありがとうございました。
こちらの方法はまさに私が求めていた方法です。非常に分かりやすくて助かります。
本当にありがとうございます。
321:320
07/11/16 21:33:37 q8UeZNS0
解決したと思ったのですが、
ROOT=/a # ←ココは何でもいい、とにかくディレクトリ
cd ${ROOT}
for DIR in `ls -d ./*/`
do
for TARG in `basename ${DIR}`
do
echo ${DIR}
echo "${TARG}"
done
done
といった感じにしてみたのですが、
Venus7.0 Personal Edition
といったディレクトリが
Venus7.0 と Personal と Edition の3つに分割されてしまい、そのディレクトリに対して
処理したいのに3つの存在しないディレクトリに対して処理しようとする為、 no such file or directory
エラーが次々と帰ってきました。
どうも ディレクトリ名に半角スペースが入っているのがダメなようです。解決策はありませんか?
ちなみに全角スペースの場合は1つのディレクトリとして正常に動作しています。
for DIR in `ls -d ./*/` ←この部分で分断されてしまっていると思いますが
for DIR in `ls -d ./"*/"` などと" " で囲んで見ましたが */ なんてディレクトリは見つからない
と怒られました。 ' ' で囲んでも同じ結果です。どうしたら半角スペースをセパレータとして
認識するのを防げますか?
322:login:Penguin
07/11/16 21:43:34 lBcVe9Af
なんでそんなディレクトリがあるのか
を考えたほうが根本的な解決になりそう
323:login:Penguin
07/11/16 21:44:56 PPFIsM3H
>>321
だから >>319 で言ったじゃん。
>>322
いや、あるときはあるでしょ。
そんなにおかしいことではない。
324:login:Penguin
07/11/16 22:02:10 lBcVe9Af
わざわざ_使ってる人の意味を考えよう
>>321は''の囲み方が間違ってるだけだが
_があるのが普通って考えたほうが手間なくていい
windowsがらみならwindowsでやったほうがいい
325:320
07/11/16 23:35:30 q8UeZNS0
>>322
ま、まぁ色々事情がありまして。あるんですよ。。。
>>323
>>319の事かと思ってレスを投稿する前に確認したのですが、
for DIR in ./*/
do
for TARG in `basename "${DIR}"`
do
echo ${DIR}
echo ${TARG}
done
done
で確認したところ 変数DIRには正しく取れました。 しかし
`basename "${DIR}"` としているにも関わらず
元ディレクトリ名 AVG Anti-Virus Free Edition 7.3
実行結果
AVG
Anti-Virus
Free
Edition
7.3
とこのように分断されてしまいます。 " " で囲っているにも関わらず、です。
何がいけないのでしょうか?
326:login:Penguin
07/11/16 23:59:15 2bsqELIP
#!/bin/sh
LIST="\"space aaa\" \"bbb\" \"space ccc\" \"ddd\"";
echo $LIST; # "space aaa" "bbb" "space ccc" "ddd"
func(){
echo "arg= $#"; #6
echo "$1"; # space
echo "$2"; # aaa
echo "$3"; # bbb
echo "$4"; # space
echo "$5"; # ccc
echo "$6"; # ddd
}
func $LIST;
上のようなスクリプトで
func には、"space aaa" みたいにスペースの入った引数を渡したいんですが、
なにか方法はないでしょうか? この場合funcにわたす引数を4つにしたいんです。
展開されて、引数が6つになってる。。。素人ですません。
327:login:Penguin
07/11/17 00:44:46 X3VLuMy8
>>325
for TARG in `basename "${DIR}"` ->
for TARG in AVG Anti-Virus Free Edition 7.3
328:login:Penguin
07/11/17 07:31:23 FrK+lOPY
>>326
$LIST をクォートする。
329:login:Penguin
07/11/17 08:31:04 tPTtgwaW
>>328
これだけで良かったんですね。
3時間くらい悩んでたよ。㌧
330:login:Penguin
07/11/17 09:32:44 X3VLuMy8
つeval
331:320
07/11/17 10:54:12 oelt9+66
>>327
レスありがとうございます。
そうなんですよ、そんな風に展開されてしまうんですよ。
${DIR} だけを出力しても
./AVG Anti-Virus Free Edition 7.3
となるのに
"${DIR}" とダブルクォートで囲っても
./AVG Anti-Virus Free Edition 7.3
と全く同じ出力になってしまう。つまりダブルクォートが利いてない・・。
だからそれをどうすれば1つの文字列として扱えるのですか?空白を区切りとしないようにする為には・・・。
332:login:Penguin
07/11/17 12:01:58 dajSe2oX
>331
basename の結果が正しいんだからダブルクォートは効いてるだろ?
その後、`` で置き換えた時には既に "${DIR}" とは無関係の文字列なんだから
直書きされてるのと同様に空白で分割されてるだけ。
あえて書くなら
for DIR in ./*/
do
BASE=`basename "${DIR}"`
for TARG in "${BASE}"
do
echo ${DIR}
echo ${TARG}
done
done
っていうか、なんで 2 段で for を回す必要があるのか。
333:login:Penguin
07/11/17 12:23:43 dh2GLbwy
>>331
バッククォート内はコマンドの出力に置き換えされるんだから、その出力を
クォートすればいい。
for TARG in "`basename "${DIR}"`"
っていうか、なんで 2 段で…
334:320
07/11/17 22:43:03 oelt9+66
>>332-333
な、なるほど・・・・
お二人の解説文を10回ほど読み直しながらじっくり考えてみた所、ようやく理解できました。
特に "`basename "${DIR}"`" はややこしくて 最初は何をかいているのだろうかと思いましたが
`basename "{DIR}"` の出力結果そのものを " " で囲っているわけですね。なるほどなるほど。
う~ん、これは思いつかない・・・。発想力ですか・・・。
で、2段でfor回していますが、確かに冷静に考えると2段で回す必要はありませんね・・・。
むしろ2段で回す処理にしている事で複雑化してしまった感があります。
1段forでいけそうです。
335:login:Penguin
07/11/23 15:28:58 P7OyMgNI
>326です。
拡張が必要になり、問題が増えました。
#!/bin/sh
echo $LIST; # "aaa aaa" "bbb" "ccc ccc ccc" "ddd"
func(){
~処理~
}
func "eee eee" "fff fff" "$LIST" "ggg ggg";
以下のようにfuncにスペースを含んだ形で
${LIST}とその他の値を同列に引数として渡したいのです。
↓funcに渡したい引数
"eee eee" "fff fff" "aaa aaa" "bbb" "ccc ccc ccc" "ddd" "ggg ggg"
>>328 >>330にあったように eval func で展開すると
LIST以外の引数がスペースで展開されてしまいます。
LIST以外の引数を "eee\ eee" とか"\"eee eee\""とする手で回避も可能ですが、
修正箇所が増えるので、極力この形は取りたくありません。
なにか方法はありませんか?
336:login:Penguin
07/11/23 22:55:10 rrMjYG9S
Σ^)/アホーアホー☆ミ-
337:login:Penguin
07/11/23 23:18:09 OSmgQwJo
uniqはsortしておかないとだめですが、
sortしなくても2回目意向の重複を削除するコマンド内ですか?
338:login:Penguin
07/11/23 23:25:42 KoVu18yL
some | command | perl -ne 'print unless $seen{$_}++'
339:login:Penguin
07/11/24 02:54:03 Qc2k01yB
>>335
func をスペースを分割しないで処理するようにして、
func に渡す前に "$LIST" だけ分割しちゃえば良いんじゃないの?
340:login:Penguin
07/11/24 13:44:38 3ItHeK84
>>338
おおおお、できました。ありがとうございました。
341:login:Penguin
07/11/24 15:57:48 uBYpiRKV
From - Fri Nov 20 14:53:45 2007
From: "Jfda dsadsada" <fdsfdsa@thdsadaer.de>
From - Fri Nov 21 14:53:45 2007
From: "rwerw dfsa" <sfdaf@fdfds.com>
From - Fri Nov 23 14:53:45 2007
From: "a bcd" <d@dfds.com>
From - Fri Nov 23 14:53:46 2007
From: "abc" <abc@abc.net>
このようなテキストの中から、日付に対応したアドレスだけをテキストに出力するにはどうしたらいいのでしょうか?
11月20日が指定されたらfdsfdsa@thdsadaer.deを出力
11月23日が指定されたらd@dfds.comとabc@abc.netを出力といった具合です
342:login:Penguin
07/11/24 16:23:59 bvlPAES0
grep -A1 "Nov 20" | grep -o "<.*@.*>"
343:login:Penguin
07/11/24 17:59:39 z00X8bIQ
>>339それが出来れば良いんですが、
できないのです。方法ありますか?
func内で echo $3; した場合。
func "eee eee" "fff fff" "$LIST" "ggg ggg";
echo $3 → "aaa aaa" "bbb" "ccc ccc ccc" "ddd"
当然のように、LIST全体が一つの引数に、、、
以下のようにクォートをなくすと
func "eee eee" "fff fff" $LIST "ggg ggg";
echo $3 → "aaa
LIST内のスペースで、分解されてしまいます。
$3 に "aaa aaa" を渡したいのに、、、
344:login:Penguin
07/11/24 22:04:52 DnopHw8N
無理にシェルで書くより
perl かなんか使った方がいいんじゃね。
適材適所。
345:login:Penguin
07/11/24 22:28:40 bmHXinLt
eval set $LIST
func "eee eee" "fff fff" "$@" "ggg ggg"
346:login:Penguin
07/11/25 17:46:10 ex492j4k
>>345
これだ!
こんなトリッキーな手法もあるんですね。
奥が深い。ありがとうございました。
347:login:Penguin
07/11/25 22:12:54 nNUo7Vyu
>>342
ありがとうございました
348:login:Penguin
07/11/28 16:44:21 lxwXbk7L
特定のディレクトリ以下にあるディレクトリ名を検索し
そのディレクトリの中にファイルがあった場合のみ変数にディレクトリ名を追加する。
という処理をしたいと考えています。
LIST=`find 特定のディレクトリ -maxdepth 1 -mindepth 1 -type d`
上記のコマンドでディレクトリ一覧は取得できたのですが
取得したディレクトリ一覧の中にファイルがあるかどうかの条件設定方法がわかりません
ご教授ください
349:login:Penguin
07/11/28 16:51:01 hjQ8uHjr
>>348
GNU の find なら ! -empty で。
350:348
07/11/28 17:14:26 lxwXbk7L
>>349
レスありがとうございます。
LIST=`find 特定のディレクトリ -maxdepth 1 -mindepth 1 -type d ! -empty`
上記のコマンドで無事に条件を満たすことが出来ました。
感謝です><
351:login:Penguin
07/11/30 01:52:45 vbHro4B7
1 A
1 B
1 C
2 P
2 Q
3 X
3 Y
3 Z
...
のような入力を
1 A B C
2 P Q
3 X Y Z
...
のように整形する簡単な方法はありますか?
352:login:Penguin
07/11/30 02:21:47 8mp/o88K
awk '{h[$1] = h[$1] " " $2} END { for (key in h) print key h[key] }' < input | sort
353:login:Penguin
07/11/30 13:45:29 zEAz9Kgp
>>352
惚れた
354:login:Penguin
07/12/01 01:13:52 285rAG3t
inputをリダイレクトしているのがイヤ。
355:login:Penguin
07/12/01 01:27:18 aR34EpD+
awkはファイル名を引数に取れるんだな。
パイプでしか使った記憶がなく、素で知らなかった。
356:login:Penguin
07/12/01 11:59:35 lphCOL1Q
むしろパイプでしか使えないコマンドの名前を
パッと挙げろという方がむつかしいだろ
357:login:Penguin
07/12/01 12:16:31 z08ppphA
オプションの引数という形もない、というものはだいぶ少ないね
358:login:Penguin
07/12/01 19:59:33 aR34EpD+
とっさに出てきたのは tr
359:login:Penguin
07/12/01 21:03:16 z08ppphA
MS-DOS 標準添付の SORT (.EXE か .COM か自身がない)
360:login:Penguin
07/12/01 23:25:16 +jVAJI5Z
MS-DOS 標準添付の MORE
361:login:Penguin
07/12/03 14:25:58 pB5IpK3Q
複数のコマンドを実行してログを残したいのですが
( { command1 && command2 } > normal.log ) >& error.log
で、標準出力と標準エラーをファイルにリダイレクトまではうまくいきました。
このエラー出力を、画面にも出すにはどんなふうに書くのでしょう?
URLリンク(x68000.q-e-d.net)
ちなみに、ここまではこの辺を参考にさせていただきました。
お願いいたします。
362:login:Penguin
07/12/03 14:26:53 pnpsuBAG
>>361
tee
363:login:Penguin
07/12/03 15:02:26 pB5IpK3Q
>>362
ありがとうございます
できました。
最初に言ってたのとちょっと違うのですが、ようは、すべてログに保存して
なおかつERRORの文字が入ってる行だけを画面に出力したかったので
2>&1 | tee file.log | grep ERROR
でやりたいことができました。
いろいろ勉強になりました。サンクス。
364:login:Penguin
07/12/03 16:10:39 +7LXyEUm
コマンドラインとGUIを融合するHotwire
URLリンク(opentechpress.jp)
365:login:Penguin
07/12/03 16:33:46 CJjSSdo9
>>364
面白そうだけど、記事の中に具体的な画像が欲しいね・・・・
366:login:Penguin
07/12/03 16:43:39 pm3xTTNy
>>365
URLリンク(code.google.com)
367:login:Penguin
07/12/03 17:31:20 BNt6sl0D
>>366
画像が表示されないのは、送ってくるContent-Typeがおかしいのか。
なんでapplication/octet-streamやねん。
368:login:Penguin
07/12/04 22:59:48 Bpu7L1AF
ややスレ違いだが、くだ質よりこっちかなと
シェルスクリプトの本を買う際に、Linuxユーザーでbashメインで使ってるなら
主旨がbash向けのものを買うべきですか?
それともB shell全般向けやsh向けでbashは補完程度の本でも質の高いものを買うべきでしょうか
両シェルの間にそれほど機能、性格の差はなさそうだし
369:login:Penguin
07/12/04 23:06:21 0gQg9Z1k
bashismって言葉があるくらいで、ついついbashの機能を使ってしまうことは多い。
素のBourne Shellの機能がどこまでなのか書いてある本がいいと思う。
370:login:Penguin
07/12/04 23:28:47 Bpu7L1AF
>>369
サンクス
sh向けでも最近の多くの書籍はbashもカバーしているようですので、その辺りを探してみます
371:login:Penguin
07/12/05 11:12:29 tDVDuECI
URLリンク(www.amazon.co.jp)
そのへん意識するならこれいいかも。
SunOS の bsh と FreeBSD の bsh ( ash ) で違いがある場合についてまで
明記されてる。
372:login:Penguin
07/12/05 21:59:53 KlliiKVC
>>371
その本と、「UNIXシェルスクリプトコマンドブック 山下 哲典」を最後に候補にしてましたが、後者を買いました。
sh、bash共用でサンプルが多いので。
373:login:Penguin
07/12/06 18:06:51 ltYfbiEn
いつも複合条件式でまるんですけど
#!/bin/bash
WAITSEC=""
if [ -z "$WAITSEC" -o $WAITSEC -lt 60 ]; then
WAITSEC=10
fi
を実行すると
./hoge.sh: line 3: [: too many arguments
というエラーになります。-oとか-aで記述するifは今まで何回かやったのに
一度もできた記憶が無い!!。結局ifを分けたりして対処してきた負け人生です。
いったい何が悪いというのでしょうか??
教えていただけますか?
374:login:Penguin
07/12/06 18:31:24 bgO18Eza
確かにbashだとなるねぇ。zshだとならんから気づかなかったw
#!/bin/bash
WAITSEC=$1
if [ -z "$WAITSEC" ] || [ $WAITSEC -lt 60 ]; then
WAITSEC=10
fi
echo $WAITSEC
とりあえずこれで。
375:login:Penguin
07/12/06 18:35:40 bgO18Eza
と、思ったら出来たw
if [ -z "$WAITSEC" -o \( $WAITSEC -lt 60 \) ]; then
こういうことだな。
優先順位がおかしいんだ。
376:login:Penguin
07/12/07 00:20:04 2WlU8Mqa
>>373
-z "$WAITSEC" の成否にかかわらず $WAITSEC -lt 60が実行されちゃってるから問題なんじゃないか?
おそらく -z "$WAITSEC"のときは 後ろの条件は 「-lt 60」になるだろうから、>>374のようにするか${WAITSEC:-0}とかやったらいいんじゃね?
377:login:Penguin
07/12/07 10:01:03 uKkYmJTB
>WAITSEC=""
なので、
>if [ -z "$WAITSEC" -o $WAITSEC -lt 60 ]; then
は
if [ -z "" -o -lt 60 ]; then
と解釈されてエラー。
zsh は sh と違って $WAITSEC は "$WAITSEC" と同じ意味なのでエラーにならない。
"$WAITSEC" -lt 60 と書き換えた場合は、
>-z "$WAITSEC" の成否にかかわらず $WAITSEC -lt 60が実行されちゃってるから問題なんじゃないか?
この理由で正しい。
378:login:Penguin
07/12/11 22:53:04 8t30b6aC
シェルスクリプトにコメントを書くには
# comment
っていう感じに # を行頭につけてコメントにしますが、自作のシェルスクリプト等に
日本語でコメントを埋め込むのは良くない事なのでしょうか?
英語でコメントを埋め込むべきなのでしょうか?
理由>環境によっては文字化けするかもしれないから
その場合、英語では上手くコメントがかけないのですが、、、皆さんはこの辺どうしていますか?
379:login:Penguin
07/12/11 23:22:06 8VUAk6YG
>>378
英語では上手くコメントがかけない、って、自分が書いた自分用のスクリプトだったら、
べつに、自分にさえ分かればいいんじゃないの?極端な話、ローマ字で書いた日本語でもいいんじゃないかと。
380:login:Penguin
07/12/11 23:27:45 LcSZkVoI
Shift_JISで書いて2バイト目に ¥ が含まれるとコメントが継続しちまうかな、
と思ったんだが、そうでもないみたいだな。
381:login:Penguin
07/12/12 08:33:10 itajSrlG
>>379
いやー、他の人にもスクリプトの内容が分かるようにコメント書かないといけない場合はどうすれば?
今はローマ字で書いたりしていますが、さすがに見にくいというか・・・ かといって英語では上手くかけないし・・
C言語やJava等では // 日本語コメント が使えるし
MS-DOSの.batファイルでも
REM 日本語コメント
が使える、Windows Script Hosting(WSH)であっても
'日本語コメント
が使えて、大抵のスクリプト言語は日本語のコメントが使えるのになぜにLinuxのシェルスクリプト
だけこんな事で悩まないといけないんだろうと・・・。
まぁOSが違うから文字コード周りのトラブルなんだろうけど・・。
382:login:Penguin
07/12/12 09:12:34 fnWAKO+5
使えるか使えないかっていうなら使えるだろ。
確実に自分しか使わないならShift_JISのようなbrain damagedな文字コードじゃなきゃ
別に何でもいいんじゃない。
しかし使ってよいか使わざるべきかというと、一般にスクリプトって
どのロケールで実行されるかわからないよとかの問題が出てくる。
あなたが出した例ではCやJavaのソースファイルはコンパイルするときの
環境が限定できれば問題ないし、DOSのバッチファイルも日本語DOSしか
考えていない。
383:login:Penguin
07/12/12 11:25:06 ytRjAEEx
>Shift_JISで書いて2バイト目に ▼ が含まれるとコメントが継続しちまうかな、
sjis だろうが何だろうがコメントの継続なんてありません。
>しかし使ってよいか使わざるべきかというと、一般にスクリプトって
>どのロケールで実行されるかわからないよとかの問題が出てくる。
コメントにロケールなんて関係ありません。
384:login:Penguin
07/12/12 11:32:57 11rQvfIz
英語くらい書けよ。
385:login:Penguin
07/12/12 12:33:25 5zz/Y7Bm
っつか、どういう環境(=人間環境)だか知らないけど、
そんな雰囲気だと、頑張って英語でコメントを書いても、
肝心の「他の人」が、それを理解出来ない、
ということが容易に想像出来てしまうわけで、
だったらローマ字でいいじゃん、と思う。
386:login:Penguin
07/12/15 11:57:10 FOfJjZuV
>>383
コメントってのは実行されるときはロケール関係ないけど
元々読むものだから、ロケールばらばらと読みにくくて困るよね
って意味だよ。たぶんね。
387:login:Penguin
07/12/19 22:19:06 qeHYVBDH
#!/bin/bash
for i in *.txt
で、'*.txt' で展開されるリストの長さに制限はある?
ls: argument list too long になる長さでも処理できるようだが、他に何か別の制限はある?
388:login:Penguin
07/12/20 18:50:14 Qtkk7tpx
sedについての質問です
aaa
bbb
ccc
という出力を、sedコマンドで一行にしたいのです。
aaa bbb ccc このように。
どうしたらよいですか。
逆の、sed -e 's/\ /\n/g' はできるのですが。
389:login:Penguin
07/12/20 21:20:24 1r8qT2Sh
awkなら
$ (出力するコマンド) | awk '{printf("%s ", $0)}'
でできるんだけどなぁ
390:login:Penguin
07/12/20 21:47:48 p9kMPhFx
$ cat input
aaa
bbb
ccc
$ sed -n 'H;${g;s/¥n/ /g;s/^ //p;}' input
なんか無様だ。きっともっとスマートに出来るに違いない。
391:login:Penguin
07/12/20 21:49:27 p9kMPhFx
もし各行が空白文字を含まないなら、
echo `cat 元テキスト` > 新テキスト
でいいな。
392:login:Penguin
07/12/20 22:14:22 IRXLh3Ok
>>388
sed ':loop; N; s/\n/\ /g ;$!b loop' hoge
393:login:Penguin
07/12/20 22:19:20 UDgG5/dT
sedにこだわらなければ
tr -s '\n' ' ' < input
とか
394:login:Penguin
07/12/20 22:28:20 p9kMPhFx
目的によっては、
$ fmt input
fmtってUNIX標準?
395:login:Penguin
07/12/20 22:39:06 Qtkk7tpx
>>389-393
こんなにレスが来るとは。
皆さんありがとうございます。
すべて試してすべてで出来ました。
echoとtrはなるほどという感じです。
他は知りませんでした。レベル1アップですね。
396:login:Penguin
07/12/20 22:43:02 Qtkk7tpx
>>394
更新遅れた。
できました。オプションすらいらないとは。
397:login:Penguin
08/01/06 19:04:19 tfZRITK8
awkで
awk '{print $2,$3}' とすると2,3番目が表示されますが
二番目以降全て表示するにはどうすればいいのでしょうか?
398:login:Penguin
08/01/06 19:44:21 TN85yzo6
awk 'gsub($1,"")'
399:login:Penguin
08/01/06 21:41:07 HrtO6pOF
$1に特殊文字が入れられると思わぬ結果になりそうな気がする。
400:login:Penguin
08/01/06 21:53:19 xjxCtnUs
awk '{for (i=2;i<=NF;i++){printf($i" ")}}'
401:login:Penguin
08/01/06 22:56:50 HrtO6pOF
フィールド区切が複数のスペースやタブコードでも、1個のスペースに置換されてしまう気がする。
>>397の「全て」がそこまで求めているかは分からないが。
402:login:Penguin
08/01/07 00:59:34 Lq+3ioDo
>>401
awk -Fなにか '{for (i=2;i<NF;i++){printf("%s%s", $i, FS)};print $NF}'
403:397
08/01/07 02:29:17 SZZlXYY6
ありがとうございます。
最初 >>387 さんと同じことを思ったのですが他に
オプションか何かで用意されていると思ってました。
402さんのを使わせていただきます
404:397
08/01/07 02:29:58 SZZlXYY6
s/387/398
405:login:Penguin
08/01/07 17:21:59 CzyB4/IB
>>402
これだと複数の空白が一つになって表示される
406:login:Penguin
08/01/07 18:30:26 DBTZ8VT2
awk '{gsub($1, "");print substr($0,2)}'
407:login:Penguin
08/01/07 18:59:30 AGg2gknU
hint:
aho,choaho,kusoaho,doaho
∴
awk '{print substr($0,length($1)+2)}'
408:login:Penguin
08/01/07 20:07:07 81ckgAQ5
個人的には>>398をアレンジして、
gawk 'gsub(/^[[:blank:]]*[^[:blank:]]+/,"")'
かな。
409:login:Penguin
08/01/07 20:13:04 DBTZ8VT2
なんだ>>398で既出だったのね。見落としスマソ。
410:login:Penguin
08/01/07 23:07:24 6d+dex8H
[file1]
bar=234
[file2]
foo=123
Bar=987
と2つのkey=valueな内容が入ってるファイルがある。ここで、file1には
ないがfile2にはあるkeyのみ(case-insensitiveな比較で、また、valueは
違っていてよい)を拾いkey=valueを出力したいのだけど、一行で書けないかな?
どういう出力になってほしいかというと
$ myuniq --split-char='=' --field-index=1 --print-unique file1 file2
foo=123
というような実行イメージ。awkで
awk -F= '{ line[toupper($1)]=$0; seen[toupper($1)]++; } END { for (key in line) if (seen[key] == 1) print line[key]; }' file1 file2
みたいなのはでっち上げたんだけど、正直汚い。
411:login:Penguin
08/01/07 23:30:18 6RYIn4eu
回答じゃなくてすまんのだが、最後にあるワンライナーだと、
2ファイル通して1回しか現れなかったものを表示するから、
「file1にはないがfile2にある」ものだけでなく
「file2にはないがfile1にある」も出てこないか?
412:login:Penguin
08/01/07 23:35:18 6RYIn4eu
負けず劣らずかっこ悪いシロモノ
for w in `cut -d= -f1 file1 file2 |tr A-Z a-z|sort|uniq -c|sed -n 's/ 1 *//p'`; do grep "^$w=" file2; done
413:login:Penguin
08/01/07 23:52:40 DBTZ8VT2
grep -v -i "`cut -d= -f1 file1`" file2
重複は無考慮
414:login:Penguin
08/01/07 23:54:29 6d+dex8H
>>411
あ、すみません。バグです。が、元の仕様が厳しすぎで、
どちらかにしかないエントリを出す
でも大丈夫でした。
file1かfile2のどちらかにのみあるkeyに対応するkey=valueを出力する
に仕様を訂正させてください。
何をしたいのかというと、Windowsの環境変数を手元のUNIXな環境に
取り込みたいのですが、その際に自分で定義している分については
上書きされないようにしたいのです。
hostA$ env > hostA.env
hostB$ env > hostB.env
hostB$ myuniq ... hostA.env hostB.env > diff.env
hostB$ . ./diff.env
みたいなことをしたいと。で、片方の環境が Windows なもので、
case insensitiveな比較とかも必要になってます。
行全体ではなく特定のフィールドのみ見て uniq/diff 処理して出力って
簡単そうで微妙に面倒です。
415:login:Penguin
08/01/07 23:59:58 6d+dex8H
>>413
おおー。grepのexprに改行入れるとそんな動作になるとは!
エレガントです。勉強になりました mOm
416:login:Penguin
08/01/08 18:35:59 0P1F18Bp
1行で2つのコマンドを実行するときに
2つ目に実行したコマンドに、1つ目に実行したコマンドの引数を
そのまま渡したい場合の記述方法がわからず、困っています。
$ vi hogehoge; echo ??
*??が不明箇所*
上記の例の場合は2つ目に実行しているecho文の出力結果でhogehogeを表示させたいのですが。。
対処方法はないでしょうか?
よろしくお願いいたします。
417:login:Penguin
08/01/08 18:38:30 k6k1za9N
>>416
i="hogehoge"; vi $i; echo $i
じゃだめなん?
418:416
08/01/08 19:34:39 0P1F18Bp
>>417
ありがとうございます。
その方法があったことに気づきませんでした。
おかげで解決しました、感謝です><
419:login:Penguin
08/01/08 23:12:30 OqUgF6yk
vi hogehoge; echo !$
420:login:Penguin
08/01/08 23:26:00 5sg6/WvN
>>419
それタイプしたタイミングではまだ!$は前行のコマンドの。
421:login:Penguin
08/01/08 23:33:15 A2IkwjEN
引数が一つだけなら
vi hogehoge; echo $_
でもいけるな。
422:login:Penguin
08/01/10 13:02:51 9dVYtTPe
cshからJavaを呼び出すシェルを作成しています。
その呼び出したJava内部で例外が発生した場合、
以降のシェルの処理を続行させたくありません。
どの様にすればよいのですか?
Javaのcatch節でSystem.exit(1);とかで処理を終了させて、
cshでそれを検知する方法があるのかなぁ?
と漠然には思うのですが・・・
423:login:Penguin
08/01/10 19:51:46 qThypT9T
>>422
System.exitが何をするのか分かっているなら、
Javaコマンドの終了値を普通にifなりswitchなりで受けて、csh側からもexitすれば良いだけでは?
単純に例外=即終了と決め打ちなら良いけど、例外によって複数の処理をさせたくなると、
System.exitの終了値を多数用意して管理しなければならなくなって面倒だけどね
ここからはポリシーの問題になるけど、System.exit等を使ってコマンドの終了値を利用するよりは、
どんな例外で終了したのかを前もって文字列等でstderrにでも吐き出したり、
終了した例外を表すような長さゼロのテンポラリファイルでも作ってから、Javaコマンドの方を終了させておいて、
csh側からは、むしろその文字列やファイル名を評価させてexitさせるようにした方が、後からデバッグする時とかは楽だよ
更に言えばシェルプログラミングにcshを使うのは止めるべき
URLリンク(www.klab.ee.utsunomiya-u.ac.jp)
URLリンク(www.klab.ee.utsunomiya-u.ac.jp)
424:login:Penguin
08/01/10 21:50:31 CJRDs9Ag
Javaのポリシーは知らないが、エラーメッセージと終了コードは二者択一せにゃならんものではない気がする。
425:login:Penguin
08/01/11 14:14:06 mrGJLB/g
>>423、424
ありがとうございます。
シェルスクリプト自体、経験が浅い上に今回の要望がcshというのが
決まっているもので・・・
困っています。。。
2chでの質問自体も初めてなもので・・・
準正常として扱うような例外は全てJava側で処理をしてプログラムは
正常終了として扱っています。
処理続行不可能と判断した、ランタイム系やIO例外などが発生した場合は
後続のシェルを流したくない。
という状況です。
if $JAVA_CMD
then
続き
else
exit 1
fi
以下処理続く
・・・
ってな感じにしたのですが、どうも上手くJavaでexitした値が取れないです。
文法が間違っているのですかね?
もう少し調査してみますが、上記の書き方で間違いがあればご指摘頂きたいです。
後は教えていただいた、テンポラリファイルでの判断も考えてみます。
426:login:Penguin
08/01/11 15:11:54 GLHvzQDj
findコマンドの結果をツリービュー(treeコマンドの結果的なツリー表示)で出すコマンドまたは方法ってありますか?
427:login:Penguin
08/01/11 16:08:44 6CIbL1kG
>>425
cshなら
$JAVA_CMD
if ($? != 0) then
echo "failed"
exit $?
endif
echo "OK"
でどう?
428:login:Penguin
08/01/11 16:55:30 mrGJLB/g
>>427
ありがとうございます。
教えていただいた方法で、想定通りの動作になりました。
429:login:Penguin
08/01/11 21:11:49 OPXAXUzh
>>426
普通にtreeコマンド使うんじゃだめなん??
findで絞った結果を出したいのかなぁ。
430:login:Penguin
08/01/11 22:17:07 4hqMEkJ5
grep -f find結果 tree結果
とか。
# 本気にしないように。
431:login:Penguin
08/01/11 23:02:21 aloediIm
基本的にはtree | grep なんちゃら でいいんじゃね?
432:login:Penguin
08/01/14 11:50:49 3iR1bkH0
画像の特定の領域だけを一括でぼかしたいのですが
いい方法はありませんか?
433:login:Penguin
08/01/14 12:00:15 ZjONjaHo
つ netpbm
434:login:Penguin
08/01/14 12:12:55 6n5zEajJ
つimagemagick
435:login:Penguin
08/01/14 14:01:26 Or9vH7Fn
メールアドレスの@以降の最後の国を表すCountry Codeの部分だけを抜き出すには
どのような正規表現を使えば良いでしょうか?
@hotmail.co.jp の.jp の部分を見る感じです。
.jp以外は無視する、という感じです。これで日本のメールしか相手にしない事になりますよね。
436:login:Penguin
08/01/14 14:04:07 ZjONjaHo
spam避け?
日本からも.comや.netや.orgや.infoや.bizや.acや.tvや.toや(以下略)の
アドレスでメールが送られることはあるぞ。
437:login:Penguin
08/01/14 14:04:25 Or9vH7Fn
$.jp
↑これでいいんでしょうか?正規表現全く知らない状態でネットでちょっと検索してみたのですが・・・
438:login:Penguin
08/01/14 14:05:05 Or9vH7Fn
あっちゃー、そうなんですか・・・
海外のメールを相手にしない方法って無いんですかね・・・
英語でViagraとかうるさいんですよ。
439:login:Penguin
08/01/14 14:17:08 6n5zEajJ
/[あ-ん]/?
ひらがながないメールは無視してもよかろう。
440:login:Penguin
08/01/14 14:37:34 FCIPzPAY
ヘッダの Content-Type を見て弾くとかどうよ?
^Content-Type: .*iso-2022-jp
441:login:Penguin
08/01/14 14:42:36 6n5zEajJ
最近はutf-8なのも多いよ。
442:login:Penguin
08/01/14 14:54:07 JtG94m55
utf-8 は違法で、危険運転致死罪が適用になるんじゃ?
443:login:Penguin
08/01/14 22:54:28 RfE0b+o0
>>437
\.jp$
では?
444:login:Penguin
08/01/16 13:17:12 ZRO/FTzi
テキストファイルを、最後の3行を除いて出力したいのですが
何か良い書き方はないでしょうか。
sed '$d' xxxx | sed '$d' | sed '$d' と書くくらいしか思い付かなくて。
445:login:Penguin
08/01/16 14:26:14 1obpvu1A
>>444
head -n -3 foobar.txt
446:login:Penguin
08/01/16 17:01:38 IKqjky5V
awk '{a[NR]=$0}END{for(j=1;j<=NR-3;j++) print a[j]}' a.txt
447:login:Penguin
08/01/16 18:25:12 ZRO/FTzi
>>445
head のオプションは見落としてました…ありがとうございます
448:login:Penguin
08/01/16 21:56:01 KAlEWwYc
ランダムな数字が欲しいとき,どうするのが簡単?
1. $$
2. $RANDOM
3. /dev/urandom
4. 時計
あたりを思いついたんだけど
449:login:Penguin
08/01/16 22:14:57 yh54UVVr
ワシは、ランダムな数字の用途により生成手段を変えてるような気がする。
450:login:Penguin
08/01/16 22:16:21 KAlEWwYc
1. 偏りそう
2. bash依存
3.4. 面倒
という問題点があるから,誰かいい方法教えてくれないか?
451:login:Penguin
08/01/16 22:19:14 KAlEWwYc
>449 たしかに用途によって求められる強さが違う気がする.
とりあえずこうしとけ的な汎用的な方法はないんかな.
いちばん手軽な方法が知りたい
452:login:Penguin
08/01/16 22:47:32 HQvmxN1E
>>448
$$はスクリプト内で複数個必要だと使えない罠
dateのmanを見ていたら、
%N nanoseconds (000000000..999999999)
というのがあった。こんな感じ
% echo -n `date +%N`
431218994 % echo -n `date +%N`
857494685 % echo -n `date +%N`
269031777 % echo -n `date +%N`
803351248 % echo -n `date +%N`
195538275 % echo -n `date +%N`
538357509 % echo -n `date +%N`
058776188 %
453:login:Penguin
08/01/16 23:09:59 PJonPFmQ
jotはたぶんBSD系限定だよな。
jot -r 10 1 6
/dev/urandomは10進数テキストで得るのがめんどーだろうか。
dd if=/dev/urandom bs=2 count=1 2>/dev/null | od -vd
左カラムがじゃまだな。 sed 1q |cut -f2 -d' ' とかで削るか。
454:login:Penguin
08/01/16 23:21:36 KAlEWwYc
>452,453
なるほど.date +%Nはいい感じ.
jot便利そうだよ,jot.犬にもこんなの欲しいな.
ありがとう
455:login:Penguin
08/01/16 23:24:18 HQvmxN1E
od -t u1 /dev/urandom | awk '{print $2;exit}'
456:login:Penguin
08/01/16 23:33:28 PJonPFmQ
r=`fortune | md5sum - | sed 's/^¥(........¥).*/¥1/'`
r=`printf %d 0x$r`
ごめんなさいごめんなさい。
457:login:Penguin
08/01/16 23:51:47 puzD1M+G
普通に perl -e 'print int(rand(1000))' じゃダメなの?(perl5前提だけど)
458:login:Penguin
08/01/16 23:55:16 KAlEWwYc
>457 これだけのためにperlやawkを出してきたくないという貧乏心があってwww
459:login:Penguin
08/01/17 01:30:17 xe77Y4ah
時は金なり、というじゃない
460:login:Penguin
08/01/17 01:45:37 hGbWYs9C
つーか、乱数ってこれだけのため、っていうほど簡単なものじゃないと思う。
そういうものが必要な処理はシェルじゃなく、ちゃんとそれなりの言語でプログラムしたほうがいいかも。
461:login:Penguin
08/01/17 09:08:26 MJ2pzO6M
確かに簡単な乱数ならともかく、ちゃんとした乱数が欲しい処理は言語引っ張り出したほうが良いかもね
462:login:Penguin
08/01/17 09:18:44 wcByJn9i
% i=0; while [ $i -lt 1000 ] ; do echo "$i "`date +%N`; i=`expr $i + 1`; done \
| awk '{hist[int($2%10)]++} END{for (i in hist) {printf("%2d %5.2f%\n",i, hist[i]/NR*100) }; exit}' | sort -k1n
0 9.70%
1 10.70%
2 8.60%
3 11.00%
4 10.40%
5 8.90%
6 11.40%
7 9.70%
8 9.80%
9 9.80%
(´・ω・`)
% i=0; while [ $i -lt 1000 ] ; do echo "$i "`date +%N`; i=`expr $i + 1`; done \
| awk '{hist[int($2%10)]++} END{for (i in hist) {printf("%2d %5.2f%\n",i, hist[i]/NR*100) }; exit}' | sort -k1n
0 9.20%
1 12.30%
2 8.60%
3 11.00%
4 11.20%
5 9.30%
6 11.40%
7 7.80%
8 11.40%
9 7.80%
(゚д゚)
463:login:Penguin
08/01/17 09:28:02 wcByJn9i
% od -t u1 /dev/urandom \
| awk '{hist[int($2/256.0*10)]++} NR==1000{for (i in hist) {printf("%2d %5.2f%\n",i, hist[i]/NR*100) }; exit}' | sort -k1n
0 9.80%
1 9.50%
2 10.10%
3 9.80%
4 9.80%
5 9.40%
6 10.20%
7 10.20%
8 10.30%
9 10.90%
(´・ω・`)
% perl -e '$MAX=10;$LOOP=1000000; for (1...$LOOP) {$hist[int(rand()*$MAX)]++}; for (0..$MAX-1) {printf("%2d %4.2f%\n", $_, $hist[$_]/$LOOP*100) }'
0 9.98%
1 9.99%
2 9.99%
3 10.02%
4 10.03%
5 10.02%
6 9.92%
7 10.00%
8 10.00%
9 10.04%
(゚∀゚)
date +%Nは、ばらつきはともかく遅いな...
464:login:Penguin
08/01/17 10:59:36 bFGNQCBf
遅いのは date +%N じゃなくて while のループだと思うよ。
465:login:Penguin
08/01/17 11:37:17 LfhUWWyD
>>450
> 2. bash依存
ksh88由来らしい
URLリンク(www.cs.princeton.edu)
ksh互換を期待できるなら使ってもいいんじゃね
466:login:Penguin
08/01/18 01:58:10 S6Zw/ddB
/usr/games/random -e 100; echo $? は?
467:login:Penguin
08/01/18 07:42:17 YTGcRcKS
>>466
/usr/gamesってそれ何年前のWSのディレクトリ構成だよ...
468:login:Penguin
08/01/18 17:40:50 wVas3OI3
findの検索結果でディレクトリの場合は最後に「/」をつけさせたいのですが、いい方法はあるでしょうか?
469:login:Penguin
08/01/18 17:50:43 YTGcRcKS
find . -exec ls -Fd {} \;
470:login:Penguin
08/01/18 22:33:39 EJvy1m4k
>>468
find (検索ディレクトリ) -type d -printf "%p/\n" -or -print
471:login:Penguin
08/01/18 22:55:09 S6Zw/ddB
>>467
最新のLinuxの(いやほんと。これだけは伝統的理由で残ってるのかな)
472:login:Penguin
08/01/18 23:22:22 6BHP4h96
>471 鳥は?
473:login:Penguin
08/01/19 01:14:55 ZLNpfSkQ
>>472
Debian (sid)。まあ bsdgames とかまんまレガシーなパッケージだけだけどね。
474:login:Penguin
08/01/19 05:58:20 JWtUz7T2
Debian etch にも/usr/games はあるな。
中みたらbannerとfortuneが入ってた。
475:login:Penguin
08/01/19 08:07:34 njld/y5g
シェルスクリプトの本で実用例の多い本ってありませんか?
476:login:Penguin
08/01/19 17:07:33 NuJUp+KH
Fedora4を使っています
/start.txt内の記載が
12
254
3678
4
59
621
78
896
、、、、、、
と法則性の無い桁数の数字が2000行近くあるものを
/end.txtに
12,254,3678,4
59,621,78,896
、、、、
A,B,C,Dと4項目で1行に変換したいと思っています
start.txtから4行抜き出して end.txtに1行にする考え方でいい方法を教えていただけないでしょうか
よろしくお願いいたします
477:login:Penguin
08/01/19 18:46:40 ZLMZWyE0
cat /tmp/test.txt | awk 'NR%4{printf("%s,",$0)} !(NR%4) {print $0} '
余りが出たら最後カンマ付きで出力されちゃうけど
478:login:Penguin
08/01/19 18:55:41 NuJUp+KH
>>477
完璧な物ありがとうございます
今迄sedばかり使っていたのですがawkすごいですね
awkの勉強させていただきます
479:login:Penguin
08/01/19 18:59:10 IrN8xoLt
>>477 あらupしようとしたら同じだったわ。
awk '{printf"%s%s",$0,(NR%4?",":"\n")}' < start.txt
480:login:Penguin
08/01/19 19:02:55 NuJUp+KH
>>479
ありがとうございました
とても参考になります
481:login:Penguin
08/01/19 19:43:02 rxOILVvf
vi start.txt
q94J↓q10000@9
:%s/ /,/g
:w end.txt
482:login:Penguin
08/01/19 19:59:13 58USgOmq
>>473-474
Debianではゲームの実行バイナリは/usr/gamesに置かれるぜ。
最近はポリシーチェッカも警告を出すようになったから、lennyまでには移動完了するんじゃね。
URLリンク(lintian.debian.org)
URLリンク(lintian.debian.org)
483:login:Penguin
08/01/19 21:00:37 ZLNpfSkQ
>>482
なんでだろうね?
FHS誤解してたかと読み直したらそんなことないし。理由がわからん。
484:login:Penguin
08/01/19 21:04:24 ZLNpfSkQ
ごめん上は嘘。Debian Policy には
As described in the FHS, binaries of games should be installed in the directory /usr/games.
This also applies to games that use the X Window System.
Manual pages for games (X and non-X games) should be installed in /usr/share/man/man6.
とか書いてあった。FHSをgrepしたら、正式なセクションはないが、optionalとしてgames作っていいと
書いてあった。
485:login:Penguin
08/01/19 21:14:55 Xt/fDApd
FHSとかグローバリゼーションとか国際化とか
そういうのが全て悪の元凶。
486:login:Penguin
08/01/19 22:06:40 ZLNpfSkQ
FHSは/usr/localと/etcを綺麗にしてくれる。
それだけでも推進されてしかるべき。
487:login:Penguin
08/01/20 02:02:52 dexE1e0m
/usr/gamesはオプションなのに、/usr/local/gamesは必須扱いなところを見れば分かるとおり
ディトリビュータはゲームなんか提供すんな、ということなのだよ。
つまりゲームを提供しているDebianは人々を堕落させる悪のディストリビュータなのだ!
488:login:Penguin
08/01/20 02:23:04 kH+ebKTA
>>487
なにその陰謀史観(w
単に /usr/ 直下はディストリの管轄だし自分で決めろ、
一方で /usr/local/* は空フォルダ切っておく以上は認められないから
代わりとして、せめて誘導できるように切っておけ、ということかと。
FHSで自分的に従来慣習と比較して見慣れないのは/srvだな。
どこのUNIXでの慣習だったんだろう?
489:login:Penguin
08/01/20 02:55:38 M1QHfiRt
つっこみどころは
/usr/games/bin/fortune じゃなくて
/usr/games/fortune ってとこじゃなかったのかー
490:login:Penguin
08/01/20 04:01:16 FZKKsnAp
>>476
sed ':b;1~4,+2{N;s/\n/,/;bb}'
sedも心の片隅にでも置いておいてやってくだされ。
491:login:Penguin
08/01/20 04:20:45 IwRos1VB
>>489
管理者のPATHからゲーム関係を除外するのが目的だろうから
/usr/games/binとサブディレクトリを掘る必要はないんじゃね。
492:login:Penguin
08/01/21 02:31:10 HJiECvMS
>>490
そんな記法初めて見た…
どうなってんの???
493:login:Penguin
08/01/21 02:55:10 QTxOOwHl
アドレス指定がGNU拡張?
494:login:Penguin
08/01/21 11:41:48 JvqHER/W
>>476
paste -d, - - - -
paste も心の片(ry
495:login:Penguin
08/01/21 14:42:32 svPtjQeo
次のようなファイルがあるとします。
$ cat name.txt
name1
name2
name3
name4
name5
$ cat weight.txt
weight1
weight2
weight3
weight4
weight5
このとき、なんとかして
$ ???????????
name1 weight1
name2 weight2
name3 weight3
name4 weight4
name5 weight5
と表示したいのですができません。
最初は
$ cat name.txt weight.txt > data.txt
$ awk '{ if(NR<=5) a[NR]=$0; else b[NR-5]=$0} end{for(i=1;i<=100;i++) printf i,a[i],b[i];}' data.txt
としましたが、空白が表示されるだけでした。
496:login:Penguin
08/01/21 14:51:31 N+zVQlnl
>>495
paste
497:login:Penguin
08/01/21 14:53:35 svPtjQeo
>>496
ありがとうございました。
ぐぐるまでもヘルプ読むまでもなく、
適当にいじっただけでそうなりました。
498:login:Penguin
08/01/22 11:11:17 DOTIpHDE
gawk 'FILENAME != old {i=0;old=FILENAME} {data[i++] = data[i]" "$0;} END{for(j=0; j<i; j++)print data[j]}' name.txt weight.txt
gawk 'FILENAME != old {i=0;old=FILENAME} {data[i++] = data[i]" "$0;} END{for(j=0; j<i; j++)print data[j]}' name.txt weight.txt height.txt
ファイル数に制限はない。あと出力される行数は、最後のファイルの行数によって決まってしまうがな。
499:login:Penguin
08/01/25 13:18:49 u9KTnE0i
ランダムに壁紙を表示するスクリプト作ってみました
一応予想通りに動いてるようですが問題点や改善点があったら叩いてくだしあ
#!/bin/sh
EXT='.jpeg$|.jpg$|.png$'
LIST=`ls $1 | grep -Ei $EXT`
if [ "$LIST" = '' ] ; then\
echo "No files found in $1."
exit
fi
NUM=`echo $LIST | wc -w`
N=`expr $RANDOM % $NUM + 1`
TARGET=`echo $LIST | cut -d ' ' -f $N`
#echo "$1/$TARGET"
bsetbg $1/$TARGET
500:login:Penguin
08/01/25 15:41:59 5ugSsaO2
>>499
そのままだと画像ファイル名やパスに空白があると動かないけど、いいのか?
501:login:Penguin
08/01/25 17:04:10 HizVC3Pf
#!/usr/bin/python
import sys, os, random
def is_image(filename):
EXT = ('jpeg', 'jpg', 'png')
return any(filename.endswith(ext) for ext in EXT)
if sys.argv[1:]:
dir = sys.argv[1]
else:
dir = os.path.curdir
files = filter(is_image, os.listdir(dir))
if not files:
print "No images found in %s" % dir
sys.exit(1)
target = random.choice(files)
os.system("echo bsetbg '%s'" % os.path.join(dir, target))
# 高級言語って素晴らしいね
502:login:Penguin
08/01/25 17:51:17 u9KTnE0i
>501 ちょwwスレタイwww
修正してみました
#!/bin/sh
EXT='.jpeg$|.jpg$|.png$'
if [ "$1" = '' ] ; then\
DIR=`pwd`
else\
DIR="$1"
fi
LIST=`ls "$DIR" | grep -Ei "$EXT"`
if [ "$LIST" = '' ] ; then\
echo "No files found in $DIR."
exit
fi
NUM=`echo "$LIST" | wc -w`
N=`expr "$RANDOM % $NUM + 1"`
TARGET=`echo "$LIST" | cut -d ' ' -f "$N"`
#echo "$DIR/$TARGET"
bsetbg "$DIR/$TARGET"
503:login:Penguin
08/01/25 18:55:56 u9KTnE0i
>502 事故レス
expr はクオートしちゃまずかった
504:login:Penguin
08/01/26 00:32:05 0LMYrtfF
個人的には NUM= 以降を配列でやらせることが多いので、わりと bash を使う。
#!/bin/bash
DIR=$1
IFS='
'
TARGET=(`find "${DIR:=.}" -maxdepth 1 \( -name '*.[Jj][Pp][Ee][Gg]' -o -name '*.[Jj][Pp][Gg]' -o -name '*.[Pp][Nn][Gg]' \)`)
if [ ${#TARGET[@]} -eq 0 ]; then
echo "No files found in ${DIR:=.}"
exit -1
fi
#echo ${TARGET[`expr ${RANDOM} % ${#TARGET[@]}`]}
bsetbg ${TARGET[`expr ${RANDOM} % ${#TARGET[@]}`]}
とか。
505:login:Penguin
08/01/26 00:54:55 a+SvfS+1
>>504
おまいさんの find には -iname は無いのか?
あと、bash なら自前で算術計算できるよ
bsetbg "${TARGET[RANDOM % ${#TARGET[@]}]}"
506:login:Penguin
08/01/26 01:31:49 Gp61cAWI
>おまいさんの find には -iname は無いのか?
あ、これは知らんかった。有り難う。
>あと、bash なら自前で算術計算できるよ
こちらは知っていたけど、元ネタに合わせんと。
507:login:Penguin
08/01/26 11:11:47 NixStw3D
#!/bin/sh
filesize=('du -h ~/file.tmp')
$loglen > ~/filesize.txt
という感じでfile.tmpのファイルサイズを出力したいのですが
出力結果に不要な部分があります。
欲しい部分だけ切り取るには、どうすればいいでしょうか?
よろしくお願いします。
100k /home/user/file.tmp
~~~~~ ~~~~~~~~~~~~~~~~~~~~
↑ ↑
欲しい 要らない部分
508:login:Penguin
08/01/26 11:20:53 NixStw3D
#!/bin/sh
filesize=('du -h ~/file.tmp')
$filesize > ~/filesize.txt
間違えてしまいました。こんな感じです。
grepで抽出するオプションの書き方も思い付かず
スクリプトで処理するには・・・?と、行き詰まってます。
509:login:Penguin
08/01/26 11:34:50 opXPKDAo
>>508
cut (coreutils)
510:login:Penguin
08/01/26 11:48:51 NixStw3D
>>509
ヒントありがとうございます。
使い方を調べてみます。
511:login:Penguin
08/01/26 12:47:23 NixStw3D
>>509
もう少しヒントをください。
cat と coreutils のどちらかを使うや
cat か coreutilsのどちらかを使うかや
レスの意図を示していただけるとありがたいです。
シェルスクリプト歴数時間で理解が及ばなく申し訳ないです。
512:login:Penguin
08/01/26 12:52:39 K0Rp0izE
>511 ちょっとでもぐぐってみたのかと.
あと猫じゃなくて切るほうな.
513:login:Penguin
08/01/26 13:12:20 NixStw3D
>>512
調べてみたのですが、広範囲になってきて混乱してきました。
今のところ
cat -Tというオプションと、rtというコマンドを発見して
コンソール上で
du -h /home/user/file.tmp|cat -T|tr "^I/home/user/file.tmp" " "
とすると、ファイル数だけ表示されるようになったので
うまい方法でもないような気もしつつに
#!/bin/sh
filesize=('du -h /home/user/file.tmp|cat -T|tr "^I/home/user/file.tmp" " "')
$filesize > ~/filesize.txt
としてみたのですが
$./filesize.sh
↓うまく実行できずに困っています。
du: invalid option -- T
du: invalid option -- |
du: invalid option -- t
du: invalid option -- r
詳しくは `du --help' を実行して下さい.
514:login:Penguin
08/01/26 13:15:18 K0Rp0izE
>513 catじゃなくてcut.たぶんこれ一発でやりたいことはできると思うから調べてみな.
515:login:Penguin
08/01/26 13:22:31 NixStw3D
>>512,514
ありがとうございます。
素で間違えていました。
調べてみます。
516:login:Penguin
08/01/26 13:24:02 ShBosd97
stat -c %s
ではだめなのか
517:login:Penguin
08/01/26 13:43:18 NixStw3D
コンソールで
$ du -h /home/user/file.tmp|cat -T|cut -d ^ -f 1
としたらうまくファイルサイズだけ切り出せたので
#!/bin/sh
filesize=('du -h /home/user/file.tmp|cat -T|cut -d ^ -f 1')
$filesize > ~/filesize.txt
と、してみたのですが
なにか基本的な構文がおかしいのでしょうか?
バックスラッシュやシングル、ダブルクォーテーションを試してみましたが回避できません。
↓
du: invalid option -- T
du: invalid option -- |
du: invalid option -- u
du: invalid option -- t
du: invalid option -- d
du: invalid option -- f
詳しくは `du --help' を実行して下さい.
>>516
ヒントありがとうございます。
調べてみます。
518:login:Penguin
08/01/26 14:22:43 /buRKO/4
>>517
これでいいだろ。
du -h /home/user/file.tmp | awk '{print $1}' > ~/filesize.txt
519:login:Penguin
08/01/26 16:30:30 NixStw3D
>>518
調べたらawkは強力で、いろいろ使えそうです。
出力も当初の予定通りで完璧でした。
ありがとうございます。
結果を変数に代入出来なくなりましたが、構文を参考に>>517を直したら同様の出力結果で動きました。
#!/bin/sh
du -h /home/user/file.tmp | cat -T | cut -d ^ -f 1 > ~/filesize.txt
>>516
>>518さんを参考に手を入れたらキロバイト表示もできました。
ありがとうございます。
ただ、数字の後ろに「k」を入れる方法が判りませんでしたが。
#!/bin/sh
stat -c %s /home/user/file.tmp | awk '{printf "%s" ,$1/1024}' > ~/filesize.txt
520:login:Penguin
08/01/26 16:43:00 /buRKO/4
>>519
stat -c %s /home/user/file.tmp | awk '{printf "%sk" ,$1}' > ~/filesize.txt
521:login:Penguin
08/01/26 23:58:52 NixStw3D
>>520
応用ありがとうございます!
感謝。
522:login:Penguin
08/01/29 13:18:07 8n8HPqGB
columnコマンドがない環境でインデント合わせをしたいのですが、
何か良い方法はあるでしょうか?
523:login:Penguin
08/01/29 15:57:53 8n8HPqGB
lsコマンドで、ファイルのatimeやctimeを取得する方法はあるでしょうか。
HP環境なので、Linuxのstatコマンドがなくて途方にくれています。
524:login:Penguin
08/01/29 16:05:29 qGMFgswu
>>523
Linux の話じゃないなら板違い。
525:login:Penguin
08/01/29 16:33:43 yAbAmnAs
ファイルから目的の行を削除して上書きしたいとき,
sed -e 2d file >tempfile
mv tempfile file
のようにすればできるんですが,テンポラリファイルを使わない方法はありますか?
526:login:Penguin
08/01/29 16:37:12 qGMFgswu
>>525
GNU sed なら -i で。
527:login:Penguin
08/01/29 21:52:45 6iHka9Si
リダイレクトとサブシェルを駆使してうまいことinplace editをやる技が
あったはずなんだがどうやってぐぐればいいかわからん。
528:login:Penguin
08/01/29 23:11:45 k/ZizWnP
つ named pipe
529:login:Penguin
08/01/30 00:25:54 /azTEfDv
こんな感じのやつか?
$ echo hoge > hoge
$ (rm hoge; (echo fuga; cat) > hoge) < hoge
要はサブシェルに開かせておけば中で上書きしても内容は
デスクリプタから参照できるからそれでin-place処理できるって奴だな。
上は手抜きだけど、どっかのFAQにデスクリプタ付け替えまくりの例題が
載ってたのだけ覚えてる。csh-whynot文書あたりかも?
530:login:Penguin
08/01/30 00:35:03 KwdpVGiV
おおう、そんなかんじだったかも。thx
531:login:Penguin
08/01/30 20:21:01 6DxEwSig
すいません
ちょっと今シェルの作り方で困っているのですが
やりたいことは
一つのフォルダに入っているファイルを、ファイル名によって3つのフォルダに振り分けたいのです。
その際に、どのファイルをどのフォルダに移動するのかはシェルの中に記述するのではなく、
ファイル名の一覧が書いてあるtxtファイルを一行ずつ読んで振り分けたいのです。
ですが、作り方が今いちわかりません。
例えばA,B,Cと分かれていたら
1、Aのフォルダに振り分けるファイル名が書かれたtxtファイルを読む
2、同じファイル名がヒットしたらAに送る
3、次にBのフォルダに振り分けるファイル名が書かれたtxtファイルを読む
4、同じファイル名がヒットしたらBに送る
ファイル名が書かれたtxtファイルはA用B用C用の3種類用意します。
どうやって作ればいいのでしょうか?
532:login:Penguin
08/01/30 20:36:32 CiuX3/ZK
シェルの作り方なんぞ知るかい。
533:login:Penguin
08/01/30 20:38:30 0RlCwXSW
宿題は自分でやれ。
534:login:Penguin
08/01/30 21:41:32 wmsZ0JX8
>531
testコマンドでググレカス
ファイルの読み込み方すらわかんねーなら本一冊買って出直して来い
535:login:Penguin
08/01/30 21:48:11 6DxEwSig
うわー
冷たい
しかも叩く時だけは一気にレスがつくんだね
>>532
>>533
わからないなら無理にレスしなくていいです
536:login:Penguin
08/01/30 22:48:33 5hT959VT
さいきんの、このバカの質問な感じのには
>>わからないなら無理にレスしなくていいです
に類する文言が書き込まれる率が高いな、て思えるんだが、これは
1. この手のバカは結局バカだから、おなじようにしか考えられない
2. 実は同じヤツが何度も釣りに励んでいる
のどちらか、ということだろうか?
537:login:Penguin
08/01/30 22:54:16 KwdpVGiV
シェルを作るのは結構高度な作業だからな。
538:login:Penguin
08/01/30 22:59:49 v0ETiHGx
>>536
真・教えて君養成マニュアルとかがどっかにあるんじゃないか?w
539:login:Penguin
08/01/30 23:01:22 sxNLHjSv
>537 最近はGUIの環境もシェルと呼んだりするらしいしね.
ところで,シェルスクリプトをシェルと略す感覚が信じられない.せめてスクリプトのほうを残すべきじゃないのか,意味的に…
540:login:Penguin
08/01/30 23:05:38 j0KqLeiL
教えてクン養成マニュアル
URLリンク(www.redout.net)
541:login:Penguin
08/01/30 23:39:48 KwdpVGiV
>>539
GUIのシェルってのはそう最近でもないと思う。
DOSSHELLとか、X68kのVS.Xとかあったじゃないか。
542:login:Penguin
08/01/31 00:54:52 5zXcU2rl
>>531
うわーきもい。シェルを作るという表現はおかしい
シェルの作り方って、VBの作り方、Javaの作り方
聞いているのと同じ。それをKY言うのは異常。
for文とifを組み合わせれてループさせれば。
543:login:Penguin
08/01/31 05:38:28 sRx07lee
>>535
>わからないなら無理にレスしなくていいです。
たぶんここの人は9割以上わかっていると思う。
544:login:Penguin
08/01/31 05:47:16 sRx07lee
やる気がおきない。
態度の豹変に腹が立つ。
mv -i `neko a.list` a
mv -i `neko b.list` b
mv -i `neko c.list` c
545:login:Penguin
08/01/31 13:37:31 zeMbksrC
>>544
単純にnukoするよりもls -1 | grep -f a.list
とかしてより分けた方が良くないか?
546:login:Penguin
08/01/31 19:50:10 /M27f8ta
for 変数名 in 10 20 30
do
echo $変数名
done
この構文の変数名ってなんでもいいんですか?
あとこれを実行すると
10
20
30
になりますよね?
547:login:Penguin
08/01/31 20:53:32 p8W84r95
>>546
変数名に使える文字は英字と数字、アンダースコアのみな。
548:login:Penguin
08/01/31 21:07:34 Ih8EaxE5
すると、うちのbashはおかしい。。。
$ for 9_var in 10 20 30; do echo $9_var; done
bash: `9_var': not a valid identifier
549:login:Penguin
08/01/31 21:49:51 g7asi3X7
もしかして>>351 == >>548なんか?
こんなところで釣りなんかすんなよ...
もし釣りじゃなくってバカなんだったら、せめてmanするとかググるセンセに聞くとか、な?
550:548
08/01/31 22:00:40 m8vTasa1
その話題では>>354だが、なぜ351と?
551:login:Penguin
08/01/31 23:25:56 g7asi3X7
>>550
う゛、勘違いとかtypoとか。いかんな、落ち着かんと。
でもってマヂレスしとくと、変数の1文字目は数字じゃダメな。
552:login:Penguin
08/02/01 20:50:34 aG/PrNJ9
kakikomi.txtというテキストファイルがあったとします。
STRING1 を含んでいて、かつ STRING2も含んでいる行だけを
印字しようとおもうのですが、
grep STRING1 kakikomi.txt| grep STRING2
くらいしか思いつきません。二度手間な気がします。
もう少しいい方法ありませんか?
553:login:Penguin
08/02/01 20:57:02 IKSH1LNN
>552 -e
554:login:Penguin
08/02/01 21:42:25 KLEwAeBF
>>552
それ前スレ(UNIX板のほうだったかも試練)で話題になったな
「STRING1とSTRING2を『順不同で』含む行をイッパツで引っ掛けようとしたら
egrep '(STRING1.+STRING2)|(STRING2.+STRING1)'
となってしまう。2個ならまだいいが、3個、4個...と増えていくと正規表現がキモいことになってしまう。
順不同という条件なら、>>552のやり方が一番シンプル
555:login:Penguin
08/02/01 22:20:29 9CGaNXUy
awk '/STRING1/&&/STRING2/' kakikomi.txt
とか。
556:login:Penguin
08/02/01 23:10:27 aG/PrNJ9
>>554,555
ありがとうございました。
最近暇なので本でいろいろ勉強してみます。
557:login:Penguin
08/02/02 02:58:37 jQtmOvcu
例えばここに置いてある松金洋子のデスクトップ用壁紙画像をターゲットとする。
URLリンク(www.sexydesktop.co.uk)
ここには全部で4ページ分48種類の松金洋子の画像がある。
## このサイトの画像はすべてデスクトップ用の壁紙を目的としているので、
## 一つの画像に関して数種類の解像度・縦横比の画像が用意されており、
## アクセスしてきた人の使っているディスプレイ解像度を検出しては、
## 最適な解像度のものを優先的にプッシュするようになっている。
## また、画像ファイルの命名ルールは非常に単純かつ形式的で、
## たとえば例に挙げた松金洋子の画像の場合、
## まず画像の名前を表す youko1 から youko48 までの48種類の画像が用意されている。
## さらにそれぞれの解像度を表す 1280x800 や 800x600 の文字列が続き、
## 最後に拡張子 .jpg が付けられている。
## 注意する点があるとすると、例えば youko48 に対して youko01 だとか、
## 1280x1024 に対して 0800x0600 といった「桁数合わせ」が一切行われていないということ。
558:557
08/02/02 02:59:35 jQtmOvcu
ここから先が質問。やりたいことは、
1). サイトがプッシュしてくるこちらのディスプレイ解像度に関係なく、
すべての画像について、解像度のより大きいバージョンを、
番号の一番若いものから古いものまで全種類取って来たい。
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種類)については、
ダウンロードを開始する前に手作業で調べることとします。
559:login:Penguin
08/02/02 03:11:26 BYWZpRq/
>>557-558
まずお前が考えて出来たスクリプトをうpしろ
話はそれからだ
560:557-558
08/02/02 03:17:30 jQtmOvcu
んー、俺はスクリプトに無知だから、一から十まで全部取って来て、
後で手作業で仕分けする、みたいな超バカなことしかできんのです。
だからエロい人に教えてほしいんです。。
ダメならヒントだけでもいいので下さい。
561:login:Penguin
08/02/02 03:19:54 BYWZpRq/
>>557-558
ほらよ
っ google.co.jp
562:login:Penguin
08/02/02 07:40:21 QLk1rUEb
地道にループ回すしかないのでは
たぶんリネーム関連はperlか何か使ったほうがラクじゃね?
563:login:Penguin
08/02/02 08:38:47 VQl51rL6
2).3). youko0123456789x0123456789.jpg というファイル名はどのように整形すれば?
564:login:Penguin
08/02/02 10:16:29 2Gx0/Giv
$cat test.txt
aaaaaaaaaaaaaaaaaaaaaaaaaa
+bbbbbbbbbb
cccccccccccccccccccccccc
+ddddddddddddddd
長い行は先頭に+をつけて折り返しているという内容のファイルを
$cat test.txt
aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbb
cccccccccccccccccccccccc ddddddddddddddd
というように+の折り返しを前の行の後ろに空白付で結合させるにはどうすればいいでしょう?
565:login:Penguin
08/02/02 10:19:50 QLk1rUEb
cat test.txt | tr '\n+' ' 'とかどう?
566:login:Penguin
08/02/02 10:34:51 2Gx0/Giv
>>565
実行したら
$cat test.txt
aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbb cccccccccccccccccccccccc ddddddddddddddd
みたいになりましたが
$cat test.txt
aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbb
cccccccccccccccccccccccc ddddddddddddddd
これが出力としてほしいです。
\nと+が別で判断されているのでしょうか・・・
567:login:Penguin
08/02/02 10:37:11 QLk1rUEb
間違った.cat test.txt | tr '\n\+' ' 'で.
568:login:Penguin
08/02/02 10:39:50 QLk1rUEb
ごめん,俺嘘ばっかり言ってるから気にしないでorz
569:login:Penguin
08/02/02 10:41:24 2Gx0/Giv
>.567
同じ結果でしたw
レスありがとう!
570:557-558
08/02/02 10:50:34 jQtmOvcu
>>563
どうもです。
えー、そういう名前のファイルは存在しないので考えてもみませんでした。
>>562
もし $name$no1024x768$suffix がある時 $name$no1024x0768$suffix にせよ、
みたいなことを延々とやる、ということなんでしょうか?(←無知)
うーん。。。
571:login:Penguin
08/02/02 11:02:51 jHuzpaac
>>564
if 先頭が+じゃない then
echo ""
else
echo -n " "
fi
echo -n 行
572:login:Penguin
08/02/02 12:30:06 A3vIBKBi
>>564
sed 'N;s/\n+/ /;t;P;D'
573:login:Penguin
08/02/02 14:09:27 2Gx0/Giv
>>572
ありがとうございます!!
574:login:Penguin
08/02/05 19:10:25 E60rvXpx
/tmpにあるディレクトリをリストし
そこからディレクトリ名だけを切り取りたいと考えています。
/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
と出力されることは確認しました。
申し訳ないのですが良い方法をご教授ください。
575:login:Penguin
08/02/05 19:18:42 DHgW4Gk4
find /tmp -maxdepth 1 -mindepth 1 -type d | awk -F/ '{print $NF}'
find /tmp -maxdepth 1 -mindepth 1 -type d | sed -e 's/.*\///'
find /tmp -maxdepth 1 -mindepth 1 -type d -exec basename {} \;
576:574
08/02/05 19:21:21 E60rvXpx
>>574で実行したコマンドは
$ find /tmp -type d -maxdepth 1 -mindepth 1 | xargs echo | awk -F/ '{print $NF}'
の間違いでした。
よろしくおねがいします。
577:574
08/02/05 19:22:58 E60rvXpx
>>575
望みどおりの出力を得ることができました!
早い回答感謝します。
ありがとうございます。
578:login:Penguin
08/02/06 21:11:41 Qs2nEtFk
すみません、次の表現ってどういう意味なんでしょうか
($Fはlsの結果が入る)
if expr "$F" : '[[:alunum:]_-]\+$' > /dev/null 2>&1; then ...
特に : '[[:alunum]_-]\+$'の箇所が分かりません
自分で調べて分かったのは
[:alunum:]が数値を表すPOSIX準拠の文字クラスであること
:はヌルコマンド
[]が正規表現とすると[[:alnum:]_-]\+$は以下のいずれかという意味でしょうか
数値+$
_+$
-+$
だとしても前半の:とのつながりもよく分からないです..
579:login:Penguin
08/02/06 21:39:32 2Q3KS/FB
そのコロンはexpr の引数であって、パターンマッチを行わせるもの。
ヌルコマンドではない。
[[:alnum]]_-]¥+$ は、
「英数もしくは _ もしくは -」([[:alnum]]_-])の繰り返し(¥+)で末尾になる($)パターン。
つまり$Fが↑のパターンにマッチするかで判断するif文だな。
出力を/dev/nullに捨てている理由は、exprの動作を調べればわかる。
580:login:Penguin
08/02/06 22:12:35 Qs2nEtFk
>>579 ありがとうございます。やっと理解できました!
exprについては、nullまたは0を返した際に0を返すという仕様のため
/dev/nullに出力していることはすぐ分かったんですが
「:」もexprの構文だったんですね
ずっとシェルのパターンマッチの構文として「:」を調べていたため
ハマってました,thx!
581:login:Penguin
08/02/07 17:29:04 SojUAx7O
リダイレクトで先頭5行目から行末から5行目前までを出力したいのですが、
??? | head -n xx | tail -n xx 以外に良い方法はあるでしょうか
582:login:Penguin
08/02/07 18:31:29 K+RTjMO0
なにをしたいのか、君の示した例は本当に目的を満足してるのか、
もういちど確認した方がよいと思われ
583:login:Penguin
08/02/08 08:15:13 D8JF1iVI
では、headとtailは使わずに。
sed -n '5,$p' file.txt | tac | sed -n '5,$p' | tac
…意義が見出せない。。。
584:581
08/02/08 15:35:34 aAYt8gpF
>>583
sedは習ってないので提出できないんですよ
他にないですか?
585:login:Penguin
08/02/08 15:38:14 Yg3sGZTq
>>584
白紙で出せば...
586:login:Penguin
08/02/08 16:08:13 z5e2UbEF
{ read a;read a;read a;read a;tac; } | { read a;read a;read a;read a;tac; }
587:login:Penguin
08/02/08 16:57:33 rygBoGE6
習っていないと使えないって、そんな小学校じゃあるまいし
588:login:Penguin
08/02/08 19:53:27 8gRlFmfx
>sedは習wwwwってwwないのwwwで提出でwwきないんですよww
>他になwwwwいですか?www
のように、wを適当にまぶすスクリプトを誰か考えてくれ。
589:login:Penguin
08/02/08 21:34:44 Z8wDJkcZ
>>588
こんな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
590:589
08/02/08 21:45:59 Z8wDJkcZ
初心wwww者でサーセンww
$RANDwwwwOM使wwってるのwwwで本wwww当のshではww動かなwwwいはずだけど,wwwここはwwLinux板wwwってことwwwで許wwwwしてもらえるwwよね?
591:login:Penguin
08/02/09 21:05:58 sA/Tx79N
あの~、正規表現についてお聞きしたいのですが
[a-z]で小文字のアルファベット全てにマッチですよね。
ならば
[あ-ん]でひらがな全てにマッチしますか?
592:login:Penguin
08/02/09 21:44:35 y7ESpv1X
yes
593:login:Penguin
08/02/10 00:32:01 HzElnwAK
「ぁ」はマッチしないのでは?
それはそうと、多バイト文字の正規表現って、大抵のアプリケーションで普通に使えるものなのか。
知らなんだ。
594:login:Penguin
08/02/10 01:02:27 bq0IfXwT
質問です。ファイルの対象部分に別のファイルを挿入するコマンドってありますか?
% cat file1
aaa%sbbbccc
% cat file2
ZZZ
% hoge %s file2 < file1
aaaZZZbbbccc
のような動作を期待しています。
挿入するファイルは少し長めなのでsedで置換ではできない気がしています。
awkあたりでfile1を%sが出るまで出力 -> file2を出力 -> file1の%s以降を出力
という方法を考えていますが、もし専門のコマンドがあれば教えてください。
595:594
08/02/10 01:12:39 bq0IfXwT
誤爆先でm4というのを教えてもらいました。
一旦使ってみます
596:login:Penguin
08/02/10 01:14:06 AyxHcvsn
そういうのはエディタで
597:login:Penguin
08/02/10 01:52:24 EflaE009
>>595
おまえFedoraすれにいなかったか?
598:login:Penguin
08/02/10 06:29:30 7q9QRaK3
>>594
printf "`cat file1`\n" `cat file2`
599:login:Penguin
08/02/11 23:47:20 wSzjm7y4
>>593
grep でやってみたらマッチしやがったよ。
600:login:Penguin
08/02/12 02:36:00 NhGbxXsu
文字列として検索できるということと、
全角文字も一文字として扱える、というのとでは意味がぜんぜん違う。
601:login:Penguin
08/02/13 03:57:10 Z8x6psMH
[あ-ん]と[\xe4\x1c-\xe4\x5f]ではまるで別物だしな(コードは適当)
602:login:Penguin
08/02/13 23:44:52 3LjmFUst
#スレ違いだが。
MS-Windowsとの可搬性に最も富むスクリプトは何ですか?
ただし、cygwin環境とperlは除外して。
603:login:Penguin
08/02/13 23:58:15 jHUDsaVW
>>602
javascriptに一票
604:login:Penguin
08/02/14 00:56:22 axFZQkw/
>>602
awk,ruby,Python つーかなんでperlダメなの?
たしかにWinのperlめんどいけどね。
605:login:Penguin
08/02/14 20:13:50 oi3zsBt5
ディレクトリにあるmp3ファイルを1行に3つずつ番号付きで表示して
指定されたファイルを再生するスクリプトを考えてみました。
これだとファイル表示の見た目がいまいちなんですが、カラムを揃えて
表示するようなうまいやり方はありますか?
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