1 :
名無しさん@お腹いっぱい。 :
2010/11/20(土) 08:29:39
5 :
1 :2010/11/20(土) 08:37:45
テンプレ貼り終了。 関連スレのURL変わってたんで、付け替えますた。
乙 最近本出てないのかねぇ。 まぁ新しい話題があるわけじゃないのでコンスタントに出るはずはないのだが。
ls -a .otsu
9 :
名無しさん@お腹いっぱい。 :2010/11/23(火) 17:01:26
killしたいプロセスのIDが書かれたファイルaho.txtがあります。 %cat aho.txt 123 456 789 012 このプロセスを順にkillする場合、どのようなシェルスクリプトを書いたらいいでしょうか?
>>9 for i in `cat aho.txt`; do kill $i; done
または
kill `cat aho.txt`
何らかの同じ文字が連続していれば、その行を表示したいです。 AABB ABCD AADD だったら AABB と AADD grepの正規表現でそういうことはできますでしょうか?
grep '\(.\)\1'
14 :
12 :2010/11/27(土) 23:15:19
grepでも後方参照できるのか まだ未確認だけどありがとう
16 :
名無しさん@お腹いっぱい。 :2010/11/28(日) 01:48:40
grepとegrepとfgrepの違いは把握しておく方がいい。
17 :
名無しさん@お腹いっぱい。 :2010/11/29(月) 16:00:02
いまでは古典?と言えるが、「UNIXプログラミング環境」も手元に 置いてほしい本。最近の本では、より難しいことも書かれているがこの 本の内容を知らないがために繰り返される基本的質問があまりにも多い。
>>17 20年近く前に自分が読んだ時点でも既に古さを感じたが、今読むとどう感じるんだろうか
逆に古さを感じないのかもね。当時は UNIX USER が創刊されたばかりで、太田純さんの
連載がシェルスクリプトとの出会いだったなあ
grepをfgrepに置き換えただけで何10倍も捗ることがあるから 侮れない。「正規表現ってなに?」ってレベルでUnix弄ってるのなら、 grep→fgrepに全部置き換えてしまえばいい
あとawkとかperlに巨大テキストを食べさせるときも、 前段でfgrepしておくと捗るよ
20年以上昔には成り立っていたバッドノウハウだな。 今は grepもfgrepも速度はほとんど変わらない。 (むしろfgrepは速そうな名前の割りに遅いことで有名だったんだが) パイプ前段でfgrepで前処理するのも不要。 昔の常識がいつまでも通用すると思わないことだな。
22 :
名無しさん@お腹いっぱい。 :2010/12/14(火) 18:23:59
>>21 バッドノウハウ(笑)
ちょっと手を動かしてみればすぐに実感できるお
ちょっと手を動かしてみた。 $ time for i in {1..5000}; do grep localhost /etc/hosts >/dev/null; done real 0m15.299s user 0m3.004s sys 0m5.896s $ time for i in {1..5000}; do fgrep localhost /etc/hosts >/dev/null; done real 0m18.646s user 0m4.784s sys 0m6.616s $ 実感できなかった。
速度に関しては、 fgrep < grep < egrep (左ほど遅い) が常識。 fgrepの存在意義は、^ とか $ とかをエスケープなしで普通の文字列として使えるという 仕様の違いのみ。fgrepよりも egrep使った方が速い。
% gzip -dc /var/log/messages.72 | wc -l 204269 % time gzip -dc /var/log/messages.72 | egrep Jan | wc -l 55 real 0m3.424s user 0m3.712s sys 0m0.025s % time gzip -dc /var/log/messages.72 | fgrep Jan | wc -l 55 real 0m3.402s user 0m3.684s sys 0m0.036s % time gzip -dc /var/log/messages.72 | awk /Jan/ | wc -l 55 real 0m0.417s ←ワロス user 0m0.663s sys 0m0.050s % time gzip -dc /var/log/messages.72 | perl -nle '/Jan/&&print' | wc -l 55 real 0m0.392s ←ワロス user 0m0.675s sys 0m0.042s 結論 .?grepはウンコ
>>27 おまえが測ってるのは gzip -dc の時間だ
>>28 それは /usr/bin/timeとかの外部コマンドを使った場合の話。
timeは外部コマンドじゃなくて、シェルが直接管理して動くもので、
パイプライン全体の時間を計るようにできてる。
$ time sh -c 'echo hoge; sleep 1'| sh -c 'cat; sleep 1' hoge 1.01 real 0.00 user 0.01 sys sh 一般の話じゃなくて、また bash 固有の動作?
>>30 bashだけじゃなくて kshや zshでもそうだよ。
$ time sh -c 'echo hoge; sleep 1'| sh -c 'cat; sleep 1'
hoge
real 0m2.014s
user 0m0.003s
sys 0m0.007s
ここまで、まとめると、 fgrepが速いと言われていたのは大昔で、今ではgrepより遅い。 さらに、fgrep/grep/egrepよりも awkやperlの方が速い。 よく、grepで前処理してからパイプでawkかperlに食わせてる例を見かけるが、 あれはgrepの処理をawkやperlのプログラム中に吸収して grepをカットした方が速くなる。
昔から、fgrepが速いなんてのは神話だ、と言われてたと思うけど
grep系をawkかperlに渡すwrapperスクリプトで置き換えたほうが10倍捗るってことだな。 ちなみにうちのLinuxは # file /usr/bin/{e,f,}grep /usr/bin/egrep: Bourne shell script text executable /usr/bin/fgrep: Bourne shell script text executable /usr/bin/grep: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), stripped # # cat /usr/bin/egrep #!/bin/sh exec grep -E ${1+"$@"} # # cat /usr/bin/fgrep #!/bin/sh exec grep -F ${1+"$@"} # 最初からスクリプトに置き換えられていますた(´・ω・`)
>>34 psedってのがほとんどのperl配布に入ってるから、
psed -n '/ /p'すればいい。
37 :
名無しさん@お腹いっぱい。 :2010/12/15(水) 12:58:57
grep一族の速度差はふーんて感じだが、awkやperlの一行プルグラムの方が10倍も速いって にわかには信じ難い話しだな。検索しか能のないgrep使う意味ねーじゃんw 使ったgrepの方がバージョンが旧すぎて実装がショボかったとか、そういう落ちなんじゃないの?
awk の方が grep より早いのが信じれないのでやってみた $ cat /etc/debian_version 5.0.6 $ echo $SHELL /bin/bash $ uname -svrm Linux 2.6.26.5 #2 SMP Mon Sep 29 14:17:40 JST 2008 i686 $ wc -l testlog 100000 testlog $ time grep 1 testlog |wc -l 40952 real 0m0.013s user 0m0.008s sys 0m0.004s $ time fgrep 1 testlog |wc -l 40952 real 0m0.012s user 0m0.012s sys 0m0.000s $ time perl -lne '/1/&&print' testlog |wc -l 40952 real 0m0.061s user 0m0.056s sys 0m0.004s $ time awk /1/ testlog |wc -l 40952 real 0m0.142s user 0m0.132s sys 0m0.008s awk 遅いんだが..。対象ファイルや条件次第でここまで変わるのかな〜
お、まだやってたのか。
>>38 >>27 の各バージョンはこうね。
% grep --version
grep (GNU grep) 2.5.1
% awk --version
GNU Awk 3.1.3
Copyright (C) 1989, 1991-2003 Free Software Foundation.
% perl -v
This is perl, v5.8.7 built for i686-linux
Copyright 1987-2005, Larry Wall
% ldd `which grep`
linux-gate.so.1 => (0xffffe000)
libc.so.6 => /lib/libc.so.6 (0xb7e31000)
/lib/ld-linux.so.2 (0xb7f50000)
% ldd `which awk`
linux-gate.so.1 => (0xffffe000)
libdl.so.2 => /lib/libdl.so.2 (0xb7f5b000)
libm.so.6 => /lib/libm.so.6 (0xb7f37000)
libc.so.6 => /lib/libc.so.6 (0xb7e23000)
/lib/ld-linux.so.2 (0xb7f6a000)
・gzipを外して time grep Jan messages | wc -l のように変えても結果は同じ
・検索条件を Jan → J に変えても結果は同じ。*grepよりもawk,perlの方が10倍速い
・timeが何を測っているかが云々されていたが、体感ではっきり差がわかるレベル。
*grepは待たされるがawk,perlは瞬間的に終わるから
>>38 ,39
debianのawkは標準だとmawkなはず。
差異の原因かも?
hoge(){ hoge|hoge& }; hoge hoge(){ hoge&hoge& }; hoge fork bombとして使うなら、どっちの方が効果的なんだろうか スケジューラに詳しい人います?
42 :
名無しさん@お腹いっぱい。 :2010/12/19(日) 20:20:02
中1の時にプログラミングしたいと思って知り合いに聞いてC言語始めたけど2日くらいで挫折した。 けど最近Ubuntuにかなりハマってシェルスクリプトも初めてみた。C言語より簡単で分かりやすかったからタイピングゲームとか作れるようになりたい。
おう、がんばれや
シェルでタイピングゲームは無理だろ?
>>46 クレイジーだな(褒め言ry
動画は保存した。スレチだけど Shibuya.lisp とかでやるヤツ
居ても可笑しく無さそうなネタに見えちまう。
grep が awk や perl より遅いのはありえんだろ。うちじゃ問題ないな grep で速度的な問題に直面したのは、何年か前に -i オプション付きだと 死ぬほど遅くなったときだ。locale 周りを見るらしいので、 LANG=C grep とかの alias で凌いだけど。スクリプトも一部書き換えたかな
↓Perlのパターンマッチに異常に時間がかかる例 #!/usr/bin/perl my $num = 30; my $str = "a" x $num; my $pattern = "a?" x $num . $str; sub perl { print "${str}\n" if ($str =~ m{$pattern}); } sub egrep { system "echo ${str} | egrep ${pattern}"; } sub awk { system "echo ${str} | awk /${pattern}/"; } print "matching ${str}\n"; print "against pattern ${pattern}\n\n"; print "with egrep\n"; egrep(); print "with awk\n"; awk(); print "with perl\n"; perl();
シェル関数では $1,$2,... は関数呼び出し時の引数になるけど、 そうじゃなくてスクリプト起動時に与えられた引数を参照する方法ってある? 関数を呼ぶときにいっしょに $@ を渡すしかない?
BASH_ARGV
うん、bash じゃないんだ。 bash がわざわざ機能を拡張してそういうものを用意してる、ということは、 逆に言えば標準的な方法ではできない、ってことでいいんだよな、やっぱり。
>>52 直接 $1, $2, ... 参照じゃまずのか?
54 :
名無しさん@お腹いっぱい。 :2010/12/21(火) 16:33:50
>>53 関数の中では $1 $2 は関数の引数を意味してしまう。
そうではなく、スクリプト自体の引数を関数の中で参照したい、ということでは。
てけとーな変数にコピーしておけばいいんじゃないの
引数の個数は不定だし、純正シェルでは配列が使えないし、 「てけとーな変数にコピー」するのも難しい。
$@ を渡すしかないね。
無理にやるならこんな感じか? #!/bin/sh func() { echo "$argv1" echo "$argv2" : } i=1 while [ $i -le $# ]; do eval argv$i=?$$i i=`expr $i + 1` done func # 関数呼び出し
空文字列な引数とか、空白入りの引数を考慮しなくていいのならば argv="$*" とかしとけば十分ではあるけど。 func(){ argc="$1" shift for((i=0;++i<=argc;)); do eval arg$i=\""$1"\" shift done echo "<$arg1> <$arg2> <$arg3>" echo $@ } set "a" "" "x y z" func $# "$@" hoge fuga うわ、だせぇ。
Linux板のシェルスクリプトが無かったのでこっちで聞く。 両方見るの大変だったからその方が都合いいんだけど Linux板のシェルスクリプトスレはUNIX板へ統合?
向うで立てろ。#!/bin/shでbashスクリプトなんてお断りだ。
bashもこっちでいいよ。 今時UNIXでもbash拡張なんて当たり前。
63 :
名無しさん@お腹いっぱい。 :2010/12/24(金) 23:07:26
ねーよ。そういうのを隔離するために板を分けたんだよ。寄ってくんな。
Solarisがbash標準になったから、bashを叩く理由がなくなったんだ
いやまて、かつてkorn shellスクリプトが許されていたわけではないぞ
いまどきBashにも対応するのが最低限のマナーでしょ。 「ウチはBashには対応しません」なんて言ってたら取引先に迷惑だよw
犬板でやる分には何の文句も出ないわけだが、何故こっちに立てたがるのだ?
こっちに立てるんじゃなくてこのスレで質問するだけのこと
>>66 非力なCPU使った規模の小さい組み込み装置にbashのせるのは犯罪だ
71 :
名無しさん@お腹いっぱい。 :2010/12/25(土) 11:26:45
>>68 アスペ丸出し。これなら理解できるか? w
犬板のスレなら何の文句も出ないわけだが、何故こっちの板のスレで質問したいのだ?
>>71 犬板のスレはなくなったの。現状をよく把握してから書こうね。
混ぜるな危険というわけ
bashスクリプトスレでも立てればいいんじゃないかな
このスレではもともとbashの質問はOKだよ。 bashだからと言ってLinuxとは限らない。 Linuxの場合でもLinuxと言わずにbashの質問として質問すればOK。
bashスレはあるから特化した話はそこですればいいかもネ
77 :
名無しさん@お腹いっぱい。 :2010/12/25(土) 11:37:38
>>72 あー、はいはい。w
犬板にスレ立てれば何の文句も出ないわけだが、何故こっちの板のスレで質問したいのだ?
>>72 そもそもなんでLinux板のスクリプトスレはなくなったの?
立てられないの?
こっちもそうだが、Linux板のシェルスクリプトスレも段々過疎ってきてた。 挙げ句Linux板のシェルスクリプトスレは立てられなくなってたわけだ。
じゃあLinux板に立てればいいのね
81 :
名無しさん@お腹いっぱい。 :2010/12/25(土) 12:45:58
>>79 お前がいたから衰退したんだろ。寄ってくんな。疫病神。
どっちの板にも関係なさそうなキチガイが混じってるな 煽り野郎は近頃減ってたんだが、なぜ湧いた
冬休みだから
夏だなぁ
bashの話題も何の問題もない。 Linux依存の話はどうかと思うけど、 使っているのがLinuxなのはなんの問題もない。
bourne shell とそのサブセット以外は禁止
>>86 ksh や zsh の行き場がなくなるわけだが
ム板にでも行けば? (なげやり)
bourne shell とそのスーパーセット以外は禁止
90 :
名無しさん@お腹いっぱい。 :2010/12/26(日) 19:20:59
個人的には対象環境を明記する人の質問ならなんでもいい。
bashでしか動かないのに#!/bin/shとか書いてる奴は来るな
対象環境がlinuxならlinux板の方が適している。
93 :
名無しさん@お腹いっぱい。 :2010/12/26(日) 21:07:55
bourne shellのスーパーセットのbashについて質問します。 プロンプトに時刻を入れることはできるのですが、 この時刻をリアルタイムで更新するにはどう設定すればいいでしょうか? 現状では時刻が更新されないため、コマンドを実行開始した時刻ではなく、 そのプロンプトが表示された時刻しかわかりません。 時刻を更新するのは、現在のプロンプトだけでいいです。 (画面の上に流れて行くプロンプトは、そのコマンド実行時点で更新停止)
まず服を脱いで奇麗にたたみます。
95 :
名無しさん@お腹いっぱい。 :2010/12/26(日) 22:03:14
screenのステータスなりキャプションなりに時間出したほうが幸せになれそう。
そもそもshとsedとawkでどこまでできるかという頭の体操スレなんだから 実用性を求めるならperl/ruby/pythonスクリプト書けばいいという話
はあ?
前回出力した行を消して、 前回と同じ行に新たに出力するには どうすればいいのでしょうか? wgetでダウンロードの進捗を表すプログレスバーのように テキストアニメーションのようなことがしたいのですが
man 5 terminfo man 3 terminfo man 1 tput
>>100 なんとかなりそうです。
ありがとうございました!
>>100 変な誘導するな。1行だけならterminfo使わずにできる。
実際、wgetはterminfo/termcapを使ってない。
103 :
名無しさん@お腹いっぱい。 :2010/12/29(水) 08:44:10
CRを出力して行頭に戻り、行全体を書き直すのが簡単。
行消去って端末依存じゃない?
CRは行消去しないよ. 端末依存には違いはないけど、CRで行頭に戻らない端末って見掛けたことがないな
いや、
>>105 はそんなこと知ってるだろ。
>>104 に対して「CRは行消去するわけじゃないよ」と言ってるんだろ
ところで、元質問とは違うが、 端末依存を解消するための tput だったはずなのに、 tputコマンド自体がOS依存なのは何とかならないものか。 FreeBSDではtputがtermcapエミュレーションのため、 tputの引数キーワードがtermcapのキーワードになっていて 他のOSとは異なっている。
>>104 は、行全体を書き直すためには行頭に戻って、行消去が必要じゃねーの?
でも、行消去って端末依存だよね。
という意味。
>>108 いまどきtermcapを使ってるようなFreeBSDを捨てればすべて解決。
termcapはラインプリンタを想定してるからそもそも行消去コマンドは無いんじゃねーか?
> termcapはラインプリンタを想定してるから > termcapはラインプリンタを想定してるから > termcapはラインプリンタを想定してるから > termcapはラインプリンタを想定してるから
カーソル行の1行消去なら、ESC [ K 現行端末で、これ以外のシーケンスを見たことがない。 だから ESC [ K 決め打ちで良い。
115 :
名無しさん@お腹いっぱい。 :2010/12/29(水) 17:10:37
例えば、dateコマンドの出力をスペースで区切って変数に代入したい場合、AIXのkshでは $ date | read DOW MONTH DAY TIME YEAR $ echo $DOW $MONTH $DAY $TIME $YEAR Wed Dec 29 16:56:47 JST 2010 というようなことができたのですが、Cygwinではbashでもkshでも同じことができません。 $ date | (read DOW MONTH DAY TIME YEAR; echo $DOW $MONTH $DAY $TIME $YEAR) とすると表示されますが、以降は変数が空になってしまい使えません。パイプの後の文がサブシェルになってしまったせいで 変数が引き継がれないのかと思いますが、良い回避方法はないでしょうか?
set -- `date` echo $1 echo $2 echo $3 echo $4 echo $5 echo $6
改良版 set_date() { DOW=$1 MONTH=$2 DAY=$3 TIME=$4 YEAR=$5 } set_date `date` echo $DOW $MONTH $DAY $TIME $YEAR
Bashなら、 read DOW MONTH DAY TIME YEAR <<< `date` だけで桶。多分最適解。
read DOW MONTH DAY TIME YEAR <<END `date` END
TIMEとYEARの間に TZONE が抜けていることを誰も指摘しないww
AIXはそういうもんだと思っていた。
LANG=C date にしとかないとバグを誘発するスクリプトだなw
みなさん。ありがとうございます。 これまでAIXのkshしかほとんど触ったことがなく、あまりサブシェルの変数の問題で悩んだ ことがなかったのですが、調べれば調べるほどハマリそうな仕組みですね。 これはこういうものとして気をつけてコーディングしないとならん、ということですね。
125 :
名無しさん@お腹いっぱい。 :2010/12/31(金) 00:35:28
ちょっとまって、なんでウニックス板はID無いの?自演しまくりじゃん?
お望みであればどうぞ
定型のメールの本文mail.txtを用意して、 cat mail.txt | mail mail@address -s "Test Mail" のスクリプトでメールは 送れるんですが、 mail.txtにタイムスタンプなどを追加したいんですが、どのように書けば良いでしょうか できれば、mail.txtには変更は加えたくないです。 ちなみに、タイムスタンプはtime_stamp.sh #!/bin/sh YEAR=`date '+%Y'` MONTH=`date '+%m'` DAY=`date '+%d'` HOUER=`date '+%k'` MINUTE=`date '+%M'` SECOND=`date '+%S'` SEND_DATE="発信 : $YEAR年$MONTH月$DAY日$HOUER時$MINUTE分$SECOND秒" echo $SEND_DATE みたいな物を考えています。
タイムスタンプをどこに入れたいかによるけど、先頭か末尾だったらこんな感じでいけるのでは ( time_stamp.sh ; cat mail.txt ) | mail mail@address -s "Test Mail"
(cat mail.txt; time_stamp.sh) | mail mail@address -s "Test Mail" で、末尾に入れることができました。 ありがとう、ございました。
130 :
名無しさん@お腹いっぱい。 :2011/01/03(月) 10:26:09
悪いことをしようとしてる奴に教える必要なんか無いぞ
>>127 その time_stamp.shは無駄杉。
あと、"HOUER"ってスペル間違ってるしw
#!/bin/sh
date +'発信 : %Y年%m月%d日%k時%M分%S秒'
↑だけで桶。
>>131 まあ、そこまで言ったら、time_stamp.sh 自体無駄ですなw
>>130 sender や envelope from を詐称したりしてないわけで...
あるディレクトリ内に5秒ごとに 2011_01_05_22_15_10_picture_000000000.jpg 2011_01_05_22_15_15_picture_000000001.jpg ・ ・ のように、ファイルが作成されますが、この内の最新のものだけを残して 古い物を削除した 基本的に、新しいファイルが作成されたタイミングで、一度スクリプトが動かせる はずなので、新しいものと、古いものの2つのファイルしかないはずなんですが 最新のファイルのみ残せないでしょうか
>>133 rm `ls -t | tail -n +2`
135 :
133 :2011/01/05(水) 23:00:50
ぐぐりながら初めてのシェルスクリプトを書いております。 bowtieとかsamtoolsとかいうコマンドを逐次実行しているだけなのですが それぞれbowtieやsamtoolsがスクリーン?に出力したものをファイルに記録したいのですが どうしたらよいのでしょう。 bowtie | tee test.log samtools | tee -a test.log では、test.logファイルは作成されるものの、記録が書き込まれておらず screen -a -q test.log bowtie samtools exit では動かなくて、 そろそろお手上げです。 よろしくお願いします。
137 :
名無しさん@お腹いっぱい。 :2011/01/07(金) 15:33:56
あああ、すいません screen ではなくてscript でした。 screen-a -q test.log bowtie samtools exit では何も書き込まれていなかったんです。
>>138 script -c 'bowtie; samtools' test.log
あ、うそです。うまくいってました。 でも、exitが効いていない感じです。 scriptがうごいているまま、何度もシェルスクリプトを実行してました。
gaslighting
たびたびすいません。 scriptにcオプションがなく、 また制御文字ではないと思うのですがへんてこな文字化けも含まれたり、 とあまりうまくいってません。 screenのハードコピーを使ってみようと思い #!/bin/sh date='date +s' echo "test" screen -X hardcopy ${date}.txt こんな感じで書いてみたのですが、動きません。。。 最後の一行を screen -X hardcopy とすると、hardcopy.2というファイルが作られ、 screen -X hardcopy test.txt とするとtest.txtは作られますが どちらもなぜかlsを実行した結果が保存されています。
ああああ、またやってしまいました date='date +s' ではなく date='date +%s'です。
dateのところは date=`date '+%s'` とかにしなくて大丈夫?
ああああ、 ありがとうございました。 あと、なぞのlsですが、シェルスクリプトが動いている画面ではなく、 いろいろ試したときのscreen2が残っていて、そいつのhardcopyをとっていたようです。 screen2をkillしたら、ただしく、testが${date}.txtに落ちてきました。 これで、希望通りになりました。 あとは、screenが動いていたら余分なscreenをkillするという前処理が 必要なのかもしれないので、またググって頑張ってみます。
146 :
名無しさん@お腹いっぱい。 :2011/01/08(土) 09:45:54
screen -list でわかる。
147 :
名無しさん@お腹いっぱい。 :2011/01/08(土) 11:49:02
さっき"$*"と$*の挙動が違うことに気づいたんだけど、どっかにまとまったドキュメントか何かあるの? IFSを挟んで展開されるかどうかが違うだけだと思うんだけど、$*は"$@"に近いというか。
man bash
>>148 When the expansion occurs within double quotes, it expands to a single word with the value of each parameter
separated by the first character of the IFS special variable.
のあたりを誤解してました。When以下の節は「'$*'じゃなくて"$*"だよ」って言いたいだけだと思ってました。
1行の長〜い命令を、複数行に書くことってできますか?
できます
ありがとうございます
知らないなら無理に答えなくていいよ。 知ってる方、答をどうぞ ↓
しってます
155 :
名無しさん@お腹いっぱい。 :2011/01/08(土) 20:45:57
し っ て ま す !
しってることにしといて、後生だから。
「おいィ?お前らは今の言葉聞こえたか?」 「聞こえてない」 「何か言ったの?」 「俺のログには何もないな」
正規表現を使ってlsコマンドを行うと、 カレントディレクトリ直下のディレクトリの中身まで表示されます… どうすればカレントディレクトリ直下のファイル及びディレクトリだけ表示できるんですか? 教えて(人∀・)タノム
>>158 -d
>>1 ・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
-d オプションとかどうよ
ワイルドカード、グロビングでくぐれ
163 :
名無しさん@お腹いっぱい。 :2011/01/11(火) 21:54:14
つまんね
165 :
名無しさん@お腹いっぱい。 :2011/01/12(水) 21:29:12
start=12 end=345 みたいに代入されていて、 hoge0001.txt hoge0002.txt hoge0003.txt : hoge9999.txt みたいなファイルがあって、 hoge「$startから$endまでの範囲の数字」.txt というワイマールカードを一発で決めたいんですが、 その命令?はどう打てばいいんでしょうか?
ワイマール ?
※ワイマールカード: 市バスが無料、ゲーテハウス、ワイマール新美術館など市内の見どころも無料で、さまざまな割引や特典が付いています。マルクト広場の観光案内所で販売しています
ハイパーインフレカードか
ワイマールカードを買ってドイツに渡米したいな
渡独にしておけ
LANG=de_DE.UTF-8; export LANG ls -1 hoge????.txt | head -n $end | tail -n +$start - or - seq -f "hoge%04g.txt" $start 1 $end
ワイマールカード言いたかっただけだろ
おれも言ってみたい。 ワイマールカード (^ω^)
174 :
165 :2011/01/13(木) 06:32:43
>>171 hoge1234.txtとかは1番からすべて順番に存在するわけじゃなくて
飛んでる番号もあります。なので、
>>171 の前半はNGです。
>>171 後半も、seqを入れたとしても存在しないファイルまで展開されるのでNGです。
hoge{$start,$end}.txt みたいなワイマールカード一発命令はないんでしょうか?
条件の後出し禁止 hoge{1,2,3}.txt だって、存在しないファイルまで展開すっぞ
じゃあ、条件の後出しじゃなくて新たな質問ということで、 詳しい方回答をどうぞ ↓
> hoge{$start,$end}.txt みたいなワイマールカード一発命令はないんでしょうか? そんなもん、あるわけねーだろwww
178 :
名無しさん@お腹いっぱい。 :2011/01/13(木) 10:19:52
おまえらスルースキルゼロだな いかにレベルの低い人間が集まっているかよく分かる
オマエモナー
情報の小出し → DQN一発指定。
>hoge0001.txt >hoge0002.txt >hoge0003.txt >: >hoge9999.txt >みたいなファイルがあって、 >hoge1234.txtとかは1番からすべて順番に存在するわけじゃなくて >飛んでる番号もあります。 ?
>>181 「みたいな」ファイル、という非限定用法が用いられているため、
必ずしも矛盾しているとは認められない。
マイルーラカードって使ってみたいけど 臭いとか無い?
そのネタは広げなくていいです。
もうマイルーラはディスコンだし
ゴムじゃないコンドームも?
sedとピリオドの使い方を教えて ./DIR を ../DIR(カレントを一つ上にしたい)のですが、 sed 's/\.\/DIR/\.\.\/DIR/g' src_file > dist_fileとすると ..../DIRと、ピリオドが4つになって上手くいきません。 誰か教えて
3回通した……ってわけないか
最初の \. の前に[^\.]を入れたらどうなる?
>>190 それ、外してるので。何か言いたければsedスレでどうぞ。
$cat test.txt { jobList = ( 813, 814, 815, 816, 略 834 ); } です。 ここから、一行ずつ、数字の部分だけ、それぞれ異なる変数に入れるには どうしたらよいのでしょうか? $echo "$1 $2 $3" 813 814 815 みたいな感じです。変数の数は、毎回固定の21個のはずです。
sed板なんだろうけど set - `sed -n '/^[0-9]*,*$/p'`
194 :
名無しさん@お腹いっぱい。 :2011/01/15(土) 08:45:53
set -- `tr -cd '0-9,' < test.txt | tr ',' ' '` とか。
違った set - `sed -n 's/^\([0-9]*\),*$/\1/p'`
>>193 カンマまで代入されるから×。sedスレ池。
197 :
名無しさん@お腹いっぱい。 :2011/01/15(土) 09:18:38
test -d a はできるけど [[-d a]] はできないのはなぜですか?
ありがとうございました。
すいません。その先もだめです。実はxgridをやっているのですが、、、、
$ xgrid -h localhost -job attributes -id ほげほげとやると
{
jobAttributes = {
activeCPUPower = 3516;
applicationIdentifier = "com.apple.xgrid.cli";
dateNow = "2011-01-17 14:18:18 +0900";
dateStarted = "2011-01-17 14:09:15 +0900";
dateSubmitted = "2011-01-17 14:09:05 +0900";
jobStatus = Running;
name = "/bin/sh";
percentDone = 0;
taskCount = 1;
undoneTaskCount = 1;
};
}
jobStatusは最終的にFinishedに変わります。
>>192 でとりだしたjob idに対して、すべてのjobがFinishedにかわるまで待つという
ことをやりたいのですが、
#!/bin/sh xgrid -h localhost - job list | set -- `tr -cd '0-9,' | tr ',' ' '` for jobid in $* do jobstatus=`xgrid -h localhost -job attributes -id $jobid |grep -c Finished` until [$jobstatus == 1] do sleep 120 done done 次のコマンド --------------- というシェルスクリプトにしたのですが、すべてのxgrid処理がFinishedに なっていないのに、次のコマンドが動き出してしまいます。 どう直したらよいのでしょうか???
203 :
名無しさん@お腹いっぱい。 :2011/01/17(月) 14:44:47
>>202 それだと、標準入力はtrに渡らず、set が食っちまうんじゃね?
(というかsetだと組み込みコマンドだから…誰になるんだ? サブシェル?)
set -- `xgrid ... | tr ... ` だとどう?
とりあえず echo $* の結果を確認してみればいいと思う。
>>202 until [$jobstatus == 1]
は
until [ $jobstatus = 1 ]
の誤記だろうけど、
これでは1つだけFinishedになったらループが終了するよ。
>>202 込み入った質問と回答になりますので、通常5インシデント申し受けますが、
ただいまキャンペーン中に付き、3インシデントで承ります。
お取引きの代理店を通じてご用命下さい。
>>203 私には縮めるのはまだ無理そうなので
#!/bin/sh
xgrid -h localhost - job list >joblist.txt
set -- `tr -cd '0-9,' <joblist.txt | tr ',' ' '`
これで行きます。。。
>>204 どうしたらよいのか、ヒントをください。。。
こういう仕様? while true; do exit_flag=1 for jobid in $*; do 終わってないジョブがあったら、exit_flag=0; break; done if [ "$exit_flag" == 1 ]; then exit 0; fi sleep 120 done
ああ下に次のコマンドがあるのか。 exit 0 → breakで。
for jobid in $*; do while true; do $iが終わっていたら、break; sleep 120 done done じゃないだろうか?
ありがとうございます。ありがとうございます。何せ、シェルスクリプト歴2週間のタコ。
breakでググっていきますと、少しずつわかりかけてきました。
>>211 です。やりたかたこと。
jobstatusには、Failedもあったので、
さらに欲をかき、以下のようにして動かすことができました。多謝。
xgrid -h 10.64.84.166 -job list > job_view_list_${date}.txt
set -- `tr -cd '0-9,' < job_view_list_$date.txt | tr ',' ' '`
for jobid in $*; do
while true; do
jobstatus=`xgrid -h localhost -job attributes -id $jobid |grep jobStatus`
case $jobstatus in
*Failed*) eval xgrid -h localhost -job restart -id $jobid;;
*Running*) sleep 120;;
*Finished*) break;;
esac
done
done
tarファイルの中のファイルを削除したいのですが、aixにはdeleteオプションが無いようなので、このオプションを使わずに削除するにはどうすればいいのでしょうか?
まずGNU tarを入れます
>>215 それは難しいと思います。
パイプで渡せば出来そうな気がするのですが。具体的にどう書けばいいのかわかりません、
パイプで渡してできると勘違いしてる奴に何アドバイスしても無駄w
マルチを甘やかしてはいけない。
>>216 の思考をエスパー
tar xf hoge.tar | grep -v 削除したいファイル | tar cf - hoge_new.tar
で、できるとでも勘違いしてるんだろう
>>215 GNU tarならできるのかぁ。
でもどうやってるんだろ。
削除した分って切り詰めるのかな?
>>215 そしてGNU tarを奇麗にたたみます
コーヒーを煎れます
そのコーヒーをたたんだGNU tarにかけます
>>223 一般論としては一時ファイル使うのが楽だけど、一時ファイルを使わないのなら
読み込み用と書き込み用のファイル位置を管理しつつ、
読み込み位置にシークして読み込み
→削除対象外のデータなら、書き込み位置にシークして書き込み
最後にtruncateすればいい
Pythonで書くとこんな感じのコード
(正規表現にマッチする行をファイルから直接削除する例)
http://codepad.org/M29pTYa5
自分のやりたい処理は gawk '$3!="*"' in.txt>out.txt なんですが、これを繰り返し処理させたいので for i in `jot 19` X Y do gawk '$3!="*"' in{i}.txt>out{i}.txt done とやると{i}が展開されず、 for i in `jot 19` X Y do eval gawk '$3!="*"' in{i}.txt>out{i}.txt done みたいにやると、$3が変に展開されてしまってうまくいかないです。 何かうまい解決策はないでしょうか?
iを変数展開してないじゃん
> 何かうまい解決策はないでしょうか? shの文法を正しく理解すれば解決する。
>>229 初歩的な質問と回答になりますので、1インシデントで承ります。
お取引の代理店を通じてご用命下さい。
あ” eval gawk '$3!="*"' in${i}.txt>out${i}.txt です。写し間違えた。 さらにググり $cat test.awk $3!="*" for i in `jot 19` X Y do eval gawk -f test.awk in${i}.txt>out${i}.txt done で、うまくいきそうです。
それつまんないからもういいよ。
235 :
213 :2011/01/23(日) 15:27:22
仕方ないので自分で作ってみました。指摘ヨロです。 #!/bin/sh if [ $# -lt 2 ] ; then echo "Usage: delter.sh tar_file delete_file1 delete_file2 ..." exit 1 fi tar_file=$1 if [ ! -f $tar_file ] ; then echo "tar_fileが存在しません" exit 1 fi mkdir dltar_work cp -p $tar_file dltar_work cd dltar_work kind="" case "$tar_file" in *.tar.gz) kind=tar.gz gzip -cd $tar_file | tar tvf - | sort -k 6 > ../before.txt gzip -cd $tar_file | tar xvf - ;; *.tar) kind=tar tar tvf $tar_file > ../before.txt tar xvf $tar_file ;; esac
236 :
続き :2011/01/23(日) 15:28:43
shift for file in $* do find . -name $file -exec rm -f {} \; done rm -f $tar_file if [ "$kind" = "tar.gz" ] ; then tar cvf - * | gzip > $tar_file gzip -cd $tar_file | tar tvf - | sort -k 6 > ../after.txt elif [ "$kind" = "tar" ] ; then tar cvf $tar_file * tar tvf $tar_file > ../after.txt fi diff ../before.txt ../after.txt echo "tarファイルを置き換えますか?[yes or no]" read answer case "$answer" in y | yes) mv -f $tar_file ../ esac cd .. rm -rf dltar_work before.txt after.txt echo done
>>235-236 初歩的な質問と回答になりますので、1インシデントで承ります。
お取引の代理店を通じてご用命下さい。
それつまんないからもういいよ。
execv についてお聞きしたいのですが、 どうして下記コードにおいて eargv[0] = "ls" を書かないと -al が無効になってただの ls が実行されてしまうのでしょうか。 execv の第 1 引数で ls を指定しているので eargv[0] で再び ls を指定する必要性がわかりません。 char *eargv[5]; eargv[0] = "ls"; eargv[1] = "-al"; eargv[2] = "/"; eargv[3] = NULL; eargv[4] = NULL; execv("/bin/ls",eargv); 初心者なのでとんちんかんな質問かもしれませんが お返事いただけると嬉しいです
>>239 エスパーすると、
eargv[0] に "-al" とか指定してるんだろ?
そりゃ無視されて当たり前。
lsコマンド自身は eargv[1] 以降しか引数として認識しない。
eargv[0] は無視される。
ただしコマンドによっては eargv[0]によって動作が変わったりするものがある。
(例: vi と ex とか)
241 :
名無しさん@お腹いっぱい。 :2011/01/23(日) 16:59:02
>>239 それはシェルスクリプトに関する話題ではありません。
と思ったら、OSに依存しない質問スレってないんだね。
> どうして下記コードにおいて eargv[0] = "ls" を書かないと
> -al が無効になってただの ls が実行されてしまうのでしょうか。
書かないというのがどういう意味なのか不明だけど、
多分、eargv[0]がNULLになって以降の引数は渡されないから。
242 :
名無しさん@お腹いっぱい。 :2011/01/23(日) 17:07:25
たとえばログインシェルの起動時は execvの第1引数が "/bin/sh"、引数配列の最初が "-sh" だったりするんじゃないの。
>>240 > エスパーすると、eargv[0] に "-al" とか指定してるんだろ?
説明が悪くて申し訳ないです。そうです。
eargv[0] = "-al";
eargv[1] = "/";
eargv[2] = NULL;
eargv[3] = NULL;
eargv[4] = NULL;
をするとなぜダメなのか、ということが疑問でした。
> lsコマンド自身は eargv[1] 以降しか引数として認識しない。
> eargv[0] は無視される。
そうなんですか! ありがとうございます。勉強不足で……。
試しに
>>239 の ls のところを任意の文字に置き換えてみたところ、同じ結果が得られました。
ありがとうございます。NULL ではダメなようですが……。
と思ったら、
>>241 さんありがとうございます。
eargv[0]がNULL だと以降の引数は渡されないんですね
>>242 さんもありがとうございました!
244 :
名無しさん@お腹いっぱい。 :2011/01/26(水) 17:55:13
ど初心者の質問で申し訳ないのですが、 catの出力内容やechoでの出力内容を変数に渡す方法ってありますか?
>>244 それ、シェル初心者からよく聞く質問ですね。
シェルもUNIXも基本が大事。
基本原理を理解していればわかる問題です。
基本原理って何よ var1=`cat file` var2=`echo foo`
>>245-246 すみません、ぐぐったらわかりました。
でも全く知らなかったです。ありがとうございます。シングルクオートじゃないんですね。``グレイブアクセント?を使うんですね。
シングルクオートだとただの文字列として解釈されるんですよねたしか。ダブルクオートだと変数名は解釈されるんですよね。
それにグレイブアクセントまたはバッククオートですね、わかりました。ありがとうございます。
でもたしかに基本原理ってなんですか。
「グレイブアクセント」とはあんまり言わんけどね。 まぁ、まずはシェルスクリプトの本でも読みなよ。
だよな。言うなら「アクサングラベ」だよな。
「アクサングラベ」ともあんまり言わないよ。この辺界隈では。
だよな。言うなら「オープニングクォート」だよな。
「オープニングクォート」とはもっと言わないよ。この辺界隈では。
つまんないからもういいよ。
だよな。言うなら「インバースクォート」だよな。
それ全部unicodeでは違う文字になってるという落ちか
アクサングラーベとグレイブアクセントは同じじゃないの。
でも本当はbacktickって呼ぶんだろ?
A-dev, B-dev....とdevのつくディレクトリがあり さらに各ディレクトリにpublicディレクトリがあるのですが 全てのpublicディレクトリ内にtest.xml(空ファイルで良い)を置きたいのですが ls | grep dev
それが、彼の最期の言葉だった。
touch *dev/public/test.xml
すいません..途中で送信してしまいましたorz ls | grep dev | xargs と対象のディレクトリ(〜dev)のリストは入手できたのですが ここからpublicディレクトリ内にtouchでファイルを作成するところがうまくいきません 対象ディレクトリを引数にして touch 引数/public/text.xml のようにできればよいかと考えているのですが ご教授願います
>>261 それ、シェル初心者からよく聞く質問ですね。
シェルもUNIXも基本が大事。
基本原理を理解していればわかる問題です。
>>262 あーごめん、ぼけてた。
for i in *dev/public; do touch $i/test.xml; done
とかか。
いろいろ穴はあるが。
>>263 つまんないネタ繰り返すのもうやめない?
>>266 一発でできなくね?
シェルによるのかな?
皆様アドバイスありがとうございます
残念ながら私の環境(CentOS bash)だと
>>260 はそんなディレクトリないよと怒られます
touch {A,B,C,D}-dev/public/test.xml
270 :
名無しさん@お腹いっぱい。 :2011/01/26(水) 21:15:06
初心者な質問ですみません。 ローカルの/path/以下のファイルを全てをリモートの「/hogehoge/」以下にファイル名変えずアップロードしたいと思いますがうまくいかないので、教えてください。 #!/bin/sh FDIR=/path ftp -ivn ftp.exsample.com << _EOF user username password bin passive cd /hogehoge for fname in * do put $FDIR/$fname $fname done bye _EOF exit 0 シェルで上記のようにFTPを用いてアップロードする構文を作ったのですが、うまくアップされません。 put $FDIR/$fname $fname の行を、↓のようにファイル名を直接指定するとうまくいきます。 put $FDIR/test.txt test.txt
>>270 初歩的な質問と回答になりますので、1インシデントで承ります。
お取引の代理店を通じてご用命下さい。
>>270 ヒアドキュメントの中で * は展開されない
>>270 for fname in `echo *`
>>270 そのftpクライアントって、シェルみたいなfor文を本当に認識するの?
インシデント見積り有効期限は24時間以内とさせていただいております。 早めにご用命いただきますよう、お願い致します。
>>270 (略)
`for fname in *
do
echo put $FDIR/$fname $fname
done`
277 :
名無しさん@お腹いっぱい。 :2011/01/26(水) 21:57:59
最終行に改行の含まれていないファイルに改行を付け足して出力するスマートな方法はなんだと思いますか? 最初はこう書いてみたんですけど、 cat ~/file; echo "" さっき習ったこっちのほうがいいかなと思って下にしてみました。 echo `cat ~/file` こういう書き方も出来るみたいですが。 echo $(cat ~/file) 好きにしろって言われるのはわかりますが、どういうのがかっこいいですか。俺ならこう格好良く書くってのを教えてください。
>>277 echo `cat file` だと、fileの中の改行や複数のスペースとかがカットされて
表示内容が変わってしまうだろw
cat file; echo
だけでよろし。echoの引数に "" は要らない。
>>278-279 ありがとうございます。echoの引数が要らないってのは勉強と共に改善点になりました。表示内容が変わってしまうのは気づきませんでした。サンクス。
ファイルに変更は加えたくなかったためcat file; echoでいきます。
似たような処理で、末尾にl空行がある場合はそのまま、 末尾に空行がない場合だけ空行を付け加えるって、 シェルスクリプトで書こうとすると結構面倒だよね (たとえば mbox 形式のファイルを処理するときなど)
そうか? tacして1行目取ってきて判定→最後に追加だけじゃね? 全行読み込む必要もないし。
tacってLinux以外では入ってないじゃん。 tail -n 1 で判定でしょ。
末尾が空行ではなくて、その行の最後に改行がない場合は? そういう場合に空行を1行入れるには、改行を2つ追加してやらないといけないが tacで判定するだけで可能かな?
最終行に改行がないファイルをtacすると、 最終行とその1つ前の行が結合されて1行目に来てしまう。 それでも空行追加が必要なことは判定できるが、 もともと改行がなかったかどうかは判定できない。 いずれにしても、最終改行がなければ改行追加、の前処理をしてから、 tail -n 1 で判定すれば問題ない。
if (ファイルサイズが0バイト) { ファイルにLFを1つ追加; return; } if (ファイルの最後がLFでない) { ファイルにLFを2つ追加; return; } if (ファイルの最後からひとつ前がLFでない ) { ファイルにLFを1つ追加; } return; /* 文字コードはlatin1を仮定(キリッ */
288 :
281 :2011/01/26(水) 23:17:25
>>286 ,287
ありがとう。やはり条件判定は複数必要だよね。
なんとなく自信なかったんだけど、これでスッキリした。
> if (ファイルサイズが0バイト) {
なかなかここまで気が回らない。さすがです
FILE=file case `tail -c 2 "$FILE" | wc -l` in 0) echo;; 1) cat "$FILE"; echo;; *) cat "$FILE";; esac ただし、wc -l で頭に余分なスペースが付かない GNU wcを使用のこと。
>>289 それちょっとおかしいよ。GNU以外のwcでも使えるように修正してみた。
↓
FILE=file
test ! -s "$FILE" && { echo; exit;}
n=`tail -c 2 "$FILE" | wc -l`
n=`echo $n`
case $n in
0) cat "$FILE"; echo; echo;;
1) cat "$FILE"; echo;;
*) cat "$FILE";;
esac
>>287 ファイルサイズが1バイトでLFのみの場合誤動作する。
>>290 最終行が1文字で改行なしの場合誤動作する。
そこまで要求シビアなのかな。
293 :
名無しさん@お腹いっぱい。 :2011/01/27(木) 00:09:15
まぁ、当座の課題を解決できればいい質問に 汎用性を求めるのはこのスレの常。
294 :
名無しさん@お腹いっぱい。 :2011/01/27(木) 00:55:59
分岐とか醜いことせず末尾のブランク行全部消してからひとつ付け足した方がスマートに思える。 cat "$FILE" | sed -e :a -e '/^\n*$/{$d;N;ba' -e '}'; echo
それもありかもだけど、そうすると元のファイルを改変することになる
操作前のデータの末尾にブランク行があったか無かったか判別できなくなってる時点で、元データの保存に意味があるとは思えないが…
まぁそれだと cat -s でいーやという話になるかもしれんが。
sed '' でどうかな $ cat /dev/null | sed '' $ echo | sed '' $ echo -n a | sed '' a $ { echo a; echo b; } | sed '' a b $ { echo a; echo -n b; } | sed '' a b $
>>298 全然駄目じゃん。空行追加するというお題だぞ
300 :
名無しさん@お腹いっぱい。 :2011/01/27(木) 14:20:28
$mojiretsuに「hogehogefugafuga」が入ってる時 MOJI=`$mojiretsu | sed 's/fugafuga//'` echo $MOJI で「hogehoge」が取り出せます。 ところが、訳有りで「`」が使えない場合、どのようにしたら上記と同じ動作が可能でしょうか?
>>300 echo ${mojiretsu%fugafuga}
302 :
300 :2011/01/27(木) 14:36:32
>>301 回答ありがとうございます。
書き忘れましたが、MOJIに代入してください。
※代入がうまくいかず困ってます
>>300 >訳有りで「`」が使えない場合
これを具体的に言ったほうがいいよ
>>302 MOJI=${mojiretsu%fugafuga}
そんなくだらない「訳有り」な事情を潰す方が健全だと思う
>>304 できました、ありがとう。
他の煽りの方は放置して失礼します♪
308 :
300 :2011/01/27(木) 15:00:15
>>304 ありがとうございました!
>>306 理由を書くと長くなりますが
大きな「`」の中ですので
つまり $() で済む話か。やっぱりくだらない理由だったな。
わざわざ外部コマンドのsed呼び出すより
>>304 の方がエレガント
``の中でも\`\`で使えるよな?
それをさらに入れ子にすると ¥¥` ¥¥`なの?
>>315 いいえ、3重目のネストは、¥¥¥`¥¥¥` になります。
317 :
315 :2011/01/27(木) 21:29:44
>>316 おぉ、言われてみればその通りだ。
ありがとう。4重目は
¥¥¥¥¥¥¥` ¥¥¥¥¥¥¥`
だね。
問題: ` ` のn重目のネストに必要な¥の数をnを使って表せ。
>>289 ,290
case文って何げに使えるよね
すいません、二つのファイルの比較をして、共通する要素を抽出するのは どういうコマンドを使ってスクリプトを作ればよいのでしょうか? ファイル形式はタブ区切りで 一つ目のファイル(リファレンス)には chr1 20513060 T C という4つの要素が縦にずらずらっと並んでいます。 二つの目ファイルは もっと要素も多いです。 やりたい処理は 一つ目と二つ目の要素が完全に一致するものを抽出しファイルに出力する。 出力ファイルの形式は 一つ目のファイルの4つの要素をならべ その横に二つ目のファイルの3番目以降の要素を並べる、です。 盛りだくさんで書いてしまいましたが、 まずはファイルの要素を比較し、一致した要素を取り出すコマンドが あれば教えてください。
>>320 とりあえず一致した要素を取り出すコマンドは
comm
322 :
名無しさん@お腹いっぱい。 :2011/01/28(金) 16:18:49
>>320 盛りだくさんな質問と回答になりますので、2インシデントで承ります。
お取引の代理店を通じてご用命下さい。
読み返すと意味不明ですね。 一つ目のファイルの要素の例 chr1 20513060 T C 二つ目のファイルの要素の例 chr1 3522454 G R 109 109 60 です。 それぞれのファイルの1番目と2番目の要素を比較する。←知りたいコマンド1 この場合、 chr1 20513060とchr1 3522454は一致しない、となります。 仮に一致した場合 一つ目のファイルの要素の例 chr1 3522454 G A 二つ目のファイルの要素の例 chr1 3522454 G R 109 109 60 出力したいファイルの要素の例←知りたいコマンド2 chr1 3522454 G A G R 109 109 60 です。検索するキーワードでも教えてもらうだけでも一歩前進です。 よろしくお願いします。
>>323 そういう処理は awk使った方が楽だが、
あえてシェルでやるなら、
2つのファイルをreadコマンドで1行ずつ読みながら
最初の2つのフィールドのみ比較して
一致していたら要素を並べて echoする。
・・という処理をwhileでループする。
外部コマンドは使わない。
perlか何かで書いた方が楽じゃね。
>>323 ほれ、これでどう?
↓
#!/bin/sh
while read a1 a2 ax
do
while read b1 b2 bx
do
if [ "$a1" = "$b1" ] && [ "$a2" = "$b2" ]; then
echo "$a1" "$a2" "$ax" "$bx"
fi
done < file2
done < file1
ありがとうございます。ありがとうございます。
>>326 は私でも理解できます。
似たようなサンプルがないかawkの解説ページを調べてみます。
perlはやったことがないので今回はやめておきます。
LLは何か身に付けといた方がいいよ。 シェルスクリプトで苦労してたのがあっさり書けることもある。
最近、なんでもpythonだわ。
pythonってワンライナーどうやんの?
>>330 while( life != end ){ do( enjoy ); }
どなたか、鼻毛チェックスクリプトをワンライナーで書いて!
while : ; do echo "鼻毛をチェキしてください!" ; sleep 86400 ; done
標準出力の結果をスクリプトで使うにはどうすればいいのでしょうか? 例えば、 telnet (サーバ) 110 stat とやって、その結果標準出力で出力されるメール数を値として保持しておいて、 その値を元に必要な数だけメールを取得するようにしたいのです。
それ、標準出力やない
337 :
名無しさん@お腹いっぱい。 :2011/01/30(日) 10:00:18
標準的なものではないんだが、telnetじゃなくてnc(netcat)とかがあれば、それで。
perlか何かで書いた方が楽じゃね。
bashなら、/dev/tcp(笑)使ってできるよ。
はいはいexpect expect ところでexpect以外のtclって生き残っているのだろうか
pyとかrbとかのexpectもあるはず。 zshならソケット作って自分でやりとりもできると思うけどね。
tcl以外のexpectじゃなくて、 expect以外のtcl っておっしゃってますが・・
zsh の zpty というのもある
344 :
名無しさん@お腹いっぱい。 :2011/01/30(日) 10:52:55
macports の port コマンドは tcl で書かれてるな。
そういえばtcl版のtimidity最近動かしてない
perl で NIFTY に telnet 接続してメールや未読記事を取ってくるという
一世を風靡 nifty4u があったね。
>>335 が perl でもいいというのなら
参考になるかも。
でも、ふつうに POP クライアントでメール取ってきて、それを
加工すればいいと思うのだけれど、そうじゃなくてわざわざ
POP プロトコルのやりとりをスクリプトでやりたいというのがよくわらかない。
エスパーすると迷惑メールをPOPで取り込まずにDELEで削除したいとかだろ STATだけじゃなくてTOPコマンドも併用すると便利
349 :
335 :2011/01/31(月) 01:44:48
みなさんありがとうございます。 与えてくださったヒントを参考にがんばってみます。 迷惑メールとかでは無くて、メーラーを使わずに自分でスクリプトを組んでメールの送受信をできればいいなあ・・・と思ったのです。
>>330 $ python -c 's="hoge";print s'
hoge
最近、いままで perl で書いていたサーバ監視スクリプトなどを
どんどん python にしてる。
perl だと人によって書き方が大きく異なるからメンテナンス性が
悪いな〜と言う事で。
あと、ipython が神。
シェルスクリプトもメンテナンス性でいえば Perl と
似たような感じだけど、十数行のものはシェルスクリプトでも
メンテナンス性をそれほど気にしなくていいし、linuxrc などで
使うことを考えると簡単には捨てることはできない..
>>350 ループとかifとかどう書くのか知りたいのよ。
いい加減スレ違いだが…… Pythonはコマンドライン引数だの標準入力だのにアクセスするだけで import sys が必要になる時点でワンライナーにはぜんぜん向いてない 向き不向きを無視して可能不可能でいえば、書ける ただしcompound statement(if, while, for, try, with, defなど)は セミコロンで区切って一行に書けないので、そうしたものは使えない もっともifに関しては2.5以降ならif式が使える(それ以前ではand/orで代用)し ループはmap(), reduce(), 内包表記, ジェネレータ式で代用できる 例外処理はどうにもならないので無理 たとえば seq 10 をPythonで書くと↓のような感じだ python -c 'print "\n".join(str(n) for n in range(1, 11))'
相当なエキスパートじゃないと無理そうだな。使いこなせる人は すげーわ。
べつにそんなことはないよ 向いてないのにワンライナーで書こうとすると無理がある、というだけの話
ワンライナーの書きやすさとしてはこんな感じでおk? Perl>>Ruby>>>Python
>>355 全般に笑えるが、特に例外処理が涙ぐましい&無理やりすぎてワロタw
ワンライナーで書ける程度の複雑さならawk,sed,sortあたりを 組み合わせた方が楽なことも多いな。
interfacesなどの設定ファイルの内容を書き換えるスクリプトを作りたいんですが 例えば address 192.168.10.100 netmask 255.255.255.0 gateway 192.168.10.1 となっていたとして、各項目を置換するにはどういったコマンドを使えば いいですか?
こりゃまたずいぶんゆるふわな要求だな。
>>359 それ、シェル初心者からよく聞く質問ですね。
シェルもUNIXも基本が大事。
基本原理を理解していればわかる問題です。
>>359 /etc 以下のシェルスクリプトを探してみると
たいていそういう処理をしてるスクリプトが見つかる
>>361 > それ、シェル初心者からよく聞く質問ですね。
一般的にシェルを作る粋狂なやつはあまりいないから
ほとんどの人がシェル初心者じゃないか?
おれ、シェル始めて2週間の初心者だけど、 ハローワールド程度のシェルなら10種類以上作ったよ。
まぁな #include <stdio.h> main () { printf("hello world\n"); } とか, 書いておいて getty から起動できるようにしておけばシェルだよな
それはシェルとは言えないのでは
> とか, 書いておいて コンパイルされたものを <<<< この部分が抜けてた > getty から起動できるようにしておけばシェルだよな
>>366 /sbin/nologin もシェルだと思ってるから
それするなら eliza 起動しときましょ
ショートコーディング的ワンライナーシェル ↓ s[64];main(){while(printf("> "),gets(s))system(s);}
system()で/bin/sh利用するぐらいなら↓でよくね main(c,v){execvp("sh",v);}
/bin/sh利用しないで最低限のシェルにするとこうか? もっと短くならないかな s[64];main(){while(printf("> "),gets(s))fork()?wait(0):(execlp(s,s,0),exit(1));}
4文字短くした s[64];main(){while(printf("> "),gets(s))fork()?wait(0):exit(execlp(s,s,0));}
374 :
359 :2011/02/02(水) 21:56:44
>362 具体的に、どんなスクリプトがありますか?
375 :
359 :2011/02/03(木) 11:46:48
分からないままに、書いてみたんですが、添削してください。 #! /bin/sh # if_rdwr.sh -r address /etc/network/interfaces # if_rdwr.sh -w address 192.168.12.100 /etc/network/interfaces if [ $1 != "-r" -a $1 != "-w" ]; then echo "Second parameter error!"; exit 1 fi # 引数チェック if [ $1 = "-r" -a $# -ne 3 ]; then echo "Wrong parameter"; exit 1 fi if [ $1 = "-w" -a $# -ne 4 ]; then echo "Wrong parameter"; exit 1 fi case $1 in # Read処理 -r) DATA=(`grep $2 $3`) VALE=${DATA[1]} echo $VALE ;; # Write処理 -w) DATA=(`grep $2 $4`) VALE=${DATA[1]} echo -e "%s/$VALE/$3/g\nw" | ed - $4 ;; esac
Debian系の/etc/network/interfacesの話なら 書き換えスクリプト自作するより mappingでも使った方がいいんじゃないの。
378 :
359 :2011/02/03(木) 16:54:46
組込みの、uC-Linuxなんです
本題と違うけど、引数とパラメータのチェックはcase文のところでまとめて case $1/$# in -r/3) ごにょごにょ ;; -w/4) ごにょごにょ ;; *) usage ;; esac などとやる手がある
381 :
359 :2011/02/04(金) 07:25:28
遊びなんです
遊びは自分でやれ
まぁいっぱい飲もうや。
飲めないんです
シェルは自分で書け
386 :
名無しさん@お腹いっぱい。 :2011/02/19(土) 01:18:14
環境はMacなんですが,HandBrakeCLIを使って,あるディレクトリより下(複数階層)の全部のm2tsファイルを違うディレクトリに変換したいです.
その時に,出力先にあるファイルは変換しないようにしたいのです.変換先のファイルは拡張子mp4です.
http://cl.ly/1d0S1e1D0L16261S1U1C どこだめ?
イタチguy
388 :
名無しさん@お腹いっぱい。 :2011/02/19(土) 11:11:12
板違いでもないと思うが途中ごとに意図した結果になっているか echoなりcatなりしてみればいいと思う。 sh-bangがzshになってるけどzshの機能はぜんぜん使ってないこととか、 バッチなのに、対話環境用の.zshrcをわざわざ読み込んでいるとことか、 気になった。
389 :
名無しさん@お腹いっぱい。 :2011/02/19(土) 11:44:09
>>388 にゃるほどー・・・zshの機能は全然わかんないですorz
**/*くらいしかw
390 :
名無しさん@お腹いっぱい。 :2011/02/19(土) 12:05:25
ああ、**使ってたか(滝汗
>>386 > その時に,出力先にあるファイルは変換しないようにしたいのです.
if [ ! -f mp4のパス名 ]; then
処理
fi
392 :
名無しさん@お腹いっぱい。 :2011/02/22(火) 18:26:12.82
あとはfind使うようにしてzshへの依存を無くせば良いね
cat * | grep "xxxx" でファイル内のxxxx文字列を探したいんですが、ディレクトリやバイナリーを 除外するってできますか
395 :
名無しさん@お腹いっぱい。 :2011/02/26(土) 09:29:00.61
>>394 grep 'xxxx' *
とすれば、ディレクトリやバイナリでも問題ないようにgrepが対応してくれるので、
そもそもディレクトリやバイナリを除外する必要がない。
あと、cat * | grep "xxxx" では、見つかった文字列のファイル名がわからないし、
catが無駄。
>>394 ディレクトリは自動的に除外されるでしょう
バイナリーファイルの除外はGNU grepなら--binary-files=TYPEオプションを使えば可能かと
grep --binary-files=without-match "xxxx" *
397 :
394 :2011/02/26(土) 10:04:56.76
ありがとう
find でがんばる、とか。
bashで書いたスクリプトを、PHPの中からsystemで呼出してたとき、 文字列変数の内容を戻り値として渡すなんて事はできないですよね
UNIXではプログラムの返り値はintです。(ほとんどの場合0-127) PHPで文字列を受け取りたければ、popenを使いましょう。
401 :
399 :2011/03/07(月) 21:50:03.91
>400 ありがとう、ございます。 スクリプトをsample.shとして FILE *fd = popen("sample.sh", "r"); while(fgets(str,1024,fp)!=NULL){ printf("%s\n",str);} みたいにできるんですね。
402 :
名無しさん@お腹いっぱい。 :2011/03/08(火) 14:30:09.29
家族から鯖の電気代でクレームが来たので作ってみた。 クライアントの生死判定をし、鯖をシャットダウン 起動はwolを使用 想定する鯖はsambaを搭載したファイル鯖など 使用方法はcronに登録し、root権限で一定間隔で走らせる 文法はタコなんでかんべんして #!/bin/sh NODE=51 LOCKFILE=/var/lock/shutdown PING_COUNT=2 if test -f ${LOCKFILE} then PING_COUNT=`cat ${LOCKFILE}` fi while [ ${NODE} -le 200 ] do ping -c 1 192.168.1.${NODE} > /dev/null 2>&1 if test $? -eq 0 then if test -f ${LOCKFILE} then rm ${LOCKFILE} fi exit 0 else NODE=`expr ${NODE} + 1` fi done
403 :
402 :2011/03/08(火) 14:30:42.77
続き PING_COUNT=`expr ${PING_COUNT} - 1` if test ${PING_COUNT} -gt 0 then if test ! -f ${LOCKFILE} then touch ${LOCKFILE} fi echo ${PING_COUNT} > ${LOCKFILE} exit 0 fi if test -f ${LOCKFILE} then rm ${LOCKFILE} fi shutdown -h now exit 0
一番電気食うのは起動時らしいよ。
クレーム来るほどの電気代ってペン4でも使ってるのか? 鼻毛あたりに交換すれば24時間通電でも省エネだよ。
>>405 犯人はST31000340NS*2だよ。(ワットチェッカー読み)
ママンはD945GCFL2 2GB
あと電源、アクセスランプがうざいと
>>402 俺もエコワット調べでDellのE2180あたりの石が入った
サーバで月に2500円くらい掛かっていたが、5万ほどのI5のノートを
サーバにしたら、月に350円程度になったよ。
当然24時間での話だけどね、W7でファイルサーバを使い
夜半から深夜の遊びようのクライアントにも使い
抱かせたvmwareで稼働したLinuxでファイルサーバやWebサーバに他
昼間は会社からリモートデスクトップとsshで手元に表示させ
為替や株の表示や売買も
他には家屋の周囲の防犯監視カメラ録画ともやってる
電気代は週計測の平均を4倍した感じで誤差はあっても500円程度だろ
そと付けの24インチディスプ2台とか、必要時に随時稼働させる
USBの外付けHDDは勘定だけどね。
下手な小細工より、省エネ機器に交換した方が良いよ
わかってるなら2.5inchHDDとに換えればいいんじゃないかな
410 :
402 :2011/03/08(火) 16:09:51.75
電気代 28日間499kwh@東電 クライアントは デスクトップ1 E8500+P35 4GB HD5770 winXP デスクトップ2(妹所有) プ530+915P 2GB 9600GT winXP ノートPC1 IBM/lenovo T42p mem 2GB ノートPC2(使用頻度低) toshiba E7 418cme の4台 妹にPC更新しろというが プーなので3点交換になるので金掛かるので嫌がっている これが電気食いだろう
>>410 つかクライアントの電気代も考えてるの?
なんか構成と目的が見えないわ
サーバって何を目的にしてるんだろう?
ファイル目的なら、ネットワーク対応のドライブでも下げれ
ば良さそうだし。
>>411 主に稼働しているデーモンは
apache 2.2
proftpd
squid 2.7
dnsmasq
samba
ntp 4.2.4p4
sshd
snmpd
その他管理ツール
おもにISO倉庫になっている
他にも玄箱があるがsquid走らせるにはきつ過ぎる
プロバイタが*.ap.yournet.ne.jpだから403サイトはIP偽装は必須だし
>>412 クライアントの居ないときに消滅させられるなら
クライアントにvmwareでも仕込めば良さそうだがなぁ?
まぁ、いずれにシテもATOM/I3でSSDでいいんじゃねーの?
sambaの用途次第で2.5インチHDD
ぜんぜんシェルスクリプトの話じゃないな。
>>414 シェルスクリプトの話がじゃまされたくないほど
大量にあるなら、ジャンジャンどうぞ
話題がなければ関係ない話をしていいってもんでもないよ。
>>416 俺も喪前も含めて、そういう関係ない部分が保守となり
活性化の助けになるんだよ。
下のようなスクリプトaddress.shをperl/CGIから $addr = `address.sh -a` $gate = `address.sh -g` と呼び出すと、-aはデータが得られず、-gはデータが 取得できます。 ターミナルからの実行では、どちらもデータを返しています。 なぜでしょうか? #!/bin/sh case $1 in -a) DATA=$(/sbin/ifconfig eth0 | grep inetアドレス | awk '{print $1}' | awk -F: '{print $2}') ;; -g) DATA=$(/sbin/route -n | grep UG | awk '{print $2}') ;; esac echo $DATA OSはDebian5 -aはifconfigの出力からIPアドレスを選んでechoします -gはroute -nの出力からデフォルトゲートウエイを選んでechoします
419 :
名無しさん@お腹いっぱい。 :2011/03/11(金) 22:00:56.54
>>418 LANGによって出力メッセージが変化している。
"inetアドレス"の部分はLANG=Cだと"inet addr"
UGはたまたまLANG=jaでも拾えただけ。
スクリプト内で明示したほうが良いね。
420 :
名無しさん@お腹いっぱい。 :2011/03/11(金) 22:03:42.57
優先順位的には LC_ALL に設定したほうが確実かな。
421 :
418 :2011/03/12(土) 14:09:39.29
>>419 420
原因が分かりました。ありがとうございます
シェルで、telnet xxxx 110に接続し、user、passwd、STAT、QUITを telnetのプロンプトに入力することってできますか?
シェルはネットワークストリームを開くことはできません。
質問の意図からすると、rshのような感じでできるかどうか訊いているんだろうが、 基本的にはできない。 特別なユーティリティを使って、無理矢理対話させることもできるが、 とてもめんどくさくなるから普通はやらない。 だから、その程度のことをやるときは、Perlなどでソケット通信を使う方が簡単でわかりやすい。
425 :
名無しさん@お腹いっぱい。 :2011/03/15(火) 19:51:21.89
expect 使えばいいのかしらね。
expectのsampleに似た感じのが付いてるから、
それ見て書けばいいんじゃない?
>>424 たぶんtelnetに対するredirectを駆使して出来ないか聞いたんだと思われ
expectって名前くらいしか知らんかったけど、
マニュアル見たら、コネクション維持したまま制御をスクリプトに持ってくるなんてこともできるのか。
>>426 「rshのような感じ」とは、その意味だよ。
その意味ですかあ
Python + libexpect = Pexpect Perl + libexpect = expect.pm
nc
telnetじゃないが例えばこんな感じであれば(機能が有効になってたら)可能。 #!/bin/bash exec 5<>/dev/tcp/localhost/631 echo -en "GET / HTTP/1.1\n\n" >&5 while read line <&5 do { echo "$line" } done
OS依存か
>>433 OS依存じゃなくてbash依存。
/dev/tcpネタで恥晒してた回答者が何スレか前にいたの思い出したw
なるほど勉強になる
でもその方法だと、POPやSMTPなんかでは使えないね。
>>436 いや、できるけど?
<&3, >&3すればいいので。
>>434 どの辺りがbash依存なのか教えて
bangの部分じゃないよね
>>439-440 おぉレス返ってきた!
ありがとう。リンク先読んでじっくり勉強して来ます
bash は、以下の表にあるようなファイル名がリダイレクトに使用されると、それらを特別に扱います。
/dev/fd/fd
fd が有効な整数ならばファイル・ディスクリプター fd が複製されます。
/dev/stdin
ファイル・ディスクリプター 0 が複製されます。
/dev/stdout
ファイル・ディスクリプター 1 が複製されます。
/dev/stderr
ファイル・ディスクリプター 2 が複製されます。
/dev/tcp/host/port
host が有効なホスト名またはインターネットアドレスで port が整数のポート番号ならば、 bash は対応するソケットに対して TCP 接続のオープンを試みます。
/dev/udp/host/port
host が有効なホスト名またはインターネットアドレスで port が整数のポート番号ならば、 bash は対応するソケットに対して UDP 接続のオープンを試みます。
ファイルのオープンや作成に失敗すると、リダイレクトも失敗します。
---
これか。
>>432 試したんだけど自分とこ/dev/tcpが無かった。
lsとかでは見えないんじゃね。
>>437 セッション維持したまま、応答に対して分岐できるの?
>>444 できる。
だからこそ、最初に exec 5<> とかで同じソケット開きっぱなしにしてるんだろ。
>>444 シェルスクリプトのファイルI/Oを理解出来てないね。
あるディレクトリの一番新しいファイル一個てどうやって抽出できる?
ls -lt|head -1
`-1'オプションの方が良くない? ls -1t | head -1
出力がパイプだと端末以外になるから-1がデフォなんで いちいち書かなくても-tだけでいいよ。
>>450 $ ls -lt | head -1
total 14116088
$ ls -1t | head -1
gonzui.log
'-l'の結果に笑った
ちなみに
$ ls -lt | head -n3
total 14116088
-rw-r--r-- 1 hoge staff 1132 3 15 22:39 gonzui.log
-rw-r--r-- 1 hoge staff 64 3 12 22:42 k.txt
って感じになっている。
452 :
名無しさん@お腹いっぱい。 :2011/03/18(金) 14:01:44.16
明示的に -l つければそりゃそれ使うわ。 ls -t | でいいってこと。
-h | --help とオプションつけたいんだけどどうすりゃいい? 外部コマンド使わないと無理?
case "$1" in -h|--help) なんだかんだ; ;; esac
>>454 hoge -v -s -x -g -d -h
hoge -v -s -h -g -d -x
whileで囲って、なんだかんだでshiftもする。 定形パターン。
え?
お?
>>453 たぶんbuilt-inでgetoptsがあるはず
POSIX規定の外部コマンドのgetoptもあるんじゃないか?
getoptsってbashだけじゃなかったっけ?
Sunがもう無いけど
プロダクト名には残ってるんじゃないかな
464 :
名無しさん@お腹いっぱい。 :2011/03/19(土) 08:47:25.04
>>450 BSD由来の機能だからSVR3とか違うUNIXもあるぞw
zshのパス設定はどこで行うべきでしょうか? bashと同様に、.zprofileで環境設定$PATHに設定すればとりあえず良さそうなのですが、 ネットで調べると、.zshenvでシェル変数pathに設定しているケースをよく見かけます。 それぞれの設定方法の違いや利点などがあれば教えていただけないでしょうか。
複数のディレクトリを処理していくスクリプトを/bin/shで作っています。 既に処理済みのディレクトリをスキップしたいのですが、処理済みリスト の保持方法で詰まっています。 ファイルに保存してgrepするというのを考えましたが、ダサいし、削除処 理が面倒なので、オンメモリで保持したい。どのように保持すればよいでしょう? 制約: 該当ディレクトリにcookieファイルを作成することはできません。(リードオンリーの場合もある) /bin/sh限定です。(配列は使用できません) その他条件: ディレクトリ数は高々数百です、1000を大きく超えることはありません。
checked_ディレクトリ名=1 とかしときゃいいんじゃねーの?
ちゃんとしたLL使った方がいいんじゃないの。
>>453 see /usr/bin/autoconf
>>468 別の場所にディレクトリ構造のミラーだけつくっといたら
たとえばGNUのdiffなら
diff --brief mirror1 mirror2
でディレクトリ構造の差分が取れると思うので、
LANG=Cで実行して出力をパースすればいいと思う
>>468 単純にリストをシェルのパラメータに保存するのはだめなの?
概念的にはこんな感じで。 linux 環境なんで bash の /bin/sh エミュでしか試してないけど。
注1: ディレクトリ名に改行文字が含まれていないことが前提
注2: sed, grep に渡す $1 は、そこに含まれる正規表現メタ文字をエスケープしといて
#!/bin/sh
NL='
'
LIST=''
list_append() {
LIST="${LIST}${NL}${1}"
}
list_has() {
echo "$LIST" | grep "^${1}\$" >/dev/null 2>&1
}
list_remove() {
LIST="$(echo "$LIST" | sed "\:^${1}\$:d")"
}
474 :
名無しさん@お腹いっぱい。 :2011/03/26(土) 11:13:25.73
未処理のディレクトリのリストアップだけをする部分と 実際に処理を行う部分をパイプで繋ぐという作りにする。 ことはできないのだろうか。
475 :
468 :2011/03/26(土) 11:31:57.59
>>469 ,473を参考にこうしました。チェックにexprを使ったらarglistの
制限に引っかかったので、caseで逃げました。
# Usage: member elt list
member()
{
local list_name -
list_name="list_$2"
eval case \""\$${list_name}"\" "in *:$1:*) true;; *) false;; esac"
}
# Usage: append_list list elt
append_list()
{
local list_name -
list_name="list_$1"
member "$2" "$1" && return 1 || eval ${list_name}=\"\${${list_name}:-:}$2:\"
}
# Usage: empty_list tag
empty_list()
{
local list_name -
list_name="list_$1"
eval unset "${list_name}"
}
ルート権限が必要なスクリプトで、スクリプトを実行してるのが rootかどうかをチェックするにはどうすれば良いですか?
test $UID = `id -u root`
>>476 俺は↓こんな感じで動かしてるわ。
if [ ! `whoami` = "root" ]; then
echo "このプログラムはroot権限が必要です。"
exit
fi
「ルート権限」と書いてあるのでおそらく superuser かどうかを知りたいのだと思うけど、 その場合それを知る律儀な方法はUID(EUID) が 0 かどうかを調べる。 superuser(UID=0) のユーザ名が必ずしも "root" とは限らないから。(まあ99% root だろうが) posix sh 互換なら [ ${EUID:-${UID}} = 0 ] あたりが無難だろうか。
480 :
477 :2011/04/02(土) 07:10:49.39
ありがとう
ルート権限が必要なコマンドでフェイルするからあえて調べない。 必要な場合はスクリプトファイルをchmod go-rxだな。
482 :
sage :2011/04/03(日) 00:58:03.42
コマンドラインにパイプ等で渡して バイナリ表示した文字列を復元する方法を教えていただけないでしょうか。 $echo 'あいうえお' | od -Ax -tx1 000000 e3 81 82 e3 81 84 e3 81 86 e3 81 88 e3 81 8a 0a ↑上記を「あいうえお」に戻したいです すみません
echo 'あいうえお' | od -Ax -tx1 | awk '{ $1 = ""; for (i=2;i<NF;i++) { print $i }}' | while read i; do printf "\x$i"; done あいうえお
i<=NFの間違い
cd "$1" targets=`find . -name "filename" -type d` if [ ${#targets[@]} = 0 ] then; do echo "該当するファイルはありません。" exit fi for tmp in ${targets[@]}; do echo $tmp done こんな感じで文字列に該当するディレクトリの一覧を出力したいのですが、 配列の要素数でファイルがない場合を分岐しようとすると該当ファイルがなくても要素数が1になってしまいます。 良い方法はないでしょうか?
if [ -z "${targets[1]}" ]; then
487 :
名無しさん@お腹いっぱい。 :2011/04/03(日) 01:47:30.95
配列の開始索引番号は zsh が 1、bash が 0。 (zsh は ksh_arrays オプションで変更可能)
>>483 awkのみで
awk '{ $1 = ""; for (i=2;i<=NF;i++) { printf("%c", strtonum("0x" $i)); }}'
491 :
名無しさん@お腹いっぱい。 :2011/04/09(土) 09:34:35.16
rcs管理してるファイルに昔書いたけど今は削除してしまったキーワードが書いてあった バージョンだけさっと取り出すようなシェルってできる?
シェルってゆうな。クズ。
shellを新たに作るとは精力が余っているのですね ガンバレー
おまえら「シェル」に突っ込んでるけど、 「シェルスクリプト」って質問に書いてあったら 答えられないんだろww
495 :
名無しさん@お腹いっぱい。 :2011/04/09(土) 11:52:37.00
煽らずに、ごめんなさいして質問しなおせば教えてやったのに。残念だな。
用途を限定した簡易版なら、シェルを書くのはそう難しくないんじゃないかな シェルを作ると言ってる人が一から書き始めるとも限らないし
497 :
名無しさん@お腹いっぱい。 :2011/04/09(土) 12:11:51.78
>>495 おれ、質問者じゃなくて回答者の立場だけど、
じゃあ、ちなみに
>>495 が知ってる回答を先に答えてみ。
(まあ、知ったかだろうから無理だろうけど)
>>495 がギブアップしたら俺が答えるから。
499 :
名無しさん@お腹いっぱい。 :2011/04/09(土) 16:08:15.63
>>498 素直にごめんなさいすれば、教えてやったのに残念だな。w
>>499 おれ回答者だよ。お前やっぱり知らないんだな。
501 :
名無しさん@お腹いっぱい。 :2011/04/09(土) 16:14:41.27
>>498 はいはい。ギブアップ。お前が教えてやれ。www
502 :
名無しさん@お腹いっぱい。 :2011/04/09(土) 21:24:05.59
自称回答者はどこに消えたんだ? w
消えた自称回答者に代わって、まずは叩き台をばばば for rev in `rlog FILE | grep '^revision ' | cut -d' ' -f 2-` do if co -p$rev FILE 2>/dev/null | grep KEYWORD > /dev/null; then echo "KEYWORD found in $rev" break fi done
単精度計算を簡単に行う方法について教えてください。
>>504 echo "1.1 * 2.2" | bc
みたいな感じとかは?
bcって倍制度じゃないの?
507 :
505 :2011/04/14(木) 21:39:13.89
いや任意精度ですね。 $ echo "scale=99;1/7" | bc .1428571428571428571428571428571428571428571428571428571428571428571\ 42857142857142857142857142857142 小数演算がしたいのかと勝手に思い込んだ。厳密に「単精度」「倍精度」を期待してたならスマソ。
509 :
名無しさん@お腹いっぱい。 :2011/04/17(日) 01:23:14.03
引数に渡した文字『あいう』を、『*あ*い*う*』に変換したいのですが、うまくいきません。 スマートに変換できる方法、ありませんでしょうか?
echo "あいう" | sed -e 's/\(.\)/*\1/g' -e 's/$/*/'
511 :
名無しさん@お腹いっぱい。 :2011/04/17(日) 01:54:37.16
>>510 早速試してみます。ありがとうございます!
Taro and Mary having sex. なんつうテキストがあったときに、awkでandの前後を拾いたい、 ただしandはANDとかAndとかかもしれない、という状況で、以下の事を知りたいです。 ・大文字小文字無関係でandを区切りとしたい場合、 awk -F [Aa][Nn][Dd] で実現はできたのですが、他によい方法はありますか? 区切りとしたい単語が長くなると、指定が厄介だと思ってます IGNORECASEを設定しても、/〜/の正規表現の箇所でしか有効でないようです ・区切りの前後の単語を拾うとき、例えば区切りの前を拾うときは awk -F [Aa][Nn][Dd] '{print $1}' | awk '{print $NF}' としているのですが、awkを二回使ったりしているあたりが 改善の余地があるのではないかと思ってます 他によい方法はありますか?
>>512 echo a and b c d And e | awk -v RS=" " -v IGNORECASE=1 '!/and/{b=$0}/and/{print b;geline;print}'
a
b
d
e
>>513 なるほど
andでなければ退避、andなら退避したものと次の行を表示、ですね
ありがとうございました
しかしなんつう例文だw
516 :
名無しさん@お腹いっぱい。 :2011/04/17(日) 23:37:18.81
517 :
名無しさん@お腹いっぱい。 :2011/04/18(月) 00:30:16.46
>>514 plus
awk -v NF = substr([a-A],[^n-N],[^d-D]) '{print $1}' | awk -f ... '{print $NF}'
走査確認はして居りませんが・・・
518 :
511 :2011/04/18(月) 23:11:38.09
2バイト文字が入ったら、うまく判定されませんでした。 echo "あいう" | sed -e 's/\(..\)/*\1/g' -e 's/$/*/' とやると2バイト文字は判定されるんですが、今度は1バイト文字が判定されません。 なにが問題か、ご教授お願い致します。
いまどき(マルチバイト)エンコーディングに対応してない sed なんてあるの?
busybox sed とか?
LANG=ja_JP.eucJP sed ...
sed 's@/lib\(64\)\?/ld@/tools&@g' と言うスクリプトの場合、@は何の意味?
sed 's#そんなことも知らんのか#あほか#' と言うスクリプトの場合の、#と同じ意味
>>523 man sed
sed 's/\/lib\(64\)\?\/ld/\/tools&/g'
これより見やすいだろ?
次からはLFSスレで聞けよ
sed の正規表現を perl と共通にしといてくれよと 思うことは時々ある # だったら perl 使えよ
perl の方が後だから話が逆じゃね。
perl regex の方が高機能だからだろ
529 :
523 :2011/04/19(火) 18:41:53.23
そうかs直後の文字が区切り文字として認識されるのね どうもです
ファイルの内容を、そっくりそのまま変数に入れたいと考えてます AAA=`cat /etc/hosts`とすると、変数echo $AAAで内容が確認できたので この調子でやればよいかと思っていたのですが、ファイル内に書いてある*が 展開される(?)のか、Cのソースを読ませた時はコメントの/*が/usrだの/etcだのに 展開されたり、*がカレントディレクトリのファイル一覧になったりと、 意図した結果が出ずに悩んでいます 対処法って、ありますか?
532 :
511 :2011/04/19(火) 23:23:03.44
sedのバージョンをアップしたら解決しました。 ありがとうございました。
テキストで、ある単語以降を削除したいと思ってます イメージとしては aaa bbb ccc ddd eee fff ggg hhh iii というファイルについて、eee以降を削除して aaa bbb ccc ddd という結果を得たいです いったん、sed s/eee/? eee/ と改行させてから、sed /eee/,$dと行単位の範囲削除やってるのですが 何か無駄な気がしてます
534 :
名無しさん@お腹いっぱい。 :2011/04/20(水) 19:39:10.88
/eee/{s/eee.*//;q} とか?
535 :
名無しさん@お腹いっぱい。 :2011/04/20(水) 19:40:58.21
あ、GNU sedだとなくても通ったけど、正しくは、qの後ろにも;がいるかも。
>>535 こういうやりかたがあるのですね
当方AIX5のsedですが、試してみます
$ sed 's/eee/{s/eee.*//;q}' test.txt sed: bad option in substitution expression $ sed 's/eee/{s/eee.*//;q;}' test.txt sed: bad option in substitution expression こうなった
sed '/eee/{s/eee.*//;q;}' できた!
質問です。 以下のファイルがあるとします。 ---------- $ cat hoge.dat aaa bbb ccc ddd eee ---------- このファイルを先頭からよんでゆき、最初に見つかったCCCの行から下全部を表示するにはどうしたらいいでしょうか? よろしくご教示お願いします。
>>539 sed -n '/^ccc/,$p' hoge.dat
>>540 できた!
まじ、ありがとうございます!
forとwhileが浮かんでしまった これもsedで出来るのかぁ!
hold spaceまで駆使して始めてのsed漢
鬱陶しいなお前
548 :
名無しさん@お腹いっぱい。 :2011/04/21(木) 08:24:13.28
549 :
名無しさん@お腹いっぱい。 :2011/04/21(木) 08:55:44.46
>>544 死ねクズ。
質問者はsed一発で出来ると思わなかったからこのスレで質問した。
なんの問題もない。
551 :
名無しさん@お腹いっぱい。 :2011/04/21(木) 09:33:03.02
553 :
名無しさん@お腹いっぱい。 :2011/04/21(木) 09:40:05.63
なら、それにアンカー打て。カス。
554 :
名無しさん@お腹いっぱい。 :2011/04/21(木) 10:27:32.49
>>552 >>533 は自分はsedを使ってやってみた、と書いてるだけで、
必ずしもsedでの解法を求めているわけではないように見える。
ちょっとsedの話題出たからってすぐ誘導するのはいかがなものか? 心の狭いお方だ
俺は検索でもawkっちまう男なんだぜ?
ちょっと誘導されただけでなんで荒れるんだ。
誘導するなら質問直後にやれば? 回答が出終わってるんだから黙ってたらいいのに
たまたまその時見てなかっただけじゃない? 誘導ってそんな怒るほどのことなのかな。
粘着誘導だからね。
お前の行動が意味不明
>>560 別に怒ってるわけじゃないよ
ただ鬱陶しいだけ
質問です。 以下の形式のファイルを、 ---------------------- [2011.04.01] 123 123 [2011.04.02] 333 333 [2011.04.03] 444 444 ---------------------- 以下のように、3つに分割するシェルスクリプトを書くにはどうしたらよいでしょうか? ---------------------- [2011.04.01] 123 123 ---------------------- [2011.04.02] 333 333 ---------------------- [2011.04.03] 444 444 ----------------------
csplit file.txt '/^\[.*\]/' '{*}'
$ t1() { echo a; echo b; return; echo c; } $ t1 a b ふむ $ t2() { echo a; echo b |return; echo c; } $ t2 a c えー! サブシェル内は別環境って忘れててやられたわ エラー出ないのは仕様?他のどのシェルもこうなの? $ bash --version GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
returnはfunction呼び出し内でしか使用できないシェルもあったような気がするけど、 ashでも同じ結果。returnすなわちexitみたいだ。
>>568 は、
>>567 の意味を理解してないなw
エラー出ないのは、文法的には間違ってないので、それで仕様。
kshやzshだとパイプがサブシェルにならないから、
パイプ中のreturnで関数から抜けられる。
570 :
名無しさん@お腹いっぱい。 :2011/04/22(金) 23:59:49.99
>>569 理解してないのはお前。バカは黙ってればいいのに。ww
>>567-568 の意味は、bashやashはパイプの尻尾がサブシェルになるから(だから
echo cが実行される)、本来functionからの脱出の構文であるべきreturnは構文
エラーになるべき。でも、bashもashも構文エラーにならない。
>>568 ash=dash(Cygwin dash 0.5.6.1-2)のmanには
> The syntax of the return command is
>
> return [exitstatus]
>
> It terminates the currently executing function. Return is implemented as
> a builtin command.
ってあるからfunctionの中限定かと思ったら、確かに終了するね…
だけど
$ return
bash: return: can only `return' from a function or sourced script
普通こうならない?こっちの方がたくさんありそうだが(POSIXモードでもこうなる
>>569 ありがとウサギ! やっぱりサポートしてるシェルもあるんだね
確かに意味的に変な挙動でも、文法的に間違ってない。 そのまま通るから困るんだよなー
こういうときどう書くべきか… 一番いいアイデアをたのむ
# 一時ファイル?パラメータに展開する?場合によるけどいい気がしない
572 :
名無しさん@お腹いっぱい。 :2011/04/23(土) 07:54:06.34
>>570 理解してないのはお前。
returnは「構文」ではなくて単なるコマンド。
コマンドとして正しく使われているから「構文エラー」にならない。
$ type return
return is a shell builtin
「構文」なのはifとかwhileとか。
$ type if
if is a shell keyword
573 :
名無しさん@お腹いっぱい。 :2011/04/23(土) 08:54:18.85
>>572 言葉の定義に突っ込み始めたお前の負け。ww
構文だろうが、コマンドだろうが、ビルトインコマンドだろうが、
>>570 の本質は変わらない。
お前、バカなんだから出てくんな。
>>573 お前aho w
returnは「コマンド」だから、本来どこで使っても文法エラーにならない。
ただしbashでは、関数外の素のreturnはエラーになる。
それとは別にパイプがサブシェルになる問題があって、
bash/ash等はパイプ中のreturnでは関数を抜けられない。
ksh/zsh等はパイプ右端のreturnでも関数を抜ける。
575 :
574 :2011/04/23(土) 09:45:06.14
>>571 エスパると、関数の中で
echo hoge | while ... return ... done
ってやりたいんだろ?
while ... return ... done <<< "$(echo hoge)"
で回避する方法が一応あるけどな。
シェルはfunctionを構文として、returnは他のコマンドと同様に処理してたわけか
なるほど、気がつかなかった。思い込んでたわ
returnがコマンドとして実行されるタイミングでは、サブシェルにも
functionの中っていう情報は伝わってるから、
>>571 みたいなエラーにならない訳ね
でもやっぱり挙動としてはおかしいと思うよ
構文エラーは行き過ぎだと思うが、警告は欲しいところ
# 構文にreturnを組み込むと、エラーを出すのはfunctionの定義のところになりそう
# そのときに、それがサブシェルの中だってエラー出すのは出来なくないけど
# そこまでシェルに判断させるべきか?
仕様なら仕方ないと思わなくないし、互換性のためだって言われそうだが
こんな出鱈目な仕様に依存するスクリプトなんて捨てたほうがいい
なぜ素通りさせるのだろうね、メリットないじゃん
>>575 thx!
おお、ヒアドキュメントっぽい
やっぱあるのか、調べ足らなかった
読み返したら必要なこと書いてなかった
その通りで、whileにパイプしようとしてて
挙動おかしくて、削っていったらあの形になったんだった
これも一度展開して読み込ますタイプ?
manには何もないけど制限はあるのかな
パイプだとコンカレントで動いてくれそうなんだよね
CPUいっぱい!が今なんだから、どうにかならないかと思うんだが
>>577 bashの場合、ヒアドキュメントは内部で一時ファイル作るから、
コンカレントには動かないな。
mkfifoでFIFO作ってリダイレクトするならコンカレントになるけど、
あまり美しくないのが難点。
bash4限定だけどcoprocなんてのがあった
$ coproc {
> echo x
> read # 即終了を防ぐ
> }
[1] 1508
$ while read -u ${COPROC[0]} A; do
> echo >&${COPROC[1]} # コプロセスのreadを抜けるため
> echo $A
> done
a
kshからインスパイアされた機能らしいが
移植性考え出すと難しいな
>>578 これはFIFOと似たようなものかな
bashだけで出来るよっていう以外に差がない
580 :
名無しさん@お腹いっぱい。 :2011/04/23(土) 11:09:19.42
>>574 言葉の定義にしか突っ込めなくなったお前の負け。
>>568 はパイプの尻尾のサブシェル問題を踏まえた発言だ。
引っ込んでろバカ。
>>580 定義を抜きにしても間違ってる
>>568 は
「returnを関数以外で使えるか」
「returnがexitみたいに動作する」
の点に言及してるだけで
パイプやサブシェル問題には一切触れてない
(多分書き込み時点では知らなかったのだろうw)
582 :
名無しさん@お腹いっぱい。 :2011/04/23(土) 11:29:49.63
>>581 お前のようなバカを相手に回答したわけではない。
>>567 で既にサブシェルに対する言及がありそれへのレスだ。
>>567 の質問は
> エラー出ないのは仕様?他のどのシェルもこうなの?
だ。
これはreturnがfunction外でも使えてしまった事への疑問に対する質問に他ならない。
したがって、
>>568 のように答えた。
>>571 は回答の意味を理解している。
お前が周回遅れのバカって事だ。
>>582 >>567 のreturnはあくまで「関数内のreturn」だよ
なのに
>>568 では質問していない「関数外のreturn」について回答してるし
質問のポイントをわかっていない
584 :
名無しさん@お腹いっぱい。 :2011/04/23(土) 11:57:26.99
>>583 必死だな。バカ。サブシェルはどこ行ったんだよ。ww
関数内のreturnを「エラー出ないのは仕様?他のどのシェルもこうなの?」と聞くわけないだろ。
>>567 はt2のreturnがサブシェルすなわち関数外で実行されてエラーにならなかった事を質問している。
それに対して
>>568 は適切に答えている。
判ってないのは周回遅れの知恵遅れのお前だけだ。 引っ込んでろ。バカ。
>>584 サブシェル自体が関数内にあるから、
サブシェルの中にあっても「関数内」なんだけどw
そうか、
>>568 はreturnを「関数外」と思ってたんだなw
それ間違いだからw
bashじゃなければいいのかしら?
587 :
名無しさん@お腹いっぱい。 :2011/04/23(土) 12:33:14.62
>>585 必死だな、バカ。w
> サブシェルの中にあっても「関数内」なんだけどw
関数内のreturnならば、echo cは実行されない。
周回遅れで知恵遅れは引っ込んでろ。
>>587 関数内のreturnだからecho cは実行されない、んじゃなくて、
サブシェルだから関数を抜けずにecho cが実行るんだよ。
お前やっぱりサブシェルを理解してないんだな。
589 :
名無しさん@お腹いっぱい。 :2011/04/23(土) 12:42:33.21
>>588 バカ、関数内のreturnじゃなくて、サブシェル内のreturnだからecho cが実行される。
実行結果もその通りだ。元質問者はだからこそ
>>567 の質問をした。
周回遅れで知恵遅れは引っ込んでろ。w
>>589 bashの場合、関数外扱いか関数内か使いかはエラーメッセージで判定できる。
$ return
return: can only `return' from a function
(関数外)
$ f() {(return)}
$ f
エラー無し(関数内扱い)
kshとzsh $ t2 a bashとdashとbusybox ash $ t2 a c
592 :
名無しさん@お腹いっぱい。 :2011/04/23(土) 12:59:30.55
>>590 それが直感的におかしいから、元質問者は>567の質問をした。
>>568 は適切に回答している。
周回遅れで知恵遅れは引っ込んでろ。w
適切な回答は
>>569 ←文法の件と、kshやzshの例を挙げて回答
>>575 ←回避方法を回答
だな。どっちも俺だけど
>>568 は的が外れている上に解決方法等の情報量が皆無w
594 :
名無しさん@お腹いっぱい。 :2011/04/23(土) 13:31:57.10
>>593 墓穴掘ってるぞ。バカ。
>>569 エラー出ないのは、文法的には間違ってないので、それで仕様。
関数内でreturnが実行されたならば、関数は終了するのが仕様。
Function:
If the builtin command return is executed in a function, the function completes
and execution resumes with the next command after the function call. Any command
associated with the RETURN trap is executed before execution resumes.
When a function completes, the values of the positional parameters and the special
parameter # are restored to the values they had prior to the function's execution.
return [n]
Causes a function to exit with the return value specified by n. If n is omitted,
the return status is that of the last command executed in the function body.
If used outside a function, but during execution of a script by the . (source)
command, it causes the shell to stop executing that script and return either n
or the exit status of the last command executed within the script as the exit
status of the script. If used outside a function and not during execution of a
script by ., the return status is false. Any command associated with the RETURN
trap is executed before execution resumes after the function or script.
周回遅れで知恵遅れは引っ込んでろ。w
>>594 >If used outside a function ... the return status is false.
↑
関数外ならエラーステータスになると言ってるが、
$ f() {(return)}
$ f
$ echo $?
0
↑真だね。よって、関数内w
596 :
名無しさん@お腹いっぱい。 :2011/04/23(土) 14:17:57.75
>>595 必死だな。バカ。w
関数内なら関数は終了して、関数呼び出しの次コマンドから実行が再開されると書いてある。
関数内であるもかかわらず、関数が終了しないのはバグ。
If the builtin command return is executed in a function, the function
completes and execution resumes with the next command after the function call.
周回遅れで知恵遅れは引っ込んでろ。w
仕様だけにしようがないなら、仕方ないとして
bash[version 4.1.10(4)-release (i686-pc-cygwin)]のmanから引用
>COMMAND EXECUTION ENVIRONMENT
> Command substitution, commands grouped with parentheses, and asynchro-
> nous commands are invoked in a subshell environment that is a duplicate
> of the shell environment, except that traps caught by the shell are
> reset to the values that the shell inherited from its parent at invoca-
> tion. Builtin commands that are invoked as part of a pipeline are also
> executed in a subshell environment. Changes made to the subshell envi-
> ronment cannot affect the shell's execution environment.
サブシェルでは環境は親から複製されるそうだ。
>>567 や
>>575 はパイプラインに
ビルトインコマンドを混ぜてるから、意識しないうちにサブシェル環境になってしまう訳か
つまりt2の中のパイプラインの解釈は、‘echo b | ( return );’ってなる
親環境が複製されてるんだから、当然サブシェル内もfunctionの中って認識されるわな
でも、意図的にこうは絶対に書かないのに、暗黙的にサブシェルになって警告すらないのは嫌がらせだろ
# 何回もこの糞長いmanpage読むのはきつい
# せめて実行環境とスクリプティングのリファレンスは分割してくれねーかな
$ type read read is a shell builtin $ type { { is a shell keyword 違うか $ echo | { /usr/bin/echo $BASH_SUBSHELL; } 1 扱いは一緒か $ type \( bash: type: (: not found なんでや!
>>596 バグじゃない。関数外のreturnはエラーと言ってるだけで
関数内のreturnが関数を終了するかどうかは別問題
パイプがサブシェルにならないkshやzshでも以下ではreturnしない
f() {(return); echo hoge;}
kshとかzshはサブシェルを作らないから、望み通りパイプでreturnできるっぽいが じゃあ、わざとサブシェル作って、そこからreturnするとbashみたく戻れないのか? 戻れないなら古くからのshの作法なんだろう。それが仕様通り
bashが保守的で、kshとかzshとかが革新的なのか パイプを特別に扱うことがあるってのは、何か問題があるからなのか
POSIX仕様的には決まってないんじゃなかったっけ? サブシェルにならない方がわかりやすいのは確かだと思うが。
604 :
名無しさん@お腹いっぱい。 :2011/04/23(土) 16:42:31.09
>>599 バカ、必死すぎる。ww
関数外ならfalseを返すけど、trueなので関数内というのが
>>595 の主張だろ。
それなら、関数内であるreturnは、関数から帰らなければいけない。
周回遅れで知恵遅れは引っ込んでろ。w
論争そのものには興味ないですが… The Single UNIX Specification Version 3では、 > 2.12 Shell Execution Environment > (略) > Additionally, each command of a multi-command pipeline is in a > subshell environment; as an extension, however, any or all commands in > a pipeline may be executed in the current environment. ==== > NAME > return - return from a function > (略) > DESCRIPTION > The return utility shall cause the shell to stop executing the current > function or dot script. If the shell is not currently executing a > function or dot script, the results are unspecified. です。 要するにどうなっていようが仕様に適合します。 (個別の実装の「仕様」はともかく)
> (略) the results are unspecified. undefinedでなくて、unspecifiedか。実装依存ってことね、たぶん ユーザとしたら、移植性の高いコード書くときに、return使う場所には気をつけろってこと? わざわざ、こういうときは実装依存ですって、規格に書くってことは、昔から揉めてたわけか
607 :
名無しさん@お腹いっぱい。 :2011/04/23(土) 18:52:01.78
つまりSUS V3的には、サブシェルで実行されている
>>567 のt2のreturnは関数外での
実行、returnが関数外で実行された時の動作は不定。なので仕様通りという事だね。
bashではmanに書かれている動作(関数外ではfalse)に反するのでバグ。
したがって、
>>569 も
>>585 も完璧なるウソ。
判ったか? 周回遅れの知恵遅れ。w
バカなんだから黙ってりゃよかったのに。
つか、何気にインプロセスでパイプ処理するのってすごくねーか? いくつ繋がってても、ビルトイン・外部コマンドがごちゃ混ぜでも動くのなら X=0; for I in `seq 1000`; do echo $I; X=`expr $X + 1`; done |sed -ne '1,$ p' | while read J; do echo $J; X=`expr $X + 1`; done |while read K; do echo $K; X=`expr $X + 1`; done | while read L; do echo $L; X=`expr $X + 1`; done |while read M; do X=`expr $X + 1`; done どーなるんだよ、これww bashだと間違いなくXは0のままだが
>>609 > ; as an extension, however, any or all commands in
> a pipeline may be executed in the current environment.
だから、SUSv3的にも「よく頑張ったぜ!」と適合。
>>610 kshとか、zshでのことだよな?確かに頑張り過ぎだわ
ちゃんとXに値入るの、これww
>>607 判ったか? 周回遅れの知恵遅れ。w
バカなんだから黙ってりゃよかったのに。
>>566 回答ありがとうございます。
試してみたところ、以下のようにエラーになります。
$ csplit file.txt '/^\[.*\]/' '{*}'
csplit: *}: bad repetition count
当方、freebsd5.4を使っております。
$ uname -a
FreeBSD japan 5.4-RELEASE FreeBSD 5.4-RELEASE #0: Sun May 8 10:21:06 UTC 2005
[email protected] :/usr/obj/usr/src/sys/GENERIC i386
マニュアル見るとfreebsdではnumに*を指定することはできないようです。。。
なにか回避策はありますでしょうか
なんでそんな古いの使ってるの?
>>613 まず、grep -c "\[.*\]" file.txtで、マッチする数を求める。
その数から2を引いた数を、アスタリスクのかわりに指定する。
>>608 に
>>575 の他の解決策書いてあるね。
f() {
while read WD; do
[ "$WD" = end ] && return # fから戻れる
echo "$WD"
done < <(cat "$1")
echo "all done!" # returnしてたら来ない
}
こんな感じ。ヒアストリングと違って、パイプ使うのと同じようだ。
diff <(sed -ne '/begin/,/end/ p' foo.txt) <(sed -ne '/begin/,/end/ p' bar.txt)
便利だ。
mlの中の人的には
>>567 は仕様で、そもそもそんな場所のreturn自体禁止しようって人もいるっぽい。
618 :
名無しさん@お腹いっぱい。 :2011/04/25(月) 21:34:16.48
rubyでいうところの for dir in ENV['PATH'].split(/:/) puts dir end ということをshellスクリプトでやりたいんだけど、 for dir in `???`; do echo $dir done ここの ??? の部分がわかりません。どうするの?
>>618 echo ${PATH} | sed '/:/s// /g'
s/:/ /g じゃなくて? PATHにスペースあったら知らんけど
>>620 どっちでも。
ksh だとこれが出来るのね。
IFS=:; for i in ${PATH}; do echo ${i}; done
>619-621 ありがとう。 echo $PATH | sed 's/:/¥n/g' がなんかうまくいかない。sedは¥nがつかえないのかな。
trで充分
今まで tr って tr -d しか使ってなかったわ echo ${PATH} | tr : '¥n'
なんで改行したいのよ
質問です。 以下を見てください。 ---------------------------- japan:~$ cat hoge.dat aaa bbb ccc ---------------------------- japan:~$ cat hoge.sh #!/bin/sh IFS=' ' cnt=0 cat hoge.dat | while read -r line do cnt=`expr $cnt + 1` echo "cnt=$cnt" done echo "cnt=$cnt" ---------------------------- japan:~$ ./hoge.sh cnt=1 cnt=2 cnt=3 cnt=0 ---------------------------- hoge.sh実行で、最後にcnt=0と表示されていますが、 なんでcnt=3とはならないのでしょうか?
>>626 パイプで繋いだために while〜 がサブシェルで実行されるから
ちなみに zsh だと最後も cnt=3 になる
628 :
名無しさん@お腹いっぱい。 :2011/04/26(火) 01:58:32.24
おい、周回遅れの知恵遅れ。 大好きなサブシェルの話題だが、お前バカなんだから黙ってろよ。w
zsh拡張し過ぎ、そこは記憶されるべきじゃない。 それ前提で書いてたし。移植性()笑
> Changes made to the subshell environment shall not affect the shell > environment. Command substitution, commands that are grouped with > parentheses, and asynchronous lists shall be executed in a subshell > environment. だからSUSv3違反だな。まあzshらしいw 常套句で言わずもがなだと思うが↓ > shall > For an implementation that conforms to IEEE Std 1003.1-2001, describes > a feature or behavior that is mandatory. An application can rely on > the existence of the feature or behavior.
>>628 訳の分からんキチガイカキコして荒らしまくってんじゃねえよキチガイ、とっとと今すぐに死んで自殺して死ねwwwwwwwwwwwwwww
年中無休発狂妄想爆裂憤死寸前粘着真性キチガイ包茎池沼病気猿男(狂猿)◆QfF6cO2gD6は今すぐに発狂して自殺して死ねよwwwwwwwwwwwwwww
何でもいいがあちこちにそうやってリンク貼って荒れるのを見て楽しんでいる年中無休発狂粘着真性キチガイ包茎池沼病気猿男(狂猿)◆QfF6cO2gD6(+とそのキチガイ妄想)はマジでウザイ(笑)から、
今すぐに発狂してとっとと自殺して今すぐに死ねwwwwwwwwwwwwwwwwwwwwwwwwwww
こういう救いようのない真性基地外ニートは今すぐにとっとと発狂してビルから飛び降りて自殺して今すぐに死ねwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
bashとzshとの挙動の違いで困ってます。 やりたいことは、「/tmp/*.html」のようなパターンに一致するファイル名を取得することと、 そのようなファイル名がなかった場合はそれを検出することです。 で、今困ってるのは、パターンに一致するファイル名がなかった場合の挙動です。 bashの場合は次のようにパターンそのものが出力され、エラーメッセージはでません。 bash> echo /tmp/*.html /tmp/*.html これに対し、zshではエラーメッセージがでます。 そしてこのエラーメッセージが、2>/dev/null とか 1>/dev/null とかしても表示されてしまいます。 zsh> echo /tmp/*.html zsh: no matches found: /tmp/*.html zsh> echo /tmp/*.html 2>/dev/null zsh: no matches found: /tmp/*.html zsh> echo /tmp/*.html >/dev/null zsh: no matches found: /tmp/*.html zshで、このエラーメッセージをださずに、パターンに一致するファイル名を取得するにはどういう方法がありますか。
634 :
名無しさん@お腹いっぱい。 :2011/04/27(水) 00:53:42.49
>>631 福島一号炉で焼かれてしまえ。粘着キチガイ犬。
芝を無駄に生やす奴にろくな人間はいないな・・・
>>632 zshはsh/kshコンパチモードってのがある。
>>633 ありがとうございました。setopt nonomatchの動作を確認しました。
続いて質問ですが、一時的にnonomatchを設定し、そのあと解除したいのですが、
nonomatchが設定されているかどうかはどうやって確認すればいいでしょうか。
つまり
nonomatch_backup=getopt nonomatch
setopt nonomatch
...シェルスクリプト...
nonomatch=nonomatch_backup
みたいな感じにしたいんですが。
なおgetopt nomatchやgetopt nonomatchを試したのですが、いつも同じ値を返すようなので、期待したものとは違うようです。
>>637 サブシェル内で setopt nonomatchすれば、
そもそも状態セーブしたり解除したりする必要ないよ。
あと、getoptは全然違う外部コマンド。
>>638 おう、getoptはコマンドラインオプションをパースするコマンドでしたか。紛らわしい・・・
つうかですね、たんに /tmp/*.html のようなパターンに一致するファイルを見つけたいだけなのに、
なんでbashとzshで違う書き方をしなきゃいけないんでしょうか。
bashでもzshでも同じように動作する書き方ってありませんか?
今「zsh」でぐぐって調べてるんですが、わかんないです。
ほんとは ruby とか使いたいけど、使えるのがせいぜいawkぐらいしか期待できない環境で
やらなきゃいけなくて、もう発狂しそうです。
640 :
名無しさん@お腹いっぱい。 :2011/04/27(水) 09:01:09.91
bashやzshではなくshを仮定すればまだ違いは少ないのでは?
検索するより公式ドキュメントを読んだ方がいい。公式ドキュメントでわからないところを検索する。 そうしないと、沢山あるウソのページに騙されて時間を浪費する。
>>641 これは参考になるページ。ありがとうございます。
しかしこのページでも、互換性のある echo "/tmp/*.html" の書き方は載ってないですね。
こんなことすら書けないシェルスクリプトって、何なんですかね。今の時代に必要なんすか?
いやゆとりの愚痴ですけど。
>>643 >>636 は無視かよ。
shコンパチモードで起動すれば解決。
zshをshの名前で起動すれば自動的にコンパチ。
shが基本だからshで書けばOk。 拡張シェルはshとの互換を取るような仕組みを持っているからそれを使う。
シェルスクリプトの互換性というのは暇つぶしの冗談なので真に受けると負け
大昔じゃあるまいし、商売でスクリプト書きながら 移植、転用なんてしてるとは思えない ボーンに拘る必要はなく、自分の環境で希望の動作が問題ないなら それはbだってcだってかまわねーんだよ。 どの道犬糞、馬糞くれーなもんなんだから。 今では、たかが数行のcシェルスクリプトみて血管切れそうに 非難するバカもいないだろうけどなw
cshなんかインストールしてないから、そんなの納品されたら動かない。取引停止だな。
事前打ち合わせで確認しましたよ^^
購入仕様に「csh不可」って書いてあるでしょ。
いいえ?いただいた購入仕様書にはそんなことかいてありませんよほら
あっそう。もう帰っていいよ。口座閉鎖な。
うふふ
cがダメなんていうバカに 「極めて単純で小さなスクリプトなんで、Cの欠陥がある部分は使ってませんよ?」 「具体的に何の処理を指してますか?」 っていうとへの字にして黙るねw 結局センパイにダメって言われて、一切の知識がないんで 「ウナギとウメボシ食べません」みたいなものなんだよ
↑こういうバカに、極めて単純なスクリプトならsh使い慣れてなくても楽勝でしょ。 それくらいできないの? っていうと黙っちゃうよね。w
というか csh script を使うことの問題点は「お里が知れる」 それだけだ 本当に問題がでるレベルで使えば自然と使わなくなるしな
問題出るレベルとか言ったって echo foo >&2 とか、いまどきcmd.exeですらできることもできない男の人って…… った感じじゃんcshって そういう初歩のリダイレクトすらしないスクリプトだとしても 後で手を入れるかもしれないんだし この使用範囲ならたまたまcshでも問題ないからcsh使おうとか そんな使い分けをする意味がそもそもわからない
>>639 逆にシェルスクリプトがbashとzshで動かないといけない意味は何?
#! /bin/sh
と指定したシェルだけ対象にすればいいだけでしょ?
根本的な部分が理解できてないのでは?
それとも各ユーザのシェル環境に取り込まれる関数でも書いているわけ?
>>639 globによる ファイル名生成でそのファイルの存在を調べたいなら、nullglob のほうがいいんじゃない?
bash: shopt -s nullglob
zsh: setopt nullglob
合致するファイル名がない場合は「*」を含む引数が空になるよ。
>>659 なんとそんな機能が!これはすばらしい。
いままでは
for x in `echo /tmp/*.html`; do
if [ "$x" != "/tmp/*.html" ]; then
echo $x
fi
done
みたいなことをやってたんですけど、nullgrobのおかげですこしコードがすっきりしました。
あとは$BASH_VERSIONと$ZSH_VERSIONを調べて使い分けることにします。
ありがとうがいます。
>>658 実行しておわりというシェルスクリプトではなく、ユーザの.bashrcから読み込まれてshell関数を提供するのが目的のスクリプトなので。
質問ですが、bashで簡単なスクリプトを書いています。 バイナリファイルで、ファイル名があればそれを読み、無ければパイプから、パイプもなければ、端末を読みに行き、処理をして、結果をlessで表示しようと思います。 script [files...] filenamesに何もなければ端末を読みにいくので、これでいいかと思いましたが、lessが付くとダメです。 $ filenames=( "$@" ) # 実際は$@を処理したもの $ cat "${filenames[@]}" | hexdump -C | less とか書いている間に、解決法も見つかったのですが、参考までにお聞かせ下さい。 皆さんならどうしますか?
やっぱり、標準入力の他に「標準エラー入力」が欲しいよな。
ashだとshoptが無いな
シェルスクリプト冒頭で #!/bin/sh と続けて書く人もいれば #! /bin/sh と、#!のあとにスペースを入れる人もいるじゃないですか それぞれの違いとか、狙っている効果とか、何かあるのでしょうか?
スペースを入れるのは情弱
こんばんは、シェル初心者ですが ディレクトリ内のaaaのファイル以外を削除する あるいは、aaa.c bbb.c 以外のファイルを削除するってことは 可能でしょうか
もちろん、シェルスクリプトを書けば可能です
シェルスクリプト変数で $HOGE と書く人もいれば ${HOGE} と、$のあとに{ と }を入れる人もいるじゃないですか それぞれの違いとか、狙っている効果とか、何かあるのでしょうか?
あるディレクトリがあったとして、それが$PATHに含まれていないときだけ,$PATHに追加するという処理は、どう書くのがいいでしょうか。
>>670 for dir in /usr/bin/mh $HOME/bin ; do
if ! echo $PATH | grep $dir > /dev/null; then
[ -d $dir ] && export PATH=$PATH:$dir
fi
done
>>670 DIR=/usr/hoge/bin
case :$PATH: in *:"$DIR":*);; *) PATH=$PATH:$DIR;; esac
>>671 はエレガントじゃないねw
>>627 ありがとうございます。
参考までに教えていただきたいのですが、サブシェルの変数の値を取得するには、どうしたらよいのでしょうか?
それとも、そのようなことは出来ないのでしょうか?
>>672 ありがとうございます。caseの引数に、$DIRじゃなくて$PATHを持ってくるんですか。頭いいなあ。
>>667 zsh なら
rm *~aaa
rm *~aaa.c~bbb.c
なんてこともできる。
autoconfは極端すぎるわな
>>669 $ A=aaa
としたとき、
$ echo $A
aaa
は当然として
$ echo $A.B
aaa.B
となるが、以下の場合は
$ echo $A_B
となる
ここで{}を使うと
$ echo ${A}_B
aaa_B
となる
変数名の区切りと見なされたり見なされなかったりする記号を続ける場合に
うっかり変な解釈をさせない、という効果はあるかな
昔、FreeBSDかなんかで、{}使ってなくてバグってたスクリプトがあるので
よくあるバグなのかもな
zshなんて誰も聞いてないんだから引っ込んでろ。カス。
>>676 zsh 便利だな
そこまでやるならスクリプト言語を使いたくなるけど
>>677 ありがとうございます。では、
"$HOGE"
と
"${HOGE}"
の
それぞれの違いとか、狙っている効果とか、何かあるのでしょうか?
{}で囲むほうが賢そう
>>680 {}付けとく方が、変数名を意識させることによる誤りを減らせる効果はあるんじゃね
あとは省略が許されているから省略するのか、それとも省略は許されていても省略はしないのか、
そういう信条に関わる違いじゃね
ファイル名のソートについて相談です。 touch ver0.1.jpg touch ver0.2.jpg touch ver0.9.jpg touch ver0.11.jpg touch ver0.11.2.jpg touch ver0.11.11.jpg というファイル名があったとして、これを単純にソートすると ver0.1.jpg ver0.11.11.jpg ver0.11.2.jpg ver0.11.jpg ver0.2.jpg ver0.9.jpg となってしまいます。しかし希望するのは最初のように番号順にソートされることです。 いちおうsortには -n オプションがありますが、この場合は効かないようです。 このような場合、どうすればいいでしょうか。
>>684 ver0.1.jpg
ver0.1.1.jpg
というファイルがあると、ls -v でもうまく行きません><
$ ls -v1 ver0.1.jpg ver0.1.1.jpg ver0.2.jpg ver0.9.jpg ver0.11.jpg ver0.11.2.jpg ver0.11.11.jpg $ ls --version ls (GNU coreutils) 8.5 (略)
>>686 GNU版にはそんな機能があるのですか。すごいですね。
残念ながら自分のマシンには入ってませんでした。
いちおうPerlを使うとこんな感じでできそうなんですが、Perlを使わずにできないもんですかねぇ。
perl -e '
%h = map {
$s = $_;
@a = m/(¥d+)/g;
$k = join("_", map { sprintf("%010d", $_) } @a);
$k => $s;
} @ARGV;
for (sort keys %h) {
#print $_, "¥n";
print $h{$_}, "¥n";
}
' ver*
netscape-4.79.tar.gz netscape-4.8.tar.gz の場合に対応できてないようです。 netscape-4.8の方が新しいんですが。
ネスケを知らない人が見たら、4.79 の方が新しいと判断する
それはない。 4.9と4.10だったら迷う。
691 :
661 :2011/04/28(木) 14:40:31.19
>>683 sort -nt '.' -k 2,2 -k 3,3
だ、だれか私の質問にレスを! lessが付いちゃ(上手く)行けないだけに...
結局3つのコマンドの組み合わせだけで、出来たのですが。
考えるネタとして面白いかなぁと、思うのですが。
var = [ -n "$value" ] ? "YES" : "NO" のように三項演算子が使いたいんですけど、なさそうなので [ -n "$value" ] && var="YES" || var="NO" と書いてみました。 この書き方は、ありでしょうか。 互換性が低いからやめたほうがいいとか、アドバイスをお願いします。
>>692 普通にアリ。互換性問題なし。
ちなみに、こういう書き方もある。
↓
var=${value:+YES}; var=${var:-NO}
普通にif使った方が見やすい気がする
var="NO" [ -n "$value" ] && var="YES" じゃだめなん?
>>694 普通にif使ったら初心者と思われる気がするw
普通に書くとしてもcaseだろ。
case $value in '') var=NO;; *) var=YES;; esac
set -eしてると面白い事になるからダメ。
ヘンに凝るより読みやすい方がいいなぁ。
>>697 set -e に耐えられる合格回答は、
>>693 var=${value:+YES}; var=${var:-NO}
だけだな。
set -e なんて前提に置かなくていいだろw
set -e だけじゃなく、
set -u も前提におくべきだな。
if [ -n "$value" ]; then
ってやると、
set -u に耐えられない。
>>693 は set -e にも set -u にも耐える。
set -fすると、その後はシェルスクリプトにあたえたパラメータについて ワイルドカードを展開させないようにできるじゃないですか set -fしてないシェルからシェルスクリプトを起動したときに、同じように ワイルドカードの展開をさせないように、できますか? パラメータに*を与えたとき、$1として*そのものを設定させたいのです
>>702 '*' で呼び出して、"$1" で受け取る。
呼び出す前に(set -fしてないシェルが)展開するするから無理。
スレチ覚悟の上だが、 find ./ -name *.txt とか、カレントディレクトリに*.txtが無い場合はfind側で*.txtへのマッチングをしているように見えるな あれはどういう仕組みで生*を受け取ってるんだろうか
何のひねりもないと思うが。 まず *.txt をシェルが解釈し、合致するファイルがなければ "*.txt" が find に渡され、 find がそれをワイルドカード展開する(試みる)。 (当然 nomatch や nullglob オプションによってシェルの挙動は変わる)
>>700 普通に使うぞ。コマンドの終了ステータスを逐一確認するの面倒だろ。
見通しも悪くなるし。
>>707 set -e して、すべてのコマンドの後ろに
|| :
を書く癖がついて、本末転倒にw
bashで hogefuga? (Y/N) のようなプロンプトを出してからreadコマンドで読み込むようにしてるのですが、 このときEnterキー等をいちいち押さずともスクリプト側が判断できるようにするには、どうしたらいいのでしょうか。 この場合、yかnを押下するだけでスクリプトが進行するようにしたいのです。
711 :
661 :2011/04/29(金) 23:30:12.80
今日気付いたのですが、`\'(back slash) もダメですね。`&' や `<' だけでは無かった。 `>'もmust be escapedとかって書いてあったような。 zenity --info -text='\' zenity --info --text='?' 誰も挑戦して頂けない様なので、一応解決法です。 すごい技の披露を期待してましたが残念です。 私はとても悩んだのですが。 最初は、変数や、テンポラリーファイルに入れてみました。 $ cat "${filenames[@]}" | { i="$( hexdump -C )"; echo -n "$i" | less; } $ cat "${filenames[@]}" | { tmpf="$( tempfile )"; rmtmpf() { rm "${tmpf}"; exit 1; }; trap rmtmpf INT HUP TERM; hexdump -C >"${tmpf}"; less "${tmpf}"; rm "${tmpf}"; }
712 :
661 :2011/04/29(金) 23:41:14.24
消えてしまいました。数値参照でいけました。 zenity --info --text='& #92;' 次にヒアストリングスを組み合わせてみました。 $ cat "${filenames[@]}" | hexdump -C | less <<<"$( cat )" $ cat "${filenames[@]}" | hexdump -C | { read -rd '' i ; less <<<"$i"; } シンプルなものが見つかりました。 $ less "$( cat "${filenames[@]}" | hexdump -C )
713 :
661 :2011/04/29(金) 23:49:45.24
誰も聞いてないのに、連投すみません。 テンポラリーファイルを、fifoに出来ないかと頑張ってみました。 手打ちや、3KB位のだと、動きましたが、 54KBのファイルでも、バッファーがつまるのか、動きません $ mktmpp_n () { tmpp="/tmp/${0##*/}.$$.$( head -c6 /dev/urandom | base64 )"; };\ rmtmpp() { rm "${tmpp}"; exit 1; };\ trap rmtmpp INT HUP TERM; mktmpp_n; until mkfifo "${tmpp}"; do mktmpp_n; done;\ ( sleep 1; cat "${tmpp}" | less; rm "${tmpp}" )& cat "${filenames[@]}" | hexdump -C >"${tmpp}"; fg
714 :
661 :2011/04/30(土) 00:23:49.12
シンプルなものは、まったくの勘違いでした。 よく確かめても、これだ。はずかし。
>>710 そんなオプションがあっただなんて・・・。
ありがとうございました!
716 :
661 :2011/04/30(土) 09:03:03.77
何度も、すみません。あまりにも、連投なので時間を置いてみたのですが... シンプルなものも、用意してありましたので、 目障りだと思う方もいらっしゃるでしょうが、続けさせてもらいます。こっちでした。 $ cat "${filenames[@]}" | less <<<"$( hexdump -C )" これも、/tmpにファイル作りますね。 trapとかkillもいじくってみました。 これも使えそうだったのですが、すぐには出来ませんでした。 $ less & pkill -STOP -P $PPID -u $UID less
出遅れた感じだが…
$ for I in `seq 30000`; do echo $((RANDOM%2)); done >tmp.txt # テストデータ
$ time while read T; do if [ $T -eq 0 ]; then X=; else X='v'; fi;
> YN="Y"; done <tmp.txt # 1. 代入だけ
real 0m4.051s
user 0m2.521s
sys 0m0.761s
> if [ -n "$X" ]; then YN="Y"; else YN="N"; fi; done <tmp.txt # 2.
>>694 real 0m5.316s
user 0m3.478s
sys 0m0.870s
> [ -n "$X" ] && YN="Y" || YN="N"; done <tmp.txt # 3.
>>692 real 0m5.447s
user 0m3.681s
sys 0m0.783s
> YN="N"; [ -n "$X" ] && YN="Y"; done <tmp.txt # 4.
>>695 real 0m5.554s
user 0m3.622s
sys 0m0.780s
> YN=${X:+Y}; YN=${YN:-N}; done <tmp.txt # 5.
>>693 real 0m5.111s
user 0m3.394s
sys 0m0.801s
3. ≒ 4. > 2. > 5. ( > 1. )
時間は5回平均。3.の書き方が一番速そうだから使ってたが、そんなことなかった。
スクリプトのプロファイラみたいなのは、ないのかね??
718 :
名無しさん@お腹いっぱい。 :2011/05/02(月) 23:27:03.68
Redhatでこれ動いたんだけど、こんなCASE文([1-5])は昔から有効でした??? それとも他のOSじゃはじかれるかどなたか教えてください #!/bin/sh case $1 in [1-5]) echo OK;; *) echo NG;; esac
719 :
名無しさん@お腹いっぱい。 :2011/05/02(月) 23:30:24.84
case の条件に書いたものはファイル名のマッチングと同じ規則でマッチする。
>>719 なるほど。安心して使います。
感謝です。
「パターン」とか「パターンマッチ記法」とか 「シェルパターンマッチ記法」って言ってる。
Ubuntuでこれ動いたんだけど、こんなCASE文(hoge) (*)は昔から有効でした??? それとも他のOSじゃはじかれるかどなたか教えてください #!/bin/sh case $1 in (hoge) echo OK;; (*) echo NG;; esac
v7shではNGですが、SUSv3は問題ないです。 いつからOKからはしらん。
>>721 glob
あるいは
globbing
と呼ぶのが正式で誤解が少ないですよ。
パターンでも通じますけど、正規表現のパターンマッチングと容易に混同されちゃうんです。
同じような記号使いますから。(どちらもオートマトン理論の閉包や和に由来するから仕方ない)
>>724 パターン(pattern)が正式だよ。
globとかglobbingとかはcsh(笑)の用語。
726 :
724 :2011/05/03(火) 17:45:14.31
ああその通り、csh以降でしたね。 で、721に戻ると、「シェルパターンマッチ記法」というのは、不自然ですよね。 マッチ⇒記法のつながり部分が特に。だって、記法(に基づいた表現)に対してマッチをするんだから。 実際、あまり聞く言い方ではないのでは?
727 :
名無しさん@お腹いっぱい。 :2011/05/03(火) 18:09:53.53
728 :
724 :2011/05/03(火) 18:25:57.67
>>727 ありがとうございます、勉強になりました。
>>729 乙
自分が初めて触ったWS(SunOS4.1.3)がcshだったなぁ…
もう20年近く前になるのか(遠い目)。
>>729 > で、そこ見ると、regular expression notationと使い分けている。
当たり前
>>731 時間帯的に、よっぱらってんのかな?
文章を見て、短絡的に反応して揚げ足をとってるように見えるが。
724の言葉、"正規表現のパターンマッチングと容易に混同されちゃうんです"をうけて、
混同を避ける為に、Open Groupでは以下の様な言葉で、使い分けている点を、皆さんに報告しているだけですよ。
globing、パターンマッチング記法を、`Pattern Matching Notation' という言葉で、
正規表現記法を、`regular expression notation' という言葉で使い分けている。
そりゃあ、まあ使い分けるの自体は当たり前だろうけど。...答えようが無い。
つくづく、言葉はお互いに理解しようとしなければ、難しいものだなあ。
とにかく、悪意無いからね。
>>730 家のパソコンを、PPPとか使ってtelnetでつないだりしましたよ。少し後だけどNCSA Mosaicがでて、ビートルズの新曲free as a bird聞いたり。
初めはrootの人が大して偉くもないのに、偉い人に見えたりした。そして、sh->csh->tcshが本流だと思ってました。
regular expression に対して shell expression (シェル表現) と言ってたのに いつのまにか少数派になってしまった
初歩的な質問ですが、 個人的に楽しむ分にはシェルは合法なんですか? 大手のちゃんとした企業だとシェルは禁止ですよね?
すべってるよ。
regular expressionはありだけど、shell expressionはなんのこっちゃ? だぞ。
>>734 どこで何を聞いてきて、そんな疑問が浮かぶ様になったんだ?
ぜひ、もう少し詳しく、聞かせて下さい。
>>711 zenity で、色が使えるんだな。知らなかった。
Pango Text Attribute Markup Language というのですね?
>>734 シェルの単純所持は禁止されてないから、
それだけでは罪には問われないよ
かまうなよ。
>>717 ご存知かもしれませんが、各コマンド毎の、アバウトな時間を測定するアイデアです。
bash特有の変数を変えれば、使いまわせるかと思います。
time を各パイプラインの前に付ける
PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }-$( date "+%s.%N" ) '
set -x
trap 'date +%s.%N' DEBUG
strace -fTtt
ついでにデバッガー
bashdb、kshdb、zshdb
ddd
#!/bin/sh set `echo | od -c` n=`basename $2 n` __=11081458154815481578040812781578162815481448012 IFS=8; for _ in $__; do printf %b $n$_; done
#!/bin/sh case $1 in -e) echo "$2" | nkf -w8 | od -to1 | sed -re 's/^[0-9]*( |$)//; y/ /8/' ;; -d) __="$( echo "$2" | sed -e ':a; N; y/\n/8/; b a;'| sed 's/^8//' )" set `echo | od -tc` n=`basename $2 n` IFS=8 for _ in $__; do printf %b $n$_; done | nkf -W8 ;; -h|*) echo "usage `basename $0` option\n -h: help\n -e strings: encode strings\n -d string: decode strings" ;; esac :<<'#EOT' # -d " 357827382778343820182128343820282028343820182278343820282158343 201820483438201825283438200820183438201822383438202821483438200 202834782118271834382018253816381458164834382018250814281418163 145815681418155814583438201821483438200820283448275827783438202 217834382018252834382018204834382018240834382028215834382018206 343820182218343820182518343820082028012" #EOT
ちょっとここで聞くようなものじゃないかもしれないけど、 httpsで提供されているファイルをダウンロードするのに何を使えばいいでしょうか。 もちろんシェルスクリプトから使うのが前提で。 wget --no-check-certificate をつかえばいちおう取って来れるんですけど、 これだとhttpsの意味があんまりないような気がします。
745 :
名無しさん@お腹いっぱい。 :2011/05/08(日) 18:29:23.42
ふつうにwgetにローカルにあるはずのCAを指定すればいいと思うの。 --ca-certificate, --ca-directory
>>745 ありがとうございます。こんなオプションがあるのですか。勉強になります。
自分でぐぐってみたのですが、たとえば--ca-directoryには
> CA のハッシュリストが保持されているディレクトリを指定する
という説明があるんですが、具体的にはどのディレクトリでしょうか。
あるいは、CAのハッシュリストはどのようにして入手するのでしょうか。
ブラウザには最初から組み込まれてると思うので、そっから取り出すんでしょうか。
747 :
名無しさん@お腹いっぱい。 :2011/05/08(日) 19:53:41.49
たぶんそのwgetはopensslあたりがリンクされてるはずだから、 そいつが提供しているはず。
ubuntuだとca-certificatesってパッケージになってます。
ヒアドキュメントで cat << \END とするとヒアドキュメント全体がクォートされるのが、よくわからないのですが、 \は直後の一文字をクォートするということから、どう説明すればいいのでしょうか? 普通の\のクォートとは違うのでしょうか?
そのように決めたからとしか言いようがない。 ヒアドキュメント全体に何らかの処理を行うフラグを付けるとしたら << END ^1 ^2 END ^3 のどれかを使用するしかなくて、2を選んだという事。ちなみに<< 'END'でもok.
そういうヒアドキュメントの変なところを改善したのが ヒアストリングです。 cat <<< 'hoge hage boke' cat <<< "$SHELL $HOME $PATH" これから書くシェルはヒアストリングを使いましょう。
>>744 に似てるんだけど、HTTPSの待ち受け先へ何個かパラメータとファイルをセットしてリクエスト送信→レスポンス受信って簡単にできないもんかな。
面白いものを見つけました。
Genius sorting algorithm: Sleep sort
http://dis.4chan.org/read/prog/1295544154 Man, am I a genius. Check out this sorting algorithm I just invented.
#!/bin/bash
function f() {
sleep "$1"
echo "$1"
}
while [ -n "$1" ]
do
f "$1" &
shift
done
wait
example usage:
./sleepsort.bash 5 3 6 3 6 3 1 4 7
みんな結構本気で突っ込んでるな
>>754 の中のスレ
それだけ新規性か意外性があったし、面白かったってことか。
つっこみどころ満載だしな
>>754 をヒントに dd_sortってのを作ってみたよ。
#!/bin/sh
for i
do
echo -n "$i" | dd bs=1 of=tmpfile seek="$i" conv=notrunc 2> /dev/null
done
cat tmpfile; echo
基本的にビンソートだからO(n)だが、
重複があるとuniqされちゃうじゃないか。
>>754 はキューにつっこむからO(n^2)くらいか。
最近forkエラーが連発して、rebaseallしても改善しないんですが うちだけですかね
760 :
名無しさん@お腹いっぱい。 :2011/05/19(木) 19:39:11.04
cp<space>ファイル名1<space>ファイル名2 って、EUCだとうまく動作しないのだが、これはデフォルトなのかな
761 :
759 :2011/05/19(木) 19:41:07.15
単にbashを起動するだけでもforkエラーでリトライしまくり、 stackdumpが生成されるのでとてもうざいです。 ここまでひどくなったのは今日が初めてで、特にcygwin関係の環境を弄った つもりもありません。 原因がさっぱり分からないのですが、Process Explorerでbashがロードしている DLLを見ると、cygreadline7.dllだけrebaseで割り当てられたのとは違うアドレスに マップされているように見えます。 他のcygwin関係のDLLは0x6〜の区間にマップされているのですが cygreadline7.dllのLoad Addressは0x3D0000となっています。 で、他のWindowsネイティブのDLLのアドレスも見てみると、 リソースDLL以外は0x7〜にマップされているようなので、衝突しているようにも 見えません。 rebase -bでちょっとアドレスをずらしてみたりもしたのですが、状況は 改善しないようです。 なお環境はWin7 64bitです。
<space> ってそのまま打ってるってオチだろw
cygwinのスレでやれ
764 :
759 :2011/05/19(木) 20:30:07.59
ありゃ、思いっきり誤爆ってました…… すいません
1 Name: Anonymous : 2011-01-20 12:22 諸君!オレは天才かもしれない。このソートアルゴリズムをみてくれ。こいつをどう思う? #!/bin/bash function f() { sleep "$1" echo "$1" } while [ -n "$1" ] do f "$1" & shift done wait example usage: ./sleepsort.bash 5 3 6 3 6 3 1 4 7
767 :
名無しさん@お腹いっぱい。 :2011/05/22(日) 00:22:50.06
質問です。 shのスクリプトから、bashの$RANDOM変数を参照する 以下のようなスクリプトを書きました。 ----------------------- ~$ cat hoge.sh #!/bin/sh num=`/usr/local/bin/bash -c "echo $RANDOM"` echo "num=$num" ----------------------- 実行結果は、以下のように何も表示されません。 ----------------------- ~$ ./hoge.sh num= ----------------------- どのようにすれば表示されるでしょうか? また、表示されないのはどのような理由からでしょうか?
実行前にコマンド行の解釈→変数の展開が行われるため。 num=`/usr/local/bin/bash -c 'echo $RANDOM'`
>>767 #!/usr/local/bin/sh
echo "num=$RANDOM"
じゃまずいんか?
理由は
>>768 の通り。解釈されて、変数の展開が行われてから、bashが実行される為。
シングルクォートでくくるのが簡単だが、ダブルクォートでくくってみたよ。
num=`/usr/local/bin/bash -vxc "echo \\$RANDOM"`
この手の事は、set -xv を使うと悩まないです。
771 :
名無しさん@お腹いっぱい。 :2011/05/22(日) 10:52:24.24
スリープソートがほとんど話題にならずに流されてるwwさすがおまいらw
OSにソートさせてうれしいかよ
そりゃシェルスクリプトに限った話じゃないしね、 たまたま使われただけで。 プログラム板でやればいいことだ。
話はそれるけど、仕事で、bashでスクリプト組むことって増えてきた? 俺の場合はまだまだでshで書いてる。HP-UXとかbashはなかった気もするし。 perlも出来る限り使うなって空気だったり規則はまだあるなぁ。 みなさんの現場はどう?
いろいろ
>>774 まさにいろいろ。客先で原則shってところもあるし規則なくても
昔からあるシステムだとそれを継続する。
新規構築のlinux系だとbashで作ってる場合も多い
778 :
>>767 :2011/05/22(日) 19:47:10.58
バッククォート `...` を使っていらっしゃる皆さんに、質問です。
POSIX にも $(...) はあるのに、使われる訳は、ずばり何ですか?
このスレだけでなく、検索して見つかるスクリプトでも、バッククォートが多いような気がします。
見にくくネストしづらいだけで、いい事が無いと思いますが、あえて使うのにはなにか理由が有ると見ました。
理由がなくとも、こだわりみたいなものがあれば、教えて下さい。
Heirloom sh を基準とされていて、Bottom Lineを、POSIX まで上げられない理由は何でしょう。
一体どれだけ、UNIX は統一されないで進化できないままなのかと、疑問です。
何故に ANSI C でなく K&R C なのかと。
N88-BASIC でなく N-BASIC なのかと... 8 inch FDD なのかと。
CORDING SHEET に手書きなのかと。グリーンモニターなのかと...。
Solaris の Posix Shell でない Bourne Shell を意識してでしょうか。
確認の為に oracle で調べてみると、Solaris の sh では記載が無いですね。
HP-UX の如く、Posix Shell と置き換わったりしていないとしても、ksh や bash を POSIX モードで使えば、Solaris がスクリプトのスタイルのボトルネックになる理由が無いように思います。
その為の書き換えが必要な事が、だめかなあ。
Solaris 11 Express のシステムシェルは ksh93(1) だそうですが、どうなんでしょう?
Shell Command Language 2.6.3
http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_03 http://download.oracle.com/docs/cd/E19963-01/html/821-1461/sh-1.html Command Substitution
The shell reads commands from the string between two grave accents (``) and the standard output from these commands can be used as all or part of a word. Trailing newlines from the standard output are removed.
みんながバッククオート使う理由は普段バッククオートしか 見たことないからw 世の中そんなもん。
back quote は字面的に値を戻している様に見えるから ネストなんてしないし
これくらいで$()使うと神経質な奴だと思われるかもしれないという脅迫的神経症。
$() とか $(()) とか () とかかえってまぎらわしい。
打ちやすいから。
日本語キーボードにはバッククォートが付いてないから、 カナシフトしてカナの濁点「゙」キーを打たなければならないんだけど、 打ちやすいか?
入れ子にするときの外側は$(…)にする。普段は`…`だ。3つ以上は入れ子にまずしない。 打ちやすいというより、$がやけに打ちにくい。避けてたら、こうなってた。 ところで、BourneシェルとPOSIXシェルって別物じゃないの?ほぼ一緒だけど。
POSIXシェルってkshとほぼ同一かと思ってた
>>788 それってローラとトリンドルくらい違うだろ
例えがわかりづらいな…どなたにでも分かるように志村貴子の漫画で例えて
ザクとグフくらいかと思ってた
榊原郁恵と柏原芳恵くらいの違いか?
どちらかというと柏原崇と堂珍嘉邦だろ
柏原芳恵と早見優ぐらいの違い?
大橋姉妹と一本木蛮ぐらいの違い
つまんないのでもうその辺でいいです。
ダチョウ倶楽部のリーダーとドリカムのベースくらい違うっての
LinuxとUNIXぐらいの違い
けっこうちがうね?
こまけえことはいいんだよ
まなかなっ!
あーちゃんとささちゃんぐらいの違い
以前も紹介されていましたが、Bourne shell 派生の一覧
sh すなわち bourne shell でなく、Version 7 - SVR4.2 とその modify が Bourne shell という事だと思います。
商業用で無いものは、以下の2つでしょうか。
ここを読む限りでは、modified SVR4 Bourne shell が起源ですね。
Heirloom variant based on OpenSolaris (2005/06/08, ~SunOS 5.10),
Schily variant based on OpenSolaris Nevada Build 84 (2008/03)
あと、Source code の項を見るとV7 shell をsimulator上で走らせたり、V7自体をメンテナンスされている方、FreeBSD port of the v7sh もあります。
http://simh.trailing-edge.com/ http://www.collyer.net/who/geoff/ http://www.freebsdsoftware.org/shells/v7sh.html traditional Bourne shell family / history and development
http://www.in-ulm.de/~mascheck/bourne/ 2011-01-14
? Version 7 (2.9BSD) and 3BSD and 4.xBSD (and Sinix 5.20 (ucb universe), SunOS 2) - Ultrix - Dynix 3.2 (ucb) - DomainOS 10.3
? System III (Plexus 1.0) and SINIX 5.20 (sie)
? SVR1
? SVR2 (MV/UX 3) and Ultrix sh5 - Version 8 - SunOS 3 - OSF/1 - HP/UX - Dynix 3.2 (att)
? SVR3 (MUNIX V3, SINIX 5.20 (att), SCO Xenix 2.3.4) and SunOS 4 - AIX - IRIX 3/4 - SCO Unix - Interactive Unix - DG/UX 40 - DomainOS 10.3 - Dynix PTX
? SVR4 (Reliant 5.42, OSF/1-SysV) and SunOS 5 - Heirloom - Schily - IRIX 5/6 - DG/UX 42 - EP/IX - Reliant UNIX
? SVR4.2 (UnixWare, OpenUnix)
###
ash は、ksh と同じく、boune shell とは別のもの
ash variants
http://www.in-ulm.de/~mascheck/various/ash/ It was written by Kenneth Almquist as replacement to the traditional "System V Release 4" Bourne shell
due to the license war between AT&T and Berkeley. Berkeley distributed it first with "BSD 4.3-Net/2".
###
ここに、$(...) と `...` が議論されていました。
$( ) command substitution vs. ')'
http://www.in-ulm.de/~mascheck/various/cmd-subst/ A few words about the issue $( ) vs. `...`
###
抜粋しました。The default system shell /bin/sh の実体らしいです。
ash、bash、ksh、SVR2から4 Bourne shellを改造したものが使われています。
posix shellとして、ksh88 93 ash dash 辺りが使われていると理解しました。
SunOS 5.x (Solaris 2 ff.) ('92-)は、 modified SVR4 Bourne shell
SunOS 5.11 / OpenSolaris 2009.06 ('09)は、ksh93-tらしいですね。
MacOSX は、10.5 より、UNIX ですが、bash です。
various system shells
http://www.in-ulm.de/~mascheck/various/shells/ 以下、抜粋した本文が続きます。
2011-03-26 AIX 4.3.2 ('98), AIX 5.3 ('04) * /usr/bin/sh: a (POSIX compliant?) M-ksh88f [aix-ksh] BSD 4.3-Net/2 ('91), BSD 4.4 ('93) and ff., 386BSD* * /bin/sh: Almquist shell (SVR4 compatible) Cygwin 1.7.7 (2010-08-31) * /bin/sh.exe: bash 3.2.51(24) * /bin/ash.exe: dash-0.5.6.1-2 (Debian ash variant) FreeBSD 5.3, 5.4, 6.0 ('04, '05) * /bin/sh: FreeBSD variant of the Almquist shell HP-UX B.11.11 / .22 / .23 / .31 aka HP-UX 11i v1 / v1.6 / v2 / v3 ('00 .. '08) * /usr/bin/sh: M-ksh88f, labeled POSIX compliant, [hp-posix] * /usr/bin/posix/sh: symbolic link to /usr/bin/sh * 11.11 (11i): /usr/old/bin/sh: modified SVR2 Bourne shell * 11.20 (11i v1.5): /usr/old/bin/sh is gone (in accordance to previous announcements) IRIX 6.4, 6.5.x ('96...'06) * /sbin/sh: ksh88f (or M-ksh88f e.g. on 6.5.5), modified: [irix-ksh] * /sbin/bsh: "later" SVR4 Bourne shell [irix-sh] Linux Distributions * /bin/sh: a bash-1, -2, -3, -4, or dash (e.g. Ubuntu since 6.10 and Debian since 6.0 ("Squeeze")), or an earlier Linux port of ash, or the busybox port of ash.
MAC-OS X 10.6.3 * /bin/sh, /bin/bash: bash 3.2.48 (separate binaries) NetBSD 1.5.x, 1.6, 2.0, 4.0.1 ('00..'09) * /bin/sh: NetBSD variant of the Almquist shell OpenBSD 2.8, 2.9, 3.1, 3.5, 4.4 ('00,'01,'02,'04,'09) * /bin/sh: pdksh(-v5.2.14) OpenServer 6.0.0 (Thanks to Rodolfo Mart?n for access) ('05) The following are symbolic links to /opt/K/SCO/Unix/6.0.0xxx/usr/bin/ * /usr/bin/sh: modified SVR3 Bourne shell * /usr/bin/posix/sh (symbolic link to /opt/K/SCO/Unix/6.0.0xxx//u95/bin/sh): a POSIX labeled ksh88g OSF1/V4, V5 ('96...'06) * /usr/bin/sh: modified SVR2 Bourne shell, [osf-sh]. SunOS 5.x (Solaris 2 ff.) ('92-) * /usr/bin/sh: modified SVR4 Bourne shell. SunOS 5.11 / OpenSolaris 2009.06 ('09) * /usr/bin/sh: symbolic link to /sbin/sh * /sbin/sh: symbolic link to /usr/bin/i86/ksh93 * /usr/bin/i86/ksh93: ksh93-t * /usr/has/bin/sh: SunOS 5 variant of the SVR4 Bourne shell UWIN (AT&T Unix Services for Windows) * /bin/sh.exe: UWIN 4.5 2010-06-08: JM-ksh93t+ 2010-05-24 Endnotes: [ksh] About ksh versions on this page: * the short term "[M-]ksh88[x]" actually means "Version [M-]11/16/88[x]", and later versions are abbreviated in the same way. * The M- prefix in a ksh version string means multi-byte support (behaviour according to locale settings).
どうでもええやん ``でも問題ないのだから
当然読み飛ばした
>>785 それ昔のPC-9801のキーボード
98からUNIXマシンにtelnetする時はカナの濁点を使う必要があった
バッククォートキーがハード的に付いてないって、
まったくUNIXのことを考えられてないキーボードだったな
昔の、って確か無印(初代)から、アルファベット1文字世代だっけ?
なる程。いろいろな意見がありますね。有難う御座いました。
動けば、違いを気にされないのも分かります。得に、思い通りに動かない時は。
確かに、見たこと無ければ使わないし、周囲の人が、`...` だと、あえて使う $(...) はカジュアルな感じがしなさそうです。
そういえば私も覚えたての頃、入力しながら "Back->戻す" みたいな感じでブツブツ言ってたような気がします。
サブシェルで動くようですので、$(...) が、(...) に似ているのは、利にかなっているなあとか思っていましたが、`...` を使われる方にとっては確かに紛らわしいだけですねぇ。
私などは、画面についたゴミと見間違うようで、あるんだか無いんだか分からない ` の方が、紛らわしいと思うのですが、人により色々ですねぇ。
http://www.in-ulm.de/~mascheck/various/cmd-subst/ をみると、backquotes are easily confused with apostrophes 等と同じ事をいってますね。
一方で、欠点は The "$( )" form is not as traditionally portable as the `...` form ですか。
Bourne Shell と POSIX Shell が違う事は知ってましたし、そのサイトも見た覚えが合ったのですが、POSIX Shell として、ksh88 93 ash dash が使われているんですね。
右手にサンドイッチやメモを持って、左手だけでも打てますしねぇ。$と()は、右手と左手ですし、両手で向かってないと打ちにくいですね。
JISキーボードだと、Pの右側に(@/` kana入力で゛)がありますが。何の話だろうと思っていたのですが、グリーンモニター等の類の、ギャグだったとは。98でtelnetもしていたはずですが、忘れてました。御二人とも、上級者ですねぇ。さぞ痛い目に合ったのでしょう。
PC9801VX2とか何とかってありましたっけ。確かその頃に、そういえば私も腹が立ってキーボードを叩いたような。
ポータブル性が必要もしくは気を払われて、疑問に思いながらも使われている方が多いのかと思いましたが、的外れなようですね。嫌というよりはむしろ愛?して使ってる方が多いとは意外でした。
3行で
互換性とかどうでもいい気がするー
スクリプト記述用としては重要。 zsh専用スクリプトならzshスレで。
zshでスクリプト書くやつなんているのか。
>>816 既存システムですでにzshの資産があるから今後もzshで開発継続しろ、
とかそんなんは見たことある。
ubuntuですが、Version 7版Bourne Shellが、make 1発で出現しますた。 Geoff Collyerのソースは、パッチを当てるとmakeだけ出来たが、エラーが出た。 1つ下のNikola Vladovのv7_sh.tar.gzを落として、make。./shで、そのまま使える。 READMEに"This work is based on the Geoff port cited above."ってあった。 PS1='`pwd`\$ 'とか出来んしw。
ksh入れてくれているだけでいいのに
シェルスクリプトって同じ記号にたくさん意味割り当て過ぎだと思うよ。 だから`も使いたくなる。 ところで、全然違う話だけど、 $((expression))で計算できるのっていつからなのかな? ただの拡張機能?exprコマンドの必要性が分からないんだよね。
Arithmetic expansionが使えるシェルでしか動かなくていいなら御自由にどうぞ。
さっそく、役に立ちそうだ。にやにや
v7sh$ echo $(( 2 * 3 ))
syntax error: `(' unexpected
v7sh$ syntax error: `)' unexpected
ksh93$ echo $(( 2 * 3 ))
6
>>821 のと合わせて
v7からksh88 の間と見た。
上の、
http://www.in-ulm.de/~mascheck/bourne/には 、検索で見当たらない。
答えはcshかksh88だな。
しかし、このv7shはexitもできんのぉう。
上でv7sh使いの人がいらっしゃったようだが、まだいたら教えて下さい先生。
Control-Dでexitするので正解?
起動時に-tでなければ、対話モードではeofまで終了しません。 See Also: exitsh(), main() 対話モードはスレ違いですけど。
exitでエラーも出さずにexitさせないって、どういう罰ゲームなんだろう。
そういうプレイなんだよ。
>>824 早速教えて下さって、有り難うございます。スレ違い失礼しました。
しかし残念ながら、解決致しませんでした。"v7sh -it"は1コマンドで終了。"v7sh -t"はプロンプト出ずコマンド1つのみ受付けて終了。途中での"set -t"は即終了でした。
main() exitsh()は、manになく、googleで検索しても今ひとつ。main.cと、error.cで定義されてましたが、理解には至りませんでした。
何か勘違いしているかもしれませんが、また調べてみます。
/*
* UNIX shell
* そもそもgnome-terminalのbashから起動するもんじゃないんじゃw。
* S. R. Bourne と下衆な仲間たち\(‘w‘)/
* Bell Telephone Laboratories
*/
結構古くから算術式展開できたんだ。 今じゃほとんどのシェルでできそうだ。 できないシェルはdeclare -iとかletとかでも無理なのかな? 互換性が欲しいときはexpr使うけど、 これもせめて浮動小数点数演算や、標準入力から式の読み込みをやって欲しいなぁ。 bc -lとかxargsとか使えってか?
浮動小数点数演算はライブラリやCPUによって結果が違ってくるのに。シェルなんかでできて何が嬉しんだ?
>>827 -tなら1コマンドでv7shが終了するから、exitで終了できるだろ。
しかもexit codeはちゃんと引き継がれてる。
# sh -t
exit 0
# echo $?
0
# sh -t
exit 1
# echo $?
1
>>828 世の中の/bin/shが何であるか
こっちからコントロールできるわけじゃないのだから、
お前みたいなこと考えても時間の無駄。
それを言っちゃあ、おしめぃよぉ
>>830 "v7sh -t"はプロンプト出ずコマンド1つのみ受付けて終了
この一文で、830と同じ事を言っているのだが、通じてないのは俺の書き方が悪かったからだろうな。
v7sh -tとすると、exitなんか関係なくecho hogeでも終了する。対話シェルに入って、問答無用で即終了は使えんだろう。
BASH$ v7sh -t
echo hoge
hoge
BASH$
こういうのには、-tは要らないんだが。
BASH$ v7sh -c 'echo -n "hoge "; echo "fuga"; exit 19'
hoge fuga
BASH$ echo $?
19
835 :
名無しさん@お腹いっぱい。 :2011/05/25(水) 10:21:25.21
age
echo 'foo^bar$baz' | sed -re 's/\^/\\^/g; s/\$/\\$/g'
を `...` で単純にくくって、
escaped=`echo 'foo^bar$baz' | sed 's/\^/\\\\^/g; s/\$/\\\\$/g'`; echo "${escaped}"
とは出来んでしょ。わざわざ、気をつかって
escaped=`echo 'foo^bar$baz' | sed 's/\^/\\\\^/g; s/\\$/\\\\$/g'`; echo "${escaped}"
とするより、$(...)を使って
escaped=$(echo 'foo^bar$baz' | sed 's/\^/\\^/g; s/\$/\\$/g'); echo "${escaped}"
の方が、簡単でしょと、言ってます。
参照元。題は、私の翻意ではありませんので、刺激されやすい方はご留意下さい。
http://blog.livedoor.jp/wbcchsyn/archives/51132233.html
13:06 か。 本物のプログラマは昼食時間に合わせて出勤するという噂は、本当のようだな。
>>834 こういう比較いいなぁ。どうやらexprの出番は文字列関連だけで済ませられそうだ。
あらためて比較すると、100倍以上の差をつけて高速化しますなぁ。 ザクとは違うのだよ、ザクとは! ザク=`expr' グフ=`$((...))' ギャン=`(( += ))' ギャンは、`+' が有るからだおー。 他に知っている、高速化テクニックを挙げていきませんか? 知らないのが出てきたら、うれしいんだけど。多分他のポケモンのみんなも。
そもそもその例がどういう高速化例なのかがよく分からない
高速化って言っても限度があるだろう。 本当に速度が欲しくて手軽に書きたいなら、awk、perl、python、ruby…ってなるんじゃないか。 シェルスクリプトにもコンパイラがあればな。 # 書いてて思い出したが、昔BASICでスペース削って高速化ってあったなぁ。何もかも懐かしい。
プロセスを何回も起動するシェルスクリプトで 速度が必要なことって殆ど無いし、ボトルネックはforkでしょ
懐かし話に乗っかりますが、 BASIC なら PEEK とか POKE とかしましたねー。 マシン語の域でしたが。続けると、スレ違いなのでこの辺で。
うわっ、懐かしすぎて涙出てきた。誰だよ、DATA文に機械語書き出した香具師わ あの頃と今じゃ違い過ぎる、何もかも。 変な小細工でシェルスクリプト高速化するより、選べる時代なんだから適所適材だと思うぞ
>>842 >>843 >>845 限度はあるな。確かにオナニーの範囲だ。
それでも、シェルを変えたりしても違いが出るとか喜んでいる奴も少なからずいると思うがね。
上でも、timeとか使っている奴がいたりして、
fgrep grep egrepとか、[...] &&...||...とか比較していた奴がいたが、
お前等にとってみれば無駄な事なんだろうなぁ。
うーん。速度が必要なければ、forkなんか避ける必要もないもんな。
まあ、必要ない奴には必要ないんだろう。
まあ、なんだ、俺はただの知識欲や技術向上欲かも知れないが、
速くなるスクリプトの書き方を選べたりすると嬉しい訳だ。
>>841 たとえば、こんな感じな。適当なので間違ってたら知らん。
まあ、実際に使用するスクリプトじゃあ無いけどね。
#!/bin/ksh
#もしくはbash zsh どうやらPosix Shellにはtimeが無い。
for Command in 'sum=`expr ${sum} + ${i}`' 'sum=$(( ${sum} + ${i} ))' '(( sum+=${i} ))'
do
echo "Now Testing ... ${Command}"
time ( sum=0; for i in $( seq 1 20000 ); do eval "${Command}"; done; echo "Sum: ${sum}" )
echo
done
デフォルトらしいから、Bourne Shellで走るようにしてみた。 ほとんど同じもん。 #!/bin/sh # usage script.sh [sh|ash|ksh|zsh|bash] TestShell='/bin/'"${1-sh}" printf "Testing in ... ${TestShell}\n\n" for Command in 'sum=`expr ${sum} + ${i}`' 'sum=$(( ${sum} + ${i} ))' '(( sum+=${i} ))' do echo "Now Testing ... ${Command}" # どうやらPosix Shellにはtimeが無いらしい。/usr/bin/timeは複合コマンドを受け付けないらしい zshのtimeは {..;} を受け付けない。 logfile="`basename "${0}"`-"${1-sh}".log" time -p "${TestShell}" -c 'exec 2>/dev/null; sum=0; for i in `seq 1 20000`; do '"${Command}"'; done; echo "Sum: ${sum}"' 3>&2 2>&1 1>&3 3>&- | sed -e "/real/!d" | tee -a "${logfile}" echo done
実行結果は?
>>848 おいおい、そりゃないぜ。
一つ良い事を教えてやろう。スクリプトというのはな、誰でも走らせる事が出来るんだ。
まあ、機会があってお前に興味があれば試してみろ。自分の手でな。
いいか? 自分の手でだ。
この掲示板は、いつまでもお前を待っているからな。
機会が無ければ、お前には縁がなかったって事だろうよ。
二度と馬鹿な事を口にするんじゃあないぞ。
仕事でスクリプトを組めば、既知の人も多く、チラ見で結果が予想出来る程度の事だろう。
結果なんか貼っても、誰も喜ばないぞ。何をからかってるのだろう。
と思ったのだが、普通に、良く分からないけれど興味半分で、軽く話に乗ってくれた人かもしれないな。
それなら言い過ぎた。善意の人に負の感情を植え付けて何やってるんだろう。
しかし知らない人に、あれこれ手を差し延べてまで知って欲しい事じゃあないしなあ。
確認程度なら、
>>846 の for 文のどれかを選んで、time の行をコピペでも十分済むだろうから、試してよ。
もはや趣味の世界だな。 実務でシェルスクリプトでそこまでする機会はないといっていい。
こういうときにはどう書けば一番速く動くのか、って話じゃないから話題にし辛い。 具体例を出せば、いろいろ出てくるかもしれない。 ただ、誰が書いても、同じようになると思うんだけどねえ。
時間の流れから見て、そろそろ 841-845 は、1度以上スレ見てるだろうし、 次の話題を振る人が、振りやすいように書いておきます。 ここに書き込みがあると、すぐに反応を返している人間は少ないから、 上の方で書き込んだ人と同じ人がまだいて、その人達なら time とか好きそうだったから、 ぶっちゃけ、盛り上がるかと思って話を振っただけなんだな。 もしかしたら、分かりにくかったかなぁ? よく見ると顔文字や、訳分からんギャル文字に見えない事もないし。 すぐ上で同じ話題だったから、そりゃないか。 まあ、気に入らなかったという事で。 ネットで検索すれば色々書いている人もいるし、 特にここで高速化の話がしたい訳じゃないから、軽く流して、次行きましょう。
850 を書いてしばらく置いておいて、リロードしないで 853 を書き込んだから、
気付かなかった。
>>851 851 は、言い切りが気持ちいいなあ。同意しかねるが、851 はそうなのだろうな。
>>852 確かに。そういうイメージだと、そうだなぁ。
例えば、[ ] より [[ ]] だとかほとんど答えが出ているものを、言い合って、
それってあるあると、テンポ良く言い合って行きたかったのだけど。
いくつかネタは用意してあったが、
expr $(( ))で、通じなければ、面倒くさそうだから止めておくよ。
うーん。前向きな意見に対して、何を後ろ向きな事を、言っているのだろう。 止めておくよは無いよな。 本当に、適当に書き込みすぎだ。
[[ ]] はPOSIX shellにないから使いたくないな
>>851 は、"仕事"のキーワードに反応して、実務の一般的な話を 851 なりに披露してくれたが、
趣味で使っている人に対し暗示的にネガティブな印象なので、一応言っておく。
850 では"仕事"だけに限定したつもりはない。趣味でも学習目的でも何でも良い。
>>731 にも、23時台に似た種類のレスがあって、酔っ払い呼ばわりされていたが、
夜だからか、頭が疲れてくるのだろうね。自分も含めて。
なんだか少し話を変えた内容で批判されても、
それに気付かないで 854 みたいな適当に返事するものじゃあないな。気をつけようっと。
変な奴が住み着いたねえ
>>858 俺を差して言うようだったら、お前はむかつくやつだな。
それに、住み着いたつもりは無いがなあ。
話の合わない奴等だと分かれば、何も好きこのんでこれ以上こちらから話しかけて言ったりしない。
気持ち悪いから、ねっとり絡み付くようなレスを付けるなよ。
気に入らなけりゃあ、流してくれて結構。
ほっとけば、こちらから何も書かない。
>>856 ネタを言い合うのとは、違うが。
そうか、856はポータブル性を、意識しているのだな。
しかし、POSIX Shellには"[[ ]]"があると思うよ。
もしkshの事が即ちPOSIX Shellだと思っているのだとしても、
ksh88のマニュアルにも載っているし、
POSIX Shellにおいても"on some implementations"として記載されている。
俺がどうこう言う事じゃあないだろうが、
POSIXはPOSIXできちんとおさえておいて、シェルによって賢く使い分けてもいいのでは。
"ない"ものを調べるので、一応2種類とも見てみた。
興味あるだろうから、見出し等を貼っておいた。
The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004 Edition
The Open Group Base Specifications Issue 7 IEEE Std 1003.1-2008
2. Shell Command Language
2.4 Reserved Words
>>860 > しかし、POSIX Shellには"[[ ]]"があると思うよ。
>スクリプトのお勉強・自慢・腕試しなどにどうぞ。 なんだからまさにぴったりとは思うけどな。
The following words may be recognized as reserved words on some implementations (when none of the characters are quoted), causing unspecified results: [[ ]] function select POSIX では規定されてないじゃん。 個人的には bash で使いまくってるけど。
思うのは勝手なので。
初めに高速化の話題を、何も限定しないで振るから… 全般に(POSIXシェルの範囲で)使える高速化の手段なんて、それこそ存在しないんじゃないかな。 [[も予約語であるだけで、挙動は規定されてないようだし、 それが使えないシェルじゃ、高速化とか以前の話だろ。 bashで良いなら、ブレース展開で書くとループ消せて速いとか、 さらに4にすると、mapfileで配列にファイルを読めて速く書けそうとか、 ありそうだが、あまりに限定すると、同じ機能でもシェルによって違う記法になってたり、 あるシェルでしか使えない方法だったり、高速化と移植性がトレードオフになる。 広い範囲でそこそこ動くのも魅力だろ?移植性捨てますか? 捨てるなら捨てるで、限定すべきだ。話自体は、このスレで問題ない。
そろそろ勘弁してもらえませんか?
/\___/\ / / ヽ ::: \ | (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ,,ノ(、_, )ヽ、,, | < っは? | ,;‐=‐ヽ .:::::| \_______ \ `ニニ´ .:::/ /`ー‐--‐‐―´´\
>>860 文献列挙してるくせに全然読めてないのなw
[と[[の違いって何でしょうか? 使わないコマンドのことはわからなよね(´・ω・`)
なんか、別の人もレスを付けてくれて、別の方向に盛り上がってきたな。
>>863 同じ文らしいが、あえて全文を貼って、議論をしたいという事は、
余程、語学に自身がある奴なのだろうな。
しかし、もしかしたら、変化球を投げる奴かもしれないので、少し注意しないとな。
>>857 で、"なんだか少し話を変えた内容で批判"してくる奴がいるから気をつけようとしていた矢先だ。
"記載されて" -> "規定されて"
雑で文字の間違いもあるだろうが、自分なりになるべく言葉は選んであるつもりだ。
>>865 建設的な意見を、有難う。
reserved wordsとして"記載されて"いる事を、確認していただいている事を、まず挙げておく。
そして、つぎに、このスレのデフォは、POSIXではなくBourneだ。
よって、"$(( ))"とあれば、その意味する所は、自明の理だ。
Bourneを逸脱した話で、当然BASH上等だろう。
もとより何か限定しなくとも、知らない奴は調べるだろうし、 使いたくなければスクリプトを書く時に選べるのだから、 キーワードをポンポンと挙げていくだけで、いいと思うが。どうだろう。 こんな雰囲気じゃあ無理だろうが、もっとフランクに、 適当なひらめきだけ挙げて検証は後ほど何て言うのも、いいなあと思っていた。
なにも、挙げるだけなのに移植性と身を共にしなくても、柔軟臨機応変で良いのではないだろうか。 最後に、話自体をこのスレでする事を、認めてくれて有難う。
読み方によっては、どちらともとれるのが862-863と、866-867なのだが、
>>862-863 >>861 は 860にレスを付けているが、内容が引用だけで、860に向かっていない。
862と合わせて読んでも、いまいち主語がはっきりとせず、誰に向かって言っているのか
意図がはっきりとしない。
860は、このスレにぴったり。
"ネタを言い合うのとは、違うが。"に対して、856はこのスレにぴったり。
>>864 を見る限り、善意の方で解釈して、860 を肯定してくれているみたいだな。肯定してくれて有難う。
>>866 ー867
これは、セットで書いたみたいだが、わかりやすい手だな。 からかっているのだろうが、面白かった。 こいつは、過去スレでも、使っているのかなあ。 しかし一応、単に866だけを、他の黙ってみている奴が言ったものだととらえて、謝っておく。 質問したいやつとかもいるだろうに、書き込みづらいだろうなあと、気にしていた。
実は、複数人で読んだり書いたりしているのだが、書くのはほぼ俺だが。 "あーあ、もうやめようぜ。酔っ払いがからんでくるのと同じだ。" "いつまでも答えてるから、反応するんだろうよ。" "俺は答えないな。" "返事返すから、いつまでも続くのだろう。" "突っ込みを入れなくても、見る人が見れば分かる。" "私はもう止めた。"
V6 Thompson Shell Port とか言うのがパッケージにあったのですが これってこのスレ的にどうでしょうか? コマンドラインとして使うのではなく、スクリプトのテスト用としては。
とか言う意見なので、そろそろ、レスを返すのも止めるが気を悪くしないでくれ。 しかし、質問が書いてあったら、すぐさま答えたりして、偉いなあと思ったよ。 どうぞ続けてやって下さい。陰ながら、応援する。
>>842 言いたかったけど、話がそれるので言わなかった事。
ただの口癖かもしれないが、"何もかも懐かしい"は、ガンダムネタを受けて返した様に思って、おかしかった。何だろうと少し考えたら、確かあれはヤマトだったな。懐かしい。
>>868 変化球投手の、続投かな。別人でもまあいいけど。なにしろ、書き込む人が少ないからなあ。
他の人の迷惑になるから、反応しない事にする。
>>869 口(指)が回っているついでに、書きますが。この手の事は、聞く種類のもんじゃあ無い。
といっても、調べ方も分からなかったら、困るだろうから、調べ方を。
man bash。gman とか w3mman もあるよ。検索はlessなら、/\[\[
そうすると、キーワードが見つかるだろう。そこで、検索。"複合コマンド [["
今のところ、"試験運用中なLinux備忘録"が、一番上にくる。 もうくどかったら、読み飛ばしてくれ。コマンドなんかは、覚え(られ)ない。 使っている内は覚えてるのだが、使わなくなるといつの間にか煙の様に消えちまう。 覚えるのは、どこら辺を調べれば良いか。 本を買うのもいいだろう。"ああ、あの本のあの辺に合ったなあ"とかを、覚える。 だからこそ、自分で調べたらいいよ。
less textfile としてから、h 大体hとか?とか-h --helpとかお決まりになっている。 うろ覚えだが、telnetで、telnet以外のポートにつないでも、HELPとかだし。 何でもh打ったり、設定ファイル覗いたりすればいい。
面倒くさいだろうが、なれてくると聞くより速い。
それに、もし聞いても疑って調べ直すといいと思うよ。
以上、879を除く870から885とこのスレは、すべて俺ね。
>>879 はさみこんでしまったな。すまん。強調しておく。
>>887 古過ぎて、テスト用にも出来ない互換性になっちゃってるのでしょうか
できればパッケージ管理下でやりたいので、それ以外だとdash辺りになりますが、こっちのがマシでしょうかね…
>>888 どういうスクリプトのテスト用かは知らないけど、
debianで提供されるスクリプトはbash依存を除いて
全部dashで動くようにする(した?)らしい。
使われてるってことで、マシじゃね。
>>889 ここにshebang行を#!/bin/shで投稿するスクリプトのテスト用にする場合です
openvpn のスクリプトが sh 仕様じゃなくてムカついた。
892 :
名無しさん@お腹いっぱい。 :2011/05/31(火) 22:53:14.21
初心者な質問。 cshの``ってどういう意味ですか?
command substitution
ああ、なんだ、command substitutionのことでしたか。 初心者な質問ですいませんでした。
右も左もわからないばか者です。簡単なものでいいので実装したいです。 OSはcentOSになります。 シェルスクリプトの例と作り方教えてください。 お願いいたします。
とりあえず
>>2 の初心者向けリンクのリンク先を全部読んできたらどうかな
Googleの使い方くらいわかるだろ。
>>897 こういう時さくっと
簡単に要点だけ書けるやつがなんでいないだろうな。かわいそうに
何をしたいかわからないのに実装したいですって、どんな質問なんだ
901 :
名無しさん@お腹いっぱい。 :2011/06/01(水) 20:11:33.30
>>898 が要点だけサクっと書いてくれるらしいから、あわてずに待て。
>>895 Linuxならブートスクリプト眺めてるだけでも良い勉強になる
Red Hat系なら/etc/rc.d/init.d/の中だったと思う
※ unix板では極力Linuxの名前は出さないほうがいいぞ
アホが寄ってくるから
echo 'hello world!'
if, for, while, function, case スクリプトで良く使う構文はこんなもんだな あとは変数とか内部コマンド Linuxのbashしか書いた事ないからcshとかzshとか分からん
その辺のパーツ自体はどのシェルでも使うでしょ 書き方の差はcsh、tcshみたいに根本的な文法の違いとか あとは同じsh系でも$((とか[とか[[とかが使えるか否か、みたいな違いはあるけれども
ex110331.log という文字列から11だけ抜き出す $ echo ex110331.log | awk '{print substr($0,3,2)}' と、適当に書いて思ったのだけど、2000年以前のIISはデフォルトだとどういうログファイル名だったんだろう。 と激しく板違いなことを思った。
awk持ち出さなくてもexprで十分そうだけど
いまさらながらに気づいたけど、cutにbオプションてのがあったのか…
s=( $s ) if [ ${#s[@]} -gt 1 ]; then ... fi という記述があったのですが、${#s[@]} ってどういう意味でしょうか。
>>910 配列の要素数で、bash依存っていう意味ですw
>>911 言葉がたりませんでした。
${#s[@]} の、とくに [@] の部分がよくわからないのですが、これはどういう意味でしょうか。
Any element of an array may be referenced using ${name[subscript]}. The braces are required to avoid conflicts with pathname expansion. If subscript is @ or *, the word expands to all members of name.
>>913 なるほど、rubyでいえば "#{list.join(' ')}" みたいなものということですか。
ありがとうございます。
ディスクのシリンダ数を取得したいんですが fdisk /dev/sdb << 'EOF' p EOF で、cylindersとして表示されますが、この出力からgrepでcylinders行を 取り出すことはできますか?
BSD板としては wd0d とか書いてほしいんだけど
えっ!
918 :
名無しさん@お腹いっぱい。 :2011/06/06(月) 23:39:09.77
(echo p; echo q) | fdisk /dev/... | grep cylinders... とか、 fdisk /dev/... <<EOF | grep cylinders p q EOF とか。
BSD板て。
懐かしBSD板の間違いだろ
なつかしうなー
fdisk -l | grep cylinders だけで桶。
923 :
915 :2011/06/07(火) 12:29:42.95
>918 ヒヤドキュメントっと、こう言う書きかたができたんですか >922 シンプルにできたんですね ありがとう、ございました。
edスクリプト+ヒアドキュメントでは定石。
どやドッキュメント
ヒアドキュメントを使ってしまうのは SunOS の format コマンドの悪影響に違いない
たびたびすいません #!/bin/bash LANG=C DATA=$(fdisk -l /dev/sdb | grep heads) HEAD=$(echo $DATA | awk '{print $1}') SECTOR=$(echo $DATA | awk '{print $3}') CYLINDER=$(echo $DATA | awk '{print $5}') # How many cylinders are needed for 512MB SWAP=`expr 512 \* 1024 \* 1024 / $HEAD / $SECTOR / 512` END=`expr $CYLINDER - SWAP - 1` echo $END expr: non-integer argument となってしまします。 整数化するコマンドって
ちょこちょこawkを起動するぐらいなら計算は全部awkにお任せで いいんじゃねーの?
>>927 > END=`expr $CYLINDER - SWAP - 1`
SWAPに$が抜けてるぜ
930 :
名無しさん@お腹いっぱい。 :2011/06/07(火) 19:06:35.44
>>927 LANG=C
set $(fdisk -l /dev/sdb | grep heads)
HEAD=$1; SECTOR=$3; CYLINDER=$5
ってしちゃえば
512byte/sectの普通のHDDなら、 255head, 63sector以外は事実上使われていないから、 1シリンダ=255*63*512=8225280バイト 決め打ちでいいよw
是非"$VAR"という習慣を。
小容量のHDDの時代は1セクタでも無駄にしないように 全セクタ数を素因数分解したなぁ あ、今でもUSBメモリで素因数分解するわ
934 :
927 :2011/06/07(火) 21:06:16.82
どうも >929 結局、expr: non-integer argumentは SWAPの$が抜けてたからなんですね。 >930 932 勉強になります。 ありがとう、ございました。
>>927 "SWAP" は変数ではなく文字列だから。
END=`expr $CYLINDER - SWAP - 1` ×
END=`expr $CYLINDER - $SWAP - 1` ○
でどうですか?
うーーむ。
937 :
名無しさん@お腹いっぱい。 :2011/06/07(火) 22:56:21.45
なんで expr だけ $(...) じゃなくて `...` にしてるんだろ。
最近やたらと back quote 取締官が出没する気がするんだけど、気の所為かな
ダニが嫌いだから。
そういう人か
>>927 もう見てないかもしれないけど、
awk使っていいんだったら、↓みたいに書けるよ。
#! /bin/bash
LANG=C
DEV=/dev/sdb
fdisk -l "$DEV" |awk '/heads/ { swap = 512*1024^2/$1/$3/512; print $5-int(swap)-1 }'
/usr/bin/mailでReturn-Path指定したいんだけど、どうすればいい? man mail見たけど何も書いてなかった。。
943 :
名無しさん@お腹いっぱい。 :2011/06/08(水) 00:14:57.33
>>942 何のために?
sendmailなら-fでenvelope fromを指定したら設定されるだろうけど、
/usr/bin/mailの末端ユーザにFromをいじらす必要はないってことじゃないかな。
>>944 /usr/bin/mailで、Return-Pathは設定不可能ってことですか?
sendmail使ったほうがいいのかなー
perl か何かで書いちゃえば。
947 :
927 :2011/06/08(水) 10:44:15.86
>941 見ました。 awkって、こんな使い方ができたんですね。 ありがとう、ございます。
sed, awkまでは許せるけどperl厨は失せろ
rubyよりまだかなりマシ
せっかくならawkもgrepも使わずに、fdisk以外はすべてシェルでやるべきだな #!/bin/sh LANG=C set `fdisk -l /dev/sdb` while [ "$6" != cylinders ]; do shift; done echo $(($5 - (512 * 1024 * 1024 / $1 / $3 / 512) - 1 ))
>>945 そうです、不可能です。
sendmail, rmailの領域です。
どこの /usr/bin/mail だよ
BSDのmailx(1)は--の後ろはsendmailに渡す。 いつ頃からあるオプションか知らない。 少なくともUSDドキュメントにはない。
どのBSDのどれ?
直接/usr/lib/sendmail呼び出しゃいいよ。定石なんで。
--がいらないじゃん
centos で man mail すると -- が必要に見えるな。 SYNOPSIS mail [-dEIinv] [-a header] [-b bcc-addr] [-c cc-addr] [-s subject] to-addr ... [-- sendmail-options ...] mail [-dEIiNnv] -f [file] mail [-dEIiNnv] [-u user]
OS 間の mail コマンドの仕様の違いとか、 マシン間の sendmail の設定の違いとか、 いろいろめんどいよね。
>>950 徹底振りが素晴らしい。計算にexpr使ったほうがよさそう、個人的に。
ところで、気になったんだけど、こういうとき元の引数を保存したいなら、どうするのがいい?
関数使うしかないのかねぇ?
>>963 こういう事か?bashなら 1行で済むが。違う話かな?
#!/bin/bash
opt=( "${@}" )
#echo "${opt[@]}"
for var in "${opt[@]}"
do
echo "${var}"
done
>>963 expr に言及している辺りで Bourne で走らせたいなら 6行か。
#!/bin/sh
[ -n "$DEBUG" ] && set -x
n=1
for var
do
eval opt_${n}=\"${var}\"
n=`expr ${n} + 1`
done
n=1
while eval [ -n \"\${opt_${n}}\" ]
do
eval echo \"\${opt_${n}}\"
n=`expr ${n} + 1`
done
素直にサブシェル使った方がいいな。 fdisk関連の処理全体をサブシェル ( )で囲む。 ( )を抜けたら引数元通り。
ああ、それで関数使う話が出てくるのか。まったく勘違いをしていた。
>>966 嗚呼!ありがとう。そうか、サブシェルか。思いつかなかった。
>>967 いろいろ書いてくれたのに、すまない。書き方が悪かったよ。
>>963 シェル関数は"$@"は別の物が使われる。
古いperlに依存してる物を洗い出したんですがどういうスクリプト書けばいいでしょうか? perl-5.10.1 => perl-5.12.3
971 :
名無しさん@お腹いっぱい。 :2011/06/11(土) 16:57:15.61
依存の定義がわからん。 パッケージマネージャーのタグイを使ってるならそれで調べるだろうし。
パッケージマネージャはrpmですが、ディストリを使ってないので。 今は/usr/lib/perl5/5.10.1/の中から探しだして一つ一つリビルドしてパッケージ作りなおしてるんですが面倒くさいのです。 orz 依存の定義は以前のバージョンのperlを参照してるパッケージ類です つか、ここでは依存で通じないのか……。
for i in $(rpm -qa); do rpm -ql $x |grep perl5/5.10.1 done うーん、これじゃどのパッケージに入ってるか判断できんのよな。
974 :
973 :2011/06/11(土) 17:26:12.92
for i なのに $xにしてしまった。すまん読み替えてくれ
なんでシェルスクリプトでやりたいのかよくわからんが、 パッケージ管理してないなら、自動化は無理でしょ。 perlのrequire, useは、指定したversionより処理系が新しいことしか要求できないから。 〜より新しいと動かないという記述ができない。 「$] < 5.008」みたいな記述を発見したいなら、それこそperlでやった方が…
>なんでシェルスクリプトでやりたいのかよくわからんが、 逆になんでこの発想になるのかよくわからんが。
>>973 ,974
それを参考に書いてみました
まだ完璧じゃないですが。
for i in $(rpm -qa);do
rpm -ql $i | grep perl5/5.10.1 > /tmp/perlpkg.txt
for x in $(cat /tmp/perlpkg.txt);do
rpm -qf $x
done;done
forが入れ子になっててダサいですけど
もう一度ファイルに落としてsort|uniqしたほうが見やすいかなぁ
978 :
名無しさん@お腹いっぱい。 :2011/06/12(日) 15:12:19.28
あ
よく知らんがデータベースを使わないから安いんでしょ。