トップページunix
987コメント345KB

シェルスクリプト総合 その13

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2008/10/16(木) 00:48:38
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

前スレ
シェルスクリプト総合 その12
http://pc11.2ch.net/test/read.cgi/unix/1218277263/
0261名無しさん@お腹いっぱい。2008/11/17(月) 22:36:36
-a
とか
*
とかよりも素人には消すのが難しいファイル名ってありますかね
0262名無しさん@お腹いっぱい。2008/11/17(月) 22:37:22
ありがとうございます。
>>259
は既に試してみましたがダメでした。

>>260
は、今環境が無いので、明日会社で確認してみます。
0263名無しさん@お腹いっぱい。2008/11/17(月) 22:40:51
この場合は$@なの?
$*じゃだめなのkすら
0264名無しさん@お腹いっぱい。2008/11/17(月) 22:57:29
>>263
駄目です。"aaa bbb"を分解したくないなら。
>>261
文字化け系
0265名無しさん@お腹いっぱい。2008/11/17(月) 23:10:51
>>264

文字化け系は、取り合えず消したくないファイルを
別のディレクトリに退避して、rm TAB{印字可能文字}*とかで、何とかなる。
・・なってほしい。
0266名無しさん@お腹いっぱい。2008/11/17(月) 23:57:28
文字化け系のファイルがいっぱいあると、
消したくないファイルの特定すら面倒だし、間違う可能性もある。
0267名無しさん@お腹いっぱい。2008/11/18(火) 01:47:14
*って消しにくいの? rm * でまっさきに消えるじゃん
普通の操作で消去できないファイルを作るのは ".[ファイル名]" にするのが常套手段

名前を厳密に指定しない限りrmでは消せないし
0268名無しさん@お腹いっぱい。2008/11/18(火) 02:05:18
どこが常套手段なんだろう。意味不明。
0269名無しさん@お腹いっぱい。2008/11/18(火) 02:07:49
第一消せるし。zshならGLOB_DOTS。
そんな挙動を前提にrm *とかやってると痛い目を見るぞ。
0270名無しさん@お腹いっぱい。2008/11/18(火) 02:42:45
>>261
rm -i * とされると rm -- -a や rm \* や rm '*' なんて知らなくても、文字化け系でも大抵何とかなる
先に必要なファイルをあらかた退避したら、作業もそう面倒でもない

ちょっとした嫌がらせ?部下に勉強させたい?なら .* とか
^Ha (スペース+制御文字^H+a) として普通に ls だと a にしか見えない、rm a でも rm a* でも消えない、とかかな
0271名無しさん@お腹いっぱい。2008/11/18(火) 05:43:00
zshでタブキーをぱかぱか押して補完させれば大体なんとかなる
0272名無しさん@お腹いっぱい。2008/11/18(火) 08:06:20
>>262
>今環境が無いので、明日会社で確認してみます。

シェルの環境がないって? どんな環境?
まさか、自宅にはWinしかないとか?
そんな人に解答したくないね。
ここはみんな、UNIXからアクセスしている人のみのはず。
0273名無しさん@お腹いっぱい。2008/11/18(火) 08:23:42
しょうもない妄想乙
0274名無しさん@お腹いっぱい。2008/11/18(火) 10:06:07
>>271
そしてたまにzshが落ちる、と。
わかります。
0275名無しさん@お腹いっぱい。2008/11/18(火) 11:19:57
>>272
お前は解答しなくていいよ。迷惑だから。
0276名無しさん@お腹いっぱい。2008/11/18(火) 23:33:31
>>272
winてなに?おいしいの
0277名無しさん@お腹いっぱい。2008/11/19(水) 01:56:35
携帯電話でそんなのがあるらしいぞ
0278名無しさん@お腹いっぱい。2008/11/19(水) 07:03:16
ファイルの先頭行だけを表示しない方法ってありますか?

--------------
$ cat hoge
aaa
bbb
ccc
--------------
こういうファイルがあるとして、先頭行だけを表示しないようにしたい。
awkを使って、以下のようにできるけど、もっとスマートにしたい。
$ cat hoge | awk '{if (NR > 1) print}'

イメージ的にはこんな感じで。
$ cat hoge | cutline 2-





0279名無しさん@お腹いっぱい。2008/11/19(水) 07:16:37
>>278

tail -n +2 hoge
0280名無しさん@お腹いっぱい。2008/11/19(水) 07:35:05
>>278
sed 1d hoge
0281名無しさん@お腹いっぱい。2008/11/19(水) 08:16:42
>>278
「もっとスマートにしたい」というなら、
まずは自分で書いてる無駄な cat が無駄であることに気づけw

>>279 に補足すると、tailの古いバージョンでは
tail +2 hoge
0282>>2782008/11/19(水) 08:18:35
>>279->>281
神! ありがとー

0283名無しさん@お腹いっぱい。2008/11/19(水) 08:23:09
>>278
awk使うにしても、if文が無駄だな。

awk 'NR > 1 {print}' hoge
0284名無しさん@お腹いっぱい。2008/11/19(水) 13:15:52
>>283
awk 'NR > 1' hoge
0285名無しさん@お腹いっぱい。2008/11/27(木) 07:43:58
grepで質問です!!

以下のような制御(色)文字を含んだファイルがあるとします。("生データ"とよぶことにします)
$ cat -t hoge.dat
^[[0;31mhello^[[0mend

catコマンドで表示するとこんな感じになります。("表示データ"とよぶことにします)
$ cat hoge.dat
helloend

で、"表示データ"をgrepするために以下のようにしたのですが、うまくひっかけることができません。
$ grep ^hello hoge.dat

grepのaオプションも使ってみたのですが、だめでした。
表示データをgrepする方法で、いい方法を教えていただきたく。

よろしくお願いします。

0286名無しさん@お腹いっぱい。2008/11/27(木) 07:58:33
>>285
stringsで抜き出したものをgrepするとか。
0287名無しさん@お腹いっぱい。2008/11/27(木) 08:07:10
>>285
単に、grep hello する。(^なし)
あるいは、grep mhello


>>286
そういう問題じゃないだろ。[0;31m とかはテキストだから。
0288名無しさん@お腹いっぱい。2008/11/27(木) 08:37:23
「行頭」とかをちゃんと区別したいなら、
エスケープシーケンス(^[からアルファベットまで)をちゃんと除く必要がある。
カーソル移動とかあれば、行頭って何って話になるけど。

sed 's/^[[^a-zA-Z]*[a-zA-Z]//' hoge.dat | grep ^hello
^[ は当然エスケープ文字な。
0289名無しさん@お腹いっぱい。2008/11/27(木) 08:40:43
>>288
あほか。それだとエスケープシーケンス中の数字やセミコロンに対応してない。
仮に英文字だけのシーケンスだとしても、hello自体まで削除される。
0290名無しさん@お腹いっぱい。2008/11/27(木) 08:53:39
いや、>>288 で合ってる。
エスケープ自体をsedに入れるのに難があるけどな。
0291名無しさん@お腹いっぱい。2008/11/27(木) 08:56:57
馬鹿をさらした >>289 は何をどう読み違えたんだ?
0292名無しさん@お腹いっぱい。2008/11/27(木) 09:42:14
あほか?
エスケープシーケンスは端末依存なので、それを解釈する端末エミュレーションも実装しないとだめ。
まぁ、がんばってくれ。
0293名無しさん@お腹いっぱい。2008/11/27(木) 09:47:53
>>292
あほか。
エスケープシーケンスは、
ESCで始まり、英文字以外が0文字以上続いた後、英文字1文字で終る、
ということは決まっている。
端末(TERM)が変わって、具体的なシーケンスが変わっても、
シーケンス自体の規則は変わらない。
だから、すべてのシーケンスを削除するのが目的なら、
>>288 でよい。
0294名無しさん@お腹いっぱい。2008/11/27(木) 09:49:43
というか、>>288 の sed に g 付けとけよな。凡ミス指摘な。
0295名無しさん@お腹いっぱい。2008/11/27(木) 09:54:26
馬鹿をさらしたあと、>>292 で馬鹿の上塗り?
02962882008/11/27(木) 09:55:51
なんかあほばか呼ばわりされて白熱してるとこすまんが、g 付け忘れた。
「行頭」だけなら最初のシーケンス消せばいいだけだからなくても動くけど。

0297名無しさん@お腹いっぱい。2008/11/27(木) 11:06:42
>>293
hp端末の制御文字列はエスケープシーケンスと認めてもらえないんでしょうか。
0298名無しさん@お腹いっぱい。2008/11/27(木) 13:38:37
>>293, >>295
あほ。カーソル移動含むエスケープシーケンス含んでたらどうすんだよ。
0299名無しさん@お腹いっぱい。2008/11/27(木) 14:36:21
>>298
カーソル移動のエスケープシーケンスも、
>>293 の言う範囲に含まれる。端末によらず。
0300名無しさん@お腹いっぱい。2008/11/27(木) 14:50:14
>>299
あほ。カーソル移動して文字列を逆順に出力してたらどうやってgrepすんだよ。
0301名無しさん@お腹いっぱい。2008/11/27(木) 14:55:29
ツマラナイカラヤメロ
0302名無しさん@お腹いっぱい。2008/11/27(木) 14:57:43
>>298 >>300
馬鹿の上塗りの上塗りの上塗りの上塗りw
0303名無しさん@お腹いっぱい。2008/11/27(木) 15:17:49
>>302
知能の足りなさを認められない、あほ。惨め。
0304名無しさん@お腹いっぱい。2008/11/27(木) 15:27:01
>>303
カーソル移動の件に関しては
>>288 が一番最初に断ってるのだが、読み落したかい?
さも、>>300 で自分が最初に発見したみたいに書き込んでるけどさw
0305名無しさん@お腹いっぱい。2008/11/27(木) 15:38:01
>>304
未だに理解できてない>>302に言ってやってくれ。ww
0306名無しさん@お腹いっぱい。2008/11/27(木) 17:53:24
tcl の文法が嫌いなので expect を使いたくないのですが、
その代用として、同様のツールがあれば教えてください。
0307名無しさん@お腹いっぱい。2008/11/27(木) 18:01:39
pexpect
0308名無しさん@お腹いっぱい。2008/11/27(木) 18:06:23
expect.rb
0309名無しさん@お腹いっぱい。2008/11/27(木) 18:15:52
>>307
> pexpect
ありがとうございます! かなり良さ気ですね。
それに python は大好きなので、是非それを使ってみようかと思います。
0310名無しさん@お腹いっぱい。2008/11/27(木) 18:46:09
>>306
zsh で zpty
使ったことないけど
0311名無しさん@お腹いっぱい。2008/11/29(土) 10:53:06
今使ってるシェルを知るには
echo $0
が一番らくだということに気づいた
$SHELL だったり $shell だったり どっちも入ってなかったりするから
0312名無しさん@お腹いっぱい。2008/11/29(土) 11:47:55
>>311
# echo $0
-su

これはなんのシェルですか?
0313名無しさん@お腹いっぱい。2008/11/29(土) 12:40:33
>>311

$ cat hoge
#!/bin/sh
echo $0

$ ./hoge
./hoge


結論: $0 でシェルはわからない
0314名無しさん@お腹いっぱい。2008/11/29(土) 20:20:36
>>313
インタラクティブ環境の話では
0315名無しさん@お腹いっぱい。2008/11/29(土) 20:25:13
>>314
後出し条件見苦しい
0316名無しさん@お腹いっぱい。2008/11/29(土) 20:42:25
>>315
後だしとか言われても。。。
スレの前のほうでやってた流れから、
多分そういう事じゃないのかと思っただけで。
で、>>312については多分そういう前提の上でうまくいかない例を挙げてるわけで。

そもそも俺は>>311とかでもないから、見苦しいとか言われてモナー
0317名無しさん@お腹いっぱい。2008/11/29(土) 21:00:42
>>313のような「当たり前」の事をわざわざ発言する必要はないのだから、
>>311はインタラクティブ環境の事を言ってるのだろうと推して知るべし。
0318名無しさん@お腹いっぱい。2008/11/29(土) 21:07:23
>>311
$ ln -s /bin/sh hoge
$ ./hoge
$ echo $0
./hoge

インタラクティブ(笑)だぞ
0319名無しさん@お腹いっぱい。2008/11/29(土) 21:20:19
なんか、無い知恵振り絞って必死だね。内定取り消されたの?
0320名無しさん@お腹いっぱい。2008/11/29(土) 21:36:27
>>314
$0に何がセットされるかは、
インタラクティブ環境かどうかとは直接は関係ないという点は理解してますか?
0321名無しさん@お腹いっぱい。2008/11/29(土) 21:39:32
>>319
何の脈絡もなしに、突然新しい話題(内定取り消し)が出てくる時は、
心理学的に、本人自身がその話題(内定取り消し)で悩んでいる場合が多い。
319 自身とか、319の息子とかね。
0322名無しさん@お腹いっぱい。2008/11/29(土) 22:11:23
ということにしたいのですね。
0323名無しさん@お腹いっぱい。2008/11/29(土) 23:02:29
なんだこの流れ

シェルスクリプトのスレだろ?
0324名無しさん@お腹いっぱい。2008/11/30(日) 00:54:43
他に方法あるの?
0325名無しさん@お腹いっぱい。2008/11/30(日) 04:27:45
スクリプトスレでインタラクティブの話題?
インタラクティブなら ps 結果を grep $$ するのも1つの方法

になりえるかなぁとも思ったけど上手くいかない状況もあるかも
あとウチの環境では少なくとも csh の場合はインタラクティブで echo $0 はエラーになる

> 他に方法あるの?
他にとかいう以前に、echo $0 含めそもそも汎用的な方法なんてないんじゃなかろうか?
0326名無しさん@お腹いっぱい。2008/11/30(日) 08:11:52
>>325
psの結果を grep $$ するくらいなら

ps -p $$


>>317
インタラクティブ環境の話題はスレ違いだから、
インタラクティブ環境の事は言っていないのだろうと推して知るべし。
0327名無しさん@お腹いっぱい。2008/11/30(日) 10:59:16
ぷぷぷ。必死だね。

もし、そうなら。>>313のような「あたりまえ」の知識を披露せずに、
「スレ違い」と切って捨てればよい。
0328名無しさん@お腹いっぱい。2008/11/30(日) 11:36:18
>>327
本当は >>313 が指摘するまで知らなかったんだろ?
後からなら「あたりまえの知識」ということにしてごまかせるわな。

あと、回答者にとって「あたりまえの知識」なのは当たり前。
それを知らない質問者が質問してくるから
あたりまえの知識を回答するのがあたりまえ。
0329名無しさん@お腹いっぱい。2008/11/30(日) 12:05:52
このスレはもっと紳士的なシェルスクリプターの集まりだと思っていたのだが…
0330名無しさん@お腹いっぱい。2008/11/30(日) 12:08:17
必死すぎ。www

そう仮定するなら、>>311は明らかに間違っているわけだが。これをどう説明するのだ? www
実行すらせずに思いつきで書いたとでも? www
0331名無しさん@お腹いっぱい。2008/11/30(日) 12:09:57
>>329
純正厨とか変なのが多いぞ。
0332名無しさん@お腹いっぱい。2008/11/30(日) 12:17:46
お前らシェルスクリプトの事話せよw

>>331
俺は汎用性よりも可読性重視だから仕事では自分で一から作るモノは/bin/bashだな。
上の方にでてた四則演算はexprじゃなくてletとか使う。
0333名無しさん@お腹いっぱい。2008/11/30(日) 12:18:04
>>329 よくわからんが、荒らしてるのは >>330 だけだぞ。

>>330 NG登録できるように、なるべくコテハンつける。
0334名無しさん@お腹いっぱい。2008/11/30(日) 12:44:08
>>330
もっと楽な方法があるってこと?
0335名無しさん@お腹いっぱい。2008/11/30(日) 12:58:20
>>334
「反論できねーだろ、>>328」という事。完璧に勝ったな。
0336名無しさん@お腹いっぱい。2008/11/30(日) 13:40:38
すんません。今までシェルスクリプト触ったこと無いものなのですが
突然、SCPとftpでファイル転送するの作ってといわれて途方にくれています。

まずシェルスクリプトのことを学ぶのにどこを見ればいいのか
また上記のことを行うのに参考になるサイトなどありましたらお教えください。

お願いします
0337名無しさん@お腹いっぱい。2008/11/30(日) 13:53:17
SCPとftp両方必要なの?どっちかだけで良いと思うけど勉強用って事?
shスクリプトについてのサイトは知らないけど

linux ftpでググったらこんなサイトが。

Linux ftpコマンド - kozy.heteml.jp
http://kozy.heteml.jp/pukiwiki/index.php?Linux%20ftp%A5%B3%A5%DE%A5%F3%A5%C9#f424c6b5

あとscpの場合はsshの鍵交換しないとパスワード聞かれるから注意
鍵交換してればscpの方が楽
0338名無しさん@お腹いっぱい。2008/11/30(日) 13:58:05
一般的なプログラミングの経験にもよるけど、
今後も書く可能性があるのなら、
本買ってひととおり読んだ方が早いよ。
0339名無しさん@お腹いっぱい。2008/11/30(日) 14:06:02
>>337-338
ありがとうございます。
C/C++を大学でやってきた程度で
鯖をFedoraやDebianで本読みながら立てたくらいです。

Shがどんなものか、触りをWEBで確認したくらいで
サンプルコードを色々弄くってみた程度で、まだ全く使い方がわかっていません

SCPでファイル取得して、FTPで他の鯖に転送という、よくわからない要求です
もう少し勉強します。。。
0340名無しさん@お腹いっぱい。2008/11/30(日) 14:26:18
>>330 は言ってることがつながってないので、
何を主張したいのかわからん。
主張のないものに「反論がない」と言われても、それで >>330 の勝ちにはならない。


>>320 も書いてるが、
$0に何がセットされるかは、インタラクティブ環境かどうかとは直接関係ない。
それを「インタラクティブだから$0にシェルがセットされる」と主張されても
当然間違い。

$SHELLについては、普通にloginすればログイン時にセットされるが、
その後、値を書き換えたり unsetすることもできる。
値を書き換えたり unsetした状態でシェルを起動しても、
$SHELLは改めてはセットされない。
よって、$SHELLではシェルを判定できない。

$shellについてはcsh系の方言だから、B-sh系でセットされていない。
0341名無しさん@お腹いっぱい。2008/11/30(日) 14:43:23
もうやめなよ
0342名無しさん@お腹いっぱい。2008/11/30(日) 16:32:20
>>339
ftp, FTP, SCP, Sh
これらの大文字・小文字の区別はいったいなんなんでしょうね。
きもちわるい。
0343名無しさん@お腹いっぱい。2008/11/30(日) 18:51:09
>>340
loginがシェルのargv[0]に渡すものは決まっている。
0344名無しさん@お腹いっぱい。2008/11/30(日) 19:15:14
treeコマンドで、以下の様にディレクトリやファイルの詳細情報も
合わせて表示させるにはどうすればよいのでしょうか?

# tree /home
/home
`-- TEST drwxr-xr-x 3 root root 4096 2008-10-26 22:28
|-- AA drwxr-xr-x 3 root root 4096 2008-10-26 22:28
| |-- test.csh -rwxr-xr-x 1 root root 4836 2008-11-30 18:25
| |-- test.csh.org -rwxr-xr-x 1 root root 3416 2008-11-29 23:10
| `-- hoge.sh -rwxr-xr-x 1 root root 1834 2008-11-29 23:24
|

0345名無しさん@お腹いっぱい。2008/11/30(日) 19:31:26
>>344
それは「シェルスクリプト」スレに相応しい話題ですか?
0346名無しさん@お腹いっぱい。2008/11/30(日) 19:41:15
>>343
login経由でログインするとは限らない。
0347名無しさん@お腹いっぱい。2008/11/30(日) 19:47:44
>>344
シェルスクリプトと関係無いから次からはくだ質行ってくれ。
各コマンドの事なら大抵はmanかhelpよめばわかるはず。

# tree --help
usage: tree [-adfgilnpqrstuxACDFNS] [-H baseHREF] [-T title ] [-L level [-R]]
    [-P pattern] [-I pattern] [-o filename] [--version] [--help] [--inodes]
    [--device] [--noreport] [--nolinks] [--dirsfirst] [--charset charset]
    [<directory list>]
(snip)
-p     Print the protections for each file.
-u     Displays file owner or UID number.
-g     Displays file group owner or GID number.
-s     Print the size in bytes of each file.
-D     Print the date of last modification.
0348名無しさん@お腹いっぱい。2008/11/30(日) 19:48:17
>>343
loginは argv[0]の頭に - を付けるが、
環境によっては、頭に - を追加するんじゃなくて、
頭の 1文字を - に置き換える。

だから、(イマドキいないと思うが)cshユーザーの場合、
cshの頭の1文字が - に置き換わって -sh になる。
よって、$0 を見て判別するのも無理がある。
0349名無しさん@お腹いっぱい。2008/12/01(月) 00:15:26
>>346,>>348
具体的にその「環境」をあきらかにするように。
キミらの脳内環境?
0350名無しさん@お腹いっぱい。2008/12/01(月) 07:32:44
>>349
え? 知らないんだw
>>348 が言ってるのは昔からUNIX使ってる人には常識だぞ。
0351名無しさん@お腹いっぱい。2008/12/01(月) 07:38:02
>>349
>>346 については、xdmなんかでログインすれば loginは経由しないし、
telnetとかsshの場合もloginは(今は)呼んでいない(自前処理)のはず。
そうじゃなくても、X上でxtermとか開いてもloginは通らないしね。
0352名無しさん@お腹いっぱい。2008/12/01(月) 07:47:41
>>350-351
「あきらかにするように」とか「脳内環境」とか言ってる奴(>>349)に
詳しく教えてやることないよ。

「教えてください」って礼儀正しく言う者にだけ教えればいい。
0353名無しさん@お腹いっぱい。2008/12/01(月) 08:56:28
このスレを見てるだけの傍観者ですが教えてください
0354名無しさん@お腹いっぱい。2008/12/01(月) 10:11:19
>>349はloginの基本仕様すら知らないから、
>>346すら理解できないのだろう。
0355名無しさん@お腹いっぱい。2008/12/01(月) 12:00:03
>>350-352, >>353
そいつらはloginのように振舞わないのか? ww
0356名無しさん@お腹いっぱい。2008/12/01(月) 13:32:40
>>351
> telnetとかsshの場合もloginは(今は)呼んでいない(自前処理)のはず。
嘘つき。telnetは呼んでる。
0357名無しさん@お腹いっぱい。2008/12/01(月) 14:24:21
RFC1416 の Authentication option を使えば呼ばれないはず。
サポートしてない/サポートしてるけどデフォルトでは使わない実装が多いようだけど。
0358名無しさん@お腹いっぱい。2008/12/01(月) 14:42:14
>>355
振舞わないね
0359名無しさん@お腹いっぱい。2008/12/01(月) 21:26:09
今やPAM(OSF RFC 86)化されてるのが多いしなあ。
0360名無しさん@お腹いっぱい。2008/12/02(火) 01:24:02
何と戦ってんだかわけわからなくなってるなw
結局こんな感じだろ?
echo $SHELL これはsh系以外アウト、つまりまったく実用的でない
ps -p $$ 理屈的にまわりくどい
echo $0 理屈的にも納得かつほぼ問題なし
■ このスレッドは過去ログ倉庫に格納されています