シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(
>>1-6 くらい)をご覧ください。
□お約束
・特記なき場合はbourne shがデフォルトです。
bash/csh/tcsh/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□シェルスクリプトでよく使うコマンド: 制御・条件判定系: [,test,expr,true,false,yes,getopts テキスト処理系: cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join ファイル名・ディレクトリ系: find,xargs,basename,dirname 出力系: echo,printf 対話コマンド制御系: expect http/ftpの処理自動化: wget,curl
まずは乙だよもん
>>8 糞スレにいちいち反応する
あんさんのほうが遥かに糞
11 :
994 :2006/01/21(土) 15:01:06
>>12 ねえぼく、レスとスレの区別は付けようね〜。
で、sh -cで起動する時に空白や改行を含んだ複数の引数を ばっちり渡す方法は見つかったのか? $ cat z #!/bin/sh echo 1:"$1" $ ./z hello world 1:hello $ ./z "hello world" 1:hello world $ sh -c './z "hello world"' 1:hello world $ set "hello world" $ sh -c './z "$@"' 1: $ sh -c "./z \"\$@\"" 1: なんつーか前スレの馬鹿は凄いね。 試してから投稿するって基本も出来ないアレ。 やってもないのに日常茶飯事とかいってさ。もうね。
15 :
14 :2006/01/21(土) 22:30:02
ちなみに $ sh -c "./z '""$@""'" 1:hello world なんてやると出来たような気がするが、、、 実はこれだと$2以降がわたらない。 はっきりいって、渡す方法を見つけたら、 チューリング賞物じゃないかな?え?無理? 思い返すとperlの黎明期には、perlなら長年shでは不可能だった これができるって宣伝を見た覚えがあるし、shじゃ無理ちゃうかな。
17 :
15 :2006/01/21(土) 22:43:30
>16 そんなに簡単に気って捨てるなよw $ arg=""; while [ $# -gt 0 ]; do arg="$arg '$1'"; shift; done; sh -c "./z $arg" で大丈夫ですよとかって帰ってくるの期待してたのに。 まあ、正直な意見としては面倒だからperlでいいじゃん。
無理なものが放置されてるということは、他の方法で回避できるからだな。 この場合はsh -c "..."を使わなければよい。
>>17 惜しいが、それだと引数の中に
普通の文字としてシングルクォートがある場合にうまくいかない。
set " hoge isn't hage " " No, I don't. "
みたいな場合ね。
echo 'echo "$@"' | sh /dev/stdin a b c とか。
>>19 今思い付いたが、引数の"とか'とか怪しい文字を全部エスケープし
てしまえばいいのか。
>>13 切り返したつもりなんだろうが、一番分かってないのはお前のようだぞw
#このスレは幼稚なやつがいぱ〜いだね。
/home/user1/sample1.txtがオーナーroot、グループroot /home/user2/sample2.txtがオーナーroot、グループroot このとき一発でsample1.txtのオーナー・グループを user1に、 sample2.txtのオーナー・グループをuser2にするシェル記述法を教えてもらえないでしょうか? 宜しくお願いしますm(_ _)m
id=$(expr "$file" : "/home/\([^/][^/]*\)/.*") chown $id:$id $file # chown $id.$id $file
25 :
23 :2006/01/22(日) 03:34:04
>>24 ありがとうございます、
上の文は正規表現ですよね、
下の#はなんでしょうか、コメントアウトじゃないですよね。
┐(´ー`)┌
コメントアウトじゃない?
コメントアウトって コメント記号で本文からはずしてコメント化するってこと? あるいはコメントしてあるところのコメントを除去して非コメント化すること?
コメント化する方。
コメントアウトしてあったものを本文に戻すことを 一語で表す表現ってあったっけ? 餡こめんと?
コメント解除
確実に通じる用語はないから 「行頭の # を削除」とか言った方がいい。
「アンコメント」(uncomment)で一般的に世界中で通じる。
35 :
21 :2006/01/22(日) 13:28:41
>>21 'とか"とかをエスケープするのではなくて、スペース類を全部エス
ケープすればいい。
なぜ?
指定したフォルダの中で一週間より古いファイルを削除するシェルって どうやったらいいんでしょうか? find . -mtime +7 -print | xargs rm これだと、指定したフォルダの配下のフォルダも削除対象になっていまうので 指定したフォルダだけ検索するようにしたいのですがよい方法はありませんでしょうか?
↓シェルに対するツッコミ
>>38 シェルスクリプトについて、もう少しルシェルシェ (recherche) しましょう
>>38 ls > ls.out でそのフォルダのファイル一覧を出力して
エクセルで編集してコピペ実行。
-depth n とみたが
-maxdepth n とみたが
↓-print に対するツッコミ
>>45 突っ込みどころなのか?
昔のシステムに乗ってる find は -print 書かないと
何も出力しないんだが...
以上、
>>45 へのツッコミですた
いや勉強になりますな
おそかったな
>>38 危険だから xragsは使うな。
意図しないファイルが削除されたりするぞ。
ふたたび-printについてのツッコミ
-print0 xargsで意図しないファイルが消されるのって、ファイル名の問題以外は、 -execでも同様な気がするんだけど、違うの?
>>53 >ファイル名の問題以外は、
重要な問題を「以外」で片付けるなよ。
次スレ用xargsテンプレ募集
>>53 というか、意図しないファイルが削除されたりしない!
>>55 xargsには、スペース、シングルクォート、ダブルクォート、改行などを含む
ファイル名を正しく処理できないという仕様バグがあります。
(例: 「I'm a girl.mp3」などというファイル名はイマドキ結構ある)
これを回避する唯一の方法は、findの -print0オプションと xragsの-0オプションを
組み合わせて使用することです。しかし、Solarisのfind/xargsには
これらのオプションがないため、移植性重視のシェルスクリプトでは結局、
xargsを使用しないのが懸命です。
- Solarisのfind/xargsにはこれらのオプションがないため、 + これらは GNU coreutils の拡張オプションであるため、 じゃね?GNU 以外で -print0, -0 のある実装ってあるの?
> xargsを使用しないのが懸命です。 必死だなw
>>57 それが唯一の方法は言い過ぎだろう。
-execを使うという手もある。xargsの出番はなくなるけど。
>>58 GNU coreutilsじゃなくて GNU findutils。
あと、FreeBSDの find xargsは GNUではないけど -print0 -0 が使える。
-execって毎回プロセス起こすんじゃないの? それがなければxargs使わないけど。
64 :
名無しさん@お腹いっぱい。 :2006/01/24(火) 18:44:59
>>57 > Solarisのfind/xargsにはこれらのオプションがないため、
あります。
つまり移植性的にも問題無いって事か テンプレ?
67 :
名無しさん@お腹いっぱい。 :2006/01/24(火) 21:12:37
>>65 それいつから?
すくなくとも, 現場で稼働してる
% uname -a
SunOS ns11 5.9 Generic_112233-06 sun4u sparc SUNW,UltraAX-i2
な, マシンでは使えないんだが...
>>65 Solaris 10でも無いよ。嘘はイカンよ。
Solarisなんかに移植しようなんて考えなけりゃいいじゃん。
えっとtgzファイルのgrep検索なんですが、 tar Ozxf hoge.tgz | grep arekore とかやってもどのファイルにあったか分からないんで困ってます。 そりゃファイルを展開すればいいけど、また削除するのが面倒です。 tarのオプション`O'はファイルを作らないでSTDINに出してくれるので これとシェルスクリプトの何か使ってファイル名と行数を出してくれる ようなことできないでしょうか。
ディレクトリ作って展開してgrepしてディレクトリごと消すスクリプトじゃだめなん?
>>71 tar Ozxvf hoge.tgz 2>&1 |
だと、ファイル名も出てくるから、何とか加工できるかもしれんが、
はげしくtarの実装に依存しそう
hoge.tgzがhoge-1.0/*のアーカイブだとして、 tar Ovzxf hoge.tgz 2>&1 | egrep '^hoge-1.0/|arekore' くらいで我慢して貰えないか? perlならArchive::Tar使ってなんとでもなるけども。
>>72 ,
>>73-74 ご返答ありがとうございます。今、帰りますた。
で、実はcygwinでやってまして、まず、以下の環境で
>>74 さんの
でやってみたのですが、何にも出てこなかったっす。
~$ tar --version
tar (GNU tar) 1.15.1
~$ egrep --version
egrep (GNU grep) 2.5.1
でもって
>>72 さんのでやればいいことに気づきました。ってか、
それは気づいていたんですけどやりたくなかったんですが…
情報小出し野郎登場。以後スルーでよろしく>みなさま
command1 && command2 || command3 と書いた場合の挙動ってどのシェルも同じ?
command1,command2,command3がすべて実行されることを期待しても良いか、ということ?
>>79 command2 が偽を返したらすべて実行されるんじゃないか?
>>77 どのシェルも同じかどうかはシェルを特定しないと答えようがないな
変な仕様の独自シェルだってありえるし
>>80 □お約束
・特記なき場合はbourne shがデフォルトです。
「無条件ですべて実行される」わけないだろ。
> どのシェルも同じ? という質問にそれはないだろ。
command1 && command2 || command3 と書いたときに、|| がcommand1の結果 を見るのか、command2 の結果を見るのか、っていうのがシェルごとに違うか? っていう質問ならば「違わない」。
>>83 || がcommand1の結果を見るのは実験してわかったのですが、manual を読んで
もきちんと書かれていないように見えます。私の読みかたが甘いのでしょう
か?
はひ?
&&や||はshort cut operatorってやつ。 右項を評価するかどうかは、左項の値による。 Cとおんなじ。
N88 BASICでもおんなじだぉ
いつもおもろいヤツが多いよな、このスレは $ ./success.sh && ./success.sh || echo failure $ ./success.sh && ./failure.sh || echo failure failure $ ./failure.sh && ./success.sh || echo failure failure >84 論理演算って知ってる?0 && 1も1 && 0も0だろ。 command1が失敗したらcommand2なんか実行しないんだよ。
>>88 いや、command2 が実行されないのは不思議ではないです。
command3 が command1 の $? を見るのがどこに書かれているのかなぁと。。
>>89 > command1 && command2 || command3
は、
(command1 && command2) || command3
と同じ。man shの"優先順位"も見れ!
command2を実行してないんだろ。 そしたらcommand1の結果を見るしかないじゃんw 88の例でも、success && success || echo failureなら何もでてないわけで、 command1とcommand2の両方の結果をちゃんと見てるジャン。 実行されないのは不思議ではないとか口ではいっときながら理解してないYo!
>>91 (゚Д゚)ハァ?哲哉してて頭おかしかったようです。。
>論理演算って知ってる?0 && 1も1 && 0も0だろ。 >command1が失敗したらcommand2なんか実行しないんだよ。 x が偽ならば y に関係なく x && y が偽なのは事実だが、 y を評価せずに済ませるかどうかは論理演算とはまったく何の関係もない。 sh を含めほとんどの言語がそう実装されているだけ。
>>93 違います。仕様です。
A && Bは、
if A; then B; fiと同じです。
ますます論理演算と関係ないじゃん。
論理演算って知ってる?0 && 1も1 && 0も0だろ。 (だからshでは最適化してて)command1が失敗したらcommand2なんか実行しないんだよ。 だったらいいんじゃね?重箱の隅つまんね。
sh で command2 が実行されるかどうかの話としてるときに、 >(だからshでは最適化してて)command1が失敗したらcommand2なんか実行しないんだよ。 このカッコの中を省略するのを指摘するのが重箱の隅だというのは 無理がありすぎるだろ。
じゃ、言い方を変えよう。質問してたヤツが納得したのに延々とつまんね(俺含む)
うむ、そのとおりだ。消える。
数学A 「論理と集合」で盛り上がっているスレはここですか?
>>102 そういうお前にはサイエンス社版クヌース4冊の演習問題を宿題として与える
そんなもん死ぬまで終わらんわ
本当に賢いしとはあーだこーだ考える前にカッコでくくっちゃうんだろうけどネ
(command1 && command2) || command3 だと、余分なサブシェルが起動されるから無駄。 command1や2でシェル変数を操作してたら反映されないというバグを生じるし。 { command1 && command2; } || command3 と、グルーピングにするべき。 もちろん、&&の方が優先順位が高いから、 command1 && command2 || command3 と書いても同じことだけど。
きみたちがプロでないことをはげしくねがうよ。
>>106 > もちろん、&&の方が優先順位が高いから、
そういう問題なん?
そういう問題でない以前に、&& と || の優先度は同じ。
>>109 同じ優先順位だから左側の演算子(&&)の方が優先順位が高いという意味だろ。
あげ足ばっかだな。
>>110 それは優先順位が高いと言わない。
「左に結合する」などが適切な表現。
優先順位は別の概念。
なんだかなぁ・・・
きみたちがプロでないことをはげしくねがうよ。
&&の方が||より優先順位が高いと思っていたヤシ ノシ
C言語だと本当に && の方が || より優先順位が高い。 shellでも、commandじゃなくて算術式の中なら、 && の方が || より優先順位が高い。 例: (( 1 || 3 && 0 )) の結果は真になる。
>>115 その例だと. 同一優先順/左結合でも,
1 が真で 3 && 0 を評価しないので
やはり真になるんだが...
同一優先順位左結合だと、 $ echo $(( (1 || 3) && 0 )) 0 でしょ。 $ echo $(( 1 || (3 && 0) )) 1 $ echo $(( 1 || 3 && 0 )) 1
>>116 違います。
仮に同一優先順位左から結合だとすると、
((1 || 3)) が真で、そのあと((1 && 0))が評価されるから偽になる。
ゆとり教育の弊害がここにも!
シェルでは普通、0が真なんだが、 算術式の場合は 0が偽になるというのも混乱の元だなぁ。
>>121 0といえば0だけど、シェルの if や while が見るのは終了コードなので
一緒にするのはよくないかと。
確かに紛らわしいんだけど
control operatorの場合、 「終了値が0かそれ以外か」とは考えなくて、 「コマンドが成功するか失敗するか」と考えるから混乱することはない。 status=$? して後で利用する時くらいか。
シェル関数の中で exit 1とか exit 0とか書く時に混乱するだろ。
>>124 言われて気づいたが、不思議なことに全然混乱していない。
>>124 「シェル関数」とわざわざ断っているのはどうして?
exitじゃなくてreturnの間違い?
$ function f () { return 0; }
$ if f; then echo yes; fi
yes
だからね。
それともサブ・シェルでのexitのこと?
わかった上でビミョーに誤りを混入してカキコして釣るのが高度な釣り師。
こりゃおじさん一本取られちゃったな。
じいさんめんご
130 :
名無しさん@お腹いっぱい。 :2006/01/30(月) 23:03:48
シェルで 少数を使った計算はできますか? 例えば for((i=0.1;i<1;i=i+0.1)){ echo $i } のような感じです。
シェルってゆうな。クズ。
まあそんなことをしたくなったらperlやrubyってのが普通だな。 □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
意地でも sh と sed と awk だけで問題を片付ける、それが男道
cutはダメ?
>>130 場合によっては bc 使う
$ for i in $(seq 10); do echo "$i/10.0" | bc -l; done
>>136 seqは小数点使える奴が多いんじゃまいか
$ seq 0.1 0.1 1
0.1
(ry
0.8
0.9
それから、seq 9な。
>>138 sedやawkも使わず、変数の展開だけでがんばれるようになったらな。
>>131 >>130 はシェルスクリプトのつもりで言ってるかも試練が
この場合はむしろシェルの方が正しいだろ
少数っていうな、が正しい
○ シェルで〜〜する ○ シェルスクリプトで〜〜する × シェルを書く ○ シェルスクリプトを書く
中等レベル × 〜というシェルが動かない
>>143 > × シェルを書く
だからぁ...
% vi lex.l
% vi parse.y
% vi main.c
...
% vi Makefile
% make
てな作業の事なので無問題
>>144 > × 〜というシェルが動かない
"〜" が sh とか bash とか csh とか tcsh とか zsh とか scsh とか...
だったら無問題
>>145 そんなんできるやつには○とか×とか言わんよ。
どーでもいーな
>>145 まあ、プロンプト % で書く香具師は、何言っても説得力が無いわな。
>>148 プロンプトが常に # の奴もちょっと嫌だな。w
プロンプトが$な漏れは勝ち組。
# な俺は神
zshはプロンプトが%
> な人
書くとき、プロンプトは、% が分かりやすいと思う # はコメントみたいだし、$ は変数と紛らわしい
ok ■
how many files ?
plan9のは%だよ。
シェルを書いている スーパーハッカーが集うスレッドはここですか?
いやシェルって普通のCUIのプログラムだし、ハッカーとかそんな凄いもんじゃないし
ポカーン、というAAが辞書に有ったら、今それを使っていたと思う
>>159 シェルを書くには結構な腕が必要なんじゃないか?
おれは、シェルスクリプトは書けてもシェルは書けん。
>>161 システムプログラムの初歩なんで、
やればできるレベルだと思われ。
動かすだけなら結構簡単なので、
大学での演習レベル。
車輪の大発明
リダイレクトとかバックグラウンド程度だけなら簡単だろうけど、 パイプとか、サブシェルとか、ジョブコンとか、環境変数とか、 基本的とはいえかなりのシステムコールの利用経験と、パーザの知識がいるかと。
> パイプとか、サブシェルとか、環境変数とか、 これは簡単だろ。 > ジョブコンとか、 とCtrl-Cでシグナル喰った時のシェルの挙動辺りは ちゃんとPOSIX規格その他を読んでないと難しいものがある。 少なくともマルチプラットーフォームは無理。
>>165 Posix 互換でなきゃいけないのか?
scsh とか, ぜんぜん Posix 互換じゃないし interactive shell として使おうと
言う気すら起きないが, それでも shell だ.
>>166 165はジョブコンを(ポータブルに)きちんと実装するのに知識が必要だって
ことなんでは。
つうか、シェルスクリプトではジョブコンは使わないって。 元祖B-shにはないし、今時のシェルであっても 非対話モード(シェルスクリプト)で起動されれば ジョブコンはdisableされるのが普通。
>>164 ,167,168
ジョブコンゆうなぁ...
いまだに ジョブコン -> JCL とリダクションされる.
>>168 csh, tcshって今でも非対話モードでもジョブコンenblaeされたままなのかな?
大昔、子プロセスにSIGSTOP送ったら、(もちろんkill(1)→killpg(2))
プロセスグループが別で、シェルに制御が戻って、
子プロセス異常終了で、スクリプトが止まったのはビビッた。
>>167 setsid()周辺は古いUNIXも含めると大変だよね。
Emacsにはその辺のレガシーなコードがまだ残っているが。
>>169 「リダクション」reduction:半減。例:ノイズリダクション
??はて??
リダクションくらいわかれよ。
わかってたまるか。
というか、JCLが分かってないのでは?
Job Control List だろ。 というか、「リダクション」じゃなく、 「リフレクション」と言いたかったのでは、とマジレス。
あぁたくもぉ…
ラムダ計算あたりでは、リダクションってのは、おおざっぱに言って
1/3 + 2/3 -> 1
のように, 複雑な表現から簡約された表現に置き換えることをさします。
おそらく
>>169 の頭の中では、ジョブコンよりも JCL の方が簡約された
表現だったんだと思うんですけど…
ちゃうんかい
>>169
Lが増えてる分、逆リダクションなのでは?
>>178 それは
>>169 に聞いてくれ。おいらの知ったこっちゃない。
ってか、文字数から見ると十分リダクションしてると思う。
音節を考えるとインダクションしてるけど。
以下のような utf8 の日本語を吐くスクリプトがあったとして #!/usr/bin/ruby require 'kconv' puts 'あいうえお'.toutf8 以下の出力が異なるのはそーゆーもん? echo 使ったほうが化けちゃうみたい。 #!/bin/sh ./utfout.rb echo `./utfout.rb` sh は dash ってやつ(Debian版 の ash みたい、Debian でごめん)。 こんなときは bash 使うべきなんかね(bash なら化けなかった)。
/bin/echo `./utfout.rb` と勘で回答してみる。
echo "`./utfout.rb`"
>>183 ,184
あーごめんなさい。どっちも試してたんだけど相変わらず化けたまんまっす。
ちなみに dash は echo は内部に持ってないみたいなのでどっちにしろ
/bin/sh を使ってるみたい。
>>185 > /bin/sh を使ってるみたい。
なにその角度
echoがビルトインじゃない(ここまでは理解できる) /bin/shを使う(ビルトインじゃないのは丸投げかよ) でぶの考えは理解できんな。
Debian$ dash -c 'echo どっちにしろ' どっちにしろ Debian$ dash -c 'echo `echo どっちにしろ | iconv -f euc-jp -t utf-8`' | iconv -f utf-8 -t euc-jp どっちにしろ
>>186 ,187
/bin/sh は /bin/echo の書き間違いね。失敬。
>>188 むむ。
% dash -c 'echo `echo どっちにしろ | iconv -f euc-jp -t utf-8`' | iconv -f utf-8 -t euc-jp
iconv: 位置 0 で不正な入力シーケンスがありました
手元の stable 環境だとこうなった。環境か dash の version 固有の話っぽい
ので犬板行ってみる。
そもそもピザだし。なぜ先にピザ板いかずにこっちきたのか不明。
ピザ板ってどれのこと?
以下のようなログがあって。 んで任意の時間帯のみをgrepしたいのですが、 全然わかりません・・・ 教えてください(*´Д`) -------------------------------------------------- 〜〜〜 XXXX 10:11 XXXXXX〜 XXXX 10:12 XXXXXX〜 XXXX 10:13 XXXXXX〜 XXXX 10:14 XXXXXX〜 XXXX 10:15 XXXXXX〜 〜〜〜 -------------------------------------------------- $xxx.sh 1012 1014 XXXX 10:12 XXXXXX〜 XXXX 10:13 XXXXXX〜 XXXX 10:14 XXXXXX〜 のような感じです。
>>195 sed -n '/10:12/,/10:14/p' logfile
でいいじゃん。
ただし、終了時刻の行は最初の1行のみ出力になるので、
必要ならば終了時刻の1分後を指定すればいい。
返事早っ!! そか、sedか・・・ 初心者ですいません。 さっそくやってみたところできました! ありがとうございます(*´Д`)
198 :
名無しさん@お腹いっぱい。 :2006/02/06(月) 15:39:48
>>195 sed -e '/10:12/,/10:14/! d' logfile
なら終了時刻の調整不要。
200 :
名無しさん@お腹いっぱい。 :2006/02/06(月) 15:56:20
201 :
名無しさん@お腹いっぱい。 :2006/02/06(月) 18:07:02
>>196 sed -n '/10:12/,/10:14/p; /10:14/p;' logfile |uniq
10:12や10:14が抜けていたらどうするかという問題があるので、 簡単にやっつけたかったら、 sed -n '/ 10:1[234] /p;' logfile が良いと思う。 日付もちゃんとみたいならunix timeに変換して大小比較するperl scriptで。 スレ違いなのでscriptは省略。他にはTime::Periodなど。
grep ' 10:1[234] ' logfile だろ
10:12 から 10:14 だといいんだけど、
10:12 から 12:03 だと
>>203 や
>>202 じゃできなくなるんだよな。
シェルでやるのは無理があるよ。 道具は選ばないと。
poka-n...
この程度はシェルでやらなきゃダメだよ。 頭は使わないと。
シェルってゆうな。クズ。
J 文脈(ry クマー
ここは釣り堀かよ
釣れないクマは、ただのクマだ
世の中には(ry
a=`grep -n '10:12' logfile |sed -n '1 p' |cut -d ':' -f 1` b=`grep -n '12:03' logfile |sed -n '$ p' |cut -d ':' -f 1` sed -n "$a, $b p" logfile いまいち。
実用的なことを考えると、指定時刻の行が必ずあるという前提 でいいのかという話もある
道具を選ぶのも頭の使い方。シェルよりrubyの方が早い。 ruby -ane 'puts $_ if $F[1] >= "10:12" and $F[1] <= "12:03"' logfile
>>215 スレタイ読めよ。
だから ruby 使いはキモいって言われるのに、自覚と学習能力がないらしいな。
スレタイしか読まない人?
シェルってゆうな。クズ。
シェルで書かれた kudzu。
出遅れた...orz #!/bin/sh awk -f - logfile $1 $2 <<'EOS' BEGIN { s = ARGV[2]; e = ARGV[3]; ARGC = 2; } $2 > s && $2 < e { print; } EOS $ xxx.sh 10:10 10:15
sleep
>>222 sleep: too few arguments
Try `sleep --help' for more information.
GNU sleep、通称ぐっすり。
し、知らなかった… おのれの無知を恥じ入るばかりw
227 :
名無しさん@お腹いっぱい。 :2006/02/15(水) 00:18:39
$ sleep usage: sleep seconds
fj.news.usage
GNU grep、通称ググれ
おせちもいいけど、カレーもね
つ [下痢シチュー&たんつぼ茶]
>>228 $ host fj.news.usage
Host fj.news.usage not found: 3(NXDOMAIN)
,j;;;;;j,. ---一、 ` ―--‐、_ l;;;;;; {;;;;;;ゝ T辷iフ i f'辷jァ !i;;;;; ヾ;;;ハ ノ .::!lリ;;r゙ シェルプログラミングはダサい… `Z;i 〈.,_..,. ノ;;;;;;;;> そんなふうに考えていた時期が ,;ぇハ、 、_,.ー-、_',. ,f゙: Y;;f 俺にもありました ~''戈ヽ `二´ r'´:::.
sleep 2d
235 :
名無しさん@お腹いっぱい。 :2006/02/20(月) 11:37:55
IPv6アドレス表記の ::1 とかの文字列を、0のバイトを省略せずに、 0000:0000:0000:0000:0000:0000:0000:0001 に変換するシェルって、どこかにありますか? 簡単そうで結構大変なので、、、
シェルキタ
その機能を内蔵しているシェルはあるかってことかな?
>>235 そんな変換は必要ないのがv6アドレスなので自分で作れ。
マッチした回数を元に演算する方法がわかればsedでもできそうな気はするのですが.. 頭悪いのでperlでこんなのしか書けませんでした。 引数は stdin から与えてください。echo a:b:c:d::1 | これ とか。 #!/usr/bin/perl -n chomp; s/^::/0::/; s/::$/::0/; ($s,$t) = /^(.*)::(.*)/; $cs = split(':',$s) - 1; $ct = split(':',$t) - 1; $_ = $s . ':' x (7-$cs-$ct) . $t; 1 while s/::/:0:/g; s/([0-9af-fA-F]{1,4})/000\1/g; s/0*([0-9a-fA-F]{4})/\1/g; print "$_\n\n";
貼り間違い。 #!/usr/bin/perl -n chomp; s/^::/0::/; s/::$/::0/; ($s,$t) = /^(.*)::(.*)/; $cs = split(':',$s) - 1; $ct = split(':',$t) - 1; $_ = $s . ':' x (7-$cs-$ct) . $t; 1 while s/::/:0:/g; s/([0-9a-fA-F]{1,4})/000\1/g; s/0*([0-9a-fA-F]{4})/\1/g; print "$_\n\n";
>(':' なにこの顔。ふざけてるの?
>>242 ば、いろんなところが顔に見えてきたorz
シェルってゆうな。クズ。
すいません、IPv6アドレス表記の ::1 とかの文字列を、 0のバイトを省略せずに、0000:0000:0000:0000:0000:0000:0000:0001 に変換するエッソって、どこかにありますか?
あぁ、確か4丁目の角。大通りの所ね。
ああ、セルフのところね。
すみませんエッソって何ですか? 新しいシェルでしょうか? 既存のシェルにはどれも不満な点があるので 試してみたいのですがググっても それらしいものは見つかりませんでした
エッソって今は統合か改名かで、なくなったでしょ。ネタの考証不足だな。
とあるディレクトリの直下だけのiniをフルパス取得したいんですが、 ん〜なんか簡単にできそうでうまくいかないんですよね・・・ 一応できるんですが、なんかいまいち強引になるので・・・ 教えてください。 /home/usr/ini/hoge.ini /home/usr/ini/log.ini /home/usr/ini/foo/test.ini /home/usr/ini/foo/bar.ini こんなんだったら /home/usr/ini/の直下のhoge.iniとlog.iniだけをフルパス取得したい。 ただし、/home/usr/ini/の直下に何もないときは何も返さない。
ls /home/usr/ini/*.ini
つnullglob
>>251 それ最初に思いついたのですが、
ls: 0653-341 ファイル /home/usr/ini/*.ini が存在しません。
のようにファイルが存在しない場合実現できません。
>>252 それよくわからんのですが、今の環境じゃ使えなさそうです。
AIX 5.2
>>253 ls /home/usr/ini/*.ini 2>/dev/null
$ ls asdf*wqerty ls: asdf*wqerty: そのようなファイルやディレクトリはありません $ bash -c 'shopt -s nullglob; echo asdf*wqerty' $ bash -c 'shopt -u nullglob; echo asdf*wqerty' asdf*wqerty
>>254 なるほど。これがシンプルでいいですね。
>>255 ほぉこんなのがあるのですね。
参考にさせていただきます。
こんな質問に答えてくれたかたありがとうございました。
あるいはfindで-depthしていするとか
AIX5.2のfindでdepthが指定できたかどうか、ちと疑問。
find /home/user/ini -name '*.ini' | awk -F/ 'NF == 5 { print $0 }' かな
すいません。
depth の
ディレクトリ本体の前に、ディレクトリの内容を先に評価する。
意味がよくわからんのですが、教えてください。
これで
>>250 可能なんすか?
きっと-maxdepthの間違いだろ。 -depthはdepth firest search。指定しないとbreadth first search。
アホだろお前。
263 :
名無しさん@お腹いっぱい。 :2006/02/21(火) 16:26:10
ホスト名をIPアドレスに変換するシェルを書こうとしていますが、 hostコマンドを使うとしても、CNAMEが絡んでいたりすると その標準出力の書式が一定せず、かといってdigコマンドでは 無駄な情報が多過ぎて切り出しが大変です。 さらに、bindのバージョンによってもhostやdigの出力が微妙に違うようです。 もっと言うと、DNSに登録されていなくて、/etc/hostsにのみ存在するホスト名でも IPアドレスに変換したいのですが、となると、host/digコマンドは使えません。 シェルでIPアドレスに変換するには、どうやるのが一般的ですか? あ、シェルで無理なら、エネオスでもジョモでもいいです。
pingして1行目を加工
なるほど! pingですかぁ、これは意外な盲点でした。。 … という冗談はさておき、本当はどうやるのが一般的でしょうか?
pingして1行目が現実的な希ガス。 でもホスト名−IPアドレスってのは一意に決まらんと思う。 DNSでロビンちゃんしてたらどうするの?
hoge=`ping host | head -1` だと、実際には2行目以降が出力されて初めてパイプが終了するため、 取得に1秒程度かかってしまいます。 さらに、hostが立ち上がっていなかったり、firewallでpingが閉じられていると 2行目が出力されないため、head -1 が終了しません。 タイムアウトまで待てば終了するでしょうが、これでは使いものになりません。
どうせDNS見にいって時間かかることあるんだから1秒ぐらい待て ホストのダウン対策は -t 1
苦労してますね。Linuxだと gethostip コマンドで一発なわけだが、 これって標準コマンドじゃないのかな。
# perl -e "print join('.', unpack('C*',gethostbyname 'www' )) " とか。 ロビンちゃん問題もどうするのか書いてないしどーでもいいけどな。
シェルスクリプトじゃないな
263はシェルを書いてるのであり、シェルスクリプトを書いているわけではない事に注意。
レベル低いなここは。相変わらず。
ほんとお前さえ来なければいいのにな。
getaddrinfoを組み込めっていうのが正解?
BSDのgetaddrinfoはrepository探索順序決め打ちでこれまたいやらしいけどな。 getentがどこにもあれば一番いいと思うけれど。
>>269 Linux だけど、gethostipインストールされてないです。
ちなみに Debian 3.1 (sarge)。
syslinuxパケージにあるだろ。
>>279 root じゃないので、インストールできません…
SuSE ES9 でも、オプション扱いのようだ。> gethostip
linuxなら、 $ getent hosts www.2ch.net でええやろ
>>263 俺はこんなの自作して使ってるが。
#!/bin/sh
echo -n "Enter lines to get: "
read lines
iplist=`ssh
[email protected] tail -$lines /var/log/httpd/access_log
| cut -f1 -d¥ `
for ip in $iplist
do
ipout=`host $ip | grep pointer | awk '{print($5)}' |
grep -v NXDOMAIN | sed "s/.$//g"`
if test "$ipout" = ""
then
echo "$ip"
else
echo "$ipout"
fi
done
>>283 host じゃ /etc/host 見ないっしょ。
>>282 getent hosts いいですね。glibcの付属コマンドみたいですね。
ただ、getent hostsでは、ごくたまーに、IPv6が登録されてるホストだと、
IPv6だけが引けて、IPv4が(登録されてるのに)引けません。
gethostipだと、IPv6は無視してIPv4のみが引けます。
どうすればいいでしょうか?
仕様を言え。 ・/etc/hostsは優先かどうか? ・v4/v6は両方欲しいのか、片方だけか。
/etc/hostsの優先順位は、そのOSの設定(nsswitch.conf)通りにする。 IPv4だけが欲しい。なるべくOS非依存にしたい。です。
うーん、どちらかというと、Perlの仕事かなあ。5.8.0ぐらいの。 バージョンによる差異が無視できるかどうかがポイントか。 RubyでもPythonでもいいんだけど、入ってないことも多いし。
ヒアドキュメントでCで書いておいて、/tmpにコンパイルして実行
商用OSだとコンパイラが入ってないこともあるけど
キモいから、ちゃんを付けるな
じゃぁクルクルロビン
んじゃこまどり姉妹問題
295 :
名無しさん@お腹いっぱい。 :2006/02/22(水) 18:14:50
あるディレクトリの直下で、リンク切れを起こしている ソフトリンクのみリストアップするシェルって、どう書けばいいですか?
findを駆使しろ。man findから全てが始まる。いい機会だから、 英語に親しんでおけって。 あ、スクリプトじゃなくてシェルを作るのか。bisonやflexについて 調べるのかな。まあどうでもいいことだけど。
シェルって言うな。 find . -type s | while true; do read x; ls -L $x >/dev/null; done | awk '{ print $2 }' | sed 's/:$//'
>>296 find . -type l
や、
find . -follow -type l
ではできないことを確認の上で聞いてます。
ちなみに、英語は得意です。
find . -type s | while true; do read x; (ls -L "$x" >/dev/null) 2>&1; done | awk '{ print $2 }' | sed 's/:$//'
>>297 -type s ってUNIXドメインソケットなんですが、、
それ違うでしょう。
あと、ファイル名に空白があると誤動作するんじゃ困ります。
find 単体でやろうとしてるからできないと思い込むんでしょ。
>298 や >300 が元の質問者(>295)だとして、 ある程度自分でも書いてみたんでしょ? 晒してみなよ。 勇気だしてさ。
シェルってゆうな。クズ。 find . -type l -exec sh -c '[ -e "{}" ] || echo "{}"' ';'
findで-type l -print0して、 #! /bin/sh ls -L "$1" if [ $? -ne 0 ]; then echo "$1" fi をxargsで-0 -n 1だな。
ワンポイントアドバイス: 「ここで質問する時は敢えて『シェルを書く』と言うと、回答の食いつきが良い」 急ぎで回答を得たい場合にもお勧め。 φメモメモ。
かなり余計なお世話だが、xargsってわかる? 敢えてそれを 使ってるのは何故だか、理解してる? 知らなくても問題ない。man xargsだ。
お前こそ何書いてんの? ほのめかし厨さん
-n 1はあれだとか、 -execがあるだろうとかそんなことでしょ。 けどエスケープやエクスパンジョンの泥沼にはまるくらいなら、 xargsはええと思うで。stdinからexecveまでshellを介さんから。 特に空白や日本語や特殊文字のパス名が多い昨今は。
309 :
295 :2006/02/22(水) 19:48:22
自己解決しました。 ↓これで一発です。 for file in *; do [ -h "$file" -a ! -e "$file" ] && echo "$file"; done findなどの外部コマンドは使いませんし、 スペース入りファイル名の問題もありません。 釣られて回答をくれた皆さん、釣りには気をつけましょう。
>>309 ln -s /nonexistent .詰めが甘いな坊や
>>310 どう詰めが甘いの?
ln -s /nonexistent . でも、期待通り動作するけど。
ln -s /nonexistent '.だから坊やって呼ばれるんだよ'
>>312 なんだそんなことか。
.で始まるファイルはここでは問題になってないので、、、
必要なら for file in * .* にすればいいだけだし。
>>310 仕様後付けで「期待通り」なんて言っているから坊やなんだよ。
いや、ここでは「ブロークンsymlinkをどうやって判定するか」が質問の
メインであって、それ以外の部分は参考でしかない。(仕様のあと付けではない)
>>310 みたいな突っ込みは本筋以外の部分に突っ込んでるので、
突っ込みとしても、釣りとしても面白くない、詰まり詰めが甘い。
そういうのは直接メールでやってください
はいはい
では次の釣りの方どうぞ。 今度はどんなシェルを書きたいのですか?
いや、これは難解そうな問題の陰に隠されたドットファイルに気が付くかという 引っ掛け問題なので、それ以外の部分は障害物でしかない。(仕様のあと付けではない)
320 :
名無しさん@お腹いっぱい。 :2006/02/22(水) 21:38:20
お使いのシステムで symlinks(1) が使えないか調べてみては。
つくづく、UNIX板だけのシェルスクリプトのスレが欲しいとか思うのであった。 それとも、犬の馬鹿が乱入して吠えてるというのは僕の妄想であって、 本当はUNIX板の住人がこうして基地外みたいに吠えてるのでしょうか?
脳内敵も大変だな
アンチLinuxも消えて欲しいよな。んなこと興味ねーし。
犬の馬鹿を排除しても このスレの馬鹿は半分しか減らないよ。
bashの話になると過剰反応する馬鹿こそ消えて欲しいよ。 すぐに犬糞とか言い出すヤツ。何なのアレ?
よくよく話を聞いてみると実はbashでしたテヘッてのは確かに氏んでほしいがな
327 :
あい :2006/02/23(木) 20:28:26
あるディレクトリから二ヶ月前のファイルは圧縮して削除をするスクリプトを作りたいです。(6か月前の圧縮ファイルは削除) それとAIXのdateコマンドを使用して二ヶ月前の日付を取得できないでしょうか?
328 :
名無しさん@お腹いっぱい。 :2006/02/23(木) 20:51:38
>>327 find で -ctime とか -mtime 指定したんじゃまずいのか?
>>327 2ヶ月前の日付は、TZいじって、
TZ=JST+1431 date でできない?
できなきゃあきらめて GNU dateを入れて date -d '2 months ago'
>>285-287 getentコマンドはSolarisにもあるよ。他のOSでは未確認だけど、
OS依存性を小さくしたいのならgetentでいいんじゃない?
IPv6を設定しているような変態ホストは無視しても問題なし。
1. getent hostsで引く(nss的な検索) 2 host -t aで引く(IPv4オンリー、ラウンドロビン) 1がIPv6なら、2のみ それ以外、1と2をmerge&uniq ってスレ違いじゃねえ?
332 :
名無しさん@お腹いっぱい。 :2006/02/25(土) 00:40:49
質問させてください。 OpenSSLの自己証明書を作成するときなど 自己証明の入力を促されますが シェルスクリプトで自動で入力するようにしたいです。 どうやったらできるでしょうか? ご教授よろしくお願いします。
標準入力から食わせられなければ、 expectスクリプトだな。
>>332 > 自己証明の入力を促されますが
何言ってんだか分からないが、引数で渡せないのか?
それともバカチョンスクリプト、CA使ってんの? 自分でやれ
335 :
332 :2006/02/25(土) 01:14:46
パスフレーズのことを言っているのか? まあいいけど。
338 :
332 :2006/02/25(土) 01:53:50
すみません。 expect勉強して、testuserのパスワード変更スクリプト作ったのですがうまくいきません。 #!/bin/sh USER=testuser PASSWD=testpass expect -c " set timeout 20 spawn passwd $USER expect \"New UNIX password:\" send \"$PASSWD\r\" expect \"Retype new UNIX password:\" send \"$PASSWD\r\" " これを実行すると何もエラーなく終了するのに パスワードは変わってません。 どこか間違ってるでしょうか? よろしくお願いします。
やっぱパスフレーズなのか orz
>>340 「強制終了」と、「コントロールコード1字入力」が、
この文脈で何か関係あるのか?
いや、C-c, C-vといえば普通コピー&ペースト
343 :
332 :2006/02/25(土) 10:23:13
#!/bin/sh expect -c " set timeout 20 spawn passwd testuser expect "*password*" send "test" expect "*password*" send "test" " expect使ったことないのでよくわからないのですが、こんな感じですよね? でもこれ実行してもパスワード変わってないのです。 どなたか、ご教授よろしくお願いします。
うぜーよ、examples/autopasswdみろよ。
345 :
名無しさん@お腹いっぱい。 :2006/02/25(土) 23:26:59
user $ test.sh & user $ みたいに&付ければ作ったスクリプトを常駐できるのですが、 &なしで user $ test.sh user $ のように&なしで常駐するようなスクリプトはどう書けばいいのですか?
>>345 スクリプトの中で & を付けてコマンドを起動すればいいだけ。
コマンドが複数ある場合は、( ) で囲って最後に &
↓みたいな感じ
(
command1
command2
:
:
) &
できました。 素早い解答ありがとうございます。
呼び出した子プロセスより先に、親コマンドが死んじゃうよ。注意してね。
何を注意しろと?
元質問では「常駐させたい」と言っている。 常駐=daemonという意味なら、むしろわざわざfork()して、 その親が先にexit()するというお決まりのプロセスを踏むのが普通。 ttyやプロセスグループを切り離すためにね。
セッションリーダーはどれになるの?
nohup command &
setsid command
>>351 セッションリーダーであるプロセスって概念はない。
あるプロセスのpidがプルセスグループidになったり、
セッションIDになることがあるだけ。
355 :
名無しさん@お腹いっぱい。 :2006/02/26(日) 18:55:50
「今日から何日前」じゃなくて、 特定の日付のタイムスタンプのファイルを探すシェルはどう書けばいいですか?
開始ディレクトリが現在地点だとして、 1日前なら find . -ctime 1 2日前なら find . -ctime 2 あとはお好みで。 -type f とか。詳しくは man findをどぞ。
>>356 質問をよく読みましょう。試験とかで早合点してケアレスミスするタイプかな?
ちなみに、findでは簡単な方法はないと思うよ。
あ、ほんとだ。ごめんね。
まあ、シェル書きたいってんだから、好きなようにかけばいいんちゃうん? Cでもなんでも好きな言語使え。
bash
シェルってゆうな、クズ。
特定の日付と、今日の日付が何日差あるかを求めるシェルを書いて、 それをfindに食わせればいいのかな? GNU dateなら何とかなりそう。でもめんどくさそう。俺はパス。
touch と組み合わせればできるでしょ。 touch -t 日付 /tmp/start touch -t その翌日 /tmp/end find . -newer /tmp/start \! -newer /tmp/end -print
>>364 「その翌日」をどうやって求めるんだよ。
結局dateを使う方法の方が奇麗では? テンポラリファイルも要らないし。
366 :
名無しさん@お腹いっぱい。 :2006/02/26(日) 21:29:00
find & ls -dl して探せ。
367 :
332 :2006/02/26(日) 21:34:32
#!/bin/bash expect -c " set timeout 20 spawn passwd testuser expect "*password:" send "test\r" expect "*password:" send "test\r" " 何度もすみません。 これ実行してもパスワード変更されません。 なぜ教えていただけないのかもわかりません。 難しすぎてわからないから教えていただけない? 簡単すぎてバカらしいから教えていただけない? どちらなのでしょうか? よろしければ、expectの使い方おしえてください。 よろしくおねがいします。
>>355 ↓ほれ。こんなんでどう?
arg=2005-01-23 # 探したい日付
days=`expr \( \`date +%s\` - \`date +%s -d $arg\` \) / 60 / 60 / 24`
find . -daystart -mtime $days
↑ ` ` が2重にネスティングしてるので注意してね。
> 簡単すぎてバカらしいから教えていただけない? :-P まずね、""(ダブルクオーテーション)の中で"(ダブルクオーテーション)を使うなら \(バックスラッシュ)をその前につけろ。わかったら一度市ね。 エラーメッセージくらいかけ。わかったらもう一度詩ね。
エラーメッセージが出ません、とか泣き言を書くなら最期に expect eof しとけ。馬鹿。氏ね。
371 :
名無しさん@お腹いっぱい。 :2006/02/26(日) 22:29:14
cシェルのaliasについてヘルプ .cshrcに下の行を登録して alias test1 'find \!:1 -name \"\!:2\*\" -print' test1 dir1 file1 と打つと、 find dir1 -name "file*" -print というコマンドを実行させたいけど、 うまく動かない。どう修正すればいい?
細かいけど、find dir1 -name "file1*" -print な
>>371 cshはスレ違い。
インタラクティブ系もスレ違い。
インタラクティブ系でしか使わないaliasの話もスレ違い。
わかったら帰れ!
376 :
名無しさん@お腹いっぱい。 :2006/02/26(日) 23:41:48
あらあら
まあまあ
>>379 ソースコードを1から読まずに済むならそれに越したことはありません
マニュアルページはある意味詳細に過ぎて見通しが悪いように思います
381 :
379 :2006/02/27(月) 00:54:25
1から読まなくても構文解析している部分などすぐ見つかるだろう。
文法なんてバージョン上がるたびに変わるんだから そのたびに規則を書き出すやつなんていないだろ。 ソース読むしかないよ。
>> 382 はあ、そういもんですか 言語なんだから仕様ぐらいキッチリ決まっているもんだと思っていたけど そーいうのがシェルの文化なんかな でもちょっとした仕様の誤認識とかで致命的な結果を招きかねないのは 困ると思うんだけど 嫌な人は他のスクリプト言語使えって事かな
馬鹿はそろそろお引き取り願えませんかのう。
>言語なんだから仕様ぐらいキッチリ決まっているもんだと思っていたけど 違うな。bashなり犬なりだけに見られる腐れた文化だ。
てかソース読むのもBNF読むのもほとんどかわらんでしょ? たぶん
sh の仕様なら POSIX あたりで決まってたりしないのかな。
決まってるが、彼が知りたいのはbashの仕様らしいからな。 やっぱソースしかないんじゃね?
標準になってるのlinuxぐらいでは?
拡張BNFになっとるがな。> bashのbisonソース
>>389 そういう理由ならexplorer.exeについてでも調べた方がいいんじゃまいか。
おそらく最多のユーザ人口を抱える対話型シェルだよ。CUIじゃないけど。
>>389 「sh として起動された場合は POSIX 互換に近くになる」と
マニュアル等には書いてあるが、これはかなり嘘。
実際にはshで起動してもbashとほとんど変わらない。
bashの独自拡張もほぼ全部使えてしまう。
目立った違いは、exportコマンドを引数なしで実行した時の表示が
bashだと declare -xなのが、shで起動すると exportの表示に
変わることくらい。
>>390 Mac OS Xも今のバージョンはbashがデフォルトっぽいです。
2つ前くらいまではtcsh(sh)がデフォでした。
まぁ、私はtcshの方が良いと思うけど。
>>394 やっぱashが漢?
>>395 tcshって少し昔しか知らないんだけど、シェルスクリプトに使うには重くない?
個人的にcsh構文ではまった記憶が多いので、偏見あるかもですが。
cshは捨てってことで。別にこれは偏見でもないような。
今までご苦労様でした! > csh系
(ただし対話型シェルとしての使用を除く)
400 :
名無しさん@お腹いっぱい。 :2006/02/27(月) 22:51:53
教えてください。 Kシェルってファンクション(内部関数)作れるんだよね? 繰り返し処理をそこでやりたいんだけどどうやって記述するの?
対話型としてもウンコ
>>400 繰り返したい処理をC-c C-vで必要な回数コピペする。
対話型ってお話が出来るの? 友達いないから俺もやってみたいな。
スレ違いだが、cshが普及したのは 当時履歴が実装されていた唯一のシェルだったからというのが大きいな。 何でも最初からあったわけではないというお話。
ファイル名補完も csh が最初。 csh でできると知らない人も多そうだけど。
filecってかなりあとになってからついた機能じゃなかったっけ? newcshの前にあった?
>406 あったんじゃね? 俺的にcsh本が書かれた時代&そっから数年はcsh以外にfilecが使えるシェルなかったし。 しかしあの数年をなかったことにしてもいいとか思っちゃえるのがcshの魔力。 また、数年後にはbashがでてくるわけだけど、当時のUNIX、68000 8MHzとかだと bashが糞遅いわけなんだ。cshは糞だけどbashはもっと糞というのが当時の認識だろ。 その後tcshやkshもでたが、同様に遅いshellで、俺はずっとcshをつかってた。移行しても いいと初めて思えたシェルがzsh。それいらいずっとzshだ。
あ、すまね。kshはcsh〜bashの当たりで既にでてた。 407でいってるkshはpdkshね。
重さだけなら、zshはbashに一歩も引けを取ってないだろ。
誰も zsh に触れてないのになぜ突然 zsh が?
いや、最近だと zsh の方が遥かに重いんじゃないかな。便利だけど。
俺もzshだけど、対話的な利用とスクリプティングじゃ要求も違ってくるし、 スレ違いなんで、対話的シェル総合スレでもたててそっちでやってくれ。
そうかなあ。bash起動するだけで数秒かえってこねえって時期に、 zshがでてきて起動すると即帰ってきたからその感動も凄くてねえ。 >410 すまん。単なる俺の過去の経験の暴露だ。 無視してくれ。
newcshナツカシス
>>407 csh本って"UNIX C Shell Field Guide"のこと?
>>413 そんなのprofileの違いだろ。馬鹿か。
>>391 > 拡張BNFになっとるがな。> bashのbisonソース
遅レスだけど教えてくれてありがとう。
シェルスクリプトの展開/置換と評価/実行の規則についてなんですが、
一つの入力単位(if などの複合文でなければ1行の「コマンドライン」)ごとに
字句構文解析→(展開/算術式評価/置換)
→(置換の結果生じた入力単位ごとに、字句構文解析→実行)
という流れで実行に移されると解釈していいのかな?
(あまりにも自明なことかもしれませんが…最後の () 内では
展開/置換が生じることはありえない?)
だからソース読めよ。死ねや、ハゲ。
アスキーからでているバイブル、「UNIXプログラミング環境」読みなさい。 bashと同じスタイル(yacc, lex使う)でshell作っているから。 # bison=GNU yacc
あ、lexは使ってねーわ。bashは。
422 :
名無しさん@お腹いっぱい。 :2006/03/04(土) 23:22:22
ファイルに書かれた環境変数を展開するにはどうしたらいいでしょう $ echo $PWD /home/nanashi/ となりますが、では $PWD と書かれたファイルから同じような出力を得るには どうしたらいいでしょうか $ cat nanashi.txt pwd = $PWD path = $PATH $ [なにかコマンド] nanashi.txt pwd = /home/nanashi/ path = /sbin:/bin:/usr/bin...
sed -e 's/\$PWD/'"$PWD/" -e 's/\$PATH/'"$PATH/" < nanashi.txt
>>422 なんで = の間が開いているの?
PWD="$PWD"
PATH="$PATH"
なら、
$ . nanashi.txt
で終りなのに。
>>422 完全に信頼できるソースから入手したファイルでないならば危険。
ナガタ君のように泣きを見ることになる。
426 :
425 :2006/03/05(日) 00:14:59
書きかけで送信しちまった。危険なのでやり方だけ そのファイルの前に cat <<EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF 後ろに EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF を追加したファイルを作ってshに食わせる。
427 :
422 :2006/03/05(日) 00:56:11
何がやりたいかというと、まー設定ファイルの雛形みたいのを 作りたいんですよ。例えば、httpd.conf であれば、 httpd.conf.in ってのを作って、中に ServerRoot "$PWD/testroot" とか書いておいて展開したいという。 やっぱ sed ですかねぇ
なんで sed じゃだめなん?
429 :
422 :2006/03/05(日) 01:10:43
いや、環境変数展開なんだからシェルスクリプトでやったほうが
簡単にできるのかな、と妄想してみただけです。
ちなみに
>>423 さんのだと、$PWD を展開した結果に
スラッシュが含まれているからダメっぽいです。
sed -e 's#\$PWD#'"$PWD#" nanashi.txt
とりあえずこんな感じにしてみます
cppやm4が古典的定番
awkもわるれるなとアホが言ってます!><
autoconf使えばいいのに…
linuxでしかノートラブルで動かねえautoconfなんか意味ねえ。 autoツール使いたがる気違いは絶滅すればいいのに。
autoconf を利用しているパッケージの問題を、autoconf 自身の 問題と混同しているのね。 シェルスクリプトのことをシェルと言ってるやつと同じレベルだな。
autoツール
>>434 あほー
互換性が無い事をチェックできないカタワなシステムと
それを有り難がって使ってる気違いの事だよ。
436がその気違いの書くソフトウェアを使わずに生きていけばいいだけじゃん。
>>436 autoconf はマジでなんでもチェックできるぞ。
互換性が無い事をチェックできなかったとしたら、それは autoconf じゃなくて
configure.in/configure.ac を書いた奴のせい。
おまいがやってるのは、シェルスクリプトのバグに対して、シェル自体に文句
を言ってるようなものだ。
そんな黒塗りメールをよく信じる気になったな。
>>436 configure.in/configure.acを正しく書かなければ、まともに動くconfigureを
生成できないautoconfというヘタレなシステムを批判しているのだ。
Cコンパイラも否定されそうです
これがFreeBSD厨というやつか
FreeBSDをばかにするな! 2ちゃんねるもyahooもSonyJapanもlivedoorもFreeBSD
>>442 Cコンパイラと比べるな。機械語と比べるのがふさわしい。
>>441 筋道のとおった議論をしなければ話を聞いてくれない
掲示板というシステムも批判したらいかがですか?
ねたにまじれすfreeかこわるい
450 :
名無しさん@お腹いっぱい。 :2006/03/07(火) 14:58:09
重複する文字列を統合するやり方を教えてくだされ @aaa.com @hoge.net @foo.bar @aaa.com @foo.bar を @aaa.com @hoge.net @foo.bar と言うように、重複した文字をまとめたいんです。
sort して uniq したら?
sort -u
453 :
名無しさん@お腹いっぱい。 :2006/03/07(火) 15:44:42
sort するから表示順序が変わるけど、そこは大丈夫? $ cat << _EOF_ | sort -u > @aaa.com > @hoge.net > @foo.bar > @aaa.com > @foo.bar > _EOF_ @aaa.com @foo.bar @hoge.net
順序が変わるのがいやなら awk '{if (!seen[$0]++) print}' とかな。
一工夫すれば順番を維持する事も可能。 cat -n | sort -k 2 -u | sort -n | cut -f 2-
普通のコマンドとやらもスクリプトの一種。
えーっと…
そっとしといてやれ。
>>456 そのアイデアはいいな。
前に同じような作業したときは、
perl で一度出てきた行を記憶しておくという
非常に馬鹿正直なやり方をしてた。
やっていることは、たいしてかわらんだろ。
(´・ω・)
(内部)sortは全部抱え込む必要があるので、
>>455 と
>>460 の方がメモリに抱える行は少ないわけだが…
>>463 メモリとか気にするなら
シェルスクリプト使わないよ。
多少実行時のパフォーマンス悪くても
さくっと作れる方重視でいいじゃん。
実際に応用が利くのは、awkとかsedだよな。
プログラミング言語だしなw> awk
シェルスクリプトなんていまやじじいどもの暇つぶしなんだから 効率なんか気にするな。
若者はそう呟きながら、sh なら5行で書けることを実現するために perl のモジュールのインストールをはじめるのであった。
>>469 を援護するつもりはないけど
perlのモジュールならWinでもつかえるな、、、とか言ってミルク
>>470 ボケ老人乙。
その5行で書けて、perlにモジュールが存在する具体例を
挙げてみようね。
口から出まかせはやめよう。お前のようなやつの年金を払っているかと
思うと反吐が出そうになる。
その勢いで、ちょっと考えてみれば良いのに…
エロ画像のダウン用だ。4行しかなかったから適当に改行してくれ。 while read url;do if [ -z "$referer" ]; then referer="$(dirname $url)/index.html"; fi test -f $(basename $url) || (while ! wget --user-agent='Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Win 9x 4.90; T312461)' --referer="$referer" --header='Accept-Encoding: gzip, deflate' --header='Accept-Language: en-us' "$1"; do sleep 1; done) done perlのモジュールというとLWPか。生活保護費もよろしくな。
475 :
名無しさん@お腹いっぱい。 :2006/03/09(木) 02:56:35
grepやegrepで、検索文字列を囲むときに、 ダブルコーテーション使ったりシングルコーテション使ったりいろいろみたいなのですが、 どちらが正しいとかはありますか?
ない。
>>475 シングルとダブルでは展開される要素の種類が全然違う。
正しいとかじゃなくて用途で使い分けるもの。
>>475 あえて「どちらが正しい」というなら、
シングルクォートが正しい。
検索文字列などの中で、シェル変数の展開等が必要ないのに
ダブルクォートで囲ってあるのはバグの誘発になるのでやめた方がいい。
シングルクォートで囲っておけば、
シングルクォート自身以外はすべてシェルの解釈を避けられる。
>>474 おいおいwgetなんて使うなよ。無理してシェルスクリプト使って破綻してる例だな。
perl使った方がほぼ全ての点で優ってる。
>>474 ちょっと添削。
「while ! コマンド」
という書き方は bashを含む一部のシェルでしか使えない。
「until コマンド」
と書いた方がいい。
あ、
$(basename $url)
も突っ込みたいが、またの機会に・・
>>480 shellで書いた方が頭がいい。
>>474 は別に破綻していない。
何でもperlで書くのは良くない。
>>481 なんで perl で書いちゃいかんの?
最近、国語能力低い人多いね。
【設問1】
>>481 が、なぜperlで書くと良くないと言っているか、
本文中の言葉を使って書き出せ。(5点)
強いて言えば
>>474 は毎回wgetプロセスを起動させているために、毎回
DNSルックアップとconnectを行ってしまうのはあまりよろしくないかも
知れない。
486 :
名無しさん@お腹いっぱい。 :2006/03/09(木) 22:52:59
どうしても解決できない問題があり、質問させてください。 -------スクリプトA-------------- #!/bin/sh echo 'NAME=$HOST' | egrep 'NAME=\$HOST' -------ここまで-------------- ↑のスクリプトを実行すると NAME=$HOST と表示されます。(期待する結果) -------スクリプトB-------------- #!/bin/sh aaa=`echo 'NAME=$HOST' | egrep 'NAME=\$HOST'` echo $aaa -------ここまで-------------- ↑のように、変数に入れて、echoで出力すると、空行が1行表示されるだけなのです。 本当はスクリプトAのように出力させたいのです。 どうすればよいのか、よろしくご教授お願いします。
>>486 ` ` で囲まれた中の \ は要注意。
$ aaa=`echo 'NAME=$HOST' | egrep 'NAME=\\$HOST'`
$ echo "$aaa"
NAME=$HOST
期待される結果。
488 :
名無しさん@お腹いっぱい。 :2006/03/09(木) 23:06:04
>>487 紙さま!!
ありがとうございます!!!
展開のdebugには #! /bin/sh -x を推奨。
すみません。質問させてください。 外部ファイルに IP=111.222.333.444 と書いたファイルがあります。 これを読み込んで #!/bin/sh cat << EOF > /home/test.txt ip='${IP}' EOF を実行すると、test.txtに ip='111.222.333.444^M' と、「^M」と言う文字が入ってしまいます。 「111.222.333.444」だけを書き込むにはどうしたらいいでしょうか? よろしくお願いします。
>>490 そもそも、外部ファイルの IP=111.222.333.444 に、
もともと ^M が付いているのが原因なので、
UNIXファイルとしてエディットして ^M を付けないのが正しい解決法だが、
どうしてもシェル側で ^M を取りたいなら、
外部ファイルを . で読んだ後で、
IP=`echo $IP | tr -d '\r'`
を実行してから cat 以下を実行すれば良い。
物凄いレベルの低さだなw
( ´∀`) オマエモナー
>>491 というか、シェルスクリプト自体が^M付きなんだろ?
cat << EOF > /home/test.txt^M
ip='${IP}'^M
EOF^M
>>495 いや、それだと #!/bin/sh^M で動作しないし、
test.txt^Mを読むにも苦労するはずだから、
そういうわけではないはず。
>>495 あ、それに、EOF^Mになるから、cat自体が終了しないじゃないか。
よって、シェルスクリプト自体には ^Mが付いていない、が正解。
IP=を書いたファイルのみ ^M が付いていると思われ。
みんなイジワルですねw
dos2ux ハァハァ
しかし cat が ^Mつけるってのも解せない話だよなあ。
>>500 catが ^Mを付けてるんじゃなくて、
ヒアドキュメントの $IPが展開される時、
シェル変数IPの中には、もともとの別ファイルにあった ^Mが入っているので、
これがそのまま展開されるという話だろ。
というか、
>>492 で解決したって言ってるんだから、
それ以上言うことないだろ。
まぁ茶でも飲めや( ゚Д゚)⊃旦旦旦旦旦
解決したことをうだうだ言っても仕方ないけど… > IP=111.222.333.444 こんなIPアドレスNEEEEEEEEEE!
>>503 例示のためにわざとありえないIPを書いたんだろ。
グローバルなIPを例示したい時、こういう書き方をすることがある。
相変わらずレベル低いなw
( ´∀`) オマエモナー
>>504 >>グローバルなIPを例示したい時、こういう書き方をすることがある。
ねーよ
日本人のパスポート申請書類のサンプルに アルファベットで外人の名前を書くぐらいにありえないな。 つまり、そういう例示をする奴は度外れて常識がない門外漢。
シェルスクリプトって書けると幸せですか?
時給いくらで働いている派遣は仕事が一瞬で終わってしまうので、不幸になります。
>>507 あるだろ。プライベートIPなら、
192.168.12.34 とか適当に例示して問題ないけど、
グローバルだと、実在する可能性があるので例示が難しい。
だから、わざと256以上のオクテットを含ませておいて例示する。
例示は 192.0.2.0/24 使え。
>>512 それって、RFCか何かで決まってるの?
あと、クラスBやクラスAのアドレスを例示したい時はどうするの?
>>513 RFC3330
今どきクラスなんて使わん。
>>514 今どきCIDRなのは知ってるが、
ナチュラルマスクの関係で、
あえてClass A or Bのアドレスを例示したい時はどうするの?
さぁ?
やれやれ
1バイト目が192だと、ぱっと見192.168と紛らわしいから、 もっとグローバルっぽいアドレスで例示したいというのもあるわな。 RFCもまだ比較的新しいから、example.comに比べてあまり浸透していないと思う。
>>513-515 ためになった…。知らんかった。
ただ、 111.222.333.444 はアレだ。デジャヴ。
某所で俺の嫌いな某コテが使っていたのだが、真似したいとは思わないなあ。
520 :
名無しさん@お腹いっぱい。 :2006/03/11(土) 15:28:48
相変わらずレベル低いなw
( ´∀`) オマエモナー
相変わらずレベル低いなw
オレ的例示用IPアドレスの推奨: クラスA: 12.345.67.8 クラスB: 132.456.7.89 クラスC: 210.345.6.78 RFCなんかより、これの方がそれっぽくてわかりやすいでしょ。
スレ違いの上に内容も馬鹿
相変わらずレベル低いなw
「相変わらずレベル低いなw 」って言うだけの煽ラーがいますね。 というカキコに対して一言 ↓↓↓
528 :
名無しさん@お腹いっぱい。 :2006/03/11(土) 17:39:55
死ねや、ハゲ
相変わらずレベル低いなw
>>524 普通の人はそれを見ても、面と向かっては何も言わないだろうけど、
内心はこのスレで付いたレスの様な事を考えてると思うよ。
オイオイ、何だコイツって。
それに、何も知らない初心者が真似したら可哀想だよ。
>>524 このアイデア頂きます。
某製品の取説を担当している者ですが、
WAN側の設定例でのIPで、xxxや***じゃわかりにくいと言われ、
どうしたものかと考えていたところでした。
自社のグローバルIPを使う事も考えましたが、
これも変更の可能性もあるし、使うのはまずいと思っていたところでした。
悪い事言わんから止めとけ。
>>531 はネタだということに気づけ。
って俺はそんな突っ込みなんてしないクマー
534 :
名無しさん@お腹いっぱい。 :2006/03/11(土) 22:46:12
IPアドレスをIPなどと呼ぶ時点で…
>>534 そういう指摘は「シェルってゆーな」と同レベル。
536 :
名無しさん@お腹いっぱい。 :2006/03/11(土) 22:56:08
そだな。相変わらずレベル低いなw
IPってゆうな。クズ。
>>530 例ならいいじゃん。
実際に振るわけじゃないし。
そだな。相変わらずレベル低いなw
こういう例を挙げとくと、サポセンに「256以上はありえない」という電話が 間違いなくかかってくる。
あと、プライベートアドレスで例示したのに、 「そのアドレスは私が使っているものですから公表しないでください」という 怖いメールが来ることも…
もちろん 「どうして RFC に書いてあるとおりにしないんですかっ!?!?!!!111!!」 というお怒りのメールが来ることもあるのだろうな。
543 :
名無しさん@お腹いっぱい。 :2006/03/12(日) 00:44:04
相変わらずレベル低いなw
∧_∧ / ̄ ̄ ̄ ̄ ̄ ( ´∀`)< オマエモナー ( ) \_____ | | | (__)_)
545 :
名無しさん@お腹いっぱい。 :2006/03/12(日) 02:42:17
おれは別にレベル低くないよ。
>>538 個人のメモ書き程度なら何も言わんが、人の目に触れる様な所で使うのは止めとけ。
>>540 ※注 例として256以上のオクテットを含むIPアドレスを表示しています。
と、同じページに注釈を入れておけば無問題。
>>542 RFCでは192で始まるアドレスなので紛らわしい。
RFC云々を言うものはかなりの上級者なので、
こういう事でいちいち電話しない。
WAN側のインターフェイスが2系統以上ある場合も、 RFCの192.0.2.xxx だけじゃ表現できず、困りますな。 まさか192.0.2.xxxをさらにネットマスクで分けたりしても 例示としてさらに紛らわしくなるだけ。
ここで言われてもなぁ。 RFC 書いたら?
551 :
名無しさん@お腹いっぱい。 :2006/03/12(日) 10:36:30
相変わらずレベル低いなw
・∀・)ニヤニヤ
RFCに従う必要なし。 好き勝手にやればいいんだよ。シェア取ったもん勝ちなんだから。 RFCを神みたく崇め奉ってる奴ってバカ。
>>550 RFC書く労力使うくらいなら、語呂のいい数字の組合せで商標登録しますw
中国が独自ドメインを作るとかいってたけど、 あれはRFCに沿ってるの?
556 :
名無しさん@お腹いっぱい。 :2006/03/12(日) 12:45:22
>>548 「256以上のオクテット」がそもそも矛盾してないか?
符号無し整数なら 255 までなのに。
相変わらずレベル低いなw
>>557 あり得ないアドレスを例に使うために、どこかを矛盾させなければならないのは当然。
敢えて矛盾させています、という注釈だろ。だからそれはおかしくない。
そこまでしてやる必要が在るのか?
花子さんから太郎くんへパケットを送るには、 太郎さんのアドレス「富.士.見.町」を指定する必要があります。
なんでやねん
こんな感じか ホストA ホストB | 富.士.見.町 | 御.殿.場.市 −+−−−−−−−+−− 図1 ネットワーク構成の例
ホストクラブばっかだな。
相変わらず気持ち悪いなw
567 :
名無しさん@お腹いっぱい。 :2006/03/12(日) 21:00:00
以下のようなcopyというシェルを作りたいので、教えてください。 copy[Enter]とタイプすると、「コピー元ファイル>」と聞いてきて、 ファイル名を入力すると、「コピー先ファイル>」と聞いてきて、 ファイル名を入力するとコピーされます。 「コピー先ファイル>」のところで、ディレクトリ名を入力した場合は、 そのディレクトリの内容が表示されて、再び「コピー先ファイル>」と聞いてきて、 ファイル名を入れると、そのディレクトリにコピーされます。 その他、コピー元ファイルが見つからない場合はエラーメッセージを出して 再び「コピー元ファイル>」と聞きます。 時間がありませんが、明日月曜の朝までにお願いします。
明日の朝までにシェルを作れってさ。 何だいそりゃあ。
シェルの機能がそれだけで良いなら、数時間で作れそうだけどね。 実装言語は C? それとも Perl とか Python とか使って良いの?
バグあっても知らんよ? #!/bin/sh infile="$1" tofile="$2" [ -z "$infile" ] && echo -n "コピー元のファイル>" && read infile [ -z "$tofile" ] && echo -n "コピー先のファイル>" && read tofile [ -d "$tofile" ] && (ls "$tofile"; "$0" "$infile") || cp "$infile" "$tofile"
>>570 それだと、ディレクトリが一旦指定された場合に、そのディレクトリの情報が
サブシェルに渡らないのでは? あと、延々ディレクトリを入力すると
プロセスが増え続ける。
つーか、
>>567 に対する答えはひとつ「宿題禁止!!」
板違いだが、「電解コンデンサのことをコンデンサってゆーな」には同意だな。 更には「コンデンサには寿命がある」とか言い出す香具師まで居る始末。 そもそも「電解」コンデンサだけが寿命があって特殊なんだよ。 一般的なセラミックやポリカーボネイトには寿命がなく、半永久で使える。
ネタレスやスレ違いばっかで、たとえ宿題でも
>>567 の質問がマトモに見える。
あ〜、ディレクトリは記憶しとかなきゃいけないわけね。 #!/bin/sh infile="$1" tofile="$2" [ -z "$infile" ] && echo -n "コピー元のファイル>" && read infile [ -z "$tofile" ] && echo -n "コピー先のファイル>" && read tofile tofile="$WD$tofile" [ -d "$tofile" ] && (ls "$tofile"; WD="$tofile/" "$0" "$infile") || cp "$infile" "$tofile" 宿題って言うより頭の体操かな? 無視したければ、あぼーんしといてよ。
575 :
名無しさん@お腹いっぱい。 :2006/03/12(日) 23:29:54
こんな汚いスクリプトはじめて見た
575先生のお手並みを拝見!
>>576 こんな感じで。
富.士.見.0/24でクラスCだから、
ホストA: 富.士.見.町
ホストB: 富.士.見.台
578 :
名無しさん@お腹いっぱい。 :2006/03/13(月) 01:56:29
んー、汚いとまでは思わないけど… Perlはもっとひどいよね。 WD設定する前に使ってるところとか、再度ファイル名を聞く処理が抜けてたりして いい加減だなとは思う。まあ、対話的にファイル名入力させるコマンドなんか 死んでも使わないからどうでもいいけどさあ。
>>567 cp、read、test、echo あたりを使えば出来る。
後は man を見て頑張れ。
再度ファイル名を聞く処理は実装されてるでしょ。再帰してるし。
>>581 コピー元ファイルが存在しなかった時に聞き直す処理が実装されていないようだが・・
$tofileがディレクトリで、再帰して、 再帰実行した自分が失敗して帰った来た時に、cp強行が汚いどす。 $ true && true || echo done $ true && false || echo done done
再帰呼出しせずに execすればプロセスは増えない。 さらに、自分をexecするんじゃなく、 whileループの中で、再入力ならcontinueするようにすれば execする必要もなくなる。 と、ヒントだけ書いておこう。
whileを使う処理が真っ先に思い浮かぶ人間はC出身だと思う。 再帰を使う処理が真っ先に思い浮かぶ人間はLisp出身だと思う。
gotoを使う処理が真っ先に思い浮かぶ人間は(ry
何だ 言ってみろ
真のプログラマ。 「真のプログラマはgotoを恐れない」
ども、後藤です。
どうも倉間です
>>567 の例題で gotoを発想するプログラマはヴァカ。
というか、/bin/shにgotoはないし、break 2以上ができるので
gotoは根本的に排除されている。
まあ、gotoがあるcshみたいなアフォなシェルもあるが・・
遠い昔... 後藤っていう理科の先生が フィリピンかどっかで自己紹介したら笑われたって 現地の言葉で「後藤=焼きうどん」なんだそうな
ダイクストラ先生のまえで「私の名前は後藤です。」
どうも進野です
596 :
名無しさん@お腹いっぱい。 :2006/03/13(月) 17:34:44
csh の利点って何?ただ文法が C ライクってこと?
hoge1/hoge4.ooo hoge2/hoge5.ooo hoge3/hoge6.ooo これを全て hoge1/hoge4.ppp_ooo hoge2/hoge5.ppp_ooo hoge3/hoge6.ppp_ooo に変えたいんですが、どうすればいいかわけわかめです。 help me orz
>>598 mv hoge1/hoge4.ooo hoge1/hoge4.ppp_ooo
mv hoge2/hoge5.ooo hoge2/hoge5.ppp_ooo
mv hoge3/hoge6.ooo hoge3/hoge6.ppp_ooo
>>598 for file in hoge*/hoge*.ooo
do
mv $file `echo $file | sed 's/ooo/ppp_ooo/'`
done
>>599 アフォか。
rename 's/\.ooo$/.ppp_ooo/' */*.ooo
sh: rename: command not found
commmand.com みたく ren *.jpeg *.jpg と操作できるようなperlスクリプトあったよね?
あったとしてもスレ違い。あと co"mmm"and.comって何だ?
rename s/jpeg/jpg/ *.jpeg なら
renameの話は犬板でどうぞ。
OS関係ないじゃん
関係あるだろ。
くだ質スレと区別つかなくなってきた
相変わらず
相変わらず給料安いな w
>>604 >mmm
アスキーネットにみたいなホストプログラム?
犬以外でrenameがデフォで使えるOSってあんの?
614 :
名無しさん@お腹いっぱい。 :2006/03/13(月) 23:34:03
shiftの反対ってないですか? スクリプトの最初で、引数で指定された全ファイルが存在することをチェックし、 そのあと各々処理したいんです。
ない 存在チェック関数書いて呼べ
616 :
名無しさん@お腹いっぱい。 :2006/03/14(火) 00:05:48
しょんぼり・・・ あったら便利だと思うのに ありがとうございました。
>>614 shift の反対は無いが
>スクリプトの最初で、引数で指定された全ファイルが存在することをチェック
が目的なら shift 使わなくてもどうにかなるよ。
for i in "$@"
do
[ -e "$i" ] || exit
done
618 :
名無しさん@お腹いっぱい。 :2006/03/14(火) 00:30:04
シェルスクリプトってスクリプトのくせに互換性低いな。
619 :
614 :2006/03/14(火) 00:35:48
>615,617 そうかfor文かfunction使えばいいのか・・・ ありがとうございます。
>>601 ,605 のrenameコマンドの文法って、Linuxのrenameコマンドとは違うけど、
どこのrename ? そんなの本当にあるの?
mmm = とらいえむ
>620 perlについてくるぞ。
「Linuxのrename」ってなんだよ
UNIX用のVBscriptは無いかな あると便利なんだが
>>624 Linuxだと標準で /usr/bin/renameがある。
renameといえば普通これを指す。ちゃんとしたバイナリだし、
perlは無関係だよ。
>>605 は Linuxの/usr/bin/renameだと
rename jpeg jpg *.jpeg
となるようだ。
全く別物の同名コマンドが出回っているようなので、
シェルスクリプトでは使えんな。
(もともと使ってなかったけど)
>>627 一口に Linux って言ってもその辺はディストリによって違うだろ。
Debian の /usr/bin/rename は perl スクリプトだよ。
たぶん
>>623 の古い版。
「Linux の rename」じゃなくて 「util-linux の rename」だろうな。
少なくとも Fedora Core 4 と Plamo は、
>>628 の文法のバイナリコマンド。
perlではない。RH系とSlackware系が同じだから、他でも同じかと思ったら
Debianでは違うのか。
まあ、そもそもrenameなんて使わないし、どうでもいいけどね。
人に説明する時はどのrenameか断らないと誤解を受けるね。
Debianのutil-linuxにはrenameはない。 俺の環境だとperlパケージの/usr/bin/prenameへのシンボリックリンク $ update-alternatives --display rename rename - status is auto. link currently points to /usr/bin/prename /usr/bin/prename - priority 60 slave rename.1.gz: /usr/share/man/man1/prename.1.gz Current `best' version is /usr/bin/prename. 要するにDebianの場合サイトごとに違う。 # ここんところがシェルスクリプトスレにちょいと関係あるのでレスしてみた。 といってもrenameの候補があるperl以外のパケージ見たことないが…
昔から自分で作ったの使ってたので そういうのあるの知らなかった。
相変わらずレベル低いなw
lwallのrename.pl、relink.pl、そんでもってhakansonのmkshadowdir.plは 俺的には珠玉のperlスクリプト。
636 :
名無しさん@お腹いっぱい。 :2006/03/14(火) 22:36:00
初歩的な質問だが、 $cat L1 aaa bbb ccc 1 ddd eee 2 これを $cat L1 aaa bbb ccc 1 ddd eee 2 に変換する方法教えてくれ〜
637 :
名無しさん@お腹いっぱい。 :2006/03/14(火) 22:48:16
while read x; do if expr "$x" : '[0-9][0-9]*$' > /dev/null; then echo "$x" else echo -n "$x " fi done
条件がよーわからん。 変換後が2行になるための条件は? 数字が来たらってこと?
>>636 while read word
do
echo -n "$word "
case $word in [1-9]*) echo;; esac
done < L1
640 :
名無しさん@お腹いっぱい。 :2006/03/14(火) 23:02:21
>638 すうじがきたら改行
質問です。 for name in hoge hage { echo $name } ↑みたいな書き方は bash依存ですか? なんか、Solarisの/bin/shでも動いてしまうんですけど、 manには記述がありません。(do doneの記述のみ)
cat L1 | tr -d "\n" | sed 's/([0-9]+)[^0-9]/\1\n/g'
644 :
名無しさん@お腹いっぱい。 :2006/03/14(火) 23:20:08
じゃあついでに $cat L1 111 222 333 a 444 555 b これを $cat L1 111 444 222 555 333 b a に変換する方法教えて
>>641 POSIXの仕様によれば、{}は()と同じくcompound-listを構成することができる。
で、for文は"The for loop requires that the reserved words do and done
be used to delimit the sequence of commands"と書いてあって、
「do/doneをつかわなければならない」のかはちょっとわからない。
>>639 は行末に余分な空白。
case内で処理した方がいい。
>>645 do doneの代用としての { } と、
compound-list の { } は違うしなぁ。
すると、Solarisとかで forで { } が使えてしまうのって
一種の隠しコマンドみたいなもの?
>>644 while read word1; do read word2; echo $word1 $word2; done
1行で桶。
651 :
642 :2006/03/14(火) 23:42:52
じゃ
sed 's/$/ /g' L1 | tr -d "\n" | sed 's/([0-9]+)[^0-9]/\1\n/g' とか。
>>644 はColumnとか使えそう。使ったこと無いので詳しくはまんまん。
>>648 joinじゃ無理じゃない? フィールド一致を見てしまうから。
653 :
642 :2006/03/15(水) 00:09:38
>>644 column -c 20 L1
とかだった。
654 :
sage :2006/03/15(水) 00:16:10
655 :
名無しさん@お腹いっぱい。 :2006/03/15(水) 00:49:50
本当にレベル低いなぁ。ここの回答者たちって本業は何?
粘土屋
>>655 馬鹿学生。
とりあえず何ができればレベルが上がったと
定義するのか説明してくれ。
スライムを一撃で倒す。
回答する側に立つなら、 sed一つで済むところを3つもプロセス使うなんて馬鹿げたことはやめてくれよな。
660 :
名無しさん@お腹いっぱい。 :2006/03/15(水) 09:28:26
>>658 お前、スライム一匹にイオナズン使うタイプだろ。
もういいからぜんぶ機械語で書け。 アセンブラ? なに軟弱なことを言ってんの?
なんで厨房はすぐ機械語とかアセンブル言語とか言うんだろう ハッカーぽい響きがあるせいか?
レベルが高い回答が来ないからレベルが低くなる。 というわけで、レベルが低い、といっている人はどーぞ、そのレベルの高さを示してください。 そのレベルの低さを示すのが関の山だと思うけど(w
機械語?レベル低杉
この程度でプロセスの数とか言ってるバカはどっかいけよ
程度問題じゃなくて、シェル内部コマンドだけでできる奇麗な解があるのに、 あとから外部コマンド(sed/tr)を複数使った解を出してきても エレガントではない。
エレガントじゃ食ってけないよ
コマンドに食わせるデータが大量でない限り、プロセスの数は無視して いいんじゃないか。この程度なら。
ちょwwwおm、あwwwwエレガントwwっw
プロセスの数が少ない = エレガントとは限らんだろ 内部コマンドだけでできればどんなに複雑でもエレガントとか言いはじめるやつとは議論にならんな
そりゃ、食うのがやっとの人にきれいなシェルを期待しちゃダメだな。
プロセス数とか、外部コマンドとか以前の問題として、
>>651 って動かないわけよ。
sedの中で \( \) とすべきところを ( ) で書いてるから。
動作確認してから書き込むのは最低限の回答者のルールだよ。
確かに、こんなシェル書いてちゃ食えないよな。
(先に言っとくけど「シェルってゆーな」の突っ込みは禁止。そろそろ言葉に慣れろ)
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
そろそろシェルスクリプトって言えるようになれよ。
んー、食わせるデータが大量になると、シェルスクリプトじゃいかんかなと 思うこともあるね。sed,awk,grep,findあたりを良く使いまわすんだけど、 重くてしょうがなくなる。まあ高速化は二の次になっちゃうんだけど、 RubyかPerlあたりのスクリプト言語を使うことを、最初に検討した方がいいかも 知れん。
シェルってゆうな。くず。
カレントディレクトリにある、大文字のファイル名を すべて小文字のファイル名に直したいのですが、 どういうUNIXを打てばいいでしょうか?
こういうの流行ってるの?
シォル
「UNIXを打つ」ってすげぇ表現だな
>>680 OS名を書かないと、答えられる人は誰もいないと思います。
いやむしろどのUNIXにするかってい(ry
シェルスクリブトが長すぎるから、略すバカが出るんだよ で前スレでこの板公認の略称が決まらなかったっけ?
シェルス にしよう
スクリブトってゆうな。クズ。
「UNIXを打ちながらこう考えた………… …………とかくにシェルは書きにくい。」
691 :
642 :2006/03/15(水) 21:35:03
エレガントじゃ無くてすいませんw 趣味でか触ってないのでいつまで経っても初級者から成長しないんですよね。 で、 sed 's/$/ /g' L1 | tr -d "\n" | sed 's/\([0-9]+\)[^0-9]/\1\n/g' で★キマリッ★
シェルをあぽーんキーワードにすると、、、、、、、、、
シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル シェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェルシェル
あぽーんってゆうな。クズ。
シェ…しぇ…シェ………シェ… …… … …… ……………… … …… … … …シェ… …
春休み期間中なのにもかかわらず平日に書き込みが減るのは、 馬鹿回答をしているのが馬鹿学生じゃなくて馬鹿社会人だからだろうな。
学生でもなく社会人でもありませんよー。
699 :
名無しさん@お腹いっぱい。 :2006/03/16(木) 13:48:35
シェルスクリプトで変数TODAYにyymmddを設定したいのですが、 どうやるのか判りません。 yyyymmddの8桁日付なら`date +%Y%m%d`で設定できるのですが、 yymmddで6桁日付だとどうやるのでしょうか? awkのsubstrという関数を上手く使えればできそうなのですが、 awkの使い方をいまいち理解できてないので・・・・ 申し訳ありませんがよろしくお願いします。
>>699 date +%y%m%d でできるよ。yは小文字。
ただし、%yは2000年問題の関係で推奨されない。
>>700 質問欲嫁。この場合 man strftimeしても解決しないだろ。
702 :
699 :2006/03/16(木) 15:08:28
701 ありがとうございました。 できました。 すごく単純なコマンドで出来たんですね(汗)
>ただし、%yは2000年問題の関係で推奨されない。 そんなの用途しだいでしょ。 昔のデータなんか扱わないようなところとか。 >質問欲嫁。この場合 man strftimeしても解決しないだろ。 man date するとたいてい strftime(3) を参照と書いてないか?
>>703 man dateしたなら、すでに %y のことは書いてある。
strftime(3)のことは書かれていなかった。
strftime(3)にでてるじゃん 誰だよ,解決しないとか言ってる奴
>>705 strftimeはC言語の関数。
そっちに載っていたとしても、回答としては不適切。
もっとそのものズバリのman dateがあるのだから。
なんでわざわざ遠い回答するの?
「man hoge」厨は、よく確認せずにカキコするため、回答をハズしやすいの法則。
ごめんdateコマンドだったか
おそらく
>>700 は、dateコマンドでも +%y が使えることを知らず、
そういうことがやりたいなら strftime() を使って、
C言語でプログラムを書け、と言いたかったんじゃないかな。
それが、実は date +%y で簡単にできてしまうことがわかり、
突っ込まれたので暴れているわけだ。
>>706 FreeBSD で man date を確認すると
% を使った詳細の書式は載っていない。
man strftime ならたぶんどの OS でも載ってるっしょ。
712 :
700 :2006/03/16(木) 16:14:40
>>710 いきなり man strftimeしても、質問者にとっては、
それがdateで使えるとはわからない。
載っているのはC言語なので、最初の数行読んで「違う」「ガセネタだ」と
思うだろう。
man strftimeとか言わずに、
>>701 みたいに date +%y%m%d と、直接回答するのが
もっとも価値が高い回答ではないだろうか。
この板最近回答者への要求きついね。 回答控えようかな。
FreeBSDでman dateでこれだけ載ってりゃ十分じゃ内科医 -------------------------------- yy 西暦の省略表現です。西暦の 10 の位と 1 の位です (1989 年なら 89、06 なら 2006)。 〜中略〜 使用例 以下のコマンド: date "+DATE: %Y-%m-%d%nTIME: %H:%M:%S" は、下のような表示を行ないます。 DATE: 1987-11-21 TIME: 13:36:16
だから今のコンテキストでは、%y が載ってないのはクズ
確認してみたが、SolarisとLinuxのman dateでは %yの他、%の書式解説が載ってるぞ。 遠回しなman書いてるFreeBSDはクズ。
手元の Solaris9 の man にはないようだが……。
date(1)には書式文字列はstrftime(3)に載っているっ て書いてあるけど。strftime(3)は遠回りでもなんでも なく、直球だと思う。まぁ、date(1)にstrftime(3)を 見ろと載っていると一言あってもいいけど。 An operand with a leading plus (`+') sign signals a user-defined format string which specifies the format in which to display the date and time. The format string may contain any of the conversion specifications described in the strftime(3) manual page, as well as any arbitrary text. つーか、質問者以外が難癖つけすぎ。
というか、Solarisの場合manは非標準で、標準はアンサーブックとかに変わったし、 Solarisスレでは二言めには docs.sun.com読め、なので、manは標準じゃないのだろう。
>>719 だからぁ、それはFreeBSDの場合なんだって。
そもそも、dateコマンドで行けるかどうかの情報すらない段階で、
man strftimeでは意味が通じないよ。
元が「dateの書式が知りたい」という質問なら
man strftimeでもわかるけど。
実際にはそうじゃない。
質問者の
>>699 は、8桁日付の date +%Y%m%d については知っている。
これを、6桁にしようと、awkのsubstr関数を使うことを考えていた。
この段階で、質問者は「dateコマンドだけではできない」と
考えていたと推定できる。
すると回答としては、まず、「dateだけでできるんだよ」ということを
教えてやらないといけない。
ところが、ここで「man strftime」などと回答すると、
「dateの出力をstrftimeというコマンド(←実際にはない)で加工する」
あるいはawkを考えているため「awkにstrftimeという関数がある?」
などと、誤った方向に誘導してしまう。
だから、manなどで回答するのではなく、
`date +%y%m%d`
と一言いえば済むことだったのだ。
回答者は date でできるのが分かってたんだから、man を良く嫁で良かったんじゃないのか。 直接、答えを教えるのは良くないよ。
manで回答する香具師って、実際に動作確認せずに回答してるだろ。 オレはその点が気になる。 シェルスクリプトとして動作確認してるなら、 回答は直接のコマンドラインになるはず。 直接答を書くというか、動作確認のためにそれは必要なこと。
なんで701はこんなに必死になってるんですか?
>>714 元々モマエは役に立ってないから
イエローで首括って良いよ
>>724 仮に動作確認のために動かしても、マニュアルに載ってることは答えを
直接書くべきじゃない。回答者の学ぶ機会を奪うのか?
>あるいはawkを考えているため「awkにstrftimeという関数がある?」 >などと、誤った方向に誘導してしまう。 GNU awk にはあるよ。その man でもちゃんと strftime(3) に誘導してる。
>>728 awkにstrftimeがあるのは知ってるよ。
だからこそ紛らわしいと言ってるんだ。
dateでできるのにわざわざawkでやると無駄だろ。
しかも、awkのstrftimeでdateみたいに表示させるの、
結構記述量多くなるよ。
余談だけど、 awk 'BEGIN { print strftime("%y%m%d") }' だね。 確かに、こんなこと書くより、 date +%y%m%d の方がエレガントだね。
>>727 >回答者の学ぶ機会を奪うのか?
確かに、「回答者」こそいい回答方法を学んで欲しいよねw
man回答は最低。
732 :
680 :2006/03/16(木) 21:08:35
すみません。
>>680 がまだ解答が付いてないんですが、
よろしければこれをネタに、解答者バトルをお願いします。
こんなUNIXを打ってください sh -c 'for i in *; do mv $i `echo $i | tr a-z A-Z`; done'
>>733 逆に大文字に変換してるのはわざと?
あと、sh -c が無駄。
cshユーザーは居ないという大前提があるので、
sh -c する必要なし。
>>734 > 逆に大文字に変換してるのはわざと?
素でまちがえただけよ
もっとハデなバトルネタきぼん
737 :
680 :2006/03/16(木) 21:41:44
>>733 ありがとうございます。733のUNIXを打つと途中まで行けるんですが、
My Document.txt というファイルがあるところでエラーになります。
こういうファイルも対応できるUNIXの打ち方はありませんか?
「UNIXを打つ」ってすげぇ表現だな
>tr a-z A-Z あれ? []がいるんじゃね?
>>739 man tr
[]はいらねーよ。正規表現じゃないんだから。
もまいら、ちゃんと動作チェックしてから書き込め。 それとも手元のPCがWinで、すぐにUNIXが打てないのかな?
SysVの古いバージョンの tr だと [ ] が要ったらしい。 でも、Solarisの tr でも [ ] なしで動くので [ ] はもう要らないのだろう。
solaris8のマニュアルだと、 /usr/bin/trの場合は、[]がいるみたいだぞ。 /usr/xpg4/bin/trの場合はいらんみたいだが。
Solaris9の/usr/bin/trだと [ ] なしで動いた。 manはインスコしてないので未確認。 manってうぜー。 現物確認が一番。
manぐらい入れとけよ
Solarisでは、「manは将来のリリースではサポートされない」みたいな記述を 何年か前に見たから、インスコしないことにしている。 LinuxのmanをNFSマウントしてそれを読んでるが、 それでだいたい間に合ってしまうんだよ。
Linuxのmanって、なんか古い記述が残ってたり、テキトーなのが多くないか? Solarisのmanの方が全然いいぞ 例えばThread-SafeかどうかSolarisのは全部書いてあるし
>>747 > Linuxのmanって、なんか古い記述が残ってたり、テキトーなのが多くないか?
日本語の man はそういうの多いね。
--help オプションとかがあるコマンドなら
そっちで確認した方が確実だね。
>>749 manも--helpオプションも間違ってて、
ソース読まざるをえないことが数度あった。
bashとかのでかいmanはよみにくいな。
かといって、zshとかperlみたいなのもな
-gつきでコンパイルしてあれば--sourceでソースが表示されるというのを標準にしよう
perl は独自に分割されてていまいちわからん。 ああいうのなら info の方がいい。
オマエら能書きは良いからUNIX打てよ
>>746 ,747
Solarisのmanは、docs.sun.comと同じソースで、
かなり前からSGMLドキュメントがオリジナルになっている。
アンサーブックの時代にそうなった。
/usr/man/sman*
で、
>>737 に対応したUNIXは誰も打てないのかよ?
しょーがねーなあ。少し上の方みりゃ分かると思うんだが。 for i in *; do mv "$i" "`echo "$i" | tr a-z A-Z`"; done
誰か俺の心を揺さぶるようなUNIXを打ってくれ!
UNIXを打ち込んでくれー!!
つーか
>>737 は普段windowsをクリックしてるんだろうけど
なんで突然UNIXを打たなきゃなんなかったのか気になる
>>745 Solarisのインストール時に、最小インストールを選択すると manは入らないよ。
サーバー専用機などで Xが不要の場合、
End Userインストールより下には最小インストールしか選択肢がなく、
それを選んで manなしになっているマシンは多い。
manぐらい入れとけよ
manにtinを入れるってか。
10台、100台とあるマシンに、同じmanのコピーをインストールするのは無駄。 しかも、manは実行ファイルでもあるまいし、サーバー専用機の場合、 サーバー機にloginしてmanを読むこと自体無駄。 あ、だからdocs.sun.comなのか。
セキュリティの関係でNFSを使えないサーバーもある。
>>766 情報を後出しされてもなぁ
じゃmanサーバ立てて都度読みに行けば?
使わない実行ファイルだって山ほど入ってるだろうに
まったくだ。昔のsun3とかの時代ならそりゃもうケチケチ使ってたよ。 find / -type f -atime +365 -exec rm -f {} \; でも実行しとけ
"Core System Support"で入れて、デフォでは入らない manを、 多数のマシンに pkgadd して回るなんて面倒なことはできない。 デフォで入らなかったというのはそれはそれで意味があるのだろうし、 あえてデフォの状態をいじりたくないというのもある。
なら入れなきゃいいじゃん。 それをシェルスレで主張する意味がわからん。
man co.jp
シェルゆうな
そうだよ、入れなきゃいいんだよ。
オレは入れるなとは主張していない。
「manくらい入れろ」と言ってる
>>762 とかに
反論してるだけ。
入れなくてもいいけど、man嫁って言われて切れるなよ
言っとくけど、man入れてないオレは回答者側。 このスレで質問したことは一度もない。 回答は多数。 初心者の質問に、誰かが man嫁と回答してるのを見て、 その直後にもっとずばりの回答をしてるのがオレ。 manなんかで回答するんじゃないぞ。
manぐらい入れとけよ
manはそのマシンに入っているから価値があるんだろ。
質問者はみんな man 入れてるよ。
はやくUNIX書けよ
>>777 > 初心者の質問に、誰かが man嫁と回答してるのを見て、
> その直後にもっとずばりの回答をしてるのがオレ。
質問者が調べる機会を奪っちゃいかんよ。
>>777 でもオマエmanの入れ方解らないで教えてもらったじゃん
僕にもmanの入れ方教えてくださいm(_ _)m
結局manが使えないバカの再教育からUNIX打たないとダメか
>>777 どのようにして、その先入観を打ち破る事が出来るのか。本当に悩ましい
>>786 そのネタもう古い。もっと新しいの頼む。
ずばりの回答か・・・ま、ほんとにずばりならいいが。
ずっぽりの回答
790 :
名無しさん@お腹いっぱい。 :2006/03/18(土) 00:18:15
相変わらずレベル低いなw
ここはmanについて考えるスレかよ!
man入れるか入れないかは別として回答としては
>>701 が一番良いと思うけどな。
>>699 の人はある程度調べた後に質問したように見えるし、調べる方向が間違いつつあるようにも見える。
そういう人にはそのものずばりの回答を出せば、その人は自分で man date で回答を確かめる事をすると
思うよ。
792 :
名無しさん@お腹いっぱい。 :2006/03/18(土) 12:28:56
>>791 だから?
要するに君はここが相変わらずレベル低いと言いたかったわけだね
>>791 ジサジエも飽きたから何か変わったUNIXを振ってくれよ
794 :
791 :2006/03/18(土) 13:35:17
>>793 俺は701では無い。
manも入れてる。
ねたは無い。
795 :
名無しさん@お腹いっぱい。 :2006/03/18(土) 13:39:28
十代に若返ってナオンとずっこんばっこんできるスクリプトをお願いします
>>795 #!/bin/sh
if [ $# -lt 1 ]; then
echo 'usage: manco YourAge' 1>&2
exit 1
fi
thisyear=`date +%Y`
year=`expr $thisyear - $1 + 16`
sudo date 01010000$year
echo 'Happy old year!'
man co
797 :
名無しさん@お腹いっぱい。 :2006/03/18(土) 14:03:36
動かしていると、自然にディレクトリ中にスクリプトが増えていくのはワームですか。
バグです
>>796 ありがとうございます。
早速実行してみましたが、
53歳だと、dateの実行のところでエラーになって
16歳に戻れません。
53歳以上にも対応したUNIXを打つ方法はありませんか?
800 :
796 :2006/03/18(土) 14:44:14
>>799 楽観的な仕様と引数の範囲チェック無しで作成してしまいました。
>>793 さん、変わったUNIXが振られましたのでよろしく。
>>794 典型的な自作自演の告白乙
ココではそんなお約束は書かなくてもおk
よしきた、俺にまかせろ! 俺は801では無い。 manは入れてない。 いつもずっぽり。
Sambaで coding system = hex で運用されていたサーバーがあります。 これを、coding system = euc に変更したいので、 hexでエンコードされた「:」入りの日本語ファイル名をすべて EUCに変換したいのですが、 どういうシェルを書いて、どういうUNIXを打てばいいでしょうか?
>804 それ、、、以前使ったら、シンボリックリンクも全部おいかけられて、 1つのファイル名を何度も何度もコード変換されて、全部の日本語 ファイルが化け化けになったw
>>806 findの -execのところに ` ` 書いても期待通りに動作しないと思うぞ。
find実行される前に展開されんだろ
809 :
名無しさん@お腹いっぱい。 :2006/03/19(日) 00:18:50
>>798 うーん、795の意図を正確に処理したら、
子プロセスがたくさん出来て困るんですけど。
810 :
名無しさん@お腹いっぱい。 :2006/03/19(日) 01:37:00
すいませんが、お力を貸してください 実行されたらあるディレクトリがあるか調べて そのディレクトリが存在していれば○○ 存在していなければ停止 このようなシェルスクリプトはどう書けばいいのでしょうか? できればbashとshの両方が知りたいです
811 :
名無しさん@お腹いっぱい。 :2006/03/19(日) 01:47:49
>>810 if [ -d あるディレクトリ ]
then
○○
else
停止
fi
>>810 A = 'ps ax | grep あるディレクトリ | wc -l'
if [ $A ]; then
○○
else
停止
fi
>>810 街がえっタ
A = 'ls | grep あるディレクトリ | wc -l'
if [ $A ]; then
○○
else
停止
fi
で、
>>806 だと不正解なわけだが、誰も正解はわからないのかな?
>>811 man で回答するのヤメレ。
>>812 正解。
>>813-814 初心者かな?
>>812 の正解を参照汁。
それだとディレクトリがなくても wc -l の結果の 0 が Aに入るので、
ifで常に結果が真になる。grepでの判定も曖昧。
そんなことしなくても [ -d hoge ] でできることを覚えろ。
>>811 ,817
おまえら一生manだけ読んでろ。manを読むばかりで手を動かさない机上の空論者だな。
>>808 はぁ?
>>806 はfind実行する前に ` `が展開されるよ。
しかも、find の -exec のあとは直接のコマンドであって、
シェルスクリプトではないため、
-execの実行時には一切のシェルの解釈を受け付けない。
だから、仮に ` ` がfindの実行前に展開されていないとすると、
逆に -exec の時に ` ` がエラーになる。
いずれにしても、
>>806 は大間違い。
俺は正解を知ってるが、回答者バトルのために敢えて書かない。
わかるモン居たら書いてみろ。
821 :
名無しさん@お腹いっぱい。 :2006/03/19(日) 09:50:16
エレガントなずっこんばっこんスクリプトまだー?
824 :
名無しさん@お腹いっぱい。 :2006/03/20(月) 12:00:36
>>818 私英語苦手・・・・じゃなくて、日本語苦手。
ほげ
ぴよ
>>824 アンカー先間違えてる?
818にそう言っても話が繋がらないのだが・・
つながらなくて困るようなスレの流れじゃないし。
829 :
名無しさん@お腹いっぱい。 :2006/03/20(月) 21:22:48
質問です。 カレントディレクトリ以下(サブディレクトリ含)にある.c,.cc,.cppのファイル数を知りたいのですが、どうしたらよいのでしょうか。 find ./* -name *.c | wc -l をそれぞれの拡張子で、では無く、一発で3種類のファイル数を求める方法を知りたいです。 後、 ./script < inputfile と入力した時、inputfileの中身をscript内で使うにはどうしたらよいでしょうか。 ./script 1 2 とやると$1に1、というようになりますが、ファイルに 1 2 とあり、そのファイルを入力として渡す時はどのようにして1や2を得るのでしょうか。
>>829 Q1 何故、findの機能を調べようとしないんだ?
Q2 何故、そのスクリプトエンジンの機能を調べようとしないんだ?
またman読めよらしいな
>>830 ,831
そういうお答えはご遠慮願います。
ちゃんとわかる方のみ、ご回答よろしくお願いします。
>>829 一問目は、man shかman bashして、
パス名展開(Pathname Expantion) のところ読んでね。
>>833 >>829 の1問目は、「一発で3種類のファイル数を(それぞれ)求める方法」
らしいから、それは shの「パス名展開」を読んでも解決にならないだろ。
また「知ったかman厨」か。
837 :
829 :2006/03/20(月) 22:49:10
>>830 忠告ありがとうございます。
findの方は -o -name の追加でなんとかなりました。
ファイル入力の方、ファイル名がスクリプト内で取得可能ならexecでどうこう出来る、
というのを見つけたのですが、肝心のファイル名をどうやって知ればいいのかわからんです。
なんか検索ヒント下さい。
>>834 「それぞれ」で無くてもよかったのだけど、その場合一発で出来るんですかね。
>>829 1問目:
「一発で」というならfindやシェルスクリプトでは無理。
3回もfindしたくないということなら、
近い方法として、
find . -name '*.c' -o -name '*.cpp' -or -name '*.cc'
の結果をシェル変数またはテンポラリファイルに一旦取り込み、
その内容を
grep '\.c$' | wc -l
grep '\.cc$' | wc -l
grep '\.cpp$' | wc -l
すればよい。
2問目:
./scriptの中で readコマンドで標準入力の内容が1行ずつ読み込める。
普通、while readみたいにして使う。
>>838 「それぞれ」でなくていいなら、
find . -name '*.c' -o -name '*.cpp' -or -name '*.cc' | wc -l
で一発。
このスレ的にはawkは邪道?
スクリプト言語だからなあ。でも実際、シェルスクリプトの一部として 使われてるって現実もあるし。微妙な所か。
843 :
829 :2006/03/20(月) 23:12:56
みなさんどうもありがと。
>>839 while read var
して$varを全部echoしてみたのですが、最初の値が0になっている。こういうものなの?
一つ目を無視すれば済むのだろうけど。
>>843 おそらく、whileループの「外」でechoしてるんだろう、とエスパーしてみる。
while readする場合にはちょっと癖があって、
while文の部分がサブシェルで実行されるので、
varに値を入れても、
whileループを抜けると消えてしまう(←ちょっと不正確な表現)んだよ。
うまく工夫してそれを避けるしかない。
845 :
名無しさん@お腹いっぱい。 :2006/03/20(月) 23:19:32
じゃ、こんなのは? find . \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' \) -exec basename {} \; | \ ( c=0 ; cc=0 ; cpp=0 ; while read i; do case $i in *.c ) c=`expr $c + 1`;; *.cc) cc=`expr $cc + 1`;; *.cpp) cpp=`expr $cpp + 1`;; esac; done; printf '*.c = %d\n*.cc = %d\n*.cpp = %d\n' $c $cc $cpp ) 長すぎたので途中で折り返してる。 てか1行で書く必要は無いのか?
>>843 この場合は while readを使わずに、
set `cat`
で読み込め。
これで、引数で起動したのと同じように
そのまま $1 $2 ... に代入されるよ。
847 :
845 :2006/03/20(月) 23:20:14
名前消えたけど845=841です。
848 :
829 :2006/03/21(火) 00:06:34
>>844 なんかよく分からないけど0が消えました。
さっき全く同じコードの筈なんだけどな。
入力ファイルの頭が0だった、なんて事は無いです。
while read var
do
echo $var
done
で0無しで動きました。不安なので再現狙ってみます。
>>845 長いからスクリプト書いた方が とか
でも一行で書けるものなんだと驚いたのも確か
>>846 うまいこと行きました。便利ですねこれ。さんくすです。
みなさんありがとうございました
849 :
名無しさん@お腹いっぱい。 :2006/03/21(火) 00:10:20
>>829 ちょっと作ってみた
--
find . -type f | egrep '\.(c|cc|cpp)$' | \
rev | cut -d. -f1 | rev | sort | uniq -c | sort -nr
--
egrepの部分に集計したい拡張子追加してね。
>>849 rev | cut -d. -f1 | rev
の部分、面白いと思うけど、
プロセス3つも使うの無駄っぽいから、俺なら、
sed 's/.*\.\(.*\)$/\1/'
にするかな。
>>850 それならもっと簡単に書ける。
sed 's/.*\.//'
なるほどー。「man嫁」じゃなくて、ちゃんと具体例で解答すると アイデアが膨らんで、スレのレベルが上がるねぇー。
質問者のフォローが良かったんだな 訊き捨ての香具師にはman嫁でじゅーぶん
スレのレベルが上がる…プッwwww
>>849 egrep のところは find -regex を使った方がお手軽だと思う。
>>850-851 のアイディアも加えるとこんな感じ?
find . -type f -regex '.*\.\(c\|cc\|cpp\)' | sed 's/.*\.//' | sort | uniq -c | sort -nr
-regex って、OS 依存だから、ポータブルなシェルスクリプトに したいんだったら、egrep 使った方がいいよ。 OS 依存でいいなら構わんが。
もちろん非依存だよ。まあ当然 UNIX 系 OS に限るけどね。
>>856 -regex って GNU 拡張だったんだ。
憶えておくよ。
egrep と grep -E ってどっちがポータブルなの?
-regex は 4.4BSD 系 find にもあるから、GNU 拡張というよりは もう少しポータブルだけどね。4.4BSD 系 OS のマニュアルには、 拡張機能だと明記してあるんだが。 egrep と grep -E では、egrep の方がポータブル。
相変わらずラベル低いなw
>>855 ,856
findの -regexがダメというなら、パイプで egrepするよりは、
find自身で -name '*.c' -o -name '*.cc' -o -name '*.cpp'
でいいと思う。ちゃんと書き直すと、
find . -type f \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' \) \
| sed 's/.*\.//' | sort | uniq -c | sort -nr
かな。
findの -type fを省略していいなら、その後の \( \) も省略できる。
863 :
名無しさん@お腹いっぱい。 :2006/03/21(火) 11:19:30
ここの馬鹿どもはPOSIXとか知らんのか?
>>863 POSIX!何ですかそれは!是非ご啓示ください!!
POSIXを読むのは有料だし、 実際の各種OSで使われているシェルやコマンドは、 POSIXと同じではない。 だから、そもそもPOSIXと同じではない各種OS間のポータビリティを 考えるなら、POSIX云々ではなく、実際に各種OSでの状況を調べて 対応するのが実践的で現実的。
opengroup.org キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
870 :
名無しさん@お腹いっぱい。 :2006/03/21(火) 14:38:19
>□お約束 >・特記なき場合はbourne shがデフォルトです。 今どき、bourne shをデフォルトにしているのなんて、 Solarisくらいしかないじゃん。
いや、ゴミが帰ってきても困るんだが。
>>860 > egrep と grep -E では、egrep の方がポータブル。
嘘おっしゃい。
du -a と find . -type f だと、やっぱり find の方が速い?
スクリプトでは難しいけど、カレントディレクトリにあるディレクトリ数分のthreadを作ってパラレルにfind するようなプログラム作るとめっさ速そうなんだけど。無理?
> 嘘おっしゃい。
Linux とか POSIX の仕様しか知らない最近の人だと、そう思うかも
しれないね。SUSv3 を見ると egrep は載ってなくて grep -E だけ
が書いてあるし。
でも、もともと egrep と grep は別のコマンドで、使っているアル
ゴリズムも egrep は DFA、grep は NFA で異なっていた。10年くらい
前だと、grep に -E オプションがない OS も沢山あったよ。
これに対し、egrep はベル研 UNIX 時代から存在する由緒あるコマンド
で、事実上すべての UNIX に存在するはず。
ttp://www.bookshelf.jp/texi/autoconf-ja/autoconf-ja_10.html > POSIX 1003.1-2001では,もはやegrepを要求していませんが,より古いホスト
> の多くはまだPOSIXのgrep -Eでの置換をサポートしていません.この問題を回
> 避するため,AC_PROG_EGREP を呼び出し,$EGREPを使用してください
>>877 Solarisだと/usr/xpg4/bin/grepにしか-Eオプションは無くて/usr/bin/grepでは-Eは使えない。
他のOSでも使えるようにgrep -Eをスクリプトに書くのはちょいめんどくさいな。
879 :
名無しさん@お腹いっぱい。 :2006/03/21(火) 16:54:26
>>867 まずはPOSIXを読めな? ごたくはそれからだ。
>>876 pthread使ったファイル検索プログラムがButenhofのpthread本に
載ってたような。
POSIXの仕様に合わせると、現実の仕様に合わない罠。
>>877 見ても、POSIXよりも autoconfの方がよほど現実的というところか。
相変わらず
884 :
882 :2006/03/21(火) 22:48:52
>>883 鬱で引きこもりですけど何か?
僕のクラッキング武勇伝でも聞くかい?
スクリプトキディってやつか。語ってみる?
よ、よし、俺のハッキングデビューはWinNuke。 その後は究極のProxy★ガブリエナイで優雅にproxy生活だったさ!!
読み方 : スクリプトキディ 分野 : セキュリティ > ネットワーク インターネット上で公開されている操作が簡単なクラックツールを利用して、興味 本位の不正アクセスを試みる「幼稚な」クラッカー。 クラックツールは既に広く知られているセキュリティホールを悪用するように作成されているため、 セキュリティパッチを確実に適用することで、ほとんどのスクリプトキディによる攻撃は防止できる。 クラックツールを使えば深い知識や高度な技術がなくても簡単に攻撃を行なうことができるため、 数の上ではクラッカーのほとんどはスクリプトキディであると言われる。
888 :
名無しさん@お腹いっぱい。 :2006/03/23(木) 15:38:21
一番汎用性があるシェルスクリプトは Bourne Shell で書かれたもの という理解でよろしいでしょうか?
889 :
名無しさん@お腹いっぱい。 :2006/03/23(木) 15:39:59
890 :
名無しさん@お腹いっぱい。 :2006/03/24(金) 02:30:15
Debianだと checkbashisms なんてコマンドがあったりするな。 まあそんなに汎用性気にするならPerl使えという気もするが。
892 :
774 :2006/03/24(金) 07:55:17
>>888 一番移植性が高いのはBourne Shellということで合ってる。
当たり前過ぎて誰も答えなかっただけ。
>>890 初心者が本気にするかも知れないから、そういう嘘書くのやめろ。
894 :
名無しさん@お腹いっぱい。 :2006/03/24(金) 09:31:20
>>893 では移植性の高さを定量的に比較し提示してください。
>>894 誰もが常識として知っていることをあなたに説明して教える筋合いはない。
知りたければ自分で知ろうとする努力をしなさい。
896 :
名無しさん@お腹いっぱい。 :2006/03/24(金) 09:45:05
>>895 つまり根拠なき妄言てことですな。自白乙。
まあ、釣りだろうけど、 「kshが移植性が一番高い」などとマジで言ってるなら重症だぞ。 ヨソでそんなこと言って恥かくなよ。
罵り合いで盛り上がっているところ申し訳無いが、 汎用性と移植性は違う気がする。 汎用性は用途の広さだよね。 それならどのシェルもほとんど変わらない気がする。
>>894 $ ssh freebsd-host
freebsd$ ksh
ksh: not found
freebsd$ exit
$ ssh linux-host
linux$ ksh
ksh: not found
linux$ exit
....noway, what more can I say ?
おぃおぃ お前のマシンに当該シェルがあるかどうかなんて聞いちゃいねー
>>901 そのとおりだが、漏れもpdkshなんて使わんからアンインストールしてるよ。
>>901 はぁ?
どんなホストでも、誰のホストでも、
デフォで動くというのが「移植性」の必須条件なわけだが。
んなこたーない
>>903 そういう標準化の為に色々大人が事情をつくるのよ
どんなUNIX95のホストでもとか
POSIXに準拠したホストでもとか
>>905 だからPOSIXって実際には使えないわけですね。
準拠ってことばを知らないなら辞書でしらべなよ(^_^;)
>>890 たくさん釣れましたね。
確かに、本当にKorn Shellが移植性が高かったら良かったかも知れませんね。
でも現実にはもう遅いですね。
腎虚
言葉遊び乙
打倒米帝
【設問1】 次の各項目を、その可能性が高い順番に並べよ。(10点) (1) IPv6が普及する (2) UNIX環境においてUTF8がEUCよりも普及する (3) kshが最も移植性の高いシェルとして普及する
(2)>>>>>>>>>>>>>>>>(1)>(3)
(4) 俺が童貞を卒業する
>>914 本当にやる気が有ればいつでも捨てれるはずだ
>>912 どれも可能性ほぼゼロ。
よって、どの順に並べても正解。
UTF8は、全角記号の横幅問題が解決しない限り、実際問題使えない。
φ=(2)>>>>>>>>(1)>(3)>>>>>>(4) でFA?
xterm -cjk_witdh じゃ駄目なの?
919 :
名無しさん@お腹いっぱい。 :2006/03/24(金) 23:32:06
そりゃ一番機能が低いのが一番移植性が高いだろ。CPM-80のcommand.comの移植性が一番高いでFA。
それこそがunix philosophyだという話もある
>>919 いい加減なことぬかすな、CP/Mにはcommand.comなど無い。
そういうことなら自動販売機が一番移植性高い。
オナホでもおでんでも売れるものな
今こそS-OS復権
OS-9!OS-9!
(2)>>(1)>=(4)>>[越えられない壁]>>(3) が漏れの印象
>>923 オナホの自販機ってあるんだ。さすがだれにも相手にされなくなった
ご老体さまがたですなw
dtkshとか、pgbashとか、ああいうの他にないんですか?
(1)>>>>>>>>>>>>>>(3)>(2) 2はUNIXではムリでそ 犬はUNIXじゃないし〜 1は連邦政府の動向見ると実現しそう 日本は後追いで普及ということになるだろうけど 3はよく分からないけどLinuxの鳥ベンダ次第 システム用の各種スクリプトはXMLでラップする方が普及すると思うので シェルの差っていうのは余り意識せず済むようになると思うケド 4は心がけ次第
オナホってそこらの女より刺激が強くて気持ちいいよ?
おでん缶うまうまだよもん
933 :
名無しさん@お腹いっぱい。 :2006/03/25(土) 02:33:55
>>925 OS-9ってshell 差し換えできましたっけ。
コマンドの標準入力がファイルを入力する時、 command < file というのと、 command '< file' というのと、両方ありますよね。 どう違うんですか?
ジュワワワジュワワ、 ジュワジュワジュジュワワワワワ?
>>933 AV Riderはシェルを換えられるというデモの意味もあった。
939 :
名無しさん@お腹いっぱい。 :2006/03/25(土) 13:22:08
> 両方ありますよね。 ありません
実際にあるから聞いてるのっ!
command < file はcommandへの引数は無し、標準入力はfileになる。 command '< file' はcommandへの引数は一つで、それは '< file' という文字列。標準入力は変わらず。 だから、2つの書き方でやろうとしていることは全く違う。 実際にあるなら、その行を変更無しにそのままコピペしてみな。
'< file' じゃなくて `< file` なんじゃないの? で、bash依存なのでお引き取りください。
で、bash依存だとなんで引き取らなきゃいけないの?
bashスレ行け池沼
>>943 bash依存だとUNIXがぶちにくいんじゃない
bashはUNIXではない。
もちろんNetBSDです。
historyがUNIXだと表示されますが、 シェルにすると出ません。 UNIXとシェルでは何か違いがあるのでしょうか?
When history is on UNIX, it is displayed, but when it is made into shell, it doesn't. Is there any difference between UNIX and shell ?
>>951 >Is there any difference between UNIX and shell ?
Yes.
>>952 Thanks. Tell me why and how to make it work.
(いぶまさとうの声で) yes, a little.
The history command is very bash specific. You should go back now !!
(いぶまさとうの声で) シンナーに気をつけろー
>>942 んなこたない。`< file` は kshでも使えるぞ。
テンプレをup-to-dateなものに修正したので、 ここに↓に上げておきます。 次スレ立てる人はコピペしてください。 オレの環境からだとなぜか立てられないので・・
シェルスクリプト総合 その6
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(
>>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 でトレースしましょう。
□関連書籍と関連リンク:
FreeBSD Hypertext Man Pages
http://www.freebsd.org/cgi/man.cgi Linux JF (Japanese FAQ) Project.
http://www.linux.or.jp/JF/ Unix Programming Frequently Asked Questions 日本語訳
http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html UNIXプログラミング環境
http://www.amazon.co.jp/exec/obidos/ASIN/4871483517/ □人間初心者へのお願い:
・このスレはシェルスクリプトについてのスレです。
シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
使い方の質問などはスレ違いなので無用に願います。
□シェルスクリプトでよく使うコマンド:
制御・条件判定系: [,test,expr,true,false,yes,getopts
テキスト処理系: cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join
ファイル検索系: find,xargs
(スペースなどを含むファイル名を正しく処理するため、
findは -print0、xargsは -0オプションを常に付けることを推奨
ただし、Solarisでは未対応。どうするんだろ?)
ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl
以上でーす。
テンプレ長くなったなあ。 名著厳選ってのならともかく、シェル本網羅ってのは 尼損で検索すればいいだけだしテンプレとしては要らないんでないの。
いい加減長いし、Wiki でも作る?
次スレで刈り込めばいいんじゃね。
>>959 > Linuxユーザは/bin/shの正体がbashなので特に注意。
→bashであることが多いので
ashなデストリも増えてる。
過去スレも長くなってきたら省略するか最後に回すかした方がいいな。 その2とか参照する暇人はいないだろう。
>>970 くだらん言い訳してないでLinux板にbashスレでも立て てお け
もうあるよ。
>>957 zshでも使えるね。「bash依存」で片付けられないわけか。
>>970 ちょっと話は変わるけど、
ashって、バージョンによって echoが echo -eを含んでいたり、いなかったり、
バージョンによってtypeコマンドが実装されていなかったり、
letコマンドの動作がbash/zsh/kshとは違ったり、、と
ashはashで変なところがあって違和感ない?
愛から和ズレベルヒクイナw
梅
ashはNetBSDのもの。 確かに、バージョンによって変種多杉。
中国語でおk
>>981 FreeBSDはいろいろ手入れてるぞ、確か。
>>984 Debianのashもいろいろ手を入れてる。
同じashのつもりだとハマる。
pdkshとkshもいろいろ違う。
bashよりはまとも。
おまえらのashで、`< file` は使えますか?
POSIX的には `< file` が使えないといかんのか。
Bourne Shell的には `< file` なんて使えちゃダメ。
だったら、Bourne Shell的には ashで $(command) が使えるのもおかしいよね?
Bourne Shell的にはSolarisの/bin/shが一番マトモ。
ashはash。shはsh。
sh同士はそんなに違わない。ash同士は結構違う。
梅
ashって、Fedoraではすでに削除されてるじゃん。
桃
ashのautoconf化、./configure; make一発キボン。BSD makeイヤン。
桜
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。