1 :
名無しさん@お腹いっぱい。 :
2007/02/15(木) 14:28:44 シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(
>>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 でトレースしましょう。
前スレ
シェルスクリプト総合 その7
http://pc10.2ch.net/test/read.cgi/unix/1157601611/
□関連書籍と関連リンク:
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
8 :
名無しさん@お腹いっぱい。 :2007/02/15(木) 16:34:15
3秒間のウエイトっていれる方法ありますか?
sleep 3 じゃダメなんか?
sleep 3
12 :
8 :2007/02/15(木) 17:35:57
>>1 乙
> □最近のシェルスクリプト本(1)
なんかダブってるけど、これの(2)ってのはあるの?
>>14 !
ダブリは1のミス
(2)は(まだ)ない
________ ,r'´:.:.:.:.:.:.:.:`.、 ,r'/:.:.:.:.:.:.:.:.、ヽ;,:.ヽ l:.i:.:.i:Mヽヽl:.:i:ヽ;,;,;l !:l:i.:トl レレVレ!:.:!-、! ヽトl:f_! '´i_,トl:.:.!_,ノ シエルスクリプトって l.ヽ '__, l.:.:!/ なんですか? l:.:| `iー‐'´l:.;!`! /!;!´ヽ,! -l;!´`ヽ、 ,r'´! 人 ,r''ヽ !::;;l /:::;ヽ ,r';;;r':::ヽ l:;;/´:::::::::::::;ヽ,r';;/;;:::::::::ヽ .l;;i:::::::::::::::::::::::::;;;;;;ヽ;::::::::::ヽ
(||)
今度シェルスクリプトを覚えなければならなくなったのですが、 私のマシンにはシェルがインストールされていないようです (メニューにそれらしいものがない) シェルを追加インストールするには、どこをクイックすればいいですか? OSはKDE3.5です。
てかおもしろすぎる
22 :
名無しさん@お腹いっぱい。 :2007/02/15(木) 23:11:51
FTP に複数コマンドを渡す際に、複数行を「+」で囲んで FTP のコマンドを記述しています。この方法は他のシェルスクリプトからのコピーです。 一応意図した動作をしているのですが、仕様を知らずに使っているため不安です。 この方法の仕様が説明されているサイト等を教えて頂けませんか?man で sh と ftp を見ましたが、該当の記述はありませんでした。 よろしくお願いします。
>>18 シェルがないと起動プロセスがまともに進行しないので、
ないってことはあり得ない。
また、KDEはOSではなくて、デスクトップ環境の一種。
あなたが必要なのはKonsoleというKDEのアプリケーションと、
エディタ。
瓶詰めぬこカワユス。
25 :
名無しさん@お腹いっぱい。 :2007/02/16(金) 00:42:36
lsの結果を配列に入れるにはどうすればいいでしょうか?そもそもできますでしょうか?
headでアレかよ!
27 :
名無しさん@お腹いっぱい。 :2007/02/16(金) 02:00:22
>>22 ftp<<EOF
コマンド
EOF
じゃダメなの?
最後の三ページを忘れるなよ。 catの無駄遣いも可愛いからいいじゃないか。
>>25 sh$ set `ls`
sh$ echo "$1"
sh$ echo "$2"
:
bash$ hairetsu=(`ls`)
bash$ echo ${hairetsu[0]}
bash$ echo ${hairetsu[1]}
:
ここはネタスレと解釈してもいいですか?
たまにはぬこの蚤とりしようとおもた
たまにはK.I.S.Sの格好もしてみようと思った。
35 :
名無しさん@お腹いっぱい。 :2007/02/16(金) 20:24:12
大至急、BourneとBASHを覚えなければならなくなったのですが、 手っとり早いお勧めの方法は何ですか? はっきり言って、理論的なことはどうでもいいです。 最小限の努力で、最大限、見ためだけ高スキルに見えればいいです。 よろしくお願いします。
36 :
名無しさん@お腹いっぱい。 :2007/02/16(金) 20:24:38
ちょっと思ったのですが、シェルスクリプトでC言語の#ifdefマクロみたいなことって 出来ますか?
>>35 スクリプトは一日にして成らず、だ
だがあなたの要求だけを見ると高スキルのスクリプトを真似て作ればいいと思われ
問題は努力もしないで中身が理解できれば・・・だが
あのTシャツ欲しいと思った
>>35 英語でのコミニュケーション能力と、pythonとperlはいいのかい?
じゃあとりあえず突撃してみたら?
>>28 複数の grep が一つにまとまるのがいい感じだな。
著書なんかには if [ i = y ] then echo aaa fi とかあるのだが、実際やってもErrorがでて・・・ if [[ i = y ]] then echo aaa fi みたいに2重括弧にしないといけないのはなぜなんでしょうか?
ググったり本で調べたりしてどーしてもわからないことがあるので質問させてください。 ksh で 文字コードで grep するエレガントな方法が分かりません。 bash なら、 grep $'\011' hoge.txt で可能だということは分かっています。 ksh だと、 grep "`echo '\011\c'`" hoge.txt で同じことが可能だということは分かっていますが、bash ほど簡潔ではありません。 (いずれも Linux 上で確認) 昔、Solaris 8 上の ksh スクリプトで bash での記述例くらいに簡潔に書かれたコードを見た記憶があるのですが…。 分かる方がいらっしゃったらご教授ください。お願いします。 できれば ksh88 でお願いします。
>>48 [ はコマンドで、[[ は bash の構文の一つ。
/bin/sh で書くなら [[ は使えない。
あと、比較演算子の書き方やその解釈がちょっと違う。
[ 1 -gt 0 ] と [[ 1 > 0 ]] とか
[ "1+1" -ge 2 ] と [[ "1+1" >= 2 ]] とか
詳細は man bash ね。
>>48 if [ i = y ]
then
echo aaa
fi
↑でエラー出ないよ。
もしエラーが出たんなら、[ や ] や = の前後のスペースを忘れたとか、
そういう問題だと思う。([ ]か [[ ]]かの問題とは違う)
[[ ]] は Bourneでは使えないので、できる限り [ ] で書くのがお勧め。
すいません、 名前にスペースの入ったファイル名のリストを for とか foreach に渡すときは どうしたらいいでしょうか。 for f in `find なんたらこうたら`; do ほげ "$f"; done; みたいなことをしたいのですが find の結果のファイル名にスペースがある場合、スペースのとこで割られるようです。
>>52 IFS='
' for f in `find なんたらこうたら`; do ほげ "$f"; done;
IFSに改行コードを入れて、それを区切り文字にする。
>>52 find の部分をコマンド置換すると、ファイル名のデリミタとしての半角空白なのか、ファイル名中の半角空白なのがシェルから見ると区別がつきません。
上手く動かない原因はこれです。
よってコマンド置換で実現するのは諦めましょう。
- start --------------------
find . -type f |
while read f
do
echo $f
done
- end ----------------------
自分がパッと思いつくのはこれ。
ただ、read コマンドは遅いので、もっとエレガントを考える余地があるかもしれません。
ところで、sh に foreach ってありましたっけ?
#!/bin/sh IFS=\ for a in `find . -type f`;do echo "$a";done これでも、名前に改行が含まれるとダメなのでfind -execをおすすめする。
>>53 その方法、いいですね!
でも環境変数を触るのって、どうなのでしょう?
触るとしても、
- start --------------------
OLD_IFS=$IFS
IFS='
'
for f in `find . -type f`
do
echo $f
done
IFS=$OLD_IFS
- end ----------------------
を推奨すべきかと。
いろいろ条件が許せば、find -print0とxargs -0のコンビにお任せする。
>>55 >>57 ああ、本当だ。改行がファイル名に入るとアウトですな。
for や while だと完全ではないですね…。
>>56 なんでそんなことする必要があるんだ?
>>53 のスクリプト作って、実行した後の $IFS 見てみた方がいいよ。
続きがあるとは想像できないのだろうか?
>>60 続きがあっても関係ない。
↓これ試してみろ。
HOGE=hoge command
echo $HOGE
$ cat hoge IFS=' ' for f in `find -type f`; do echo "$f"; done; $ sh hoge sh hoge for: not found hoge: 2: Syntax error: ";" unexpected
$ cat hoge IFS=' ' for f in `find . -type f`; do echo "$f"; done; だった。
変数=値 command ( IFS='改行コード' for ... ) で実行した際 IFSの変更に対して安全かどうなかなんて元のお題には意味なくないか? 元のお題だとそもそもfindで引っかかる数(吐き出す文字数)が予測不能なんだし tabやspaceのことも含めて for はやめて find | xargs か while の方が安全なんだが あとファイル名に改行コードが含まれる場合は?とかこの板的には重要かもしれん けど、そこまで考えるとどうしたら処理できるか?より、そんなファイルが作られないように するにはどうしたらいいか?という問題になる気がする その上でそういうファイルをリネームや削除するスクリプトを組みたいっていうなら 環境や状況に合わせたものを組めばいい、動くことが重要で エレガントな一般的解法なんて考えても無駄だし必要もないはず
もとのお題に対してはどうでもいいが、if, for, while, caseといった フロー制御コマンドは変数=値 command形式では使えないという事実は、 このスレ的には重要。
66 :
52 :2007/02/18(日) 09:45:52
皆さん、どうもありがとうございました。なるほど、IFS とか while ですか。 自分の環境では改行がファイル名に入ることはとりあえずないんですが、 より厳密には find -print0 として IFS に NUL をセットすればいいんですかね? と思ったんですが... あれ、IFSにNULをセットって、どうやればいいんでしょう? たびたびすいません。
67 :
名無しさん@お腹いっぱい。 :2007/02/18(日) 11:30:58
grep -e 'foo (\w+?) bar' file とした場合、 perl などでは \1 で (\w+?) の内容を 参照できるのですが、 grep (sed, awk など) でそうする方法はありますか?
>>52 厳密にやりたかったら
1 find -print0を使ってNULLをレコードの区切りと認識できるコマンドで
処理する(shのwhileやforは使用できない)
2 find -execで1個づつ処理する。
3 perlで全部やる
>>67 sedにはある。awkは知らん。マニュアル嫁。
自分が知らんならマニュアル嫁とかほざくな。
言うこと無くなると何度も前と同じ事を
繰り返してほざく知恵遅れが小学校の時にいたんだが、
>>68 =70 でそいつを思い出した.
もしかするとそいつかもw
何度諭されてもしつこく絡んでくる
>>69 =>71 みたいなアフォもいたなぁ。
まあ、諭されてることすら理解できてないんだろうけど。
72 が必死すぎる件
おっと俺はこっちだ。 他人に煽られたからってお前がその煽り文句を真似して効果があるとは限らんぞ。
75 :
68 :2007/02/18(日) 15:50:25
クスクスクス
(・∀・)ニヤニヤ
>>67 どっちでもできる。
man に載っているよ。
79 :
64 :2007/02/19(月) 05:56:44
>>65 お、仰るとおりですな
>>52 普通?は find コマンドと IFS 変数は関係ないよ
いや余程特殊な環境があるなら分からんけど
IFS 変数は Bourne Shell 系 ( sh, ksh, bash など) で区切り文字の定義に使われる
で find コマンド自体はこの環境変数を参照しないから関係ない
find -print0 は出力する各ファイル名にヌル文字を付加する
で find -print0 が使える環境なら xargs -0 も使えるんじゃない?
>>57 さんが既に言ってるけどね
>>67 ,
>>78 sed, grep はあるけど awk はなかったような
>>80 環境によっては使えないかもね
manでもネットでも調べれば?
82 :
64 :2007/02/19(月) 07:03:11
>>52 あ、find -print0 と IFS を弄って while を組合わせたいって意味なら駄目だよ
>>68 さんの言ってる方法で
それより -print0 オプションが使えない環境もあるから
まずはそっちを調べた方がいいよ
>>79 findコマンド自体では IFSは当然関係ないが、
findの結果を ` ` で取り込んで forの引数にする際に
IFSが参照される。(IFSの影響を受ける)
なので、スペース入りファイル名の問題なら、
IFSの内容を改行コードのみにして for f in `find ...` を実行すればOK
なことは既に上に書かれている。
>>68 ちなみに NULL じゃなくて NUL ですね。
>>84 頭ではわかっているが、指が憶えてしまっているのでしょうがない。
>>79 man awk の文字列関数の項を参照してみな。
もしかしたら gawk だけかもしれないけど。
gawk 3.0 以上の拡張機能でございます。
大嘘つき
89 :
64 :2007/02/20(火) 17:58:58
いつから正規表現板に?あと自分の環境が全ての人しか居ないの? 素のAIXじゃ、grep '\(a\)\1' はできたが egrep, grep -E は無理みたい 拡張正規表現だと \1 は使えなさそうあとawkも gawk は知らんけどgawkは無い環境も多いからawkとgawkを一緒にするな awkと言えば昔ながらの素のawkのことだよ linuxでshを語るアホウ(そりゃashだ)と同じやね
90 :
64 :2007/02/20(火) 19:15:33
最後だけ削除 shについては、Cygwinもash、今時の素のAIX、HP-UXなら実はkshだったりするから Solaris、FreeBSDは知らんけど例としてはかなり不適切やね、無視してくれ
kshはねーよ。デフォルトでは使いにくい。 set -o emacs set -o vi どっち?
92 :
osuga :2007/02/20(火) 22:49:15
>>89 > 素のAIXじゃ、grep '\(a\)\1' はできた
参考までに grep のバージョン教えてくれ。
>>90 > Cygwinもash
それいつの話?
手元の環境だと ash は入れてあるけど、sh の実体は bash になってるよ?
$ uname -r
1.5.24(0.156/4/2)
$ /bin/sh --version
GNU bash, version 3.2.9(11)-release (i686-pc-cygwin)
Copyright (C) 2005 Free Software Foundation, Inc.
>>89 POSIX的には拡張正規表現(ERE))でbackrefernceが使えるということは
一言も書いていないので、grep -E でbackrefernceが使えるGNU grep
なんかが拡張しているということなんだろう。多分。
それにしてもネタないね
叩きはすぐ集まってくるけど
grep '\(a\)\1' は実際できるし(AIX5.3、SFU)、基本正規表現(BRE)にあるんで
linuxやHP-UXのgrepでも出来た記憶がある、まぁ昔の事なんで自信はない
拡張正規表現(ERE)にはBREの\( \)にあたるものが無いようで
>>95 はフォローしてくれたんだろうけど
実際にやってみたが egrep, grep -E じゃできなさそう(AIX5.3)と既に書いている
HP-UXのshについては昔、といっても11iなんだが
純粋なshでは使えないはずの [[ ]] や alias なんかが使えたんで調べたら
sh-posix とか書かれていて、sh->kshで拡張されたものがほぼ?まんま拡張されてた
なんでHP-UXのshはksh、って位の認識だったんだが
POSIX の sh いうんやから [[ ]] や alias が使えるのが今時の純粋な sh ということかもしれんね
sh-posix ってのがあるんですよ奥さん
>>98 だから、sh-posixの部分だけ書けばいい。
正規表現の部分はスレ違い。
本当にそういうものはあるのかな? solaris においては /bin/sh は sh-posixではなく /usr/xpg4/bin/sh が ごにょごにょ FreeBSD では /bin/sh は IEEE Std 1003.2 (``POSIX.2'') に対応する途上 NetBSD では /bin/sh は POSIX 1003.2 and 1003.2a に対応する途上 OpenBSDでは (ry HP-UX では
103 :
95 :2007/02/21(水) 12:40:01
>>96 すまん。寝る直前に書いたせいか
フォローのつもりがわけのわからんものになってた。
GNU のツールでそうだからといって、
それがUNIX全般でいえるかというと違うよね。
というのを補足したかった(awkとgawkとか)
>>102 以前は /usr/old/bin/sh に Bourne shell があったんだけど今はもうないの?
手元に実機がないので確認できない。
106 :
ksh :2007/02/21(水) 19:49:50
こんばんわ ペソです。 シェル初心者ですが教えてください。 「ディレクトリの中にあるファイルで、実行権限のないファイルを読み込み そのファイルに実行権限を付与するシェルが必要なのですがどうすればいいのかわかりません。 OS: AIX shell: ksh #!/bin/ksh for filename in ${1:+$1/}* ; do newfilname=$(print $filename |tr [A-Z] [a-z]) newfilename=$newfilename%.} print "$filename -> $newfilename" mv $filename $newfilename done とりあえず自宅のfedora core5 のkshで実行したら、 ' unexpectedtax error: ` と表示されて困ってます。 どうか教えてください。お願いします。
>>106 質問が支離滅裂。実行権限を付けたいといっているのに、
スクリプトではファイル名の大文字を小文字にリネームしようとしている。
あと、クォートが正しくないので、スペース入りファイル名とかでコケるだろう。
釣りじゃないならもう一度よくまとめてから質問し直せ。
108 :
ksh :2007/02/21(水) 20:43:07
すいませんでした。 リネームするスクリプトを少し変更して作ろうとしているのですが、 このファイルもこけて動かないんです。
>>106 そんなの、
#!/bin/sh
chmod +x "$1"/*
だけでいいじゃん。kshである必要もなし。
とりあえず 1. シェルスクリプトのことをシェルというな。 2. forの次の行からdoneの前の行までは全部リネーム用でいらないから削れ。 3. man test 4. man chmod
>>109 「実行権限のないもののみを選び出す」というのが宿題の一部であると
思われるので、問答無用で+xしちゃいけないかもしれない。
「実行権限のないもののみを選び出す」意味がない。 もともと +x なファイルを chmod +x しても影響はない。 AIXで実行しようとしてるし、だとすると 宿題じゃなく、実務で必要なんだろ。 chmod +x で十分。 (ctimeは更新されるけど、そんなの普通関係ない)
>>110 えっと、こういうことでしょうか?
#!/bin/ksh
for filename in ${1:+$1/}* ; do
man test
man chmod
done
やってみましたが、なんか、ファイルの数だけマニュアルのようなものが表示され、
実行権限は付きませんでしたが、、
なんだ釣りか。
115 :
ksh :2007/02/21(水) 22:08:50
kshです。 #!/bin/ksh for filename in ${1:+$1/}* ; do if [[ -f $filename ]] ; then chmod +x $filename fi done なんとかディレクトリの中のファイルすべてに実行権限を付与できました。 これはシェルスクリプトと言うのでしょうか? お恥ずかしながらシェルスクリプトとはなにか?イメージが完全でなく・・・
>>115 > kshです。
ペソじゃなかったのかw
117 :
ksh :2007/02/21(水) 22:53:27
あっペソです!! ルールよくわかってなくてすみませんっw
>>102 単に興味本位で聞くけどsh-posixとkshを比較して
実際に機能として違う部分てどんなところがあるの?
すごく久しぶりに man tcsh してみたのだが。 あれ、"THE T IN TCSH" なんて項目、昔あったっけ? turbo csh じゃないじゃん > 昔俺にそう教えた奴
Tenex CSHの略だと思っていたが、Tenex & Tops-20だったんだな。
TOPS-20 ねぇ。command line editing が欲しくてcshからtcshに移ったが、 それまでは、fep 使ってました。bash は、なじめんな。 今は、zsh 派です。
>>118 102とは別人だけど、kshはksh88とksh93で非常に違う。
とくに後者はperlに遜色ないほどの汎用言語になっている。
kshはbashと同じくshベースということで、
bashがkshから採り入れた機能もけっこうある。ローカル変数とか
kshといえばwkshで一度でいいから遊んでみたかった。 もうwのないkshしかないからなぁ・・・
125 :
名無しさん@お腹いっぱい。 :2007/02/27(火) 22:45:55
viで編集中は日本語のメッセージが正しく表示されていたのですが、シェルスクリプトを実行するとメッセージが文字化けします。どうすればよいですか。
viが自動認識して処理してる? nkf -e < script nkf -j < script nkf -s < script nkf -w < script で化けないパターンを探してそれに置き換える。
127 :
名無しさん@お腹いっぱい。 :2007/02/27(火) 22:51:13
>>125 その vi の実体は、賢い vi で、
シェルの ENV がついていけてないとか。
Cシェル、Oracle10gで exp 〜 query\"where column_name in\( select col from tableB \) \" みたくqueryパラメータで副照会できないようなんで exp 〜 query\"where column_name in\( $COLUMN_NAMES \) \" なんて具合に変数を埋め込みたい。 シェル変数が展開されてからexportに渡されるようにする方法ないかな?
おお、そんなものが。 nkf -wができることに最近気づいたくらいアップデートしてなかったんで。
131 :
名無しさん@お腹いっぱい。 :2007/02/28(水) 09:20:31
浜田マキ子って人のジャーナル見てみなよ。 中国の恐さにぞっとすること請け合い。 あいつら本気で日本を侵略する気だ。 そして、手下はやはり立命館?
132 :
118 :2007/03/01(木) 04:39:27
>>122 すんません書き漏れです
知りたいのはsh-posixとksh88の機能差です
kshにksh88とksh93があってかなり違うってのは知ってるというか
kshの情報には大抵2つのバージョンの比較が併記されてるもんだし
ただsh-posixとksh88の比較は見たことがないし違いも見つけられなかったもんで
>>132 ・ パターンマッチングがegrep相当に拡張
・ [[ ほげ ]] (中身をメタキャラ解釈しないtestのようなもの)
・ 配列が使えた
・ emacs風コマンドライン編集
ってとこか。なおksh93はksh88と挙動が違ったりバグが直されたりしてるし、
ksh88とpdkshでも機能に違いがあるので、
ksh88で動けば他のkshで動作するとは限らない
ksh に限らないが、バージョン依存の対応は本当に面倒だな。
135 :
名無しさん@お腹いっぱい。 :2007/03/02(金) 00:10:52
こういうデータを、 ---- yes ・・・・ ・・・ ・・・・・ IPアドレス xxx.xxx.xx.54 ---- no ・・・・ ・・・・・ IPアドレス xxx.xxx.xx.123 ---- yes ・・・・・・・・・ ・・・・・ IPアドレス xxx.xxx.xx.23 こういうふうに加工したいのですが、 yes,xxx.xxx.xx.54 no,xxx.xxx.xx.123 yes,xxx.xxx.xx.23 ・・・・・・・・・ ・・・・・ の部分は2行のときもあるし10行のときもあります。
136 :
135 :2007/03/02(金) 00:14:33
最初の ---- と IPアドレス という文字をうまく関連付ければ 加工可能とは思うのですが、 具体的にどうしたらいいのかよくわかりません。 最初の ---- を見つけたら その次の「IPアドレス」という文字列を捕まえて xxx.xxx.xx.123を確保する、 という形でしょうか。 うまい方法があればヒントをいただけますか? cat、more、grep、cut、sedなど一般的なコマンドは習得しています。
1行1レコードじゃないときは めんどくさいから perl 使っちゃうな。
csplit input '/^----$/' '{*}' for file in xx*; do echo `sed -n '2p;${s/.* //;p}' $file`; done csplitってPOSIX標準だっけ?
俺もperlかawkに1票。適材適所ってやつ。
awkで RSに---を入れてやればいいじゃない
ここはあえてCで
>>135 俺も awk に一票だが、
最初と最後をどうにかすれば grep と sed だけでもできそう。
grep -C 1 -x -e ---- | sed ....
こんな感じで。
143 | sed -n ' N; N; N; s/¥(yes¥|no¥)¥n/¥1 /; s/----¥n//; s/--¥n//; s/IPアドレス //; p' 改行ってどこのsedでも¥nと書けるのだっけ?
あー、最後の部分がきちんと処理できないな。
sed -n ' /¥(yes¥|no¥)/h; /IPアドレス /{ H; x; s/¥(yes¥|no¥)¥n/¥1/; s/IPアドレス /,/; p }' input どだっ!?
147 :
135 :2007/03/02(金) 13:43:23
みなさんありがとうございます。
僕はまだレベルが低いですし
awkは(難しくて)使えないので
>>143 さんの
grep -C
オプションでやってみよと思います。
148 :
名無しさん@お腹いっぱい。 :2007/03/02(金) 15:27:32
変数1で指定したディレクトリに変数2のファイル名でlsの結果をリダイレクトするにはどうすればいいですか。
>>148 ちょっと、質問が複数の意味に取れるけど、
ls > "$1"/"$2"
ってことか?
150 :
148 :2007/03/02(金) 16:42:33
>>149 できたっす。バックスラッシュいれてたっす。
151 :
名無しさん@お腹いっぱい。 :2007/03/02(金) 17:25:16
変数1で指定したディレクトリに変数2のファイル名でlsの結果をリダイレクトするときに、すでにファイルが存在する場合、上書き確認のメッセージを出して処理を分岐させるにはどうすればいいですか。
test -f ファイル [ -f ファイル ]
その調子で、1から10まで全部ここで聞くのか?
シェルスクリプトの犬小屋でも作るか?
いらね。
>>152 便乗質問ですが、よく、ファイルがあるかどうかを判断するのに、
test -fを使えと言われるのですが、実行しても何も起こりません。
何か設定が必要なのでしょうか?
test -f hoge && echo found
「ファイルがあるかどうか」なら、test -fじゃなく、test -e使え。 test -fだとレギュラーファイル以外はないものと判定されるぞ。 (デバイスファイルとか、broken symlinkとか、socketとか)
>>158 だめーっ。Bourneではtest -eは使えなーい。test -fが定石。
if exist %1
>>156 何かが起こるように書けばいい。
test を実行しただけで何も起こらないのは当たり前。
Bourne Shellのif文で、ifの次に来るのはコマンド(列) test...も [ ... ] もコマンドを実行してる。 実行した結果のステータスコードで分岐するだけ。
>>159 >>162 の通り、testはシェルの内部コマンドではない。Bourneかどうかは関係ない。
まあそれはそれとして、autoconf infoの"Limitations of Builtins"から抜粋。
POSIXも信用せずにportableにしたいならどおぞ。
... use `test -f' or `test -r'. Do not use `test -x', because 4.3BSD
does not have it. Do not use `test -e' either, because Solaris 2.5
does not have it. To test for symbolic links on systems that have
them, use `test -h' rather than `test -L'; either form conforms to
POSIX 1003.1-2001, but older shells like Solaris 8 `/bin/sh' support
only `-h'.
うちのシェルでは内部コマンドなのだが。
165 :
162 :2007/03/03(土) 01:05:35
>>164 そういえばそうか。シェルの実装はtestを内部コマンドとして定義しても
いいんだっけか。すまん間違えた。
testは外部コマンドだから条件分岐は出来るだけcaseを使おうって話を どっかで聞いたことがあるけど、 UNIX黎明期を除けばどのシステムでもシェル組み込みコマンドとして実装されている。 ループで最頻出のコマンドが外部呼び出しじゃ実用的な速度が出ないだろうしね。
>>166 KernighanとPikeのUnix Programming Environmentにそういう記述があった希ガス。
UNIX第7版とかの時代の話だが。
162は俺なのだが……、俺は「外部コマンド」とは書いてないぞ。
>>168 すまん番号間違えた。
漏れは163と165だた
>>166 適当なループ回して試してみろ。
testが内部コマンドである現在のシェルでも、
case使った方が、if [ ... ] よりも若干速いよ。
おそらく、内部コマンドとはいえ、独立したコマンドとして
内部的に実行するオーバーヘッドがtestにはかかるんだろう。
caseの場合はシェル本体が直接解釈するから
オーバーヘッドはtestよりも少ないと。
>>171 釣りじゃないだろ。実験してみろ。time sh -c '...' とかで計れる。
確かに caseの方がちょっと早い。
>>171 おかしなところがあるなら具体的に指摘してみればいいじゃない
だね。あと、zshだと何故か違いが顕著になる。 $ time zsh -c 'for i in `seq 1 10000`; do [ a = a ] && :; done' real 0m3.051s user 0m2.705s sys 0m0.207s $ time zsh -c 'for i in `seq 1 10000`; do case a in a);;esac; done' real 0m0.915s user 0m0.703s sys 0m0.204s ↓おまけ。[ ]の代わりに [[ ]] にすると、内部コマンドじゃなく、 直接のシェル文法になるので、早くなる。 $ time zsh -c 'for i in `seq 1 10000`; do [[ a = a ]] && :; done' real 0m1.708s user 0m1.201s sys 0m0.402s
>>173 おかしなところは推測の部分。単に実装の違いだけでしょ。
ksh(93)
case 0.65 real 0.46 user 0.17 sys
test 0.58 real 0.46 user 0.10 sys
pdksh
case 23.23 real 22.45 user 0.20 sys
test 4.96 real 4.74 user 0.14 sys
bash2
case 3.52 real 3.21 user 0.24 sys
test 4.26 real 3.93 user 0.25 sys
ash
case 0.38 real 0.28 user 0.09 sys
test 0.52 real 0.45 user 0.05 sys
>>175 その実装の違いを推測してるのではないか? なので、おかしくない。
ちなみに俺の環境では、kshでもtestよりcaseの方が速かったよ。
つまり、testよりcase使え、って言うテクは今でも生きてるってわけか。
bash3 [[ real 0m1.758s user 0m1.562s sys 0m0.160s bash3 case real 0m1.515s user 0m1.341s sys 0m0.150s 確かに少しだけど、case の方が速いね
>>178 いや、[[じゃなくて [ と caseを比較するという話だが。
速い順に、
case > [[ > [
となると思う。
>>179 あ、そうだったっけか。
bash3 [
real 0m2.388s
user 0m2.042s
sys 0m0.370s
181 :
名無しさん@お腹いっぱい。 :2007/03/04(日) 21:32:58
Bashにおいて以下の条件で動くシェルスクリプトを書く場合、どのように書けばよいのでしょうか? ディレクトリ名とその中にあるファイルサイズが0のファイル名を出力する。 補足1:ディレクトリが特定されていない場合は、現在シェルが働いているディレクトリ名を出力する。 補足2:もし引数がディレクトリ名でない場合は、すべてのコマンドラインの引数にエラーメッセージを出力する。 補足3:ファイル名の一番最初の文字が、「.」の場合は無視するようにする。
>>181 問題に曖昧なところがあるけど、こういうことか?
bashじゃなくてもB-sh共通で動く。
dir=${1-.}
if [ ! -d "$dir" ]; then
echo "$dir is not a directory" 1>&2
exit 1
fi
for f in "$dir"/*
do
if [ ! -s "$f" ]; then
echo "$f"
fi
done
「すべてのコマンドライン」の意味がちょっと判らないけど、 大体こんな感じじゃない? usage() { echo "Usage: ..." 1>&2 exit 1 } test -d $1 && find $1 -not -name '\.*' -size 0 -print || usage() ただし補足1はGNU findの機能を使ってるので、どのfindでもということなら $1が空だった場合の扱いを自分でする必要がある。あと、「.」で始まる フォルダは処理したいのなら、find の条件をもうちょっと詰める必要がある。
宿題にマジレスはご遠慮ください。本人のためになりません。
185 :
名無しさん@お腹いっぱい。 :2007/03/04(日) 22:01:31
186 :
181 :2007/03/04(日) 22:21:53
>>183 分かりやすい解説付でありがとうございます。
この場合、
test -d $1(ディレクトリ名を引数1に格納)
&& find $1 -not -name '\.*' -size 0(ファイル名の頭文字が「.」、サイズが0の物をはじく)
-print || usage() (結果をusage()に返し、出力)
usage() で、正常ならば結果を出力。エラーならば1>&2が働きエラーを表示。そしてexitで終了。
といった感じでしょうか?
188 :
181 :2007/03/04(日) 23:16:28
>>187 Unix and Shell Programmingという洋書です。
しまた、181 <-> 184 ね
>>135 sed -n '/^[yn][eo]/p;s/^IPアドレス.//p' data.txt | fmt -w 18 | tr ' ' ,
193 :
192 :2007/03/05(月) 15:55:14
ああ先頭が ne とか yo で始まる行があるとだめなので、 yes/no 個別に書くべきですね。 それとスペースを数えると正しくは fmt -w 19 だ ww
194 :
192 :2007/03/05(月) 16:14:27
ああ、やっぱ駄目だ。 スレ汚し済まない。
>>135 perl -ne 'BEGIN { $/ = "----\n" } /(yes|no).*(\d+(?:\.\d+){3})/s && print "$1,$2\n"'
>>135 sed -f 135.sed
$ cat 135.sed
/^----/{N
s/^----\n//
x
d
b
}
/^IPアドレス /{
s/IPアドレス /,/
x
G
s/\n//
b
}
d
一連のアクションが3回実施され(割り込み重複なし) 一行ずつ一つのログファイルに延々と結果が記載されます。 100 ABC 101 200 DEF 201 …こんな感じで3行ずつが一連のアクションです。 これを以下のように整形したいのですが、妙案は有りますでしょうか? 100,ABC,101 200,DEF,201 ご教示いただければ幸いです。
>>197 sed 'N;N;s/¥n/,/g'
む、あたまに余計な空行が付くな。
ああ、勘違いだった。198でいいわ。
>>199 やっぱりsedを使うのかな?と思い本を見ていたところでした。
なるほどNで行数分読み込んで、改行\nを,に置き換える…。
見れば直ぐに解りますが、これを0から考えるのは大変でした。
今度は誰かに教えれるよう、頑張ります。
素早いご解答ありがとうございました!
どうしても分からないので教えてください。 利用者が指定した文字列の書いてあるファイルを読み込んで、 配列に文字列を一つずつ格納し、その文字列を順番に出力させたいのですが、 どのようにすれば良いのでしょうか?
>>201 どのシェルよ?
少なくともピュアBourneシェルには配列はない。
>>201 tr ' ' '¥012' < ユーザーが指定したファイル | sort
という意味?
指定したファイルの中はどんな構造なの?
1行に1語なのか、フリーテキストか。
>>204 指定したファイルは、おっしゃる通り、1行1語のテキストファイルです。
Sapporo
Tokyo
Osaka
Nagoya
Fukuoka
といった感じです。
単純に中身を表示するだけなら、
echo -n "ファイル名を入力してください:"
read x
cat $x
でよいと思われるのですが、一度配列に全文字列を格納してやるので困っています…。
言ってる意味が分からん。 sort そのファイル とするのとは違うの?
>>206 sort ファイル とは違い、この場合だと、
array[0]=Sapporo
array[1]=Tokyo
array[2]=Osaka
array[3]=Nagoya
array[4]=Fukuoka
i=0
while [$1 -le 5]
do
echo ${array[$i]}
let i=$i+1
done
読み込んだテキストファイルをこのような感じで出力させたいです。
宿題は自分でやりましょう。
>>201 シェルスクリプトじゃなきゃいかんの?
perlかなんか使った方が楽じゃない?
とりあえず、「順番に」が読んだ順にという意味であって 「整列させて」という意味ではないことは理解した。
while read word; do words=($words $word) done < 指定したファイル してあとは一緒。
>>209 perlじゃ駄目なんです。
>>211 echo -n "ファイル名を入力してください:"
while read word; do
words=($words $word)
done < $word
という事でしょうか?
違う。
>>213 すいません・・・
どうやれば良いのでしょうか?
<の後ろに書くのは、
>>207 のx
echo -n "ファイル名を入力してください:"
read source
while ....
done < $source
あとは出力のためのループ
>>215 echo -n "ファイル名を入力してください:"
read source
while read word; do
words=($words $word)
done < $source
cat $source | while read
do
echo $words
let source=$source+1
done
でやってみましたが、テキストの最初の文字列しか表示されません。
後半の出力ループがいけないのでしょうか?
ああ、ごめん、bashじゃなくzshでやってたわ。
bashで配列にpushする方法がわからん。 代わりに一パラメータで逃げてみた。 while read word; do set -- $* $word done < $source for word in $*; do echo $word done
訂正 ×一パラメータ ○位置パラメータ あんど、こう書くらしい。 while read word; do size=${#words[@]} words[$size]=$word done < $source for word in ${words[@]}; do echo $word done
>>219 動作確認出来ました。本当にありがとうございました。
>>220 誘導ありがとうございます。
スレ違いで申し訳ありませんでした。
222 :
名無しさん@お腹いっぱい。 :2007/03/08(木) 15:53:31
shです 教えてください #!/bin/sh COUNTER=0 while [ $COUNTER -lt 100 ]; do mv "$COUNTER".jpg /home/more/ let COUNTER=COUNTER+1 done こんな感じのとき最初の10までが1桁になってしまうのですが 01 02 03,,,, 行頭に0を付けた2桁で処理するのはどうすれば良いのでしょうか? 00-09と10-99でループをわけるしか無いのでしょうか?
最近の環境ならprintf外部コマンドがあるんじゃない? mv `printf %02d $COUNTER`.jpg /home/more なければ mv `echo "0$COUNTER" | sed 's/0*¥(..¥)$/¥1/'`.jpg /home/more とか、 mv `echo "0$COUNTER" | rev | cut -b1,2 | rev` /home/more とか。
>>222 for COUNTER in `seq -w 0 99`; do : ...; done
↑でループすれば桶。
あと、letコマンドは純粋な shには無いぞ。
ただ、
>>222 がやっていることをやるだけなら、
そもそもループすら不要で、
mv [0-9][0-9].jpg /home/more
だけで一発。シェルは不要。
seqもあったりなかったり
>>223 ありがとうございました。
最終行でうまくいきました。
上の2個も含め手法を理解するように勉強してみます
(たとえば) [0-9][0-9] を展開しているのはシェルですぅ
ので不要じゃないわよ
>>225
>>228 お約束どおり釣れましたよ。おめでとう。
>>224-226 ありがとう。
実際にはdateから自動生成された莫大な
画像データを部分的に抽出しながら動画生成を
行うので
例に出したのより多少複雑に書き直します
seqも実験してみます
touch [0-9][0-9].txt [root@localhost /tmp]$ ls [0-9][0-9].txt となります。 00.txtから99.txtを作りたいのですが…
BSDだとseqの代わりにjotだったかな。
zsh があるなら zsh -c 'touch {00..99}.txt' とか
231は空のディレクトリで touch *.txt やったときに どういう結果になってほしいんだろう。
zsh -c 'touch {00..99}.txt' は、書かれてしまったから touch `seq -s ".txt " -w 99"`.txt
シェルってゆうな。クズ。
>>234 00.txtから連番で99.txtまでのファイルが欲しいんでしょ
>>236 いつものお約束も釣れましたよ。おめでとう。
シェルっていうな
>>223 のprintf以外の方法だとちょっと無駄。
exprを使うのが定石。
expr 0$COUNTER : '.*\(..\)'
seqもない場合があるけどね
>>235 の seq、間違ってるよ。最後の .txtが余分なのと、"が1個余分。
>>235 よりも、
seq -f %02g.txt 0 99
の方がエレガント。
>>243 -sは間に挟む文字列だから最後の.txtがないと、
00.txt ... 98.txt 99 で終わってしまうぞ。
でも正解は
>>244 。
>>244 確かにこっちなら完璧に出来ますね。
ところで %02g と言うのは何なんでしょうか?
>>246 man seq
つーか
man 3 printf
248 :
201 :2007/03/08(木) 18:43:31
>>219 最後にもうひとつだけ質問させてください。
出力をする時に配列の反対(リバースオーダー)から出力をするのはどうやれば良いのでしょうか?
例えば、
Tokyo
Osaka
Nagoya
とあったら
Nagoya
Osaka
Tokyo
と出力されます。
for ... done | tac のようにパイプすればいいのではないでしょうか。 tacがない環境では、 for ... done | sed '1!G;h;$!d'
251 :
201 :2007/03/08(木) 19:14:20
ありがとうございました。 これでなんとか単位が取れます
はぁ? 単位?? 宿題禁止なわけだが、、答えて損した、、
上で指摘されてるのに気付けよ
ファイルを1行ずつ読み込んで配列に入れたいとおもってまつ。 ↓みたいに書いてみたのですがエラーでちゃいます。なぜ?? #!/bin/csh set ALLCOUNT = 5 @ CT = 1 @ NO = 3 @ CN = "" while ( $NO <= $ALLCOUNT ) set CN[$CT] = `sed -n "$NO p " job.txt @ CT ++ @ NO ++ end
シェルスクリプトでは、sh だろうと csh だろうと、 配列を使おうと思った時点で負け。別の方法を探すべし。
>255 ダメっぽ? >256 いや趣味
cshの時点で負け。 それが宿題だとすると、そんな教官がいるような学校に 進学した時点で負け。
思考停止論か
宿題で「cshで書け」と指定されている場合以外に、 cshで書かなければいけない合理的な理由は存在しない。 趣味なら自分で研究すること。
シェルスクリプトならファイルが配列ってことで
インデックスによるアクセスが必要ならポジションパラメータ使うだろ。普通。
配列も、位置パラメータも 所詮人間がデータ構造を解釈しているだけの話。
264 :
名無しさん@お腹いっぱい。 :2007/03/10(土) 21:31:59
201が宿題やったせいで254も宿題思われてるのかw というより口だけで実は分からないだけですかおまいら。
>>264 宿題かどうかが問題なんじゃなくて、cshのスクリプトは論外ということ。
誰も答えるはずがない。
自演乙
/ / ,. -'"´ `丶、、 ヽ __l // / | \ \\ ゙、 / ̄ ̄ ̄ ̄ ̄ ̄ / :::|| / / / l l ヽ ヽヽド、 / l::::::::::|| / / / ! l ヽ ヽ ヽヽ ||:::::ヽ | l 十`` 十_ヽ 斤.::::::::||/ / //! ハ l ! ヽ ', ゙ヽ||::::::::勺 | レ d、 (_| _) |ll|i :::::::|| l l イ l /!l | ヽ ト、|、 ト、 l l、||::::::::}ll| | ┼‐、ヽ ┴┴ |ll|ヽ:::::|l !l |l!‐!‐ト、l ヽ | l | ヽ | l i l l||:::::::/!l| | ノ 月 l | |lll| `ー! l | l 」-=ミ|`ヽ ヽ | !-‐!‐|-l、|} l |r、〃|ll| | 二二`` l__ヽ L!l | l | 〃{ノ::::iヾ ヽ! ,. =-ミ、!ハ l !"´ |ll| | ノ _) {l |!l | ヽ `ー" ' トイ:::}ヾ | l | |ll」 | ─ァ ヽ |l !| `二ノ '| || | /\ l |', | /)|l l | ┼‐、ヽ l | ゙、 ` ´ /-イ| l | ノ !| \ ヽニヽ , ′/゙! l ∠ '⌒) | |ヽ、 ー / 〃 | ! | 「 ,.rr| 丶、 ,.. '´ト、 l′ ヽ ゚ l::l {:| ` ´ |::}} \______ _. -‐1::ヽ' -、 _,.. -‐ン::|ヽ、 _.. -‐ "´ |:::::::::`ゝヽ /rJ::'"´:::::::! ` 丶、
だいたい木曜辺りに宿題が出るのか?
宿題は2chでやってもらうのが当たり前です。
逆に、宿題を出す立場の人間です。 毎回、問題を出すのにネタが尽き気味で大変です。 宿題が出た人、どんどんその問題を書き込んでください。 一部変えて出題に使わせていただきます。
2ちゃんを使わせない方法
>>270 分かった。
うちで使うスクリプトを問題として出してやる。
sedの解が出てるんだからそれを呼べばよいのでは。 何も無理してshだけで文字列操作するこたーないと思うけど。 #!/bin/sh f () { local l; read -r l && { f; echo "$l"; }; } f
>>275 readの -r オプションはbash依存。localコマンドは Bourneで使えない。
あと、再帰呼出しは重い。非再帰版の方がエレガント。
出題ネタにしたいので、回答は省略。
#! /bin/sh txt= IFS=' ' while read line do txt="${line} ${txt}" done echo -n "$txt"
>>276 CodeGolfが出ちゃったからbashism上等の答えになったんだと思う。
localはどうか忘れたがread -rはPOSIXにもあったんじゃないか?
そーすpls
283 :
名無しさん@お腹いっぱい。 :2007/03/13(火) 20:53:58
awkについて質問します。 single quotation mark("'")をエスケープしたいのですが、 次のコードは×となります。 どなたか、どうやって、"'"をエスケープするのか 教えていただけますか? たとえば、 awk '{printf "\'%s\'", $2}' file として、 $2フィールドの値を 'AX' 'PY' 'CU' のように''で囲みたいのです。
シェルレベルで '...' と ¥' からなる並びに見えるようにする。 '{printf "' ¥' '%s' ¥' '¥n", $2}' 見やすいように改行入れてみたが実際にはくっつけて記述。
285 :
名無しさん@お腹いっぱい。 :2007/03/13(火) 21:15:45
>>284 できました!
ありがとう。
なんでできるのか、もう少し詳しく
教えていただけないでしょうか?
awk に渡したい文字列を分解するだけだよ。 シェルの解釈する文字をエスケープしながらね。 だから、 '{printf "'"'%s'"'\n", $1}' などでもいい。
$1じゃなくて$2だったか
288 :
名無しさん@お腹いっぱい。 :2007/03/13(火) 22:15:15
wgetの実行結果をファイルに書き込みしたいんですけど wget アドレス >>ファイル名 で実行して失敗しました。 どうしたらいいかわかりますか?
わかりますよ。
wget --help
291 :
名無しさん@お腹いっぱい。 :2007/03/14(水) 17:16:17
テキストファイルのある行が2chのdat形式かどうかを 正しく判別するにはどうすればいいでしょうか? grep -E ".*<>.*<>[0-9]+/[0-9]+/[0-9].* [0-9:.]+ ID:[a-zA-Z0-9+-/]+<>.*<>.*" こんな感じでひっかけようと思ったのですが、 何かの間違いでメール欄やレス欄に <> が まぎれこんでしまってる場合でもマッチしてしまいます。 やりたいことは、このようなゴミのまじった行を削除することなのですが どうするのがよいでしょうか?
292 :
名無しさん@お腹いっぱい。 :2007/03/14(水) 18:47:38
あ、しまった。
> ゴミのまじった行を削除する 全部捨てたらいいんじゃないか。
無理にシェルで書かんでもいいんでは。
296 :
名無しさん@お腹いっぱい。 :2007/03/15(木) 03:28:47
ペーパーテストで一発完動のスクリプトかける奴なら即戦力だな。
ShellScriptの中でscpとsshを使用しようと思っているのですが 普通に構文を書くとパスワード入力等を求められると思うのですが 手動入力でなく、完全自動化にできないでしょうか? Shellは「sh」です。 OSはRedhatです
ssh-agent を使用するしか方法はないですか? 他のプログラムとかの絡みで使用できるか・・・・
リモートの.ssh/authorized_keyにローカルの公開鍵を書いとく
>>300 ssh-agentを知ってるなら質問するなよ!
自分の鍵を暗号化しないでおくというのはどうだろう
パスフレーズを空にする。 ただし、秘密鍵を盗まれないように。
ssh-keychain は?
307 :
306 :2007/03/16(金) 10:30:13
308 :
名無しさん@お腹いっぱい。 :2007/03/16(金) 22:01:18
困ったときは〜expect
expectって標準ではいってたっけ?
なんの標準だかわからんけど 入ってないなら入れればいいじゃん。
仕事の場合、そうホイホイと入れるわけにはいかないんだな
じゃあしかたないな
必要ないものはホイホイ入れられないだろうが 必要あるなら入れなきゃいかんだろ。
あたらしい言語処理系が入るというと嫌がられそうだから、 perlの小さなライブラリを追加といってExpect.pmでよくない? かなりプログラム臭くなるのでexpectに比べてはいけないが、次善の策ではあるはず。
なんでexpect入れる話になってんだ
telnetならexpect使うのがいいだろうけど、sshとscpならパスなしのkeyを使うのが無難だと思うけどな。 パスなしでログインできるのが怖いなら、authorized_keysにcommandを書いて、できることを限定しておくといいよ。 スレ違いだったらすまん。
sedで、最後の行から逆順に文字列検索していって、1件目を出力して終わらせることできるかな?
cat hoge.txt | grep ほげ | tail -1
>>320 awkでやれ
awk '{line[NR]=$0}END{for(i=NR;i>0;i--){if(line[i]=="検索パターン") print line[i];}}' input.txt
tac filename | sed -n '/hoge/{p;q;}'
二つのテキストファイルA.txtとB.txtがあります。 行数は同じでそれぞれの行が関係のある物になっています。 現在、その二つの行をそれぞれスペースで区切って接続を行いたく考えています。 A.txt 山田 山下 B.txt 太郎 二郎 AB.txt 山田 太郎 山下 二郎 A.txtとB.txtからAB.txtを作成する妙案などございましたらご教示いただけませんでしょうか? よろしくお願い致します。
>>324 paste A.txt B.txt > AB.txt
>>325 PASTE(1)
名前
paste - ファイルを行単位でマージする
大変失礼いたしました…orz
シェルスクリプトとかそう言うレベルで無かったことをお許し下さい…。
b.txt の内容で 幸子の場合、a.txtが山田となっていたら 里中に変更する。という条件付きくらいにしとけば スクリプトでしなきゃいかんけどな。
328 :
名無しさん@お腹いっぱい。 :2007/03/30(金) 15:20:07
~/.forwardに記述して、メールを標準入力から読み込んで そのenvelope Fromを、実データのFromに置換して/usr/bin/vacation に渡すスクリプトを書きたいのですが・・・ sed -n 's/^From: [^<]*<\([^>]*\).*/\1/p'の内容を覚えさせておいて、 もう一度先頭から読み込んで置換すればよいと思いますが、 その方法がわからないのです。 微妙な内容なのでググるためのキーワードもいまいちで、ヒットしません。 別にsedでなくてpealやawkでもよいのですが、何かいい方法はありますでしょうか?
>>328 そのまま
・覚えさせる->ファイルに書く
・もう一度先頭から読み込んで置換する->そうする
でいいんじゃないの?
URLが一行ずつずらーと並んでいるのですが 頭とケツにそれぞれ「”」を付けたいです。 何か良い方法は有りませんでしょうか?
sed 's/^/”/' | sed 's/$/”/'
>>331 パイプが無駄。一発でできる。
sed 's/\(.*\)/"\1"/'
pealのようなもの
334 :
328 :2007/03/30(金) 16:31:53
>>329 難しく考えずに、そうすることにします。
336 :
328 :2007/03/30(金) 17:10:27
>>334 と思ったら、メール出力から起動されるプログラムは
きわめて弱い実行権限(nobody)しかないので、/tmpにさえ
ファイルを作れません。(人間がテストしたときは巧くいきましたが・・)
権限を強めればセキュリティーリスクが増大するし、
やはり、スクリプトの中で記録と標準入力の再読み込みが必要な模様です。
まあ記録は置換文字列に変数を使えることが判ったので何とかなりそうですが、
「初めからもう一度実行」が途方に暮れてしまいますね。
何かよい方法ありますでしょうか?
・nobody でも /tmp に書ける。 ・そもそも sendmail でも postfix でも .forward のファイル所有者と 同じ権限でプログラムが起動する。nobody にはならない。
338 :
328 :2007/03/30(金) 18:36:24
>>337 なるほど
では、ほかの原因を考察して見ます。
ありがとうございます。
>>335 sed 's/.*/"&"/'
でもいいな。
>>335 正規表現は使わない方が速いかな。
awkで、
awk '{print "\""$0"\""}'
awkのsystem関数に与えるコマンド文字列の中で「"」や「'」って使える? 「\」を前に置いても駄目でした…
>>341 system が起動しているシェルに食われたんじゃね?
>>342 例えばこんな感じ。実際はこんなシンプルじゃないけど。
awk '{system("grep \"^$\" $1")}' input.file
systemが食われたのか、systemの引数の中では引用符が使えないのか、切り分けができません。
>>344 あそっか、$1は""の外でした。。
awk '{system("grep \"^$\" "$1)}' input.file
本物は業務で使う予定だからコピペできないんだよね。
346 :
名無しさん@お腹いっぱい。 :2007/04/07(土) 02:11:04
find /日本/関東/女/ mtime +7300でリダイレクトしたら彼女が出来た
>>345 ちゃんと伝わっていなかったようで。
awkの中にシェルの変数の$1入れてもawkがもっていっちゃうからダメなんだって。
>>347 そうか?普通に↓とか使えてるぞ?
awk '{sum[substr($0,a,b)]+=substr($0,c,d);}END{for(n in sum)print n,sum[n];}' input.txt
なんかかみ合わないんだけど、
>>343 や
>>345 の例だと、$1をシェルがもっていっちゃって動かないだろうから、
本来やりたいことである
>awkのsystem関数に与えるコマンド文字列の中で「"」や「'」って使える?
の問題とは違ったところでハマっているでしょ、ってことを書いただけなんだけど。
($1にはinput.txtを入れたいのだろうと推測)
それに対して、$数字は awkで使用できるよ、と書かれても困っちゃうんだが。
>>349 言いたいだろうことは理解するが、347がそれが伝わる書き方とは思えなかったぞ。
例えば、何を誰がもっていっちゃうと書いたか、347と349を比較してみ。
ふいんき(なぜか略)を悪くしたようで正直スマンカッタ
awkは読み込んだレコード全体を$0で参照できて、 フィールドセパレータ(デフォルト空白文字)で区切られたn番目のフィールドを $nで参照できるんだよな。 awk '{system("grep \"^$\" "$1)}' input.file で$1はinput.fileから読み込んだカレントレコードの1番目のフィールドを 参照すると。 $数字がawkで使えるのは良いとして結局"や'は system関数の引数の中で使えるのかどうか?
353 :
名無しさん@お腹いっぱい。 :2007/04/13(金) 16:02:04
DebianとFreeBSDを使っていて、共通の.bashrcを参照しているのですが Debianを使っているときにはUTF-8を、 FreeBSDを使っているときにはEUC-JPを 環境変数LANGに設定するようにしたいのですが どのようにコードをかけばよいのでしょうか?
>>353 uname とか hostname あたり見るとか。
355 :
353 :2007/04/13(金) 16:42:04
>>354 unameとif文を使えばできると思うんですけど
それでsourceコマンドを実行したときに
ちゃんとわりあたるかどうか・・・
>>355 おいおい、sourceなんて使わないよ。
あと、ifじゃなくてcaseを使うのが定石。
case `uname -s` in
Linux) export LANG=ja_JP.UTF-8;;
FreeBSD) export LANG=ja_JP.eucJP;;
esac
別に if 使ってもいいと思うけど、 なんで source が出てくるのかよくわからん。
>>356 Cとかだとswtichは敬遠される傾向にあるけどな。
お前の周りだけだろ。
ifを使うとすると、 if [ `uname -s` = Linux ]; then export LANG=ja_JP.UTF-8 elif [ `uname -s` = FreeBSD ]; then export LANG=ja_JP.eucJP fi となって、unameの実行が2回になって無駄になる。 かと言ってunameを1回にしようとすると、 tmp=`uname -s` if [ $tmp = Linux ]; then export LANG=ja_JP.UTF-8 elif [ $tmp = FreeBSD ]; then export LANG=ja_JP.eucJP fi となって、シェル変数1つが余分に要るので美しくない。 よって、caseを使うのがモストエレガント。
で、source はなんで出てきたんだ?
363 :
名無しさん@お腹いっぱい。 :2007/04/16(月) 19:45:58
そうっすねぇ…。
審議せずに却下
sh にそんなコマンドがないからか?
.があるじゃん。
. はあるけど source はないってオチなのかなと。
source がない sh ってたとえばどれ?
J
>>371 普通のbshなら.しか使えない。
HP-UXやAIXのshは中身がkshなんで。
/bin/zsh
375 :
名無しさん@お腹いっぱい。 :2007/04/25(水) 21:35:53
シェルいい本知りません?初心者向けで
UNIXプログラミング環境
マジレスをおねがいします
どのへんが冗談だと?
初心者向きじゃないし、内容が古い
対案を出してから批判しろ
「試験に出るシェルスクリプト」
Z80は最強だから大丈夫
じゃあ「できるシゥルスクリプト」
英小文字からなる文字列の最初の一文字だけを大文字に変換するには どうすればよいのでしょうか? sedだと只それだけで一文字目の後ろに改行を挿入してホールドスペースに入れて、 y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ てなことして また連結して改行を削除みたいな、バカ手間が掛かるので投げ出してしまった。 もっと簡潔に出来たら良いなと思うのですが・・・
>>385 echo aaa | sed 's/\(.\)/\U\1/'
387 :
385 :2007/05/02(水) 18:01:30
>>386 それは。どこのsedですか?
うちではそれはUaaaと出力します。\Uという正規表現はUそのものを表すようです。
388 :
385 :2007/05/02(水) 18:42:47
ちょっと調べてみたらGNUのsedだと、
>>385 の動作が出来るようです。
しかし、なんでもコマンドを高機能なやつに入れ替えるのもどうかと思うし、
使っているOSがGNUツール群を標準装備していないのもそれなりに理由があるだろうし
高々文字列変換で新たなツールを使うのには、消極的になりますね。
echo "abc" | awk '{print toupper(substr($0,1,1))substr($0,2)}' echo "abc" | perl -pe 's/(.)/\U\1/'
echo aaa | awk -v FS= -v OFS= '{$1=toupper($1);print}' はどう。
391 :
385 :2007/05/02(水) 20:06:42
>>389 有り難うございます。
awkのsubstrで文字位置指定して、toupperで大文字に変換ということですね。
perlの方はgsedと互換な感じの構文ですね。(てかgsedが模倣した?)
>>390 済みません。
awk: illegal statement
input record number 1, file
source line number 1
と成ります。
いずれにしてもいろいろと勉強になります。
>>386 ,
>>389 ,
>>390 の皆さん、ありがとうございました!
GNU の sed でも y/a-z/A-Z/ みたいな表現できないんだよね。 互換性維持のためなんだろうけど。
kshのコマンドヒストリで矢印キーが使いたいのだが、 emacsのCTRLキーはめんどい。 エロい人、設定のしかた教えてチョ。
cshで変数の中に空白文字で区切られた複数のワードからなる文字列が代入されてる。 例:「aaa bbb ccc ...」 各ワードに接頭辞と接尾辞を付加したいが、sedでできるかな? 例:「prefix.aaa.postfix prefix.bbb.postfix prefix.ccc.postfix ...」 ちなみにワード数は不定。 置換後の文字列長はLINE_MAX以下でないと駄目?
はい、cshはスルー、次の方どうぞ
こんなんでよい? bashだけど $ s="aaa bbb ccc" $ echo $s | sed -e 's/\([^ ]*\)/prefix.\1.postfix/g' prefix.aaa.postfix prefix.bbb.postfix prefix.ccc.postfix
Gnomeなどのデスクトップ環境でxxx.shに何らかのファイルをドロップしたとすると、そのファイル名はどういった変数に格納されているのでしょうか。 tex処理を簡単にしたいと考えたのですが、これが分からずにつまっています。
$1, $2, ...
>>398 $1,$2...って9個までしか使えないんじゃ?
396は「ワード数不定」って言ってるから、10個以上もありうるだろ。
↑gオプション付いてるやん。何かみついてんだコイツ
>>399 多分、コマンドでこう起動したのと同じ扱いになっている思う。
$ xxx.sh < "abc.tex"
スクリプト側でリダイレクトされる前のファイル名を
取得する方法が分かれば、どうにかなるんじゃないかな。
405 :
名無しさん@お腹いっぱい。 :2007/05/06(日) 01:12:45
画像変換するスクリプトを作っています。 スクリプ中で使用するコマンド(今回はmogrify)がインストールされているかどうか 調べるのに手っ取り早い方法ありますか? 今のところ思いつくのは、PATHから「:」で区切って1つづつ抜き出し、その直下に mogrifyがあるか「test -x」する方法です。
406 :
405 :2007/05/06(日) 01:26:07
ちょっと自己解決 whereis使えばいいか。 whereisって見つからなくても0返すんですね・・・ whereis -b mogrifya | grep -v ':$' > /dev/null if [ $? ... って感じかな もっとスマートな方法ありましたらご教授ください。
whichは?
if which mogrify > /dev/null 2>&1 ; then ... は?
409 :
名無しさん@お腹いっぱい。 :2007/05/06(日) 02:18:36
>407,408 whichか、なるほど 解決しましたありがとうございました。
410 :
405 :2007/05/06(日) 02:45:19
たびたびすいません &&や||の後に複数のコマンドを書くにはどうすればいいのでしょうか? 見つからなかった場合、NGと表示しexitしたいのですが、 which mogrify > /dev/null 2>&1 && echo 'bc ok' || (echo 'bc NG'; exit 1) としてもミニシェルから抜けるだけなのです if文で書けばいいだけなのですが、勉強の意味でも知っておきたいのです。
function echo_exit() { echo $* exit } とか定義しちゃえば?
>>410 ... || { echo NG; exit 1; }
は?
413 :
410 :2007/05/06(日) 11:45:38
>411 いいですね。たくさんコマンド実行したいときに使わせていただきます。 >412 おー、意図したとおりになりました。今回はこちらを使わせていただきます。 ありがとうございました。 ちなみにcommand1が成功したときはcommand2、失敗したときはcommand3という時に、 command1 && command2 || command3 という書き方は問題ないですか? 動作は意図したとおりなんだけど、「|| command3」はcommand2の結果に かかってくるように見えるのでちょっと気持ち悪い・・・
>>413 >command1 && command2 || command3
>という書き方は問題ないですか?
command2が falseを返した時、command3まで実行されてしまうのが問題。
if - else の代わりにするなら、
command1 && { command2; true; } || { command3; }
と書けば完全。command2や command3は、; で区切って複数コマンド可能。
415 :
413 :2007/05/06(日) 14:40:39
>414 なるほど。 command2にはechoとかしか入れてなかったので気づかなかった・・・ 勉強になりました。ありがとうございます。
tail -f ログファイル名 | awk -f 手続きファイル 上記コマンドを指定の条件をつけてwhileによる繰り返しでログを整形する シェルをつくりたいのですが、末尾に">>ファイル名"としても指定のファイル にリダイレクトできません。 while〜doneの後、シェルスクリプト実行時の末尾に>>を指定してもだめです。 出力は画面のままです。(通常のtail -fのイメージ) &でバックグラウンドで実行しても同様です。 tail -f で読み取っている内容を別のログファイルに出力するにはどうすれば よいですか?
teeじゃだめ?
シェルってゆーな。クズ。
tail -f って終了しないじゃん
tee -a hoge.log
421 :
名無しさん@お腹いっぱい。 :2007/05/15(火) 17:57:30
hoge%68%6F%67%65 のような文字列を %68%6F%67%65%68%6F%67%65 のように %表記に直すにはどうしたらよいでしょうか?
perlつかえ。
>>421 よく意味がわからんが、URLエンコーディングとかの話か?
>>423 よく意味がわからんなら答えなくていいよ。
>>421 s/hoge%68%6F%67%65/%68%6F%67%65%68%6F%67%65/g
自演乙
ESP発揮して混じれ酢すると hogeを%表記しようとしたときに 右側の既に%表記されてる部分が さらに%表記に変換されてしまうことを 回避したいと思っているのではないかと
一旦デコードしてからエンコードするのが確実だな
430 :
201 :2007/05/16(水) 02:03:24
01.jpg 02.jpg 03.jpg 04.jpg ... と沢山のファイルがあってfor文(じゃなくてもいいけど)により convert +append 01.jpg 02.jpg 03.jpg out1.jpg convert +append 04.jpg 05.jpg 06.jpg out2.jpg ... というように、3つずつ抜き出して一気に処理したいのですが、どうすればいいのでしょうか?
>>430 100個ずつとかだと別の方法を使うが、3個ずつならこんなもんか
#!/bin/sh
set -- ??.jpg
i=1
while :; do
case $# in
0) break;;
1) convert +append $1 out$i.jpg; break;;
2) convert +append $1 $2 out$i.jpg; break;;
*) convert +append $1 $2 $3 out$i.jpg; shift; shift; shift; i=`expr $i + 1`;;
esac
done
set -- *.jpg i=0 while [ $# -gt 0 ]; do i=`expr i + 1` #式使えるならそれでも。 convert +append $1 $2 $3 out$i.jpg shift 3 done shiftの数引数ってBourne Shellでも使えるのかな。 使えないなら3回shift。
ああ、ちょうど3の倍数になっていない場合は考慮してなかったな。
ちょうど3の倍数になっていない場合はどうすんの?
/dev/null とかで補完
名前欄は無視でお願い
437 :
430 :2007/05/16(水) 02:45:01
おお、夜食食べている間にこんなにもレスが 3の倍数になっていないときは私自身考慮してませんでいした。 431さんの set だけ使ったことがないのですが、とにかく >431-435 で十分対処できそうです。 setも調べてみます ホントにありがとうございます。
438 :
430 :2007/05/16(水) 02:46:51
よく見たら432さんもsetありましたね。 とにかくありがとう
439 :
421 :2007/05/16(水) 11:12:47
>>422 シェルスクリプトで難しいならperlを使ってもかまいません。
>>423 URLエンコーディングならアルファベットはそのままだと思うのですが、
アルファベットも16進数表示したいわけです。
pukiwiki のバックアップをローカルに落とすのに、
ファイル名を知りたいんです。
>>439 pukiwikiスレあたりで「戻し方教えれ」って聞いた方がいいんじゃね?
441 :
416 :2007/05/16(水) 23:44:33
ご返事いただきありがとうございます。 tail -f ログファイル名 | awk -f 手続きファイル 上記コマンドではawkによる整形結果を標準出力できる状態で、 さらにパイプでteeコマンドを実行してみましたがうまくログが 出力できませんでした。 名前付きパイプを作成し、オリジナルログの出力先を名前つきパイプにして 直接awkで名前つきパイプを標準入力状態にしても、tail -f のような画面に 標準出力はできますがファイルへのリダイレクトは無理でした。 難しいですねぇ。。
tee の使い方間違ってるだけだろ
>>441 tail -f をパイプすると、上手く動かないよ。
GNUのだとどうなんだろ?
「tail パイプ バッファリング」
でググると、それっぽい事いっぱいでてくるYO
a.shに . b.sh として読み込まれるb.shが自分の名前がb.shであると知る方法はありますか?
>>444 ない。
. で読む場合は $0もセットされないし。
>>445 ありがとうございます。
あらかじめ埋め込んでおくしかなさそうですね…。
447 :
416 :2007/05/17(木) 23:00:53
>>443 バッファの問題だったんですね。
通常のawkはやめて、gawkのfflush関数を使うことでうまくいきました。
ありがとうございました。
シェルスクリプトでログインログアウトを自動化するにはどうしたらいいでしょうか? もし良かったら数行のコマンドでレスお願いします。
450 :
448 :2007/05/18(金) 19:59:20
>>449 1.現在rootでログイン中。
2.testユーザーでログインして何か作業をする。
3.そしてまたrootに戻る。
これを自動化したいです。
>>450 su test 何か
もしくは
su - test 何か
違いについては man su 等を参照。
>>451 間違ってるよ。man su 等を参照するべきなのはオマエ。
>>448 testユーザで実行するバッチファイルを作っておいて、
su - test -c バッチファイル
で実行しる。
バッチファイル バッチファイル バッチファイル バッチファイル wwww
ほんとうにloginしたいならexpectを使うとか
457 :
448 :2007/05/19(土) 03:04:26
rootでログイン中 expectでsu - testとして touch /home/test.txtを実行して 再度expectでsu - rootでrootになっても /home/test.txtは作成されてませんでした なぜでしょう?
パーミッションじゃないの? /homeにtestユーザは書き込めないんでは。
質問。 11.22.33を 33.22.11に文字を反転させたい。
460 :
459 :2007/05/20(日) 04:42:15
459は取り消し! 11.22.33を a[0]=11 a[1]=22 a[2]=33 のように配列に代入したい。 よろしくお願いします。
宿題でつか
462 :
459 :2007/05/20(日) 06:19:25
宿題でつ
463 :
459 :2007/05/20(日) 07:14:05
スレ汚してごめんなさいできまつた
テキストファイルに、ファイルの場所がずらずら書かれていて ----- /usr/local/etc/pussy001.jpg /usr/local/etc/pussy002.jpg /usr/local/etc/pussy003.jpg : ----- そこに書かれているファイルを指定した場所に移動させたいんです。 で、こんな感じで動くスクリプトを書きたいなぁと考えているんですが cat list.txt | grep jpg | mv.sh /work/pussy この mv.sh の書き方が分かりません。
>>464 mv `grep jpg list.txt` /work/pussy
で、一発。・・・で、pussyってww
>465 残念ながら、ファイル名にスペースがあるとだめでした。 sh, tcsh, bashで試してみましたが、どれも同じです。
>>464 の例では、ファイル名にスペースが入ってないじゃないか。
そういう条件は先に例に含めて書くこと。
ファイル名にスペースがある場合のやり方ももちろん知ってるが、
わざわざ教える気にならないので俺はパス。
>>466 IFS='
' mv `grep jpg list.txt` /work/pussy
(while read f; do mv "$f" dest/ ; done) < file
>>467 ファイルの長さを考慮しないgrep戦法しか提示しなかった奴が
そんな理屈をこねても見苦しいだけ。
>>469 残念ながら、ファイル名に \ があるとだめでした。
じゃあ諦めな。
>>471 ファイル名の \ を考慮しないを考慮しないwhile read戦法しか提示しなかった奴が
そんな理屈をこねても見苦しいだけ。
というか、
>>469 って、元の質問の jpg で grepするの忘れてるじゃん。
テストだったら0点。
でもテストじゃないよ。
そういう香具師が、「それはケアレスミス。答えはわかってた」とか後で言うんだよな。
なんでそんな完璧にこだわるんだろ。 質問者のヒントになればいいじゃん。
低能同士、仲良く!
478 :
464 :2007/05/22(火) 00:44:46
すみません、御礼が遅れました。 という訳で >465 >468 >469 全て参考になりました。特にIFS=〜は初めて 知ったので成程と関心しました。 この場をお借りして厚く御礼申し上げます。
xargsは? grep jpg list.txt | xargs -i mv {} /work/pussy
grep jpg list.txt | tr '\n' '\0' | xargs -0 -i mv {} /work/pussy
>>481 ファイル名に改行が含まれてるとだめだろw
sudo find / -name '*pussy*' -exec rm -rf \{\} \;
デリミタが改行なリストなんだから要素に改行は含められないんじゃ? 改行入りファイル名を考慮するならリストは改行文字以外で区切るべき だと思う.
ファイル名に改行を入れるアホなんてほっとけ(w
試しに作ってみた。 % touch aaaa^Maaaa % ls -lF aaaa*--r-- 1 ウサチャソ users 0 5月 22 20:58 aaaa 表示バグってるよ…
改行と復改の区別ができないお子様は犬... 以下略
>>487 改行のみ入れるのは面倒臭かったんだスマソ
>>488 $ touch 'aaaa
aaaa'
だろ。
$ > 'aaaa
aaaa'
でも可。
CTRL+Vが楽だったんで、つい…
ちなみに、
>>489 でも
>>486 でもCygwinだと同じ表示。
-rw-r--r-- 1 ウサチャソ なし 0 May 22 22:10 aaaa?aaaa
今日始めて知った。
あ゛っごめん、Cygwinは「--show-control-chars」が必要だった…。 スレ違いなんでもう消えます、スマソ
492 :
名無しさん@お腹いっぱい。 :2007/05/24(木) 20:33:53
質問します。 lsnrctl >>_EOF_ set log_file listener.tmp RET=$? if [ $RET -ne 0 ];then logger -t loglog -p local1.notice "切り替えに失敗しました" exit 1 fi exit _EOF_ という事をしたいのですがどうしてもsetコマンド以降エラーに なってしまいます。 対処法を教えていただけないでしょうか?
逆だ。 lsnrctl <<_EOF_
あと、ヒアドキュメントの部分は、LSNRCTLのコマンドしか受け付けないぞ。
495 :
名無しさん@お腹いっぱい。 :2007/05/24(木) 21:23:10
すいません逆に書いてました。 やはりLSNRCTLコマンドしか受け付けないですか・・・ う〜ん、どうしてもLSNCTLの中でシェルスクリプトの処理の記述を したかったのですが無理そうですね。 ありがとうございました。
質問。 ファイルの最終から20行を削除したい。 どうしたらいいでしょうか?
>>496 wc で数えて、head で切り出すぐらいしか考え付かない
awk
tac なんてLinuxでもないかぎり標準装備じゃない罠 cat file | tac | sed '1,20d' | tac
無意味なcat出た
tacが使えなければ sed '1!G;h;$!d' すればいいじゃない。
cat!出た!cat出た!得意技!cat出た!cat!これ!cat出たよ〜〜!
俺は限界だと思った
505 :
名無しさん@お腹いっぱい。 :2007/05/29(火) 00:14:45
tail つかって最後から20行みれ
で、
>>499 しる
基本的にサブシェルはshを新たに起動するよりは動作が軽いですよね?
>>498 awkには入力ファイルの行数を保持する組み込み変数はないんじゃね?
だから、結局wcでカウントしないとダメだったり。
は? awk '{a[NR]=$0}NR>20{print a[NR-20]}'
>>508 短くていいが、でかいファイル通すとメモリが…
無理して一行でやるより、行舐めの回数が少ない方が好きだな。
>>510 ワンパスだし。消費メモリを考えればいいと思うが。
awk '{if (FNR>20) print a[FNR%20]; a[FNR%20]=$0}'
20行分だけバッファして遅延して出力させて ファイル末尾に到達したら終了させるとか。
>>496 こういう場合、ed を non-interactive に使うのがいい。
最後20行ということは、$-19から $までだから、
echo '$-19,$d
w outfile
q' | ed infile
↑で桶。
sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'
質問なんですが・・ #!/bin/sh - tmpfile=/tmp/program.$$ cat "$1" | tr ' ' '\n' > tmpfile while read word do grep ${word} "$2" | いろいろと処理・・・ done < tmpfile てな感じのスクリプトなのですが、 第一引数のファイル中に、例えば -i と言うような語があると grep がオプションと解釈するのか何なのか、直後に while ループが 終了してしまいます。 '${'"$word"'}' だと grep には ${word} として渡されてしまいます。 何とかシェルを騙して grep に '-i' として渡す方法は無いでしょうか? (渡す前に条件判断して先頭文字が - なら sed などで先頭に \ を 付加すると言うのも行けそうな気はしますが、出来れば余計なIFとか 変数とか無しで行きたいものです)
grep -e grep -
522 :
520 :2007/05/30(水) 19:53:07
>>521 ありがとう。
シェルを騙さなくても grep の方で用意されていましたか、
良く考えりゃ当然ですね。
オプション -- で、それ以降はオプションとは解釈しないってのは 結構な数のコマンドで使える。
524 :
520 :2007/05/30(水) 23:07:09
>>523 ですね。
これまで -- なんて、はぁ?って感じでしたけど、
実に有用性が高いですね。
勉強になります。
質問 インターネットに接続できるか試すコマンドってありますか? やりたいこと インターネットに接続できたら echo "できます" インターネットに接続できなかったら echo "できません" としたいです。
インターネットとLANの区別をしなくていいのかな?
多分、この程度の精度でOKなんだろ。 if ping -c 1 www.yahoo.com >/dev/null 2>&1; then echo "出来ます" else echo "出来ません" fi
528 :
525 :2007/06/03(日) 03:05:39
>>562 >>527 ありがとうございます
できればヤフーなどの特定のサイトに依存せず
確実にインターネットに繋がるかどうか判断したいです。
もし無理なら特定のサイトでも構いませんが
こういう場合通例としてyahoo.comを使うのが適切でしょうか?
接続できていると分かったら、どこかと通信するんでしょ? その通信相手にすればいいよ。
その通信相手がICMPブロックしてるかも知れないから、ブロックしてない www.yahoo.comとかwww.google.comとか使えばいい。
>>528 君のほうから、どことつながったらインターネットに繋がっていると言えるかの
判断基準を出してくれないと先に進めないと思うよ。
相手もそうだがプロトコルもな。 ファイアウォールの具合でICMP通らないかもしらんし。
まぁ、スレ違いだな。
535 :
名無しさん@お腹いっぱい。 :2007/06/04(月) 07:59:35
>>527 >if ping -c 1 www.yahoo.com >/dev/null 2>&1; then
関係ないが、この 2>&1
エラー対策でつか?
遅レスだが、 tail -r ファイル名| tail +20 | tail -r でもいけた(tailばっかりでカッコ悪いか)
>>535 終了ステータスだけとれりゃいいので、エラーメッセージとか捨てる。
それを捨てるなんて、とんでもない!
きのうはおたのしみでしたね。 ウホッ
*「おお しんでしまうとは なにごとだ!」 *「アッー!」
vmstat 1 の結果の左側に`date +%H:%M:%S`(時分秒)を付けて流して表示させようとしています。 以前、gawkでstrftimeを利用して同じ事をしたのですが、今回使ってるサーバのawkは gawkでない為に別の方法が必要です。 どうもウマイ方法が思いつきませんで・・・ご教示お願いします。
Perlあるなら vmstat 1 | perl -MPOSIX -pe 'BEGIN{$|=1} print strftime q{%H:%M:%S }, localtime'
これは重そうだけど vmstat 1 | while read line; do echo `date +%H:%M:%S` $line; done
545 :
541 :2007/06/05(火) 22:31:39
>>542 HP-UX10.20だったのですがperlが入っていませんでした(汗
でも、これを機会にperlもちょっとづつ勉強したいと思います。どもでした。
>>543 readがそんな使い方できるとは知りませんでした。
おかげさまでばっちり動きました。ありがとうございます。
bash.infoの説明だと echo hoge | read v で echo $V →hoge になるように読める で、できないってことはわかったんだけど結局readはどう使うんですか なんでwhile中だとうまく動くんでしょう
サブシェルが起動するから。 read で代入する変数はサブシェルのものだから、親シェルに戻ると忘れる。 while でなくても、下のような書き方をすれば {...} の中にかぎり有効。 echo hoge | { read v echo $v } あと、ksh はふつーに可能だったような記憶がうっすらとあるが自信ない。
質問 シェルスクリプトを、windowsでCD-Rに焼き、linuxで実行すると 改行がコマンドとして認識され、command not foundとなってしまいます。 普通に改行を改行として認識させることはできないのでしょうか?
よくわからんが改行コードの問題? 改行コードをLFで保存できるテキストエディタ使えよ
>>549 ありがとうとざいます
LFで保存したところ大丈夫でした。
ただし1行目だけはなぜかcommand not foundとなってしまう。。
551 :
名無しさん@お腹いっぱい。 :2007/06/06(水) 20:15:14
log=20070101.log $logを 2007-01-01 という風に、[西暦]-[月]-[日]な形にしたいのですが、どすればよいでしょうか? どなたか、お力をお貸し下さいませ。 .log と取って、4桁、2桁、2桁ごとに「-」を挟む。というのはわかるのですが 方法や何のコマンド使ってよいものやら見当もつきません。お願いします!
echo $log | sed 's/\(....\)\(..\)\(..\).*/\1-\2-\3/'
>>552 ありがとうございました!出来ました!
sedは使えるつもりでいたんですが、まだまだの若輩者でしたorz
こんなに早く答えて頂いて本当に助かりました。
554 :
名無しさん@お腹いっぱい。 :2007/06/06(水) 23:42:52
じぇっとすとりーーーむ〜
555 :
名無しさん@お腹いっぱい。 :2007/06/06(水) 23:42:59
シェルが何かは分かったのですが、シェルスクリプトが良く分かりません… 専門用語を交えないで言うと、どういったものなのでしょうか?
シェルが何かどうわかったか、専門用語を交えずに説明してからだ
レストランのメニューがシェル。コース料理がシェルスクリプト。 大分違うな…
559 :
名無しさん@お腹いっぱい。 :2007/06/07(木) 02:08:21
>>557 その説明で開眼しました!!
今ならどんなプログラムも書けそうです!!
(^ω^)
560 :
名無しさん@お腹いっぱい。 :2007/06/08(金) 00:50:30
if [ -e foo ] ; then echo "foo exists." else echo "foo does not exist." fi これを Solaris 8の bash, cygwinの sh, bashで実行するとOK。 でも Solaris 8の shで実行した時だけ test: argument expected と出てしまいます。どうにも分かりません。助けて下さい…
Solarisなどの旧式shのtestコマンドには-eというものはない。 これは外部コマンドのtestも同様。
>>561 ダウト。
Solarisの外部コマンド版のtestの実体はkshスクリプトだから、
Solarisでも外部コマンド版のtestには -eオプションがある。
ただし、純正Bourneには -eがないので、使わないこと推奨なのは同意。
[ -f foo ] あたりで代用だな。
563 :
名無しさん@お腹いっぱい。 :2007/06/08(金) 08:29:58
grepコマンドで検索した行の前後三行を出力するコマンドってないすか? たとえば、以下のようなファイルがある。 ---------------------------- aaa bbb ccc ddd eee fff ggg ---------------------------- grepコマンドをつかって、 $ grep ddd -a 333 とすると bbb ccc ddd eee fff と表示されるようなやつよ。
>>563 普通にgrepだけで行けるぞ
grep -A 3 -B 3 'ddd' filename
普通は-Aとか-Bなんてない。
何が「普通」かなんて人それぞれでしょ。 -A がある grep とない grep がある。 それだけ。
目的達成できるなら、それでいいじゃん
grep -n して sedで : より前だけ取り出して awkにくべて前後の必要な行番号を全部計算して sort -nuして sedでsedのコマンドに成形しなおして sedで抽出。 てゆうか、grepにこだわらずにawk1個の方がめちゃ楽そう。
FreeBSDは変にsed使うよりawk1本に絞った方が軽い。
複数行のテキスト整形には弱い 普通は、prelとかrubyを使う まあ、perlとかruby使えないから聞いてるんだろうけど
>>572 sedやgrepでどうしようかななんて考えてる時間が無駄だよな
perl覚えちゃたほうがいいのにね、これを機会に
これを機会にGNU grep入れちゃえ。
パタン行より前の行も表示しないといけないのでawk一本だとちょっと手間でしょ。 perlやrubyを使ってもそれは同じじゃないかな。 sed+awkなら sed -e "$(awk '/pattern/{for (i=-2;i<=2;i++)if(i+NR>=0)print (i+NR) "{p;d;}"}' file|sort -nu)"';d' file zshでしか試してないのでクォート回りはshだと違うかも知れんが、 だいたいこんな感じで。
GNUは偉大だな、改めて思った
当たり前じゃね?
だってGNU拡張は、ユーザが便利だと思うものを実装して
拡張していったんだから
きっと、
>>563 みたいなことを、数年前にも同じといってる人が
現れてんだよw
それで拡張されてる
GNU sed awk grep を使いましょうね
俺はgawk派
ガウォーク
GNU is Not UNIX の意味がやっとわかったようでなにより
GNU教に入信する準備をしてます
しこしこ、書いてんじゃね
mac でターミナルで操作しているのですが、safariでgoogleなどのページで キーワードを打ち込んで検索させたりはできないものなんでしょうか? 初心者なんで仕組みなどわかりませんので構造上できないものなら教えてください
シェルスクリプトとGUIアプリの連携ってか?
質問です! ---hoge.txt--- aaa bbb ccc これを ---hoge.txt--- aaa ccc こうしたい。 sed -i "s/bbb//g" hoge.txtだと ---hoge.txt aaa ccc こうなってしまう・・・
sed -i -e '/bbb/d'
GNU sedは正規表現のエスケープまわりが腐ってるんだよなあ それに、わざわざBourne Shellに縛ったスレなのに、GNU拡張に依存するのもどうかと思う ポータビリティも勘案すると、perl使った方がいい
GNU grepの-oは便利
それを言ったらshよりzshのが便利だ
そうだよ
FreeBSDよりWIndowsのが便利だ
当たり前だろ
perlの書法がもっと自由度低かったら決定版たったのだが。 お行儀悪く書けてしまうのが悩みの種
お行儀良く書きたいならRubyなりPythonなりへ行けば良い お行儀悪く書いても心が痛まないのがPerlの長所
use strict; するんだからそれほどひどいコードにはならないような
どーせワンライナーか数行でやれるようなのしかPerlで書かないから どうでもいい
602 :
名無しさん@お腹いっぱい。 :2007/06/15(金) 02:31:42
cshを勉強し始めたものです。 研究室で使うためです。 C言語もほとんど知らないので、取っ付きにくく、苦労してます。 今よく分からないのは、シェル変数と環境変数です。 普通に話に出てくるのですが、変数だとは理解してますが、違いが分かりません… どなたか教えて頂けませんか?
シェル変数はシェルが使う 環境変数は(主に)呼び出されたコマンドが使う それはいいとして、なんでcshかちゃんと確認しろ csh使う必然性がなければ、shにしとけ
環境変数は子プロセスに引き継がれる。 シェル変数はそのシェルのみが使い、 子プロセスに引き継がれない。
605 :
602 :2007/06/16(土) 01:09:53
レス有り難うございます。 なぜcshなのかと言うと、 今研究室で使われてるのがcshだとしか… Cで書かれたソースプログラムをcshに渡して、 結果を他のプログラムに渡して…… って感じらしいです。 まだ学部なので、難しいプログラムは書けず、 既成のプログラムの値を変えて走らせたりするようです。 最近の課題が、あるcshの中身を渡され、理解してくるものでしたが、 プログラムの知識が無い自分にはさっぱりというわけです…
そんなに何種類もcshがあるのか?
cshで書かれたシェルスクリプトってとこじゃないか?
いや、cshの中身だぞ?
とりあえず
>>605 よ、
cshの中身というのはcshスクリプトという意味か?
こらこら、cshの話はもう終り。禁止。
GNU grepの話をしてもいいなら、cshも良くないか
良くない。
シェルスクリプトのスレでシェルのソースコードの話かぁ……
614 :
名無しさん@お腹いっぱい。 :2007/06/16(土) 19:35:05
質問です。 ファイルの内容が同じものをリストアップする目的で、 対象ファイルのmd5sumを計算したいと考えています。 ただし、ファイルが大きいと時間がかかってしまうので、まずはファイル頭の 512バイトだけでmd5sumしたいです。以下のようなものを書いたのですが、 ファイル数が多い(1000とか)とプロセスの起動がボトルネックになってしまう ようで、遅いです。 while read -r filename do dd if="${filename}" ibs=512 count=1 2> /dev/null | md5sum >> output done < ${tempfile_prefix}2_filesize_onajiyatu md5sumに先頭から512バイトだけで計算しろと指示することはできますか? もしくは何かいい案ありますでしょうか?
えろ画の整理スクリプトかよ
616 :
名無しさん@お腹いっぱい。 :2007/06/16(土) 19:49:09
違います。 エロ動画です。 だからでかいのです。
>>614 プロセス起動がネックならperlとかpythonとかrubyとか好きなのでやれ。
まずはファイルサイズで比較すればいいのに
粗く分けるのにmd5なんか使わんでも。
>>619 の通りファイルサイズが手軽だし、もし同じサイズで内容が違うものが
沢山ならファイル中の適当なところをhexdumpでもいいんじゃないの。
横から済まぬが
>>619 ,620
>> ${tempfile_prefix}2_filesize_onajiyatu
って書いてあるから、そもそも同じサイズ限定ではないのか?
同じファイルサイズのものだけでも1000ファイルもあるって、 結構集めまくったね、絵炉動画をw
623 :
名無しさん@お腹いっぱい。 :2007/06/16(土) 21:03:28
>617,618 perlか・・・ついに手を出すときが来たか >619,621 失礼しました。サイズ比較をあらかじめこんなのでやってます。 ls -l "$@" | sed 's/ \+/ /g' | cut -d ' ' -f 5,8 > ${tempfile_prefix}1_filesize_all awk '{ if(a[$1,0]==0){a[$1,0]=1;a[$1,1]=$0;} else{if(a[$1,0]==1){print a[$1,1];} a[$1,0]++;print $0;} }' \ ${tempfile_prefix}1_filesize_all > ${tempfile_prefix}2_filesize_onajiyatu >620 ためしに512byteのgomi.txtを作ってみて、以下試しました。 %time (for i in `seq 1 1000`; do cat gomi.txt > /dev/null 2>&1 ; done;) -> 1.486sec %time (for i in `seq 1 1000`; do md5sum gomi.txt > /dev/null 2>&1 ; done;) -> 1.510sec これくらいのサイズだと処理内容はあまり影響なさそうです。 md5sumの方が比較しやすかったのです。 >622 いやいや、得ろ動画とか1000個とか例えばの話ですよw
すまん。@bitwarpなもんで、更新漏れだった。 忘れてくれ
xargsでもつかえば?
気が向いたんでやってみた $ time (for f in tmp/*; do dd if=$f bs=512 count=1 2>/dev/null | md5sum; done) 065d30715dcffa21596406373a9124ac - ...中略... ed4cf7b8f209f9ce630b5e76219357ae - (; for f in Desktop/*(.); do; dd if=$f bs=512 count=1 2> /dev/null | md5sum; ) 0.09s user 0.38s system 49% cpu 0.960 total $ time perl -M'Digest::MD5(md5_hex)' -e 'for (@ARGV) { open F,"<$_"; read F,$a,512; print md5_hex($a),"¥n" }' tmp/* 065d30715dcffa21596406373a9124ac ...中略... ed4cf7b8f209f9ce630b5e76219357ae perl -M'Digest::MD5(md5_hex)' -e Desktop/*(.) 0.02s user 0.02s system 18% cpu 0.193 total
xargs使えって
絵炉動画ファイルは、ファイル名にスペースとか特殊記号とか入りまくりである ことが多いため、xargsは全く持って不適当。
それならfor文やreadでも難しくならないか・・ まxargsのほうがもっと不適当なのだろうが
>>631 は何がしたいんだろうか? まったく外してるわけだが、、
>>631 $ ssh solarishost man xargs
ファイル名の問題以前に、個々のファイルごとに頭の512バイトを切り出したいわけ
だから、xargs使ったところでプロセス起動数は節約できない。
よって、
>>626 >>628 は全く的はずれ。
>>632 はずしているのはお前の方。
find 〜 -print0 | xargs --null
>>635 はずしているのはお前の方。
-print0 や xargs --null は、一般には使えない。(たとえばSolaris)
あと、
>>634 が指摘してるように、今回の件は xargsでは解決しない。
よって、そういう意味でも外しているのは
>>635 の方。
-print0で喜んでるのは石器人。 現代人はふつー find ... -exec ... +
て言うか、プロセス起動数が云々と言うなら md5sum を改造するなり、 ファイル名の取得からハッシュの計算までやるようなアプリ作ればい いじゃん。
答えそのものも>627に出てるわけだが...
#find ... -exec ... + 横レスだが知らなかった ってか手元のmanにはない
最後の「+」ってなに?
xargsは同じプロセスを連続起動するから 工夫されていると聞いたことがある。 これは事実?
645 :
名無しさん@お腹いっぱい。 :2007/06/18(月) 15:14:11
基礎的な質問ですいません。 bashで、シェル変数に値を突っ込み -zで存在を確認する手法ですが、 if [ -z $test ] ; then echo "val exist" else echo "val isn't exist" 質問 1.[ -z $test ] と書くのはよろしくない? 2.[ -e $test ] とすると、シェル変数が存在しない時に真、 シェル変数が存在する時に偽となるのはなぜ? 結構、このパターンで利用してたのですが、2.の動作を確認すると、 なぜだか逆になっているような。じゃ、-zもよろしくないのかなぁ、と ところで、みなさんは、環境変数やシェル変数の存在確認をどうやってますか? 宜しくお願いします。
>>645 まず、[ ] の中ではシェル変数は基本的にダブルクォートを付けること。
[ -z "$test" ] とする。この場合、$testがセットされていれば偽になる。
これだと真偽が逆になってわかりにくいので、
[ -n "$test" ] または -n は省略できるので [ "$test" ] とする。
[ -e $test ] は、$testがセットされていない時、[ -e ] となってしまい、
これは、"-e" という文字列がサイズゼロかどうか(この場合は2バイト)という
判定がなされるため、$testがセットされていないと真になる。
一方、$testがセットされていると、今度は -e は -eオプションとして解釈され、
$testの中身がファイル名とみなされるため、そんなファイルがなければ偽になる。
更に言うと、-e は Bourne shでは使えないため非推奨。
647 :
名無しさん@お腹いっぱい。 :2007/06/18(月) 15:39:39
>>646 ありがとうございます。
うーーん、なるほど。1行目でよく分かりました。
丁寧に説明してもらった理由を理解したのかしてないのかよくわからん回答だな
このあたりものこともあって zsh で手抜きスクリプト書くことが多くなった
650 :
名無しさん@お腹いっぱい。 :2007/06/18(月) 16:24:47
>>648 舌足らずですみません。
1行目で自分の間違いを気付き、
詳しい説明をしていただいたので助かりました、と書きたかったところでした。
-eオプションの非推奨コメントは特に助かります。
______ / ))) / /// /―――-ミ / 彡彡 // / ヽ)) / 彡彡 iiiiiiiiiiiiiii iiiiiiiiii| / 彡彡 < ・ > 、<・ >l / | ヽ 〉 / ( | | __) | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ / | ≡ /, ――― |ゝ < 馬鹿共にshellを与えるな! / | | L ___」 l ヾ \_________ _ミ l ______ノ ゞ_ | l ヾ ー / | l | | \ー ‐/ | |
>>646 >>更に言うと、-e は Bourne shでは使えないため非推奨。
?????
>>652 教えて欲しいんなら「???」じゃなくて、ちゃんと日本語で書け。初心者君。
ところで-eがないshが標準で載ってるOSってどれ?
Solarisとか。SCOとか。Tru64とか。
>>655 今では使われていないOSばかりですね。じゃあ、-e使ってもいいですねw
つっ、釣られないぞ
>>653 では日本語で書かせていただきます。
私が学習に使用している O'REILLY の「詳解シェルスクリプト」によりますと、
/bin/sh 組込の test コマンドに於ける -e 表現は標準的なものとして記述され
POSIX で定義している旨明記されております。また更に今回の議題の発端である
>>645 質問子の環境と共通する bash 等での独自の拡張に付いて記述した件では、
条件判定構文中の -a 演算子について(非推奨です。 -e を使いましょう)
とまで明記されているものを、使用者の環境の多用性や使用目的の別など勘案せず
一言の下に「非推奨」と断定できる根拠を教えてください。 お願いします。
>>658 「Bourne shでは使えないため」って書いてあるじゃん。
それが重要かどうかは各自が判断すればいいこと。
>>658 POSIXは理想論ばかりで、現実に即してないんだよ。
いくらPOSIXでどうこう言っても、実際に動くかどうかがすべて。
test -e については、Solarisの/bin/shで動かないんだから、
OS共通のシェルスクリプトでは非推奨であるのは当然。
あと、別件で、-e の意味で -aを使ってはいけない(非推奨)なのはその通りだよ。
-a は別に ANDの演算子の意味があって、そちらの意味で使うべきだからね。
わかったら、今後は -e を使うなよ。今まで書いたシェルスクリプトで
-e を使ってるのがあったら、気づき次第直しとけよ。
661 :
658 :2007/06/19(火) 14:12:59
予想通りの回答をどうもありがとうございました。 >>わかったら、今後は -e を使うなよ。今まで書いたシェルスクリプトで -e を使ってるのがあったら、気づき次第直しとけよ。 ご心配有り難うございます。 そもそも機能が曖昧過ぎて過ぎて使おうと思ったことも御座いませんw
予想してたなら聞く必要ないだろ……。 むだに波風立てんなよ。
シェルスクリプトの互換性過敏症な奴っていじると面白いんだよ
ここにもユトラーか・・・・
>>663 export LANG=C とか書いてるのを見ると反応してしまうのは互換性過敏症ですか?
いや寧ろ互換性を指摘できる人がいて有難い
そんなこといって年寄りほめたらわらわらわいてくるぞ。 SunOS 3.5世代の俺なんかまだまだ甘ちゃんだ。
沸いてきてくれ それぞUNIXの面白さの真髄だわ
仕事では一緒になりたくねえけどなw
ようするに、 POSIX が理想論で現実に即していないのは当然の話で、 現実がバラバラだから標準化が必要という理念が生まれたわけですわな。 で、各プラットフォームでそれぞれ POSIX に準拠する姿勢を示していながら どうしても譲れない仕様への拘りがあるから未だに移植性の問題が取沙汰される。 そこの処の理を語らずに、只単に○○では使える or 使えないという議論に 終始するというのは如何にも思慮が浅いと言わざるを得まい。
実社会ではそういうもんだ
携帯電話みたいなものだね いまだに携帯電話つかわないもうろくジジイとかいるかなw
じじいじゃないけど使ってないよ。
うわw
携帯電話使わない仕事というと、医者とかパイロットくらいか
というか、どこが「携帯電話みたいなもの」なのかさっぱりわからん。
痴呆がはじまった?
>>670 こだわりなんかないだろ、準拠するのが面倒なだけだよ。
準拠したからって売れ行きがたいして変わるわけでもないし。
>>675 院内では携帯は使わないけど緊急呼び出しが頻繁にあるような
医者もいるからなぁ。
パイロットは仕事中は使わないけど、そういう意味なら電車の
運転手なんかも同じだな。
て言うか、仕事中とか会社の中に限定すると携帯持たない/持て
ない奴はそれなりにいるし。
ケータイでも3G(高周波のやつ)は大丈夫らしいけど。
使えない奴にかぎって、くだらねえことに拘ってたりする
そろそろUNIXの話にでも戻す?
よしなに
>>678 >>準拠したからって売れ行きがたいして変わるわけでもないし。
売行きが変わらないからって騒ぐこともないでしょ。
拘りがなければ準拠する方がはるかに楽なのにねぇ
あくまで /bin/sh 標準なのは基本であって、実勢はケースバイケースで、
linux じゃ bash 標準だろうし、 solaris だって適宜 ksh なり使うだろうし、
パーソナルユースや $HOME/bin 限定使用とか、管理者でも同一プラット
ホームだけでの運用が多く、移植性のプライオリティーがさほど高くない
現況において、やいのやいのいう奴は要するに「言いたいだけ」ちゃうんかと。
> 拘りがなければ準拠する方がはるかに楽なのにねぇ 何が楽なのか詳しく書いて欲しいんだが。 商用ソフトってちょっと変えると、検証がスゲー大変なことぐらいは知ってるよな?
>>683 Solarisは古いshとkshを選択できるからいいけど、
HP-UXとかAIXは/bin/shはkshそのもなんで選択の余地はない。
シェルごときで移植性とか言ってるアホが多いっていうのは同意。
視野が狭いのって、幸せでいいよね。
そう?いまどきシェルの互換性なんか気にしてる奴って幸せそうに見えないが。
シェルはさまざまなコマンドと組み合わせて使うしな。 コマンドにも完全な互換性がない以上、シェルスクリプトの互換性や移植性を気にし過ぎるのはアホ。 ささっと書いてテストして動きが変だったら、そのとき直せばいい。 シェルってそういうライトな使い方をするためのものでしょ。
互換性のことも知らずに、暢気に [ -e file ] とか、export HOGE=hoge とか書いて、 「動いたからOK」とか言ってる香具師の方がアフォに見えるけどな。
「さくっと直せばいいじゃん」って言ってる奴はだいたい直したことがない奴だし。
そもそも、直す必要なんてない、動くから
何が問題か、具体的に
問題を理解できていないことが問題なんだろ。
互換性がいるのは移植する可能性がある場合だろうかと。 あるいは環境が一部不明な場合か。 ただ、知識としてはあれば有効だろうが
開発当初は特定のシステム限定であったとしても、実社会では いつのまにかそんな制約はなくなってしまうものなのだよ。 ニートにはわからないだろうが。
自分の体験したことが、現実の全てだと思っている
>>697 がいるスレはここですか?
>>698 「全ての」と「存在する」の違いを未だ習ってないのかい? ぼーや
シェルで移植性の高いスクリプトを書くのはめんどうくさいので Perlを使うようになりますた
それはそれで別の移植性の低さが問題になりそうな…
Solarisさえ無くなればシェルの互換性の問題はほとんど解決するよね。
UNIXのソフト開発標準を策定しようという取り組みはたくさんあった。 だがそうした標準は、POSIX(Portable Operating System Interface)のように 一般的過ぎて役に立たないか、あるいはUNIX戦争として知られる Open Software Foundation対UNIX Internationalの企業連合間抗争に 巻き込まれるかだった。
mkmfのようにメタスクリプトを環境依存シェルスクリプトにコンパイルする プログラムがあるといいと思います!
mkmfって、、また古い遺物を持ち出してきたなぁ、、
本当にそんな互換性が必要ならlintの一つや二つとっくにありそうな気がするが、 寡聞にして知らないなあ。
>>706 つ dash #まあ呼び出したコマンドの互換性まではチェックできないわけだが・・・
役に立たない、ただそれだけ
すべてのシェルが/bin/shを名乗るのを止めて /bin/shを永久欠番化すれば解決
なんかすごい扱われようだな。 互換性を述べている人は割とバランスの取れたUNIX流の解釈だと思うぞ
どうせUnixなんて適当じゃねえか varとかetcとか システム変えることになったらどうせテンヤワンヤだ
ということにしたいんですね:)
edで日本語がうまく扱うほうほうがあれば言うことないのだが・・・・
sedにin-placeオプションがなくてperlをよく知らなかったころは edでやってたな
>715 edより先におまえが日本語をうまく扱えるようになる必要がありそうだ
誰がうまいこといえと
てか、蒸し返すようで恐縮だけど シェルスクリプトって、基本的に ash と ksh と bash で動けば 移植性で問題になることは極めて低いよね? この三つで動いても駄目な環境って今どれほど実運用されているのだろうか?
>>719 Solarisが問題だな。Solarisにはkshが標準で付いてるとは言え、
シングルユーザモードでは使えない。
シングルユーザモードを含めたシステムスクリプトは依然、
/bin/shか/sbin/sh(単にstatic linkというだけで中身は/bin/shと同じ)の
範囲内で書く必要がある。
誰かが書いてたように、Solarisが無くなる(もしくは影響力が無くなる)なら、
シェルの互換性の問題は一気に解決するだろう。
Solarisの/binは/usr/binへのシンボリックリンクだからkshやbash使ってもいいんじゃない? /usr/binの中には/bin/kshで書かれたコマンドもけっこうある。 Solarisのshの動きがヘンなのはたしかにときどきちょっと困る。
> Solarisの/binは/usr/binへのシンボリックリンクだから マジで?
> シングルユーザモードでは使えない。 > シングルユーザモードでは使えない。 > シングルユーザモードでは使えない。
>>721 マジだよ。/sbinは別れてるけど。
>>720 は/usrがマウントできない状況のことを言ってるんだと思うけど最近は/と/usrを分けないのもふつうなんじゃないかな。
どっちかっつーとそういう問題でなくて、 ふつースクリプトは#!/bin/shで書くけど/bin/shが何だかわかんねーじゃん? って話では?
ashもいろいろ修正入ってる。 Solarisの/bin/shはそれこそSystemV7のころのものとほとんど変わっていない。
・・・ってシェルを使えじゃなくてPOSIXだか何かのsh規格に沿って書けって事だよな。
>>721 じゃなくて、シングルユーザーモードの時、
/sbin/shはあるが、
/sbin/kshは無い。
/sbin/shはstatic linkの/bin/sh(/usr/bin/sh)
だから、シングルユーザーモードも含めれば、
結局 /bin/shの文法の範囲で書かざるを得ないという話。
しかも、Solarisの/bin/shは古いままなので、
export a=b も、$(command)も test -e も、
ちょっと新しい書き方はすべて使えない。
互換性の話に便乗だけど、 一部のスクリプトで、未だに ${1+"$@"} って書いてあるのがある。 これ、もう "$@" でいいんじゃないか? 引数が0個の時に ""が残らないようにする措置だろうけど、 Solarisの/bin/shですらそんな不具合は発生しない。(確認済み) なので、"$@"と書いて問題ないし、視認性上も "$@"と書くべきと思うんだが。 本当に ${1+"$@"}と書く必要がある /bin/shを搭載したOSって、 現存してる?
>>729 なんか Solaris のシングルユーザモードって不便そうですね。
CD 6枚焼いたけど、インストールを躊躇してしまうよ。
/ と /usr をわけたりしなければ気にする必要ないよ。
>>724 ,
>>726 なるほどねぇ、知らんかったよ。ありがと。
>>730 書き換えるのが面倒なだけなんじゃないか?
目障りだと思うなら、君が片っ端から書き換えて動作検証してあげればいいと思う。
>>732 すんません BSD ユーザなもので、 / と /usr を分けるというのが
イマイチ良く解かりません。
ad0s1a に全部突っ込めって事ですか?
/var も /tmp も含めて・・・(よーするに swap 以外は同じパーテーション?)
Solaris だとそんなの有りなんだぁ。(BSDでも無いことは無いけど、なんだか・・)
OSは別に関係ない。パーティションの切り方なんて好みの問題だ。
>>735 でも、その好みの問題に対して Solaris はシングルユーザモードの
挙動をもってして、ユーザに介入してくる分けでしょう?
>>732 のレスからは、そういう風に読めるのだが?
どうでもいいけどよそでやってくんないかな。
>>730 の ${1+"$@"} てどうゆう意味なの??
なんか理解できん・・・(TT
>>734 NetBSDのデフォルトは分けないからBSDユーザーってのは言い訳にならない。
あと、未だに if [ X$HOGE = X ] なんてのも見かける。これも、 if [ "$HOGE" = '' ] と書いたほうがいい。 むかーしのバージョンのtestで、$HOGEの内容が = だったような場合、 [ = = '' ] みたいになるとエラーになるtestに対する対処として、 X$HOGE とかいう回避法があったけど、今の testコマンドでそれが必要なのは もう現存しないはず。
>むかーしのバージョンのtestで、$HOGEの内容が = だったような場合、 ちがう。 $HOGE の内容が -f だったような場合に対する対処だから、今でも有効。
>>741 $HOGE の内容が -f でも正常に動くんだけど。
[ -f = hoge ] みたいに、項が3つある時は、
-fはファイル存在オプションとはみなされないから
-f だった時駄目になるような/bin/sh搭載した OSって 何?
>>742 a="-f"
b="-a"
c="="
d=""
test X"$a" = X"$b" -a X"$c" = X"$d"
echo $?
test $a = $b -a $c = $d
echo $?
FreeBSD の ash、Solaris の sh, ksh、GNU bash いずれでも異なる結果になりました。
>>743 それは、複数の式を -a (AND) でつないだ場合の話。
それだと確かに式の評価がおかしくなることがあるが、
[ $HOGE = hoge ] なら、X$HOGE とする必要はなし。
Solarisの/bin/sh でも [ -f = -f ] は無問題。
-a 使ってるかどうかで場合わけするより 一律で X$HOGE にしといた方がおしゃれ。
>>745 -a 使う場合は、各評価式ごとに \( \) で括るのを推奨。
[ \( "$a" = "$b" \) -a \( "$c" = "$d" \) ]
↑みたいにね。これで、X"$HOGE" は不要。
>>744 > [ $HOGE = hoge ] なら、
クォート忘れてる。
> X$HOGE とする必要はなし。
ダウト。
そのへんの対バカ性能をどこまで頑張るかはヒューリスティックで実装依存。
たとえばFreeBSDのtestでは
$ HOGE='!'
$ [ "$HOGE" = hoge ]; echo $?
[: =: unexpected operator
2
となるので変数に任意の値を想定するなら "X$HOGE" = Xhoge は依然必要。
常にtestの引数が正しい式となるよう書くにしくはなし。
>>747 氏に聞きたいのだが、
>>730 についてはどうお考え?
${1+"$@"} は以前必要? もう不要で "$@"で桶?
ここでポリシー決めても どこ使うんだろ。
こういう突っ込んだ話まで網羅してる本は無いの?
結局トラディショナルな書式に落ち着くんだよな...
文字列の比較なら [ X"$HOGE" = hoge ] なんてするより case $HOGE in hoge) にするなぁ。 caseだと、たとえ$HOGEの中身が ! だとか -f -a とか特殊記号だったとしても すべて無問題だから。
需要ないだろー
wikiでいいんじゃね
需要とかそういうことに興味あるのかしら?
需要ないだろ。問題になるのSolarisだけだし、Solarisユーザーの人数が、、、
>>757 >>756 が言ってるのは、ユーザーがシェルの互換性に興味あるのか? ってことでは
(需要に興味があるかどうかじゃなく)
今時、シェルスクリプトの本なんて、全く売れないとは言わないにしても
何冊くらい売れるんだ?
このスレでも
>>4 にある本の話なんて全然出ないし。
入門書はそれなりに売れるんじゃないの? そういうの読む人がここの話に参加しづいらいだけで。
getopts は互換性あるの?
>>762 よほど古いシェルじゃない限り互換性ある。でもなぜか出番なくてあまり使わない。
詳説正規表現もこんなのみんな興味あるのかよとかおもったけど 意外に受けたらしいから
互換性があって、どのシェルでも使えるのに、 使ってるの見たことないコマンドの筆頭が readonly だな。
>>763 ありがとうございます。
もうひとつ質問なんですが、ポータブルかつ安全に一時ファイルを作成するにはどうすればいいのでしょうか。
UNIXシェルの新刊はここ2年くらいやたら出たが、 もうこの分野で出ても意味ないわな。 カーニハン&パイクとブルース・ブリンけあればいいんじゃないか。
>>766 どこまでの安全性を言ってるのかわからないけど、
(unask 77; > /tmp/hoge$$)
じゃだめかい?
mktempコマンドは、必ずしもあるとは限らないと仮定するべきなのだろうか?
mktemp(1) を勧める文書は「pidは容易に推測できるので危険」とか書いてますよね。 実用上はほとんど問題にならないのでしょうが、気持ち悪いので何か安全な方法があるのかお尋ねしました。
本当に安全でないといけないなら、 mkdirとかでちゃんとロックして、 失敗したら別の名前で試すとかするしかない。 作るディレクトリのパーミッションちゃんとしとけば 推測されてもかゆくもないでしょ。
cat /dev/urandom | od -x
>>771 /dev/urandom はポータブルではないわけで、、
こういう時はお約束だろ
>>771 catが無駄です。
正規表現もそれぞれで実装がまちまちなのに、なにを言ってるのか
そもそも正規表現エンジンが内蔵されてる sh なんかあったっけ?
詳説シェルスクリプトが必要とされているな
なんで正規表現の話が出てきたんだ?
774さんの説明に期待
激しくどうでもいいが、Solarisの/sbin/shは動的リンクされているぞ。 ていうか、間違いだらけの知識を持ってるやつほどSolarisをバカにする傾向があるな。
>>779 Sol10 からね。Sol9 までは static link。
最近Solarisを使いだした奴に限って、Solarisをマンセーしたがる傾向があるな の間違いでした
>>748 747じゃないけど "$@" -> ${1+"$@"} とするのは set -u でもエラーにならない為かと
すくなくともある環境では0を除いた位置変数が未設定なら前者はパラメータ未設定エラーになるから
別に""の互換性の理由だけで${1+"$@"}にする訳ではないでしょ
783 :
782 :2007/06/30(土) 16:14:29
誤) 為かと 正) 為でもあるかと
>>782 実際に ${1+"$@"} が使われてるのは set -u のところじゃない。
コマンドのラッパーで引数を渡す時の話。
なので、
>>782 の話は当たっていない。
${1+"$@"} と書くのは、位置パラメータがない場合に 空文字列が残らないようにするため。 他に、${@+"$@"} という書き方もある(あった)。 今議論になってるのはそこじゃなくて、 未だに ${1+"$@"} が必要なシェルが現存しているかどうか、 現存しているなら そのOS名は? という質問。
>>784-785 「でもあるかと」と訂正してるんだが
実際 set -u 設定状態でコマンドラッパーに"$@"で渡そうとしても
$@ を評価(展開)する段階で未設定と判定された訳で
空文字列が残るかどうかなんて今時大抵解消されてるでしょ
幾つかのOS、幾つかのB系シェルを触ったことはあるけど個人的には見たことがない
ただ単純に ${1+"$@"} -> "$@" として問題ないか?と聞かれたら
set -u で問題が起きるからダメだと
>>786 で、その set -u で問題が出たOSって何?
788 :
782 :2007/06/30(土) 18:25:32
上の文、言葉のチョイスが変だわ もともと空文字列対応で今時 ${1+"$@"} とする必要はあるか?かもしれんが、 たとえその為の対応が不要になったとしても、${1+"$@"} -> "$@" にしていいことにはならんよと言いたい 理由は以下のスクリプトを実行するとエラーになる環境もあるからと #!/bin/sh set -u echo "$@"
>>788 だから、そのエラーになる環境は何なのかと。
俺のところの *BSD/Solarisとあと犬で、エラーになるのはひとつもないのだが。
>>789 そのSolarisじゃないの? ほんとに試してみた? バージョンによるのかな?
結局互換性の最大の問題はいつもSolarisだなww
古いSolarisで見限っちゃったやついっぱいいるからな いまのSolarisをしらない奴がいてもしょうがない
792 :
名無しさん@お腹いっぱい。 :2007/07/03(火) 01:38:27
今のソラリスは早いの? おそーーーーーーーーいので、あまり使いたくない。
昔からCPUなりのスピードは出てると思うがな...
rm -rf /なんてもう古い 時代はmv /bin /ms.green
795 :
名無しさん@お腹いっぱい。 :2007/07/04(水) 22:29:33
誰か教えて。Bシェルで test 1000000 -lt 9999999999 の結果が正にならないんだけど。数値型の値に制限とかあるのかな?
>>795 bashだと無問題。「正」じゃなくて「真(0)」な。
797 :
名無しさん@お腹いっぱい。 :2007/07/04(水) 22:35:06
小さい値だとちゃんと真(0)になるんだけどなんでかな。
>>795 実装依存だな。シェルによっては 31bit整数最大の 2147483647 が扱える最大値。
799 :
名無しさん@お腹いっぱい。 :2007/07/04(水) 22:37:55
>>798 ありがと。ちなみに対処法って何かあったりする?違う言語使うしかないか。
>>799 bcに喰わせるとか。bcだともっと大きい数まで扱える。
echo '1000000 < 9999999999' | bc
bcでは、testとは逆で、真の場合1になって、それが標準出力に出る。
801 :
名無しさん@お腹いっぱい。 :2007/07/04(水) 22:55:38
ありがとう。試してみます。
802 :
名無しさん@お腹いっぱい。 :2007/07/05(木) 22:47:11
ipアドレスを0101って2進数にするにはまず・・・・・・・・なにすればいいの?
小数点までを取り出す
こんなのでどうだろう (echo obase=2; echo 1.2.3.4 | tr '.' '\012') | bc | xargs -n 1 printf %.8d
もちょっとカイゼン: 旧:(echo obase=2; echo 1.2.3.4 | tr '.' '\012') | bc | xargs -n 1 printf %.8d 新:printf %d%.8d%.8d%.8d `echo obase=2.1.2.3.4 | tr . \; | bc`
shebang が #!/bin/shのシェルスクリプト test.shを PATHの通った$HOME/bin に置いたところ、 tcsh では $ test.sh で動作するのに、 bash では $ test.sh で動作せず、 $ bash -c test.sh でも動作しませんでした。 /usr/local/bin/以下に置いたところ、 bash上の $ test.shは動作しましたが、 やはり、$ bash -c test.sh は動作しません。 この原因は、どのあたりにあるのでしょうか。 ヒントでよいので教えてください。
>>806 (t)cshと(ba)sh では、PATHの変数が違う。本当はPATHを通し忘れているというオチ。
あるいは、.bashrcでPATHが再設定されてしまっているとか。
808 :
806 :2007/07/06(金) 10:42:36
>>807 bash上で、$ set | grep PATH すると、$HOME/binも入っているのですが、
やっぱり、PATH関係っぽいですよねぇ。
$ bash -c test.shができないのが気持ち悪いです。
ちなみに、$ $HOME/bin/test.sh では実行できました。
>>808 setじゃなくて、printenvで確認した方がいい。
シェル変数のPATHのみセットされていて、exportされてない可能性がある。
すると、bash -c とかやった時、新しいbashにはPATHが引き継がれないから、
そういう現象が起きる。
810 :
806 :2007/07/06(金) 10:59:27
>>809 exportされないというのは盲点でした。
おっしゃるとおり、
$ printenv | grep PATH
をしたところ、$HOME/binも含まれていました。
一応、.bashrcでの設定はきいているんですよね。
ググったところ、Cygwin上では、
bashのバグ?かなにかで、bash -c がきかない現象があるようです。
遅くなりましたが、自分の環境は linux 、bash 3.1 です。
ユーザ名だけ伏せていいから、完全なスクリーンダンプ出せ
812 :
806 :2007/07/06(金) 12:10:14
>>811 席を外していまして、遅くなってすいません。
スクリーンダンプは以下のようなものでよろしいでしょうか。
実はtest.shは、navi2chインライン画像表示のためのシェルスクリプトで引数もとります。
i) bash上で実行
$ bash --verbose -c navi2ch.makethumb
http://www.google.co.jp/intl/ja_jp/images/logo.gif navi2ch.makethumb
$ sh -x navi2ch.makethumb
http://www.google.co.jp/intl/ja_jp/images/logo.gif + tmp=/tmp/navi2ch-thumbnails
+ origfile=/tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif
+ thumbfile=/tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg
+ thumbsize=300x150
+ '[' '!' -f /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif ']'
+ '[' -z '' ']'
+ /usr/bin/wget
http://www.google.co.jp/intl/ja_jp/images/logo.gif -q -N -x -P /tmp/navi2ch-thumbnails
+ '[' '!' -f /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg
+ thumbsize=300x150
+ '[' '!' -f /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif ']'
+ '[' -z '' ']'
+ /usr/bin/wget
http://www.google.co.jp/intl/ja_jp/images/logo.gif -q -N -x -P /tmp/navi2ch-thumbnails
+ '[' '!' -f /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif ']'
++ identify -format %n /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif
+ scene=1
+ '[' '!' -s /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg -o /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg -ot /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif ']'
+ '[' 1 -gt 1 ']'
+ convert -sample 300x150 /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg
+ echo -n /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg
/tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg
813 :
806 :2007/07/06(金) 12:13:07
>>812 上の方の
$ bash --verbose -c
では、画像は取得されませんでした。
下の方の
$ sh -x
は、画像が取得されました。
なんかよくわからんけど フルパス指定じゃだめ?
改行コードが CRLF になってないか?
>>812 test.shが問題だというから、
ちゃんと問題を切り分けて小さくしてるのかと思ったら、それかよ
.bashrcの中身も、printenv PATH そのものも、隠さず出したら?
817 :
806 :2007/07/06(金) 12:52:00
/usr/local/bin/下のnavi2ch.makethumbを消し、~/bin/navi2ch.makethumbだけにして、
もう一度試したところ、bash上でも
$ navi2ch.makethumb 引数
が実行できました。
しかし、
$ bash -c navi2ch.makethumb 引数
は、やはり実行できませんでした。
>>814 フルパス指定だとbash上でも実行できます。
一応、回避策として、/usr/local/bin/に置いているので、具体的な支障はないのですが、
"bash -c"だけがうまく動いてくれないのはなぜだろうと不思議に思って、質問しました。
だから、本当はこんなにレスしていただくほどのことでなくて、申し訳ないです。
>>815 nkf でチェックしたところ、EUC-JPでした。(環境はja_JP.UTF-8)
cat -v で見ても、改行コードらしきものはありませんでした。
PATHの問題は知らんけど、引数を渡すのなら bash -c 'navi2ch.makethumb 引数' じゃないと駄目だろ
819 :
806 :2007/07/06(金) 13:07:41
>>816 #!/bin/sh
echo test
のようなシェルスクリプトですと、~/bin/以下に置いて、
$ bash -c test.sh
test
と実行できます。
$ printenv PATH
/home/mona/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
ふだんbashを使っていないので、~/.bashrcはありものです。
~/.bashrc
PATH=$HOME/bin:$PATH
↑とりあえず、これだけにしました。
これでもやはり、
$ bash -c navi2ch.makethumb
http://www.google.co.jp/intl/ja_jp/images/logo.gif では画像を取得できませんでした。
"bash -c"はいろいろときびしそうですね。
820 :
806 :2007/07/06(金) 13:12:21
>>818 $ bash -c 'navi2ch.makethumb 引数'
で画像を取得出来ました。
超基本的なことに気付かず、おさわがせして申し訳ないです。
どうもすみませんでした。
ほんとうにごめんなさい。
821 :
名無しさん@お腹いっぱい。 :2007/07/15(日) 17:20:37
>>821 よく見ろ。-INT と -KILL で違うだろ。
本当だ。失礼しますた。
824 :
名無しさん@お腹いっぱい。 :2007/07/16(月) 22:04:04
シェルスクリプトでif文に正規表現による文字列一致条件を記述できないでしょうか? sedなどを使ってやればできないことはないですが、 if文一発でできればいいなと。。
>>824 できない。
正規表現と言ってるが、実際にはワイルドカードで十分なことが多い。
ワイルドカードなら ifの代わりに caseを使えばできる。
case使え。
モレはいっつもテストコマンドの中でegrep使ってるけど・・・・素人なのでアフォな事やってるのかも。
if expr $string : $regex >/dev/null; then ...
>>827 機能・性能に問題なきゃそれで充分だろ。
コンピュータ (て言うか、道具) なんて楽するためにあるんだから。
830 :
827 :2007/07/17(火) 23:45:10
831 :
名無しさん@お腹いっぱい。 :2007/07/22(日) 20:41:39
UNIX上からリモートでWindowsのバッチを起動させるシェルスクリプトを 作りたいのですが、実装イメージがまったくわからず困ってします。 Win相手に対してrshは使えないであろうし。。。何かいい方法をご存知の方 いらっしゃいませんか。よろしくお願いいたします。
スレ違い
>>831 Windows が 2k / XP なら、telnet でどうぞ。
836 :
824 :2007/07/22(日) 23:08:49
実行時間は case < expr < sed だったので 結局、caseにしときました。
837 :
831 :2007/07/22(日) 23:48:25
>>833 >>835 アドバイスありがとうございます。cygwinについて
あまり知識がないので調べてみます。
>>834 telnetで可能ということは、Win上でtelnetサービスを
稼動させておけばいいということでしょうか?
明日にでも実施してみようと思います。
ありがとうございました。
> telnetで可能ということは、Win上でtelnetサービスを > 稼動させておけばいいということでしょうか? 手元の 2k だと特にわざわざ入れた覚えはないから、多分 標準で入ってると思う。 サービスの中に telnet ってあるはずだから、それを起動 するだけ。 常用するなら、スタートアップの種別を「自動」にする。
telnetは対話型だから、ダメというかめんどくさいだろ。
expectとか使えばいいだけじゃないの?
下記のようなファイル検索をするシェルを作ったのですがうまく動きません #!/bin/csh echo 検索するファイル名を入力してください: set filename = $< (find /* -name $filename -type f -print > /dev/tty) > & /dev/null 「hoge.txt」を検索する場合はうまくいくのですが、 ワイルドカードを用いた「hoge\*」の検索をすると検索を行わずに一瞬で終了してしまいます。 setで変数に"\*"を入力するのは不可能なのでしょうか?
今日はカレーにする
・シェルスクリプトのことをシェルってゆーな クオートすれば?
シェルってゆうな。クズ。 csh捨てろ。クズ。
スルーカ
>>843-845 すんまそん、会社でシェルシェル言ってるもんで癖がついてました。
クオート試してみることにします。
cshは会社の都合なんすよ
>>847 最初の行に
sh
と書きゃいいじゃん。
>>848 実社会で勉強してね
cshからshに変えるのは容易ではないのだよ
シェルスクリプトは1人で作るのではないし
1つの会社で作るものでもない
つまり、1人だけではなく1つの会社だけでもなく、
いくつもの会社にまたがって何人もの人がよってたかって
>>841 みたいなスクリプトを書いているわけだな。すげぇ。
つーか、csh を使うにしてもせめて #!/bin/csh -f にしろよ。
>>841 の例は、わざわざcshの欠点が目立つような典型例だな。
ワイルドカードの展開の問題とか、
findのstderrを捨てるために苦労してるところとか。
そもそも、findをインタラクティブに実行させるようなスクリプトは、
システム管理用スクリプトじゃない。初心者ユーザー向けに作ったものだろ。
こんなの、/bin/shで書き直せば一発。
>>841 が抱えているcshでの問題も一気に解決する。
>>849 へ。
みんな実社会で「cshスクリプトは使わない」が常識だといってるんだよ。
>>849 は自分の会社名を公表しない方がいいよ。会社の不名誉になるからね。
cshじゃなきゃだめな会社ってどこ?
853 :
849 :2007/07/25(水) 14:57:09
>>851 ま、会社名を挙げる気は無いけど、
おれんとこでは全部のスクリプトがcshだし
スクリプトの作成・保守を依頼している会社も
cshで作るようになっている。
OSが古いもの・新しいものが混在しているのも
理由ではあるが、
常識など、会社によって違うものだろ。
シェルがダメなのは分かるが、
シェルを変えろとか無理な話だ
HP-UXでkshを使っているのですが、C-p・C-nで履歴検索ができるとmanpageに書いてあるのですが、 実行しても何も起きません。 どうすればよいのでしょうか? また、linuxのbashみたいに↑↓キーで履歴表示をしたいのですが、 kshで実現可能でしょうか?
>>853 > OSが古いもの・新しいものが混在しているのも理由ではあるが、
/bin/shが存在しないUnixなんて無いんじゃないのか
> シェルがダメなのは分かるが、シェルを変えろとか無理な話だ
へえ。cshがダメなのははるか前からの常識なのに、誰もその
やりかたを変えようとせず、変えるのは「無理」だと思ってるんだ。
しかも古いスクリプトだけでなく、新しいスクリプトもわざわざ
cshで書き、ゴミを製造し続けていると。
勿論、C++やJavaやPythonなんて誰も使わないんだろうな。
ソース管理は未だにCVSでさえない、いやソース管理なんて概念もないね?
お前さんがアホなのか、会社がアホなのかは知らないが、実に見事に
アホだな。
会社の都合なら仕方ないんだから そんなに必死に弁解しなくていいよ
>>853 だってさ、起動スクリプトとかOSに元々内蔵されてるスクリプトはshだよね?
そういうスクリプトを修正する時も、cshで書き直してるの?
棄てる気になれば簡単に捨てられる。棄てられないのは
>>853 がヘタレなだけ。
恐ろしいことにうちはコーディングルールでcsh使うことになってるorz おまけに最近スクリプトでsql実行してるのを、「COBOLで実装しろ」って指摘された… SQLの使い方調査があって、スクリプトが調査範囲から漏れたからだと。
>>859 つまりOSインストール時からあるスクリプトも全部cshで書き直してるって事か?
間違っているルールを変更できないなんて将来の無い会社だな。
袋叩きw csh好きな勉強不足の若者の脳内会社なんだから許してやれよw
某社と某社はcshだったな 皆さんがんばってね
古いBroadVisionなんかだと、パッケージに cshで書かれたシェルスクリプトがいっぱい付いてくるから 仕方が無い
会社で使うシェルスクリプトなんてコマンド順番に起動して 戻り値チェックするくらいのもんだからな。
それですむならそれでいい
ジュセッペさんお元気?
869 :
名無しさん@お腹いっぱい。 :2007/07/27(金) 00:19:38
Zshまんせー
>>866 俺はシェルスクリプトがないと会社で生きて行けんが。
これお勧め: つ ln /bin/sh /bin/csh もっといいのは#!起動された時にスクリプトを調べて 昔からのcshスクリプトなら「しょうがなく」csh、じゃなきゃ shにディスパッチするようにするとか。Linuxなら簡単だな。
まぁ、/bin/shのシェルスクリプトを書かせたらbashスクリプトを書きやがったとか *.shのファイルを開いたらbashスクリプトだったなんて事を無くす為なら cshしか使うなってのもありかも知れん。
ないないw
20年モノのcshスクリプトが10万行単位である とかね
csherは平気でコピペで行数倍増するから10万行も妄想じゃないな。
そんなコードだったな
昔、(偽装)派遣で行ったところは csh が標準だったよ。 ひ孫請の俺がルールを変えるなんて無理だった。 当然ソース管理なんて概念もない。ファイルはタイムスタンプ (mtime)で管理してたよ。もー馬鹿かアフォかと。 とりあえず、自分のコードは SCCS で管理してた。 当然フリーソフトウェアなんて得たいの知れないものは 使用禁止。 まだあの会社あるかな…
某独立系大手とか 某システム系大手とか
879 :
名無しさん@お腹いっぱい。 :2007/07/28(土) 01:05:38
folder>------folder1---test | ---folder2---test folder1内にある実行ファイルtestを実行して、 その終了を待って、folder2内のtestを実行する というスクリプトを作ったんですが、folder2の実行が行われません。 どこがいけなかったんでしょうか?ご教授ください。 #!/bin/sh for i in 1 2 do cd folder$i nohup test wait $! cd .. done
まず、なんでいちいちwait入れるのかわからん。 ほっとけば、終わってからしか次が実行されんだろ? あと、本当にtestって名前なのか? /bin/testかビルトインのtestが動いてるだけでは?
881 :
879 :2007/07/28(土) 01:24:56
>880 実際は、testっていうプログラムじゃないんですけど、 実行すると1日くらい走り続けるものです。 wait入れなくて実行したら、二重に実行されてしまったので。 二重に走らないようにしたいので、wait入れたのですが。
実行したいモノを列挙すればいいんじゃね? それで満たせない要件は後だしでくるような気もするけど
cronかなんかで後から起動しちゃってるだけ? waitって子プロセスの終了待つだけなんだから バックグラウンドで動かさん限り無意味
884 :
名無しさん@お腹いっぱい。 :2007/07/28(土) 03:15:41
awkについて質問です。 echo "<tr><td></td></tr>" | awk '{print $1, $2, $3, $4}' とすると、以下のように分解して代入されるようにしたいのですが、 awkのオプションをどのように指定すればよいでしょうか? (同じことができるなら、awk以外でも構いません) $1=<tr> $2=<td> $3=</td> $4=</tr> よろしくご教授お願いします。
sed 's/></> </g' < "<tr><td></td></tr>" | awk '{print $1, $2, $3, $4}'
< "<tr><td></td></tr>" この部分は何だ?
そのくらいわからないのか <tr><td>< というディレクトリの下に td>< という子ディレクトリがあって、その下に tr> というファイルがある。 その内容が <tr><td></td></tr> なのだ。
hagewarosu
>>884 なんで echo の中で FS 使っちゃいけないの?
おばあちゃんの遺言で
891 :
名無しさん@お腹いっぱい。 :2007/08/01(水) 00:31:16
for f in 'ls -1' do echo ${f} done とか for s in 'cat hoge.txt' do echo ${s} done なんかは、基本だな
if分で「$numbarが10から1000の間なら」という分岐は可能でしょうか? if [ $numbar = 10 -o $numbar = 11...] と地道に書いていくしかだめですか?
っman test
case $number in [1-9][0-9]|[1-9][0-9][0-9]|1000) .... ;; esac
>>893 [ "$number" -ge 10 -a "$number" -le 1000 ]
>>897 引っかけ問題に引っかかりましたねぇ。
>>893 の問題では、シェル変数名は number じゃなくて numbar
前任者から引き継いだスクリプトとかで変数名がミススペルで、
自分が正しいスペルで書き足すと動かなくて1日悩むこと、よくあるでしょ?
そのための練習問題でした。
900 :
名無しさん@お腹いっぱい。 :2007/08/02(木) 20:28:27
バージョンの略を var と書いてしまう奴は結構いるよな。
見たことないぞそんな奴。
スペルミスならもっと酷いのをいくらでも見たことがある
ここで伝説のuwariteが登場。
>>898 シェルスクリプトごときで1日も迷うねーよ。
それと、From:見る癖つけたほうが良い。
「対話的な利用についての話はスレ違い」ってあるけど、 どこに逝っていいのか教えて頂けないでしょうか〜 expect があることは知ってるけど、 インストールが必要だからダメだって。 とりあえず、どういう選択肢があるか知りたいです。 あと perl の話になるんだけど、 Expect.pm を Makefile.pl とか CPAN での インストールをしないで(起動ディレクトリにモジュールを置くだけとかで) 起動する方法があれば、誘導をお願いしたいです。
>>907 ポエム?
なんかアフォ扱いみたいな感じだけど、
変なこと書いてるんかなー? よく分からん。
とりあえず反応ありがと。
>906 は対話的の意味を勘違いしているに一票
>>906 インストールがダメって言うなら、現行環境に入ってる使えそうな道具立てはなんなのよ?
それとは別に、「対話利用についての話題禁止」の意味をつかめてないに一票
で、結局何をしたいのよ?
>911 やりたいことをできるだけ具体的に
今度、会社で、シェルを使わなければならない可能性が発生する恐れがあるかも知れない状況になる兆しが出て来ました。 とりあえず初心者がシェルの方を始めるには、どのシェルの方から始めればいいでしょうか? 開発ツールの方とか、デバッガーの方はGUIの方であるんでしょうか? できればフリーの方を希望します。
915 :
名無しさん@お腹いっぱい。 :2007/08/03(金) 18:11:06
>>914 > 可能性が発生する恐れがあるかも知れない状況になる兆しが出て来ました。
それぞれ20%と仮定すると、4段階あるから、0.16%だ。
悲観的すぎー
どれがいいかは会社に聞け。 GUI はないと思っていい。
まず日本語を勉強したほうがいいと思われ
面白いと思ってやってるんだろうか? 低脳としか比喩できない釣りだ。
>>906 push(@INC, '/home/hiroyuki')
とかやればモヂュールのサーチパスに追加されるんじゃないの?
>>916 wishとかwkshとかPowerShellかもしれないじゃないか!
>>921 悔しいのか? でもつまらんものはつまらん。
おや、
>>914 が餌をまいているのに、
「シェルってゆーな」の人が登場する可能性が発生する恐れがあるかも知れない状況になる兆しが出て来ませんねぇ
シェルってゆーな
>>926 それを言うなら、送り仮名が違う
×虞れ
○虞
ただし、「虞」は常用漢字じゃなく、現在では「恐れ」と表記するのが標準。
ぐぐってみても、「○○する恐れ」は多数ヒットするが、「○○する虞」はごくわずか。
>>924 お前、センスが皆無な上に致命的に頭悪いな。
> シェルスクリプトをシェルとゆうな。
なので、
>>914 は(呆れるほどつまらない釣りだが)誤用無し。
929 :
926 :2007/08/04(土) 14:34:15
>>927 うちのAnthyはそこまでバカじゃない。
送り仮名は「敢えて」俺が書き足した物。
>>ぐぐってみても、「○○する恐れ」は多数ヒットするが、
>>「○○する虞」はごくわずか。
世の中全体が、バカになって来たということですな。
(負の)probabilityをterribleと表記することの
とんでもなさに違和感を感じないとはねぇ・・・
>>929 英語でも I'm afraid ... って言うじゃん。
単に可能性だけじゃなく、もしそうだったら困ると言うニュアンスがあるから
「恐れ」で的確。
いいことに対しては確率が低くても「恐れ」とは言わないし。
ちなみに、probabilityは 0 <= probability <= 1 でしか定義できない。
負のprobabilityなんて言ってる時点で、お前数学も苦手だっただろw
悪い事象の発生するおそれって意味じゃないの。 930はprobability=(数学的)確率というバカの一つ憶えしかしてないから 早合点したんだろう。蓋然性って日本語知ってるか?
>>931 確率を蓋然性と言い替えたところで本質は変わらない。
(数学以外でも)「負の確率」なんて存在しない。
「負の確率」という言葉が出てしまった時点で、アンタの負け。
933 :
931 :2007/08/04(土) 16:15:22
てんで指摘を理解してないな。俺は929じゃないし。 日本語も英語もダメな人みたいだね。
もし「悪い事象が起きる確率」のことを「負の確率」と言ったのなら、
それは数学だけじゃなく日本語としてもおかしい。
確率を理解していないことになる。
よって、
>>931 のように弁護しても、やはり
>>929 は間違い。
935 :
931 :2007/08/04(土) 16:21:39
やっぱり理解してないなw
>>934 は負の遺産とか負の感情とかいう言葉も使わないんだろうな。
>>936 負の遺産は本当に「負」だろうが。
借金はマイナスの遺産。マイナスだからこそ「負」と言って正しい。
ところが、確率は絶対に「負」にはならない。
負の確率なんて存在しない。
新聞でも、「…する恐れ」って書いてるよ。
>>936 は別の意味で「負」を理解してないなw
937は借金のことを負の遺産というと思ってるのか。
>>939 借金が負の遺産として一番わかりやすい例ということだろ。
いずれにしても負の遺産はマイナスのものに違いない。
で、「負の遺産」を持ち出しても、「負の確率」を正当化することはできない、
という点は理解してますか?
じゃあ負の感情についても論破してみて。
>>941 好感度を数値化できるものとする。
平常心での好感度は0で、何かに好感を持った時プラスの好感度になる。
逆に嫌悪感を持てば、マイナスの好感度になる。
マイナスの好感度は「負の感情」と言ってもいい。
だから「負」で正しい。
(だから「負の確率」を肯定する材料にはならない)
そうだな。 どうせ表現するならエロでやってくれなきゃわからん。
漢和辞典ひいてみると、虞の項目には「可能性」という文字はないが、恐れには「可能性」と書いてある。 どちらの項目にも「心配する」の意味はある。 広辞苑でも、恐れのほうが虞より先に載っている。 probabilityは見こみで考えたらいいじゃないかな。
>>945 邪魔だと言っている。
意味が分からないならお得意の広辞苑を引いてくれ。
947 :
名無しさん@お腹いっぱい。 :2007/08/05(日) 18:41:23
エアコンの室外機が壊れたんですが お金がないのです どうしたらいいでしょうか?
948 :
926 :2007/08/05(日) 18:59:36
>>930-945 夜勤明けに遊びに行って、帰ってきたらば
この有様w
板違いだけど感受性がおもしろすぎて、嬉しくなるねぇ。
ちなみに(負の)probabilityってのは、
negativeな蓋然性の意味で用いた訳だが・・
あ、あと「マイナスの確率」ってのも
概念的には存在しうるね。
(数学ではなく統計学になるけど
日本語として間違いでは無いよね)
虚数よりは遥に理解しやすい。
>>948 土曜に夜勤か。ご苦労さん。
俺は優雅な休日だった。
>>948 符号付(確率)測度なんて、数学では大して珍しくも無い概念だが…?
951 :
名無しさん@お腹いっぱい。 :2007/08/06(月) 07:38:00
ハッシュ汽盆!!
自己顕示欲の固まりが集まるスレはここでつか?
その確立200%
まあ、おれは例外だけどなw
200%も突っ込みどころだろw
すみません。 シェルスクリプトというかコマンド一発で デバイス(eth0とかeth1とか)を出力することってできますか? もしよかったらコマンド一発でおしえてください。お願いします。
くだ質へいきなさい。
すみません。 シェルスクリプトというかコマンド一発で デバイス(fxp0とかde1とか)を出力することってできますか? もしよかったらコマンド一発でおしえてください。お願いします。
つまんね。
>>960 まずはいっぱつやらせろ。話はそれからだ。
アッーーーーーー!
ふむ analyzeってことか
くそつまんねえネタはやめろ
ふむ お通じ快適ってことか
くそスレ化するかどうかのふんばり時だな
968 :
名無しさん@お腹いっぱい。 :2007/08/09(木) 21:06:16
CentOS Linux on Xen tcsh 6.13.00 たまになんだけど、 cd dir ls | echo 1 ls | echo 1 ; echo ってやったあとに ls って打つとtcshが固まるのは何故?? バージョンあげれですかそうですか。
>>968 それはXenとかCentOSにフィードバックしてあげれば?
スレ違いとか板違いっぽいけど
971 :
名無しさん@お腹いっぱい。 :2007/08/09(木) 21:12:46
>969 はえーなw そうするわ<フィードバック 再現できた。 ls | echo 1^C ls
aシェルの中でbコマンドをバックグラウンドで実行した場合、 bはまだ実行中だけど、aが終了したときにbにシグナルを送って強制的に終了することってできますか?
>>972 trap "kill $pid;kill -0 $pid && { sleep 1;kill -9 $pid; }; :" EXIT
>>973 trap: Illegal number: EXIT
>>974 trap "kill $pid;kill -0 $pid && { sleep 1;kill -9 $pid; }; :" 0
スクリプトで排他制御をする手っ取り早く確実な方法は何でしょうか? セマフォ使えればいいんだけど、そんなコマンドないもんね・・・
>>973 ありがとうございます。
ちなみにSIGKILLはどうしようもないですよね・・・
子の側でときどき親が生きてるか確認する、とか。
>>976 FreeBSDには
LOCKF(1) FreeBSD General Commands Manual LOCKF(1)
NAME
lockf -- execute a command while holding a file lock
がある。
>976 lockf は簡単だけど無ければ mkdir を使うんじゃね?
981 :
名無しさん@お腹いっぱい。 :2007/08/11(土) 19:03:37
ksh93での質問です。 typeset -A で連想配列を使用したいんですが、ksh93でKey値の一覧を取得する方法ってあるんでしょうか? (Perlでいうとkeys関数みたいな感じで)
ksh93をつかっているUnixってあるんだな。
983 :
名無しさん@お腹いっぱい。 :2007/08/11(土) 21:25:48
>>982 ソースが公開されてんのって、ksh93だから、LinuxやFreeBSDとかでもpdksh以外のkshを使おうとすると、ksh93になるよね。
逆にksh88的に使いたいならpdkshになるんだけど、pdkshはpdkshでksh88とは振る舞いが結構違うのでいたいところがあるね。
商用系のUnixだと、AIXは/bin/ksh93がksh93、/bin/kshはksh88。HP-UXやSolarisはどうなんだろ?一応、ksh93は存在するみたいだけど・・・
HP-UX11iv1とSolaris8/9/10はksh88しかない。
posix-sh をつかうとか