シェルスクリプト総合 ..
[2ch|▼Menu]
212:210
08/06/22 13:59:15 IsXP6W78
>>211
どうもありがとうございました。

213:login:Penguin
08/06/22 16:57:49 3HpeFvyL
あれ?更新されてない


214:login:Penguin
08/06/22 17:03:12 3HpeFvyL
rsyncをあえてつかわずローカルでのWEBサイトの更新を別のPCへFTP(put)
したいのですが混乱してきましたどなたかわかりますでしょうか?
#!bin/sh
#pukiwiki内のファイルで更新のあったファイルのあぶりだし。
echo = "`ls --full-time -F`" > fulltime
awk '{print $6$7}' /var/www/html/pukiwiki/fulltime
awk '{print $6$7}' /var/www/html/pukiwikibk/fulltime2
diff=diff /var/www/html/pukiwiki/fulltime /var/www/html/pukiwikibk/fulltime2
#diffの中身が空なら抜ける
if [ "$diff"-eq /dev/null ];then
logout
#diffの内容がディレクトリなら再度中身のファイルの更新がないかを確認。
#diffの中から$10のファイル名を取り出す

215:login:Penguin
08/06/22 17:04:18 G5GD5xl+
>>214
lftp使え。

216:login:Penguin
08/06/22 17:13:28 3HpeFvyL
わかりました。ありがとうございます。lftp調べてみます。

217:login:Penguin
08/06/22 17:19:23 3HpeFvyL
ローカルになく、リモートにのみあるファイルを削除したいときは
mirror -R -e

mirror -e
などできるみたいですが、
ローカルで更新されたファイルのみアップといったこともできるのでしょうか?

218:login:Penguin
08/06/22 17:47:05 3HpeFvyL
#!/bin/sh

cd /var/www/html/pukiwiki
lftp -e "mirror -e -vvv pukiwiki; bye" ftp:XX.XX.XX.XX/var/www/html/pukiwiki

これだけでいけますでしょうか?

219:login:Penguin
08/06/22 18:16:38 7nMjRrut
n 更新されたのみ

mirror -Rn


220:login:Penguin
08/06/22 22:21:11 R/kAIh0A
ubuntu初心者スレから誘導されました。

成形した時刻の文字列をクリップボードにコピーするシェルスクリプトを作りたいのですが
まずdateで時刻を取得出来ることがわかりました。それで日付や時間を成形してみました。
で、その取得した時刻をクリップボードにコピーさせる方法が分かりません。

ubnutuは8.04です。よろしくお願いします。

221:login:Penguin
08/06/22 22:29:53 G5GD5xl+
>>220
xclip が使える。ただし日本語が通らない。
ruby がクリップボード操作できるみたい。

222:login:Penguin
08/06/22 23:37:38 MIeLc8tv
シェルスクリプトで正規表現使いたいのですが、
末尾が .jp のものだけマッチさせたい場合は
$\.jp
でよろしいのでしょうか?

223:login:Penguin
08/06/22 23:55:19 iLaxDbCt
シェルだけで正規表現って扱えるの?

224:login:Penguin
08/06/23 00:09:49 xSXSaj7v
>>223
[[ 'www.example.jp' =~ '\.jp$' ]] && echo OK

225:login:Penguin
08/06/23 00:26:20 bFQcdw6C
>>223
man expr

226:login:Penguin
08/06/23 07:14:57 xSXSaj7v
>>225
expr は外部コマンドじゃね?

227:login:Penguin
08/06/23 07:23:33 /dfygF5Q
bash 3.2.33だが>>224だとOKと表示されない件について

228:login:Penguin
08/06/23 07:55:06 xSXSaj7v
quote しちゃだめになったのか。

[[ 'www.example.jp' =~ \.jp$ ]] && echo OK

229:login:Penguin
08/06/23 08:04:56 E3xyu4wD
>>221
そうですか。日本語通らないですか。
rubyがいけるならPythonもいけるのかな。探してみます。ありがとうございます。

230:login:Penguin
08/06/23 13:11:35 R4pyjC2R
>>229
xselでおk

231:login:Penguin
08/06/23 20:44:19 E3xyu4wD
>>230
さっそく入れて使ってみました。
中クリックで文字列を選択した内容をそのまま貼り付けれてものすごく便利でした!
いいものを知りました。ありがとうございます。

で本題
スクリプトはこんな感じまで書きました。
#!/bin/bash

y=`date +%Y`
m=`date +%m`
d=`date +%d`
t=`date +%T`
DATE= $y/$m/$d/" "$t
echo $DATE

これで、chmod -x で権限を与えて実行すると、現在の時間を返してくれるようになりました。
が、xselを使って$DATEをクリップボード(かプライマリ)にコピーする方法が分かりませんでした。--inputは変数が代入出来ないようですし。
xsel -p  < $DATE ではうまくいきませんでした(ファイルじゃないので当たり前ですか)

232:login:Penguin
08/06/23 20:57:33 II3EglSV
>>231
>xsel -p < $DATE ではうまくいきませんでした

echo $DATE > xsel -p


233:login:Penguin
08/06/23 21:41:12 t++FsyID
echo $DATE | xsel -i

234:login:Penguin
08/06/23 21:51:30 E3xyu4wD
>>232
どうもうまくいきませんでした。
修正したものを実行すると、〜.shと同じディレクトリに xsel という中身が"-p"の入ったファイルが作成されてました。

235:login:Penguin
08/06/23 21:54:47 eV6dG77Y
>>234 look asap >>233

236:login:Penguin
08/06/23 22:05:35 E3xyu4wD
>>233
こちらもうまくいきませんでした。

実行すると、以下の結果が表示されました。

./date_clipboard.sh: 7: 2008/06/23/ 21:52:49: not found

/が入っていると、ディレクトリと認識してしまうのではないかと思って、/を外して数字だけ並んだものも作って見ましたが、だめでした。 同じく echoで$DATEの中身とnot foundと出されました。

>>235
こういうことでしょうか?

#!/bin/bash

y=`date +%Y`
m=`date +%m`
d=`date +%d`
t=`date +%T`
DATE= $y/$m/$d/" "$t
look asap
echo $DATE | xsel -i

これを実行しても、同じく、echoで$DATEの中身とnot foundと出ました。

237:login:Penguin
08/06/23 22:18:40 t++FsyID
#!/bin/sh
date "+%Y/%m/%d %T" | xsel -i


238:login:Penguin
08/06/23 22:26:25 E3xyu4wD
>>237
おお! 見事に表示されました。
dateごと渡してやればよかったのですね。勉強になりました。
ありがとうございました。

239:232
08/06/23 22:40:24 7JKTU8Gt
ごめん! (汗)

240:login:Penguin
08/06/23 22:50:21 xSXSaj7v
>>238
> dateごと渡してやればよかったのですね。
別に echo $DATE | xsel -i でもいいよ。

241:login:Penguin
08/06/23 22:51:35 xSXSaj7v
>>236
> DATE= $y/$m/$d/" "$t
問題はここだ。
= の後の空白が余分。

むしろ
DATE="$y/$m/$d/ $t"
と書くべき。

242:login:Penguin
08/06/24 08:29:39 /ei8InYp
>>239
いえいえ。

>>240-241
空白がまずかったのですね。気がつきませんでしたorz
ダブルクオーテーションでくくると文字列がそのまま出てくる気がして、
> DATE= $y/$m/$d/" "$t の途中の" "は空白を出力したつもりでしたが、全体をくくってやってもよかったのですね。実行して確認しました。

#!/bin/sh

y=`date +%Y`
m=`date +%m`
d=`date +%d`
t=`date +%T`
DATE="$y/$m/$d/ $t"
echo $DATE | xsel -b -i

(xsei -b -iでクリップボードにもコピー出来るようにしてあります。xsel -pでも動きました。)
見え栄は>>237のほうがいいですねw

勉強になりました。ありがとうございました!



243:login:Penguin
08/06/24 08:33:49 /ei8InYp
一部ミスりました

× ダブルクオーテーションでくくると文字列がそのまま出てくる気がして、
○ ダブルクオーテーションでくくると文字列がそのまま出てくる気がして、 全体をくくらずにしていました。


244:login:Penguin
08/06/24 09:36:52 7q12wxxB
>>242
> ダブルクオーテーションでくくると文字列がそのまま出てくる気がして、
URLリンク(www.linux.or.jp)

YEAR=2008
echo "$YEAR"
echo '$YEAR'

245:login:Penguin
08/06/24 10:37:39 /ei8InYp
>>244
そうだったのですか、シングルクオーテーションは文字として出てきて、ダブルクオーテーションでは、$も例外として、$が機能すると言うことですか。
いやはや知らないことだらけでした。勉強になります。ありがとうございます。

246:login:Penguin
08/06/24 19:18:26 GHnoP+if
初心者の書くスクリプトは、むしろダブルクォートを忘れて
インジェクション的な事故多発なわけですがw

if [ x"$HOGE" == x"DQN" ] ; then

ちゃんとこういう風にまで保護されているスクリプトは稀。

247:login:Penguin
08/06/24 19:36:34 RnXDPQy/
俺さ、その x が何のためにあるのか、以前から不思議なんだ。

if [ "${HOGE}"="DQN" ] ; then

との違いは何?

248:login:Penguin
08/06/24 19:40:10 y8G0f9r3
$HOGEが未定義の場合どうなるんだ?

249:login:Penguin
08/06/24 19:41:45 7q12wxxB
>>247
= と == は違う。
== の前後に空白が必要。

その上で、$HOGE が空文字列の場合にエラーになるのを回避するため。

250:login:Penguin
08/06/24 19:50:56 GHnoP+if
>>247 の = は == の typo でしょうw

で、"${HOGE}" == "DQN" だったら $HOGE が未定義でもエラーにならない。
x"$HOGE" == x"DQN" との違いは漏れは知らん。ジジイ仕様の /bin/sh とかが
あって "${HOGE}" できない場合があるんじゃない?

× export HOGE="DQN"
○ HOGE="DQN"; export HOGE

こんな環境もあるぐらいだからなぁ・・・・・・

251:login:Penguin
08/06/24 20:00:18 7q12wxxB
>>250
> で、"${HOGE}" == "DQN" だったら $HOGE が未定義でもエラーにならない。
bash はそうだけど、エラーになるシェルもある。
Solaris の /bin/sh とか。

252:login:Penguin
08/06/24 20:07:28 GHnoP+if
やはり Solaris かw そんな気はしていた。

普段は Linux 使ってるから必然と bash になっちゃうんだよね。sh で出来たっけ?
とか結構記憶が曖昧になってしまって鬱。場合にもよるけど、ポータビリティを
意識してなーんとなく昔ながらの書き方を守ってる漏れ・・・・・

あえて #!/bin/bash って書くべき?w

253:login:Penguin
08/06/25 02:03:39 QRiAgjkv
Solarisの古いshなんて無視していいだろ。
POSIX shell (ash, bash, ksh, ...) で動けばいいよ

254:login:Penguin
08/06/25 03:24:07 CH5fnn3k
実際 そんなに拡張されてないし でしょw
#!/bin/bash
でいいよね。

255:login:Penguin
08/06/25 03:42:02 r4HiK5gk
>>254
スクリプト動かすのに重量級のbashなんか使わないだろ。
#!/bin/sh
で十分。

256:login:Penguin
08/06/25 04:07:08 CZiflGY7
>>255
先生!うちの環境では
file /bin/sh
/bin/sh: symbolic link to `bash'
です.どうすればいいですか?

257:login:Penguin
08/06/25 04:46:49 N+m64wV+
>>255 i486SX/16MHz

258:login:Penguin
08/06/25 04:59:00 CH5fnn3k
だから もう 手じかな環境では
/bin/shはないでしょ。
/bin/shと書けばいちおー 互換モードで動くってだけで。

259:login:Penguin
08/06/25 10:58:55 NWVIKvCl
FreeBSDの事もあるしshで書いておこうってだけじゃね

260:login:Penguin
08/06/25 11:25:51 r4HiK5gk
debian 系だと
$ file /bin/sh
/bin/sh: symbolic link to `dash'

~$ ls -l /bin/bash /bin/dash
-rwxr-xr-x 1 root root 686K 2008-05-13 03:33 /bin/bash*
-rwxr-xr-x 1 root root 79K 2008-03-12 20:22 /bin/dash*

サイズが全然違う。

261:login:Penguin
08/06/25 11:46:13 e3mj3BLL
別にどっちかに決める必要なんてない。
portabiltiy が必要なスクリプトは protable に書く。
そうでなければ bash 依存な書き方をしてもいい。
それだけのこと。

262:login:Penguin
08/06/25 12:06:01 foNddTWJ
>>256
ぶっちゃけbashはzshよりも遅い。軽量のashなんかとは比べるべくもなく。

ログインシェルとしてなら使い勝手云々ってのがあるけど、
/bin/shをbashにしておくメリットはあんまないよ。

263:login:Penguin
08/06/25 12:36:18 Qkn+OwYP
なんかもっともらしいウソが垂れ流されてるぞ。

>>251
>> で、"${HOGE}" == "DQN" だったら $HOGE が未定義でもエラーにならない。
>bash はそうだけど、エラーになるシェルもある。
>Solaris の /bin/sh とか。

solaris ではたしかにエラーになるけど、それは $HOGE が未定義だからではない。
== という演算子自体がないため。
互換性を考えると文字列の比較には == ではなく = を使う。
= なら $HOGE が未定義でもエラーにならない。

x"$HOGE" のようにするのは、$HOGE が -f とか ! のような文字列だったときに
別の意味に解釈されないようにする対策。

264:login:Penguin
08/06/25 17:32:32 PrRjFF/A
マジッスカ
ちょっとコンビニで Soliras 買ってくる><

265:login:Penguin
08/06/25 20:22:07 g812rZ0o
>>251
Sun4 で試したら、未定義でもエラーにならんかったよ。

$ cat test.sh
uname -rvs
VAR="VAL"
[ "${VAR}" = "VAL" ] && 'true'
[ x"${VAR}" = x"VAL" ] && 'true'

unset VAR
[ "${VAR}" = "VAL" ] && 'true'
[ x"${VAR}" = x"VAL" ] && 'true'
$ /bin/sh -x test.sh
+ uname -rvs
SunOS 4.1.4-JL 2
VAR=VAL
+ [ VAL = VAL ]
+ true
+ [ xVAL = xVAL ]
+ true
+ unset VAR
+ [  = VAL ]
+ [ x = xVAL ]

266:login:Penguin
08/06/26 15:09:48 ZojLTS6b
お邪魔します。

シェルスクリプトを走らせて、あるシェルスクリプトを起動させるようにするにはどういう書き方したらよいですか。
また、そのシェルスクリプトを走らせた結果を変数にぶちゅっと入れる書き方はどうしたらいいですか。

267:login:Penguin
08/06/26 15:35:52 ZojLTS6b
事故解決しますた。すいません。

268:login:Penguin
08/06/26 22:18:06 ZPxwXTvf
ぶちゅっ


269:login:Penguin
08/06/28 20:17:43 /ZK60QF9
シェルでエロゲをつくるためにはどうしたらいいですか

270:login:Penguin
08/06/28 21:21:44 MDU5A1fa
エロゲって何ですか

271:login:Penguin
08/06/28 22:52:16 /ZK60QF9
linuxがwindowsに唯一負けてるのがエロゲです

272:login:Penguin
08/06/28 23:29:11 fs03Gty7
だとすれば、sh スクリプトでなく、BAT ファイルで作ると良いのではないでしょうか

273:login:Penguin
08/06/28 23:48:10 ZJYzC1iZ
windowsに対抗するため、Linuxにエロゲを導入します
また、複数のplayerがエロゲサーバにtelnetしてplayすることを想定としているため
GUIではなくCUIで行いたいと思っています

274:login:Penguin
08/06/29 00:53:49 nwf205tS
>>273
CUIでいかにエロさを出すかが問題だ

絵もない本当のノベルゲームでいいっていうなら、
ひたすらechoとifとかwhileとかcaseを駆使すればできる気がするけど

今どきtelnetってのもツッコミどころだけどな

275:login:Penguin
08/06/29 01:02:35 wXyVSJIl
Nethackはエロゲ
異論は認める

276:login:Penguin
08/06/29 01:16:19 4XAvfgBl
NetHackを2ch-AA拡張すればエロくなる。

主人公:( 'A`)
ヒロイン:J( 'ー`)し

てな具合。そんでもって濡れ場ではフルスクリーンAAでアニメーションするの。

277:login:Penguin
08/06/29 02:09:45 O4g3tYWz
エロゲの話はこっちで。

Linuxで動くオープンソースエロゲを作ろう!2
スレリンク(linux板)

278:login:Penguin
08/06/30 18:35:41 Y3MWGahT
Linux + Darwin Streaming Server で自分専用の放送局を何チャンネルも建てて
どこでも自分のコレクションした音楽を聞けるようにして楽しんでいるのですが、
面倒くさいのは、メタファイルを用意せねばならない点。
例えばマイケル・ジャクソンだけを集めた専門局を作るとします。これを
1). URLリンク(www.example.com)
2). URLリンク(www.example.com)
などといったメタファイルに、以下のような内容を記述しておいてやらねばなりません。
1). [playlist]
File1=URLリンク(www.example.com:8000)
Title1=nina
Length1=-1
NumberOfEntries=1
Version=2
2). URLリンク(www.example.com:8000)
ま、大した量じゃないので、今まではいちいち手作業で cp して vi で編集していたのですが、
これを、例えば
$ mkpls michael
などと言った変数 $streaming_name を与えれば、
自動的にファイル内の特定の部分も書き換えて、
かつ、.pls .m3u それぞれのストリーミング用メタファイルも
まとめて生成してくれるようなスクリプトがあれば便利なのに、
と思っているのですが、どう書けばいいのかサッパリ解りません。
基本は、単に変数を含んだひな形を用意し、ひな形を複製、与えられた変数を代入して、
変数の名前+拡張子で保存、というだけのことだと思うんですが。。。。orz

279:login:Penguin
08/06/30 22:16:41 mYyaCshH
超入門者です。下記内容のシェルを作成しなければならないのですが、参考書を見てもよく分からず
知り合いにも分かる人間がおりません。。ごめんなさい、どなたかご教授頂けないでしょうか?

・/var/log/mailを解析して特定のユーザに関する調査を実施して結果をファイル出力する。
(条件)
 ・スクリプトの実行形式は「スクリプト名 ログファイル名 メールアドレス」
 ・受信メール数と送信メール数を集計する。
 ・調査をするユーザは引数として与える。
 ・調査をするユーザはtest@toyo.co.jp
どのような記述にすれば良いのか、参考となる情報を何でも構いませんのでお願いいたしますm(__)m

280:login:Penguin
08/06/30 22:19:25 LfTOpvVG
>>279
grep $2 $1 | wc -l

さっさと学校辞めて派遣労働者にでもなってしまえ。
その方が親孝行だ。

281:login:Penguin
08/06/30 22:51:24 LE+io00E
シェルからwindowsにrshのような感じでコマンドを打ちたいんですが、
telnetを使ったりしてどうにかならんでしょうか?

282:login:Penguin
08/06/30 22:51:47 LfTOpvVG
>>281
expect

283:login:Penguin
08/06/30 22:55:37 pVpnujlR
>>279
スクリプト以前にひょっとしてシェルプロンプトで何も叩いた事がないほど初心者?

284:login:Penguin
08/06/30 23:08:10 mYyaCshH
279です。
>>280
その言葉真摯に受け止めます。ですが今後努力する所存です。
すいません。諸事情で時間がない中でしたのでこちらで質問させて頂きました。
参考情報ありがとうございます。
>>283
簡単なコマンドなら叩いたことはありますがシェルは全くの初心者です。
どうか宜しくお願い致しますm(__)m

285:login:Penguin
08/06/30 23:13:41 LE+io00E
>>282
家のfedoraでインストールして試してみてexpectすげーと思ったけど、業務用のredhat 3 には多分入ってないです・・・
ありがたいですけど、他にないですか?

286:login:Penguin
08/06/30 23:35:01 EeC8VQhU
>>285
Expect.pmとかopen3.rbとか・・・
最悪openptyで相当品を書けばいい。tccで書けばそれでもスクリプト。

287:login:Penguin
08/06/30 23:41:54 pVpnujlR
>>284
それじゃまずgrepを使ってあるユーザーの受信メールの行と送信メールをどうやったら切り出せるか
試行錯誤し、それが出来たらwc。 ひっかかったらgrepのmanページでまず回答を探す努力を。
awkとかのほうが色々柔軟性があるけどたぶん使った事無いでしょう。

あと>>3のリンク先をいくつかながめるといいと思う。


288:login:Penguin
08/06/30 23:48:15 hskJhfYi
初心者です。お願いします。

cutコマンドはファイルのみ使えますか?
変数にも使えるでしょうか。
変数に格納してある文字列からcut.grepを使いたいんですが。


289:login:Penguin
08/06/30 23:49:01 mYyaCshH
>>287
ご教示いただいた方法にて調べてみます。本当にありがとうございますm(__)m

290:login:Penguin
08/06/30 23:54:15 LE+io00E
>>286
それらはアプリでしょうか?
インストールが必要なのはNGなんです。
標準的なコマンドで実装できれば・・

291:login:Penguin
08/07/01 00:23:35 7AvBIvdb
>>278
plsとm3uは多くのプレイヤーが使ってる形式のようですから
お使いのプレイヤーにその機能がないか確認してはいかがでしょう。
プレイヤーをお使いでないならこういうものもあります。
URLリンク(freshmeat.net)
ビルドにuriparserを求められますがconfigureに--disable-xspfを
つけると要らなくなります。

292:login:Penguin
08/07/01 00:37:40 F/ZP/0+B
>>278
外してるかもしれないのですがこれだけで十分ですかね

#!/bin/sh
streaming_name=$1

cat <<END >$streaming_name.pls
[playlist]
File1=URLリンク(www.example.com:8000)
Title1=nina
Length1=-1
NumberOfEntries=1
Version=2
END

cat <<END >$streaming_name.m3u
URLリンク(www.example.com:8000)
END

293:login:Penguin
08/07/01 01:20:48 DL3owd7E
>>288
$echo 1111 bbbbbb | cut -f1 -d ' '
で1111と表示できるからcutにパイプして
echo $var | cut -fx
で出来る

変数にファイル名を入れてる場合なら
cut -fx < $filename
でおk

あとはエスパーじゃないんで分からん

294:login:Penguin
08/07/01 07:30:47 /iSyGj3E
>>288
echoしてリダイレクト。基本。

295:login:Penguin
08/07/01 10:01:29 ckhBGtgF
質問です。
変数の中に=があったらそれまでの文字を出力したいんですが、

例)$1に abc=defg -> abcのみ出力
  $2に abcdefgh -> 何もせず

こういった場合、abcを取り出す(=の前までCUT?)事はできますか?
if(( grep '=' $1 ))
then
cut〜
みたいになるんでしょうか。お願いします。

296:login:Penguin
08/07/01 10:12:23 wSJ46Tmn
>>295
case "$1" in
*"="*) echo "$1" | sed 's/=.*//' ;;
esac

297:login:Penguin
08/07/01 10:25:43 sgtpdcHD
bashで
x=$1
p=${x%=*}
[ $x = $p ] || echo $p

298:login:Penguin
08/07/01 10:28:44 ckhBGtgF
>>296
即レス有難うございます!お陰様で出来ました^^

299:login:Penguin
08/07/01 10:37:02 wSJ46Tmn
>>297
それだと $1 が「/tm*/=xx」とかのときうまくいかない。

300:login:Penguin
08/07/01 10:58:55 HD46/kcy
>>295
>(=の前までCUT?)

>>296 で sed の例が出てるけど
cut -d "=" -f 1
とか
awk -F "=" '{print $1}'
とかでもできる。

301:login:Penguin
08/07/01 11:57:13 ckhBGtgF
>>296,>>297,>>300の皆さん有難うございます!

302:login:Penguin
08/07/01 12:12:55 ckhBGtgF
すみません、力を貸して下さい。
今やらなければならないのが、lsuser ALL を叩いて、
出力結果を見出し付で出力する(体裁を整える)です。

現在見出しの部分でつまずいています。

bin id=2 pgrp=bin groups=bin,sys,adm home=/bin
guest id=100 pgrp=usr groups=usr home=/home/guest
などを

user_name id pgrp groups

bin 2 bin bin,sys,adm
guest 100 usr usr

と言った感じです。=の前後でCUTし、前部分を見出しに、
後部分を見出しの下に出したいです。難しいのが、既に見出しにidがあるのに
また見出しにidが追加されてしまうんです。
どなたかサンプルを作っていただく、またはアドバイスを頂けますでしょうか。
よろしくお願いします。長文・乱文すいません。

303:login:Penguin
08/07/01 12:33:08 wSJ46Tmn
>>302
perl か何かで書いた方が早いと思う。

304:login:Penguin
08/07/01 12:44:02 ckhBGtgF
>>302
アドバイス有難うございます。調べてみます!
書き忘れたんですが、KORNシェルです。

305:login:Penguin
08/07/01 12:46:37 EG1sJMbp
実用的な答が欲しいならもう少し環境を書くべきだ.
bash,sed,awk,perlなどが使えるのかどうかとか.
それともシェルだけでアクロバティックにこなしたいのか?

306:login:Penguin
08/07/01 12:50:08 wSJ46Tmn
そもそも使ってる OS は何よ。

307:login:Penguin
08/07/01 13:03:02 Arg2/vlJ
>>292
ありがとうございます。バッチリでした。
いやー楽になった。っていうか勉強になりました。
みなさん、どういうところで構文を学んでいらっしゃるんでしょう?
この手のことについては完全に無学なもので、
どこからどう手をつけていいやら分かりません。

308:login:Penguin
08/07/01 13:21:36 wSJ46Tmn
>>307
テンプレくらい読め。

309:login:Penguin
08/07/01 13:31:41 ckhBGtgF
302です。環境はUNIX AIXです。そしてKORNシェルです。


310:login:Penguin
08/07/01 13:39:10 wSJ46Tmn
>>309
なら板違い。

311:login:Penguin
08/07/01 13:42:53 F/ZP/0+B
IFSに=を加えて行ごとにsetすると簡単

312:login:Penguin
08/07/01 13:48:38 ckhBGtgF
>>310さん すいません板違いでしたか。移動します。

>>311さん やってみます。有難うございます。

313:login:Penguin
08/07/01 17:29:52 0HA3LMf0
今日の宿題スレッドはここですか?

314:login:Penguin
08/07/01 20:13:34 sk7tfsLb
>>309
そういえばIBMのTivoli agent for Linuxをインスコしようとしたら
インストーラーがkshを必要としやがった。

315:login:Penguin
08/07/02 07:58:38 kAlrwjxr
>>302
俺には難しかった・・orz
誰か見本よろ

316:login:Penguin
08/07/02 11:59:47 t4E6Zbe3
>>302
#!/bin/sh
st=true
while read s
do
    rctop=null
    rc=null
    for n in $s ;do
        if [ $st = true -a "$rctop" = "null" ] ;then
            rctop=user_name
        fi
        if [ "$rc" = "null" ] ;then
            rc=$n
        else
            if [ $st = true ] ;then
                rctopadd=`echo -n $n | cut -d '=' -f 1`
                rctop=`echo $rctop $rctopadd`
            fi
            rcadd=`echo -n $n | cut -d '=' -f 2`
            rc=`echo $rc $rcadd`
        fi
    done
    if [ $st = true ] ;then
        echo $rctop
        st=false
    fi
    echo $rc
done
$./shellscript.sh < n.data

理想の動作じゃないだろうが
フォーマットをこっちが指定するやり方として…あとは整形の仕方だな

317:login:Penguin
08/07/02 12:18:34 15uy4jBz
>>312 で移動するって言ってるんだから
もうここで言ってもしょうがないんでは。

318:login:Penguin
08/07/02 13:02:11 t4E6Zbe3
('A`)スマソ

319:login:Penguin
08/07/02 15:26:35 BlTL/xTh
>>316>>317>>318
どこに行っていいかわからなくて、ちょくちょく覗いてましたw
>>316を参考にしたら、思ったとおりの動きをしてくれました。
本当に有難いっす。

320:login:Penguin
08/07/02 15:29:18 15uy4jBz
さっさと消えろ。

シェルスクリプト総合 その11
スレリンク(unix板)

321:login:Penguin
08/07/02 18:57:00 iGIzjxTr
質問です。

たとえば、
cat test
1
2
3
4
5

と表示されるシェルスクリプトがあったとして、それを
5
4
3
2
1

と表示させるにはどうしたらいいでしょうか?

322:login:Penguin
08/07/02 18:59:10 15uy4jBz
>>321
tac test

323:login:Penguin
08/07/02 19:12:45 iGIzjxTr
>>322
即答ありがとうございますっ

324:login:Penguin
08/07/02 23:09:21 tYZaCcmU
>>322
しっ、知らなかった... なんつー冗談ネーミング。 いつからあるの? 発祥はgnuかな。 Wikipediaにも
載ってない。

325:login:Penguin
08/07/02 23:11:36 tYZaCcmU
>>324
あ、あったわ。 tac(Unix)であった。

326:login:Penguin
08/07/03 07:56:36 HJXPhQch
Terrible-monster Attacking Crew

327:login:Penguin
08/07/04 00:23:17 Z8+RYNGO
cat tac
most more less
head tail
cut paste
pgp gpg
mail nail

言葉遊び系のコマンドペアって案外少ないんだな。

328:login:Penguin
08/07/04 01:21:52 7gcupJvt
if fi case esac

#ここはコマンド以前にシェルスクリプト スレだよな

329:login:Penguin
08/07/04 01:24:49 9pO2naUI
esac にはびっくりしたなーもー

330:login:Penguin
08/07/04 05:28:59 AeTu0vqB
逆文字でネストを表現するのはお手本となる言語があった気がする

331:login:Penguin
08/07/04 08:23:27 jR7hqKfT
プロセスをkillするシェルを作成しましたが、そのシェルそのものも引っかかってしまいます。

下記を実行すると、test のプロセスはKillされますが、
./kill_test.sh: line 6: kill: (17914) - No such process
と、エラーが出ちゃいます。
どのようにすれば、そのシェルそのものを検知しなくできますでしょうか。


例えば、test というプロセスをKillするプログラム

#!/bin/bash
# kill_test.sh
ID=ps axo pid,cmd | grep test | awk '{print $1}'`

if [ -n "$ID" ]; then
kill $ID
fi


実行結果
test のプロセスはKillされますが、エラーも出る
./kill_test.sh: line 6: kill: (17914) - No such process



332:login:Penguin
08/07/04 08:32:51 dZZeWoZr
>>331
pkill test

333:login:Penguin
08/07/04 08:55:04 jR7hqKfT
ありがとうございます。

プロセスはKillされますが こんどは Terminated と出ちゃいますが...


#!/bin/bash
# kill_test.sh

pkill test




334:login:Penguin
08/07/04 16:17:24 8eslOrWY
>>331
grep -v $$ とかやって
シェルスクリプトの pid を除く。

grep -v grep とか grep [t]est とかやって
grep の pid を除く。

335:login:Penguin
08/07/04 23:59:25 /fP/UZlP
most なんて初めて知ったよ。
URLリンク(www.jedsoft.org)

336:login:Penguin
08/07/05 05:45:46 zldIi++e
>>335
同じく
support multiple windowsの意味がわからんwww

337:331
08/07/05 08:21:10 f1ZF3ker

ps axo pid,cmd | grep test| grep -v ' grep' | awk '{print $1}'

で、できました。 m(._.*)mペコッ

 pkill 知りませんでした。pgrepも知ることができ感謝です 

338:login:Penguin
08/07/05 15:47:51 9A3h5Tdb
>>335
漏れも漏れも
can scroll left and rightの意味がわからん。

339:login:Penguin
08/07/05 16:46:32 QzBtt5r9
文字どおり左右にもスクロールできる、ってことじゃないのか
複数のファイルが見られるとか書いてあるし
URLリンク(www.slackbook.org)


340:login:Penguin
08/07/05 19:44:37 wIp47NAo
perlとかrubyとかpythonとかはシェルスクリプトよりも確かに優れてる面もたくさんあるけど、
classpathの設定とかで混乱する手間と暇を総合的に考えると、単純なシェルスクリプトの範囲内で
問題を解決する能力がある人のほうが貴重。

341:login:Penguin
08/07/06 00:07:36 H+bXS9E7
>>340
めんどいからさっさと結論を出すと、適材適所だな。

次の方どうぞ。

342:login:Penguin
08/07/06 00:17:49 KiLBqQPD
>>340
> classpathの設定とかで混乱する手間と暇
ちょっとまてw。perlとかrubyとかpython使ったことないだろ?
java男ご乱心。

343:login:Penguin
08/07/06 00:19:29 H+bXS9E7
>>342
例えばperlとかには@INCとかあるから、その辺のことを話したいんだろうと理解。

行間くらい読んでやれ。

344:login:Penguin
08/07/06 00:29:37 KiLBqQPD
>>343 行間読んでJython,Jrubyみたいな話かとおもた。あんなキモいもん認めん。

345:login:Penguin
08/07/06 00:31:39 fSJWsnfA
作るスクリプトが動かされる環境を予測できて,ちゃんと互換性をもたせる能力があればperlでもgnu依存でもなんでもいいよ.

346:login:Penguin
08/07/06 00:33:14 KiLBqQPD
それでもjavaライブラリ依存は認めない。

347:login:Penguin
08/07/06 20:32:11 Bp8Wp40b
テキスト処理について質問させてください
SQLを格納した以下のようなログファイルがあります。

select * from table1 where 名前='田中'
select * from table1 where 名前='佐藤' and 年齢 > 20
select * from table1 where 名前='鈴木'

これの条件部分('田中'とか'佐藤'の部分)を'*'に一括で変更する方法はありますか?
環境としてbash、awk、sedは使えますがperlは使えません。
よろしくお願いします

348:login:Penguin
08/07/06 21:12:08 9FSHXxTH
$sed "s/名前='.*'/名前='*'/g" hoge > foo
$mv foo hoge

349:login:Penguin
08/07/06 21:36:34 7sKhRIVr
>>348
$ sed -i "s/名前='.*'/名前='*'/g" hoge

350:login:Penguin
08/07/06 21:42:16 9FSHXxTH
そのオプションマニュアルに載ってないな、初めて知った勉強になりました

351:login:Penguin
08/07/06 22:12:09 ksmXqbT3
再起動(shutdown -r now)後、
数分後に指定シェルを起動させたいのですが、
何か良い方法ないでしょうか?
centos4で、
/etc/rc.local
に記述すると即時起動は可能なのですが、
時間指定ができないため悩んでおります。

再起動を行うのが一定時刻ではないので
atも使えません。

どなたかお助けくださいませ。

352:login:Penguin
08/07/06 22:14:33 fSYsy/u2
>>351
sleep

353:login:Penguin
08/07/06 22:21:54 WvrNzaWB
>>348-349
ありがとう

354:login:Penguin
08/07/06 22:28:07 fMUp8CRa
>>351
at now + 数 minutes
などと /etc/rc.local に書いたらどうだろう。

355:351
08/07/06 22:45:55 ksmXqbT3
>>352
>>354
サンクスコです!!
試してみます!!

356:login:Penguin
08/07/07 21:33:14 pcTeT086
uClinux2.6上のBusyBoxのmshというシェルで質問です。
BusyBoxのバージョンは以下です。
BusyBox v1.4.1 (2008-06-02 10:22:52 CST) Built-in shell (msh)

mshでループ処理をさせていると、いつのまにか
Shell input nested too deeply
というエラーになり、スクリプトのプロセスが死んでしまうのですが、
何か良いやり方はあるでしょうか。

やりたい事は、アプリケーションの裏方で、1秒毎にサーバに
pingを打つなどしてネットワークが見えているかを確認し、
通じないならリカバリをするポーリング処理です。
autorun.sh内からsrvwatch.sh &として起動しています。

srvwatch.sh
--------
#!/bin/sh
server=192.168.0.1
while [ 継続条件 ]
do
ping $server -c 1
if [ $? != 0 ]; then
# ( pingが通じない時の処理 )
fi
sleep 1
done

最悪、他のシェルが使えない事もないのですが、mshで解決できれば
それに越したことはないので、よろしくお願いします。


357:login:Penguin
08/07/07 21:34:48 2WJ5nXyr
>>356
キリの良いところで別のスクリプトにして子プロセスとして動かせば?

358:login:Penguin
08/07/07 21:44:55 pcTeT086
>>357
なるほど。
例えばアプリケーション内のループをトリガにできれば問題を回避できそうですね。
その方向で検討してみます。

359:login:Penguin
08/07/13 16:02:53 XKteJijz
quotaのedquotaだとテキスト形式でエディタで編集しなきゃいけないですが、
コマンドのみで指定ユーザを指定容量に変更、ってどうすればできるでしょうか?



360:login:Penguin
08/07/13 18:28:58 Ixz1lkH8
実は、ここは「シェルスクリプト総合」スレ。

361:login:Penguin
08/07/13 23:41:37 2nzKAI8F
a,1
a,2
b,3
c,1
d,15
d,1
d,1
e,3

こんな感じのファイルを、1カラム目でユニークにして、2カラム目は1カラム目の値ごとに合計を出したい
という場合なんですが、シェルではむずいですか?

a,3
b,3
c,1
d,17
e,3

この結果を求めてます

362:login:Penguin
08/07/14 00:16:50 pAKMtVeu
いいえ 容易です

363:login:Penguin
08/07/14 08:20:36 Nv/tP5Or
>>361
cutとsort、uniqでキーのリストを作る。
grepとcutでキーごとの値を得る。
それをexpr

364:login:Penguin
08/07/14 16:52:54 6AUtGr7x
>>361
awk 使えば〜


365:login:Penguin
08/07/14 18:28:30 Mh/R7fAz
>>361
awk -F, '{dat[$1]+=$2}END{for(i in dat) print i","dat[i]}' hoge

366:login:Penguin
08/07/17 15:31:48 8xNJ++Yc
指定した変数の中に、ある文字列があれば〜
という条件式、どのように書けばいいですか。

367:login:Penguin
08/07/17 15:59:24 RxW1jeOx
#!/bin/sh

hoge=$1
hogehoge=$2

if [ `echo $hoge | grep $hogehoge` ]; then
echo "$hogehoge exist in $hoge"
fi
exit 0


368:login:Penguin
08/07/17 16:09:53 RxW1jeOx
と思ったけど >>228 のほうがいいな

369:login:Penguin
08/07/17 20:02:22 8xNJ++Yc
>>367
ども
ですが、ひとつ質問です

たとえばhogeにunko is
hogehogeにu

とした場合、ちゃんと動かないですがこれはどう扱えばいいですか。

370:login:Penguin
08/07/17 20:35:02 IIv1XTjU
よろしくおねがいします

bkfile=$dest/$2.$timestamp.tar.gz

tar cpzf $bkfile $1 >/dev/null 2>&1

if [ $? != 0 -o ! -e $bkfile ];

ここのでの
if [ $? != 0 -o ! -e $bkfile ];

意味を教えて下さい、エロイヒト


371:login:Penguin
08/07/17 20:49:36 wB0Vu+2C
>>370
URLリンク(cyberam.dip.jp)

372:login:Penguin
08/07/17 21:05:28 6zoBsCIm
それも、変数に 'unko is' を入れられない糞スクリプトだね。

373:login:Penguin
08/07/17 21:10:39 IIv1XTjU
$? != 0 -o
は終了ステータス
! -e $bkfile
はファイルで無い場合
すなわち
終了ステータスがO以外、且つ、bkfileがファイルの場合
ということでok?

374:login:Penguin
08/07/17 21:14:48 ZrSZoUoY
>>372
unkoは入れるものじゃなくて出すものだからな

#/bin/sh

hoge=$1
hogehoge=$2

if [ "`echo $hoge | grep $hogehoge`" = "$hoge" ]; then
echo "$hogehoge exist in $hoge"
fi

375:login:Penguin
08/07/17 21:21:49 wB0Vu+2C
>>373
終了ステータスが0以外、もしくは、$bkfileファイルが存在しない場合

376:login:Penguin
08/07/17 21:27:09 IIv1XTjU
>>375thx
if [ $? != 0 -o ! -e $bkfile ];
[ $? != 0 ]且つ [-o ! -e $bkfile ]
-oの意味と
[ $? != 0 -o ! -e $bkfile ]; スクリプトの区切り方がわかんらんのですが・・・
面倒かけてスマソ
よろしくお願いします

377:login:Penguin
08/07/18 00:26:56 djfoTRoL
>>374
助かりましたどうもです。

378:login:Penguin
08/07/18 00:47:41 JinxhkI+
>>376
man test で -o を探せ。

379:login:Penguin
08/07/23 12:37:01 AKylUJRP
「あるディレクトリにAA.bbというファイルがなかったら
 AA.ccというファイルを削除する」
これをどう書いたらいいか教えてください

380:login:Penguin
08/07/23 12:42:19 XuVewefN
[ ! -f AA.bb ]
rm AA.cc

381:login:Penguin
08/07/23 12:43:53 x1Crms/C
宿題は自分でやりなさい。

382:379
08/07/23 21:51:48 AKylUJRP
>>380
ありがとうございます!できました。


別件でもう一つ教えてください。
「m2eという拡張子のものをコンバート(m2t化)、成功したらm2eを削除する」
というスクリプトを書きました。

#!/bin/sh
for file in *.m2e
do
/usr/local/bin/b25 $file ${file%m2e}m2t
EXITCODE=$?
if [ 0! = $EXITCODE ]; then
rm -f $file
fi
done

m2eファイルは複数あるんですが、4行目でありったけのm2eを処理し終わらないと
5行目以降の処理に進まないようで、
m2eを削除することなくばんばんm2tができていきます。

これを、1ファイルごとの処理にするにはどこを変えたら良いでしょうか・・・?

383:login:Penguin
08/07/23 21:59:02 XuVewefN
>>382
>381

in `ls *.m2e`

384:login:Penguin
08/07/23 22:18:42 jePbQOfG
分からない時は変数を出力してみるといいよ!

385:login:Penguin
08/07/23 22:22:18 Ec8ZyKSx
終了判定の if文がおかしいから、rm行が実行されないのでは?
sh -x script
してデバッグしてちょ。

386:379
08/07/23 23:27:36 AKylUJRP
皆さんほんとありがとうございます。
sh -x すら知りませんでした。超便利ですねこれ…。
で、b25コマンドが成否に関わらず終了コード0を返していました。
成功したら1を返すだろうという先入観が敗因でした。

今日教わったことを踏まえ以下のとおりにしたら成功しました。

#!/bin/sh
for file in `ls *.m2e`
do
/usr/local/bin/b25 $file ${file%m2e}m2t
if [ -f ${file%m2e}m2t ]; then
echo complete
rm -f $file
else
echo fail
fi
done

初めて書くシェルスクリプトですが、おかげさまで思ったとおりできました。
どうもありがとうございました。

387:login:Penguin
08/07/23 23:30:38 bXJC8PaP
>>383
ls する必要あるか?

388:login:Penguin
08/07/23 23:31:06 HicxYVC5
>>386
蛇足かもしれんが、成功したときの終了コードは0だ。

389:login:Penguin
08/07/24 01:05:36 cIOzBtbq
空白を含んだファイル名の処理がおかしくなるので,ls しない方がベター。
元の
> for file in *.m2e
のままでよい。

>>382
= の否定は != ね。
! と = の間に空白を入れてはいけないよ。

390:login:Penguin
08/07/24 08:32:37 BJInmIaX
>>387-389
遅いよおまいら。
遅刻の罰として、5分毎にこのスレの新規書き込みをチェックするスクリプトを上げること。
bashの内部コマンド以外は使ってはいけません。

391:login:Penguin
08/07/24 10:40:03 jtU4rAt4
curlも使っちゃいかんのかい・・・

392:login:Penguin
08/07/24 20:20:13 Hhban5lk
あきまへん。bashのソケットで。

393:login:Penguin
08/07/24 22:02:07 pIyY20xI
wgetは認められるはず。
なんせ左手だけで入力できるんだぜ?

394:login:Penguin
08/07/24 23:00:05 yNUWiOQr
>>392
詳しくは知らないけど/dev/tcp/host/portじゃダメかな?

395:login:Penguin
08/07/25 08:02:37 5wHuLUjg
ええのではないでしょうか
bashでcurlを代替するには、それで双方向ソケットを実現するしか多分ないだろうから。

396:login:Penguin
08/07/30 16:48:07 JUVwIDuC
あるファイルの、ファイル名を先頭から10文字分取得してOSの変数に入れたいのですが
拡張子もない日時そのままのファイル名(080730151530 とか)なので
for文すら書けずにいます。
どう書いたらいいですかと聞ける段階にもないのですが、
こういったファイル名の扱い、前方一致のさせ方について
参考になりそうなサイトなどないでしょうか?

397:login:Penguin
08/07/30 17:37:14 8Rj3UHKM
まずは正規表現について学ばれるといいと思います

398:login:Penguin
08/07/30 17:47:11 sE7Hyt0D
#!/bin/sh
tmp="9999444422228888"

for file in ${tmp}; do
#先頭から8文字目まで切り出し
echo ${file} | cut -c 1-8;
done

プロトタイプつくって、色々試してみるといいかもよ
あとは、tmpをどのように持っていくか

find使いたかったら
tmp=`find -tpe f`
とかだろうし
色々やってるうちに、スペースが入ったファイル名とかで疑問もでてくるだろうし

399:login:Penguin
08/07/31 02:05:26 kxeNsmhd
目的のファイルがあるディレクトリで(そのディレクトリに cd して)
スクリプトを実行するという前提で、、、

for FILE in *
で、そのディレクトリにある隠しファイル以外のファイルの名前が順に変数 FILE に入る。
拡張子のあるなしは関係ない。

もし、日時そのままのファイル名(数字12文字のみからなる?)以外のファイルが
ディレクトリ内に存在する場合には、以下のような if 文で弾く。
if echo $FILE | grep '^[0-9]\{12\}$' > /dev/null

あとは>>398のを組み合わせて全体はこんな感じ。


#!/bin/sh

for FILE in *
do
    if echo $FILE | grep '^[0-9]\{12\}$' > /dev/null
    then
        echo $FILE | cut -c 1-10
    fi
done

400:login:Penguin
08/07/31 10:18:05 JpgVGgaY
そもそも CUI 環境の UNIX, Linux に拡張子という概念は無いと思われます。

401:login:Penguin
08/07/31 14:53:26 a31/vqCD
概念という言葉が適切かどうか。

402:login:Penguin
08/07/31 15:54:04 SAvKwoDD
kakutyou.c

403:login:Penguin
08/07/31 16:54:35 CDeZt19d
>CUI 環境の UNIX, Linux に拡張子
CUIと拡張子に何の関連があるんだ。
MS-DOS時代には拡張子が無かったという主張なのか。


404:login:Penguin
08/07/31 17:22:53 JpgVGgaY
>>403
文字通りの意味だよ
KDEなど使用したX環境では拡張子を判断してプログラム動作を変えるものが一部にあるからね

もう一度言うが、「文字通りの意味」だ
そんなに解らん日本語だったかね

405:login:Penguin
08/07/31 17:24:39 FFTlQwAQ
mailcapはあるけど

406:login:Penguin
08/07/31 17:26:02 +AWBOmCl
拡張子ではなく suffix だ、とかそういう話じゃなかったのか。

407:login:Penguin
08/07/31 17:29:51 6oedF87g
>>404
胸張って屁理屈言ってどうするかね。

大人気なく反例を提示するなら、CUIで動く代表的なプログラムであるgccは拡張子を見て呼ぶコンパイラを変えたりするが、見解を求む。


408:login:Penguin
08/07/31 17:35:59 JpgVGgaY
>>407
めんどい

409:login:Penguin
08/07/31 18:09:02 RztDzhJY
>>407
座布団あげる。
柔軟だというだけだよね。

410:login:Penguin
08/07/31 18:18:49 6oedF87g
gzipも拡張子見るなw

411:login:Penguin
08/07/31 18:21:00 9ySiTva1
make !! , make !!

412:login:Penguin
08/07/31 20:26:30 54icAPXL
ID:JpgVGgaY 恥ずかしいなw
全部言い返されてやんの

413:login:Penguin
08/07/31 22:03:49 zM7TOaQk
>>406
拡張子でなく接尾辞だという点には誰も異論だ無いんじゃないか。

>KDEなど使用したX環境では拡張子を判断してプログラム動作を変えるものが一部にあるからね
などと強弁してるのを皆に笑われているだけで。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5396日前に更新/243 KB
担当:undef