シェルスクリプト総合 その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とか
*
とかよりも素人には消すのが難しいファイル名ってありますかね
0262名無しさん@お腹いっぱい。
2008/11/17(月) 22:37:22>>259
は既に試してみましたがダメでした。
>>260
は、今環境が無いので、明日会社で確認してみます。
0263名無しさん@お腹いっぱい。
2008/11/17(月) 22:40:51$*じゃだめなのkすら
0264名無しさん@お腹いっぱい。
2008/11/17(月) 22:57:29駄目です。"aaa bbb"を分解したくないなら。
>>261
文字化け系
0265名無しさん@お腹いっぱい。
2008/11/17(月) 23:10:51文字化け系は、取り合えず消したくないファイルを
別のディレクトリに退避して、rm TAB{印字可能文字}*とかで、何とかなる。
・・なってほしい。
0266名無しさん@お腹いっぱい。
2008/11/17(月) 23:57:28消したくないファイルの特定すら面倒だし、間違う可能性もある。
0267名無しさん@お腹いっぱい。
2008/11/18(火) 01:47:14普通の操作で消去できないファイルを作るのは ".[ファイル名]" にするのが常套手段
名前を厳密に指定しない限りrmでは消せないし
0268名無しさん@お腹いっぱい。
2008/11/18(火) 02:05:180269名無しさん@お腹いっぱい。
2008/11/18(火) 02:07:49そんな挙動を前提にrm *とかやってると痛い目を見るぞ。
0270名無しさん@お腹いっぱい。
2008/11/18(火) 02:42:45rm -i * とされると rm -- -a や rm \* や rm '*' なんて知らなくても、文字化け系でも大抵何とかなる
先に必要なファイルをあらかた退避したら、作業もそう面倒でもない
ちょっとした嫌がらせ?部下に勉強させたい?なら .* とか
^Ha (スペース+制御文字^H+a) として普通に ls だと a にしか見えない、rm a でも rm a* でも消えない、とかかな
0271名無しさん@お腹いっぱい。
2008/11/18(火) 05:43:000272名無しさん@お腹いっぱい。
2008/11/18(火) 08:06:20>今環境が無いので、明日会社で確認してみます。
シェルの環境がないって? どんな環境?
まさか、自宅にはWinしかないとか?
そんな人に解答したくないね。
ここはみんな、UNIXからアクセスしている人のみのはず。
0273名無しさん@お腹いっぱい。
2008/11/18(火) 08:23:420274名無しさん@お腹いっぱい。
2008/11/18(火) 10:06:07そしてたまにzshが落ちる、と。
わかります。
0275名無しさん@お腹いっぱい。
2008/11/18(火) 11:19:57お前は解答しなくていいよ。迷惑だから。
0276名無しさん@お腹いっぱい。
2008/11/18(火) 23:33:31winてなに?おいしいの
0277名無しさん@お腹いっぱい。
2008/11/19(水) 01:56:350278名無しさん@お腹いっぱい。
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:37tail -n +2 hoge
0280名無しさん@お腹いっぱい。
2008/11/19(水) 07:35:05sed 1d hoge
0281名無しさん@お腹いっぱい。
2008/11/19(水) 08:16:42「もっとスマートにしたい」というなら、
まずは自分で書いてる無駄な cat が無駄であることに気づけw
>>279 に補足すると、tailの古いバージョンでは
tail +2 hoge
0282>>278
2008/11/19(水) 08:18:35神! ありがとー
0283名無しさん@お腹いっぱい。
2008/11/19(水) 08:23:09awk使うにしても、if文が無駄だな。
awk 'NR > 1 {print}' hoge
0284名無しさん@お腹いっぱい。
2008/11/19(水) 13:15:52awk 'NR > 1' hoge
0285名無しさん@お腹いっぱい。
2008/11/27(木) 07:43:58以下のような制御(色)文字を含んだファイルがあるとします。("生データ"とよぶことにします)
$ 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:33stringsで抜き出したものをgrepするとか。
0287名無しさん@お腹いっぱい。
2008/11/27(木) 08:07:10単に、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あほか。それだとエスケープシーケンス中の数字やセミコロンに対応してない。
仮に英文字だけのシーケンスだとしても、hello自体まで削除される。
0290名無しさん@お腹いっぱい。
2008/11/27(木) 08:53:39エスケープ自体をsedに入れるのに難があるけどな。
0291名無しさん@お腹いっぱい。
2008/11/27(木) 08:56:570292名無しさん@お腹いっぱい。
2008/11/27(木) 09:42:14エスケープシーケンスは端末依存なので、それを解釈する端末エミュレーションも実装しないとだめ。
まぁ、がんばってくれ。
0293名無しさん@お腹いっぱい。
2008/11/27(木) 09:47:53あほか。
エスケープシーケンスは、
ESCで始まり、英文字以外が0文字以上続いた後、英文字1文字で終る、
ということは決まっている。
端末(TERM)が変わって、具体的なシーケンスが変わっても、
シーケンス自体の規則は変わらない。
だから、すべてのシーケンスを削除するのが目的なら、
>>288 でよい。
0294名無しさん@お腹いっぱい。
2008/11/27(木) 09:49:430295名無しさん@お腹いっぱい。
2008/11/27(木) 09:54:260296288
2008/11/27(木) 09:55:51「行頭」だけなら最初のシーケンス消せばいいだけだからなくても動くけど。
0297名無しさん@お腹いっぱい。
2008/11/27(木) 11:06:42hp端末の制御文字列はエスケープシーケンスと認めてもらえないんでしょうか。
0298名無しさん@お腹いっぱい。
2008/11/27(木) 13:38:37あほ。カーソル移動含むエスケープシーケンス含んでたらどうすんだよ。
0299名無しさん@お腹いっぱい。
2008/11/27(木) 14:36:21カーソル移動のエスケープシーケンスも、
>>293 の言う範囲に含まれる。端末によらず。
0300名無しさん@お腹いっぱい。
2008/11/27(木) 14:50:14あほ。カーソル移動して文字列を逆順に出力してたらどうやってgrepすんだよ。
0301名無しさん@お腹いっぱい。
2008/11/27(木) 14:55:290302名無しさん@お腹いっぱい。
2008/11/27(木) 14:57:43馬鹿の上塗りの上塗りの上塗りの上塗りw
0303名無しさん@お腹いっぱい。
2008/11/27(木) 15:17:49知能の足りなさを認められない、あほ。惨め。
0304名無しさん@お腹いっぱい。
2008/11/27(木) 15:27:01カーソル移動の件に関しては
>>288 が一番最初に断ってるのだが、読み落したかい?
さも、>>300 で自分が最初に発見したみたいに書き込んでるけどさw
0305名無しさん@お腹いっぱい。
2008/11/27(木) 15:38:01未だに理解できてない>>302に言ってやってくれ。ww
0306名無しさん@お腹いっぱい。
2008/11/27(木) 17:53:24その代用として、同様のツールがあれば教えてください。
0307名無しさん@お腹いっぱい。
2008/11/27(木) 18:01:390308名無しさん@お腹いっぱい。
2008/11/27(木) 18:06:230309名無しさん@お腹いっぱい。
2008/11/27(木) 18:15:52> pexpect
ありがとうございます! かなり良さ気ですね。
それに python は大好きなので、是非それを使ってみようかと思います。
0310名無しさん@お腹いっぱい。
2008/11/27(木) 18:46:09zsh で zpty
使ったことないけど
0311名無しさん@お腹いっぱい。
2008/11/29(土) 10:53:06echo $0
が一番らくだということに気づいた
$SHELL だったり $shell だったり どっちも入ってなかったりするから
0312名無しさん@お腹いっぱい。
2008/11/29(土) 11:47:55# echo $0
-su
これはなんのシェルですか?
0313名無しさん@お腹いっぱい。
2008/11/29(土) 12:40:33$ cat hoge
#!/bin/sh
echo $0
$ ./hoge
./hoge
結論: $0 でシェルはわからない
0314名無しさん@お腹いっぱい。
2008/11/29(土) 20:20:36インタラクティブ環境の話では
0315名無しさん@お腹いっぱい。
2008/11/29(土) 20:25:13後出し条件見苦しい
0316名無しさん@お腹いっぱい。
2008/11/29(土) 20:42:25後だしとか言われても。。。
スレの前のほうでやってた流れから、
多分そういう事じゃないのかと思っただけで。
で、>>312については多分そういう前提の上でうまくいかない例を挙げてるわけで。
そもそも俺は>>311とかでもないから、見苦しいとか言われてモナー
0317名無しさん@お腹いっぱい。
2008/11/29(土) 21:00:42>>311はインタラクティブ環境の事を言ってるのだろうと推して知るべし。
0318名無しさん@お腹いっぱい。
2008/11/29(土) 21:07:23$ ln -s /bin/sh hoge
$ ./hoge
$ echo $0
./hoge
インタラクティブ(笑)だぞ
0319名無しさん@お腹いっぱい。
2008/11/29(土) 21:20:190320名無しさん@お腹いっぱい。
2008/11/29(土) 21:36:27$0に何がセットされるかは、
インタラクティブ環境かどうかとは直接は関係ないという点は理解してますか?
0321名無しさん@お腹いっぱい。
2008/11/29(土) 21:39:32何の脈絡もなしに、突然新しい話題(内定取り消し)が出てくる時は、
心理学的に、本人自身がその話題(内定取り消し)で悩んでいる場合が多い。
319 自身とか、319の息子とかね。
0322名無しさん@お腹いっぱい。
2008/11/29(土) 22:11:230323名無しさん@お腹いっぱい。
2008/11/29(土) 23:02:29シェルスクリプトのスレだろ?
0324名無しさん@お腹いっぱい。
2008/11/30(日) 00:54:430325名無しさん@お腹いっぱい。
2008/11/30(日) 04:27:45インタラクティブなら ps 結果を grep $$ するのも1つの方法
になりえるかなぁとも思ったけど上手くいかない状況もあるかも
あとウチの環境では少なくとも csh の場合はインタラクティブで echo $0 はエラーになる
> 他に方法あるの?
他にとかいう以前に、echo $0 含めそもそも汎用的な方法なんてないんじゃなかろうか?
0326名無しさん@お腹いっぱい。
2008/11/30(日) 08:11:52psの結果を grep $$ するくらいなら
ps -p $$
>>317
インタラクティブ環境の話題はスレ違いだから、
インタラクティブ環境の事は言っていないのだろうと推して知るべし。
0327名無しさん@お腹いっぱい。
2008/11/30(日) 10:59:16もし、そうなら。>>313のような「あたりまえ」の知識を披露せずに、
「スレ違い」と切って捨てればよい。
0328名無しさん@お腹いっぱい。
2008/11/30(日) 11:36:18本当は >>313 が指摘するまで知らなかったんだろ?
後からなら「あたりまえの知識」ということにしてごまかせるわな。
あと、回答者にとって「あたりまえの知識」なのは当たり前。
それを知らない質問者が質問してくるから
あたりまえの知識を回答するのがあたりまえ。
0329名無しさん@お腹いっぱい。
2008/11/30(日) 12:05:520330名無しさん@お腹いっぱい。
2008/11/30(日) 12:08:17そう仮定するなら、>>311は明らかに間違っているわけだが。これをどう説明するのだ? www
実行すらせずに思いつきで書いたとでも? www
0331名無しさん@お腹いっぱい。
2008/11/30(日) 12:09:57純正厨とか変なのが多いぞ。
0332名無しさん@お腹いっぱい。
2008/11/30(日) 12:17:46>>331
俺は汎用性よりも可読性重視だから仕事では自分で一から作るモノは/bin/bashだな。
上の方にでてた四則演算はexprじゃなくてletとか使う。
0333名無しさん@お腹いっぱい。
2008/11/30(日) 12:18:04>>330 NG登録できるように、なるべくコテハンつける。
0334名無しさん@お腹いっぱい。
2008/11/30(日) 12:44:08もっと楽な方法があるってこと?
0335名無しさん@お腹いっぱい。
2008/11/30(日) 12:58:20「反論できねーだろ、>>328」という事。完璧に勝ったな。
0336名無しさん@お腹いっぱい。
2008/11/30(日) 13:40:38突然、SCPとftpでファイル転送するの作ってといわれて途方にくれています。
まずシェルスクリプトのことを学ぶのにどこを見ればいいのか
また上記のことを行うのに参考になるサイトなどありましたらお教えください。
お願いします
0337名無しさん@お腹いっぱい。
2008/11/30(日) 13:53:17shスクリプトについてのサイトは知らないけど
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ありがとうございます。
C/C++を大学でやってきた程度で
鯖をFedoraやDebianで本読みながら立てたくらいです。
Shがどんなものか、触りをWEBで確認したくらいで
サンプルコードを色々弄くってみた程度で、まだ全く使い方がわかっていません
SCPでファイル取得して、FTPで他の鯖に転送という、よくわからない要求です
もう少し勉強します。。。
0340名無しさん@お腹いっぱい。
2008/11/30(日) 14:26:18何を主張したいのかわからん。
主張のないものに「反論がない」と言われても、それで >>330 の勝ちにはならない。
>>320 も書いてるが、
$0に何がセットされるかは、インタラクティブ環境かどうかとは直接関係ない。
それを「インタラクティブだから$0にシェルがセットされる」と主張されても
当然間違い。
$SHELLについては、普通にloginすればログイン時にセットされるが、
その後、値を書き換えたり unsetすることもできる。
値を書き換えたり unsetした状態でシェルを起動しても、
$SHELLは改めてはセットされない。
よって、$SHELLではシェルを判定できない。
$shellについてはcsh系の方言だから、B-sh系でセットされていない。
0341名無しさん@お腹いっぱい。
2008/11/30(日) 14:43:230342名無しさん@お腹いっぱい。
2008/11/30(日) 16:32:20ftp, FTP, SCP, Sh
これらの大文字・小文字の区別はいったいなんなんでしょうね。
きもちわるい。
0343名無しさん@お腹いっぱい。
2008/11/30(日) 18:51:09loginがシェルのargv[0]に渡すものは決まっている。
0344名無しさん@お腹いっぱい。
2008/11/30(日) 19:15:14合わせて表示させるにはどうすればよいのでしょうか?
# 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それは「シェルスクリプト」スレに相応しい話題ですか?
0346名無しさん@お腹いっぱい。
2008/11/30(日) 19:41:15login経由でログインするとは限らない。
0347名無しさん@お腹いっぱい。
2008/11/30(日) 19:47:44シェルスクリプトと関係無いから次からはくだ質行ってくれ。
各コマンドの事なら大抵は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:17loginは argv[0]の頭に - を付けるが、
環境によっては、頭に - を追加するんじゃなくて、
頭の 1文字を - に置き換える。
だから、(イマドキいないと思うが)cshユーザーの場合、
cshの頭の1文字が - に置き換わって -sh になる。
よって、$0 を見て判別するのも無理がある。
0349名無しさん@お腹いっぱい。
2008/12/01(月) 00:15:26具体的にその「環境」をあきらかにするように。
キミらの脳内環境?
0350名無しさん@お腹いっぱい。
2008/12/01(月) 07:32:44え? 知らないんだw
>>348 が言ってるのは昔からUNIX使ってる人には常識だぞ。
0351名無しさん@お腹いっぱい。
2008/12/01(月) 07:38:02>>346 については、xdmなんかでログインすれば loginは経由しないし、
telnetとかsshの場合もloginは(今は)呼んでいない(自前処理)のはず。
そうじゃなくても、X上でxtermとか開いてもloginは通らないしね。
0352名無しさん@お腹いっぱい。
2008/12/01(月) 07:47:41「あきらかにするように」とか「脳内環境」とか言ってる奴(>>349)に
詳しく教えてやることないよ。
「教えてください」って礼儀正しく言う者にだけ教えればいい。
0353名無しさん@お腹いっぱい。
2008/12/01(月) 08:56:280354名無しさん@お腹いっぱい。
2008/12/01(月) 10:11:19>>346すら理解できないのだろう。
0355名無しさん@お腹いっぱい。
2008/12/01(月) 12:00:03そいつらはloginのように振舞わないのか? ww
0356名無しさん@お腹いっぱい。
2008/12/01(月) 13:32:40> telnetとかsshの場合もloginは(今は)呼んでいない(自前処理)のはず。
嘘つき。telnetは呼んでる。
0357名無しさん@お腹いっぱい。
2008/12/01(月) 14:24:21サポートしてない/サポートしてるけどデフォルトでは使わない実装が多いようだけど。
0358名無しさん@お腹いっぱい。
2008/12/01(月) 14:42:14振舞わないね
0359名無しさん@お腹いっぱい。
2008/12/01(月) 21:26:090360名無しさん@お腹いっぱい。
2008/12/02(火) 01:24:02結局こんな感じだろ?
echo $SHELL これはsh系以外アウト、つまりまったく実用的でない
ps -p $$ 理屈的にまわりくどい
echo $0 理屈的にも納得かつほぼ問題なし
■ このスレッドは過去ログ倉庫に格納されています