1 :
うはwwwww :
2006/03/26(日) 00:56:22 シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(
>>1-6 くらい)をご覧ください。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
2 :
おkwwwwwwwwwwwww :2006/03/26(日) 00:57:10
3 :
ちょwwwwww :2006/03/26(日) 00:58:49
4 :
ワッフルワッフル :2006/03/26(日) 01:00:22
□関連書籍と関連リンク:
FreeBSD Hypertext Man Pages
http://www.freebsd.org/cgi/man.cgi Linux JF (Japanese FAQ) Project.
http://www.linux.or.jp/JF/ Unix Programming Frequently Asked Questions 日本語訳
http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html UNIXプログラミング環境
http://www.amazon.co.jp/exec/obidos/ASIN/4871483517/ □人間初心者へのお願い:
・このスレはシェルスクリプトについてのスレです。
シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
使い方の質問などはスレ違いなので無用に願います。
□シェルスクリプトでよく使うコマンド:
制御・条件判定系: [,test,expr,true,false,yes,getopts
テキスト処理系: cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join
ファイル検索系: find,xargs
(スペースなどを含むファイル名を正しく処理するため、
findは -print0、xargsは -0オプションを常に付けることを推奨
ただし、Solarisでは未対応。どうするんだろ?)
ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl
5 :
名無しさん@お腹いっぱい。 :2006/03/26(日) 01:00:52
6 :
名無しさん@お腹いっぱい。 :2006/03/26(日) 01:02:35
7 :
名無しさん@お腹いっぱい。 :2006/03/26(日) 01:03:05
以上でーす。
|乙
>>1 |
//
>三三三 // ∧_∧ //
( ´>`)y=-※==(・Д・※==================⊃
( ○ ( )
| || // /
(_)_) (_(_)
rm -rf *
結論。シェルを書いて、UNIXを打て!
12 :
名無しさん@お腹いっぱい。 :2006/03/27(月) 14:50:04
なぁ お願いだから糞スレを立てないでくれるかな? 俺からのお願いだよ 分かったら削除依頼よろしく
前スレで紹介されてた debianの checkbashismsというコマンド、 perlスクリプトだったので持ってきて、いろいろ試してみた。 手元にあった bashスクリプトの1行目を #!/bin/sh に書き換えて checkbashismsにかけてみたけど・・・ ・・・なんかチェック甘いね。 ほとんど何も引っかからない。 引っかかったのは ${HOGE//hage/boke} くらい。 引っかけて欲しかった、↓は、 for ((i = 0; i < 10; i++)) { echo $i; } 通ってしまった。 これってbash依存じゃないの?
>>13 @bashism_regexs にあるのしかひっかけないみたいね。
パッケージ作る際にありがちなのだけひっかかれば十分、
っていう考えなんじゃないの?
perlって時点で真面目な作りを期待するのは無理があるね。 bashのソースを改造して、構文解析でbash依存の構文が出現したら メッセージを出すようにすれば簡単に作れると思うんだけど。
16 :
名無しさん@お腹いっぱい。 :2006/03/27(月) 23:24:20
なぁ お願いだから糞スレを立てないでくれるかな? 俺からのお願いだよ 分かったら削除依頼よろしく
シェルスクリプト勉強中のものです。 tcshで困ってます。 ---------------------------------------- #!/bin/sh MYPATH=`pwd` --------------------------------------- はOKなのに ------------------------------------------ #!/bin/tcsh MYPATH=`pwd` ------------------------------------------ はNGなのは何故なんでしょう。 shとtcshでは変数に値を入れる文法って 違うのでしょうか?
tcsh のことは忘れてよい。
>>17 >>1 嫁。
>・csh/tcshのシェルスクリプトは推奨されません。
> (理由は「csh-whynot」でググれ)
忘れてよい以前に17はtcshのことなんて全然知らんがな
21 :
名無しさん@お腹いっぱい。 :2006/03/28(火) 15:27:06
なぁ お願いだから糞スレを立てないでくれるかな? 俺からのお願いだよ 分かったら削除依頼よろしく
良スレの予感
>>23 ばかもん。答えるなよ。皆んな知ってても敢えて答えなかったのに。
削除依頼出して来るわ。
基本的なことかも知れませんが、 シェルとUNIXとで実行結果が異なる場合、 どういった原因が考えられますか?
>>26 キミの日本語インタープリターが壊れている。
>>26 それは多分UNIXが間違ってるんだろうね。
ちゃんと手を洗ってからインストールした?
ウイルス入っちゃってるかもよ。
あるコマンドを2回だけ繰り返し実行したいのです。 たった2回なのでforやwhileにするのは大げさなので、 #!/bin/sh あるコマンド !! というシェルを書きましたが、エラーになります。 UNIXだと $ あるコマンド $ !! で実行できます。なぜこうなるのでしょう?
30 :
名無しさん@お腹いっぱい。 :2006/03/28(火) 22:44:42
あるコマンド.exe にパスが通ってないんじゃないか?
>>29 あんたは「シェル」を書いたんじゃなくて「シェルスクリプト」を書いた。
「UNIXだと」じゃなくて「シェルプロンプトだと」だ。
おそらくあんたの使っているシェルは/bin/bashか/bin/ksh。これらは/bin/shと違って !! で直前のコマンドを実行できる。
絶対確実というわけではないけど、どのシェルを使っているかは、
echo $SHELL
を実行してごらん。
>>31 $ echo $SHELL
/bin/sh
と出ましたが。
!で始まるヒストリ操作はcsh由来だからcsh否定論者は使えないなww
UNIX打つの人来てたのかー
36 :
31 :2006/03/28(火) 23:36:41
>>33 すまん、間違えた。
>>32 うーむ、今動いてるシェルが何かを確実に見極める方法は知らない。
bashを使っているという前提で次の事を試してみて。
Tabキーを連続して2回押すとどう表示されるか?
echo $BASH の出力は?
ps の出力は?
37 :
名無しさん@お腹いっぱい。 :2006/03/28(火) 23:37:16
あるコマンド あるコマンド と素直に二行書けばいいじゃん
sync sync sync
>>29 起動する時に-funroll-loopsオプションをつけると
自動的に展開される
!! !-5 !32 !!
41 :
名無しさん@お腹いっぱい。 :2006/03/29(水) 00:59:14
42 :
名無しさん@お腹いっぱい。 :2006/03/29(水) 02:24:03
質問です aaa.txtという名前の2000バイト固定長ファイルの500〜502バイト目が 'xyz'のときだけ、そのレコードをbbb.txtにコピーするためには どのようなスクリプトを作ればよろしいのでしょうか? よろしくお願いします。
> aaa.txtという名前の2000バイト固定長ファイル 固定長なのはレコード長なのじゃないのか? #!/bin/sh infile=aaa.txt; outfile=bbb.txt; tmpfile=/tmp/foo.$$ echo 'xyz\c' > $tmpfile.1 dd bs=1 skip=500 count=3 < $infile > $tmpfile.2 if cmp $tmpfile.1 $tmpfile.2; then cp $tmpfile.2 $outfile fi rm $tmpfile.1 $tmpfile.2
head -c502 aaa.txt | tail -c3 とかでいけそうな気もする
45 :
名無しさん@お腹いっぱい。 :2006/03/29(水) 06:46:49
なぁ お願いだから糞スレを立てないでくれるかな? 俺からのお願いだよ 分かったら削除依頼よろしく
>>29 2回だけ手軽に繰り返したい、という質問なら、
#!/bin/sh
a='あるコマンド'
$a
$a
コマンドラインで !! が実行できるのに、
シェルスクリプト中では実行できないのは何故かという質問なら、
それは、「インタラクティブかどうか」でシェル自身が動作を変えているから。
!! が使える bashや zshであっても、
シェルスクリプト中では !!はただの !!という文字列になる。
tcshなら repeat 2 あるコマンド
>>48 それだと「構文」になっちゃうから、「手軽」にならない。
しかも、(t)cshの文法はタブー。
「構文」使ってもいいなら↓
for i in 1 2; do あるコマンド; done
cshだと、スクリプトの中でさえ !!が使えるぞ。 #!/bin/csh あるコマンド !! で桶。 なんたる糞Cシェル。 副作用として、 echo 'Hello !!' が、シングルクォートで囲んでいるのに !!が展開されてしまう。 なんたる糞Cシェル。
>>50 解ってるなら
不利益になるコマンドは使わなければ良いんだろ
52 :
名無しさん@お腹いっぱい。 :2006/03/29(水) 15:02:37
なぁ お願いだから糞スレを立てないでくれるかな? 俺からのお願いだよ 分かったら削除依頼よろしく
sed と awk はどちらの方が実行速度で有利ですか?
計ってみれば?
>>54 んなもんやることによって違うに決まってるでしょ
>>54 もちろん sed。(sedで書けるものはなるべくsedで)
ありがとうござます。 バイナリサイズは sed < awk で4倍も差があったので、基本は sed で、 sed ではすっきりしないAVアホですっきりしたい時は awk って事にします。
>>58 バイナリサイズの時間への影響なんて誤差の範囲だし、
メモリに載ってるかどうかで逆転する。つまり気にする意味がない。
速度が気になるなら57を鵜飲みにせず自分で2通り書いてはかってみれ。
sed 's/hoge/hage/g'
と、
awk '{ gsub(/hoge/, "hage"); print }'
とで比較すると、
sedの方が約2倍速いなぁ。
>>59 「バイナリサイズの時間への影響はメモリに載ってるかどうかで逆転する」
というのは同意だが、それはsed/awkの起動時のオーバーヘッドであって、
起動中の文字列処理速度とは別の話。
sedでもできる処理をawkにやらせると、やっぱりawkの方が遅くなるよ。
sed 使うか awk 使うか迷う場面ってどんなんだ?
64 :
名無しさん@お腹いっぱい。 :2006/03/29(水) 19:19:34
なぁ お願いだから糞スレを立てないでくれるかな? 俺からのお願いだよ 分かったら削除依頼よろしく
>64 なにいってんだハゲ 帰れ
66 :
名無しさん@お腹いっぱい。 :2006/03/30(木) 01:53:10
なぁ お願いだから糞スレを立てないでくれるかな? 俺からのお願いだよ 分かったら削除依頼よろしく
>>65 これスクリプトで書き込んでいるんじゃないのか?w
結果が多少異なる点は放置して、こうなりました。 >find / -print > find.txt >ls -l find.txt -rw-r--r-- 1 root whell 27679632 Mar 30 07:39 find.txt >time awk -F / '{print $1"/"$2"/"$3}' < find.txt >> /dev/null 17.871u 0.569s 0:18.57 99.2% 148+277k 0+0io 0pf+0w >time sed -ne 's|^\([^/]*/[^/]*/*[^/]*\).*|\1|p' < find.txt >> /dev/null 770.721u 4.670s 13:00.62 99.3% 35+235k 0+0io 0pf+0w >time sed -ne 's|^\([^/]*\)/*\([^/]*\)/*\([^/]*\).*|\1/\2/\3|p' < find.txt >>/dev/null 1616.450u 8.887s 27:16.78 99.3% 35+235k 0+0io 0pf+0w sedに問題がありそうですが、そこはsedスレに行きましょう。
>>68 sed -ne 's|^\([^/]*/[^/]*/*[^/]*\).*|\1|p'
↑じゃなくて、
↓じゃないの?
sed -ne 's|^\([^/]*/[^/]*/[^/]*\).*|\1|p'
(上だとアスタリスクが1個余分だから、無駄な処理が行なわれている)
下の方でawkと比較すると、
やはりsedの方が速かったよ。
70 :
名無しさん@お腹いっぱい。 :2006/03/30(木) 10:03:15
なぁ お願いだから糞スレを立てないでくれるかな? 俺からのお願いだよ 分かったら削除依頼よろしく
>>69 うーん。クロック4倍で。
>time awk -F / '{print $1"/"$2"/"$3}' < find.txt >> /dev/null
4.194u 0.070s 0:04.27 99.7% 147+275k 0+0io 0pf+0w
>time sed -ne 's|^\([^/]*\)/*\([^/]*\)/*\([^/]*\).*|\1/\2/\3|p' < find.txt >> /dev/null
378.530u 0.515s 6:19.73 99.8% 35+235k 0+0io 0pf+0w
>time sed -ne 's|^\([^/]*/[^/]*/[^/]*\).*|\1|p' < find.txt >> /dev/null
156.079u 0.249s 2:36.65 99.7% 35+235k 0+0io 0pf+0w
やっぱりうちではsedが遅い。ちなみに結果が異なるというのは、
>awk -F / '{print $1"/"$2"/"$3}' < find.txt | head -3
//
/.snap/
/dev/
>sed -ne 's|^\([^/]*\)/*\([^/]*\)/*\([^/]*\).*|\1/\2/\3|p' < find.txt | head -3
//
/.snap/
/dev/
>sed -ne 's|^\([^/]*/[^/]*/[^/]*\).*|\1|p' < find.txt |head -3
/dev/network
/dev/geom.ctl
/dev/devctl
こんな感じ。awkの結果が必要なものだとすると、sedはプロンプトが返ってこないのに
心配になるくらいうちでは遅い。
Windows Meを入れて売ってた頃のメーカーPCってのがだめなのかなぁ。
どうでもいいけど、head -3で動くんだな。 内部で-3を-n3に書き換えてるのか。
>>71 出力が違うことについては、
sed -ne 's|^\([^/]*/[^/]*/[^/]*\).*|\1|p'
じゃなくて、
sed -e 's|^\([^/]*/[^/]*/[^/]*\).*|\1|'
の方がいいかも。
>>72 head -3 のほうが一般的だよ。
head -n3 だと動かないバージョン(OS)があるはず。
>>73 >time sed -e 's|^\([^/]*/[^/]*/[^/]*\).*|\1|' < find.txt >> /dev/null
156.072u 0.218s 2:36.66 99.7% 35+235k 0+0io 0pf+0w
となりました。しかし
>sed -e 's|^\([^/]*/[^/]*/[^/]*\).*|\1|' < find.txt > sed.txt
>awk -F / '{print $1"/"$2"/"$3}' < find.txt > awk.txt
>diff -q sed.txt awk.txt
Files sed.txt and awk.txt differ
と、結果が違うようです。
> sed -ne 's|^\([^/]*\)/*\([^/]*\)/*\([^/]*\).*|\1/\2/\3|p' < find.txt > sed.txt
>diff -q sed.txt awk.txt
こっちは同じになってるらしい。圧倒的に遅いけど。
76 :
名無しさん@お腹いっぱい。 :2006/03/30(木) 14:00:48
なぁ お願いだから糞スレを立てないでくれるかな? 俺からのお願いだよ 分かったら削除依頼よろしく
願いだから糞スレを立てないでくれるかな? てのは流行ってるの? なんでああ言う書式なんだろWinブラウザだと何か特殊に見えるの?
専ブラで透明あぼーんにしやすいようにしてくれてるんじゃないか
なんか.hideに良い特色がもう一言ほしいなぁ
>>74 確かに -n3 より -3 の方が一般的だと思うけど、
GNU textutils 2.1 の man には -LINES は
推奨されないオプションで -n LINES か
--lines=LINES を使えと書いてあるね。
getopt 化が進んで、getopt の標準からはずれたオプションは 迫害される時期にあるのね。head だけじゃなくて sort のオプ ションも同様な状況。 それがいいことか悪いことかは分からないが… 俺は相変わらず head でも sort でも古い形式を使ってる。
だって確認したらこうですよ? int main(int argc, char *argv[]) { : obsolete(argv); while ((ch = getopt(argc, argv, "n:c:")) != -1) : static void obsolete(char *argv[]) { : /* Return if "--" or not "-[0-9]*". */ : 2バイト大きいメモリを確保して"-n"と"-[0-9]*の"-"を取った文字列同士をくっつける処理 : }
obsoleteだからといってどうせ切るわけにいかない形式なんだし、 使ってていいんじゃない?
getoptどころか、通常のUNIXコマンドの書式とも合わない ddって、 未だに改善される気配すらないよね。 dd if=/dev/zero of=tmpfile bs=1024k count=1024 じゃなくて、 dd -i /dev/zero -o tmpfile -b 1024k -c 1024 の方が、今から設計するなら然るべきと思うんだが。 特に、ファイル名(デバイス名)の左側に = がくっついてるから、 シェルでワイルドカードの展開とかができない。 headのオプションに拘るより、こういうのを改善するべきだ。
いや、ddで展開が決まると悲惨な状況にもなり得るから、このままで。
>>85 Copy and Convert で cc になる予定が cc はすでにコンパイラで使われて
いたので dd にした。ちなみに dd は JCL の data definition の省略形
なんで, シャレで JCL の構文に合わせてみた(反省はしていない)。
ってのを, どっかで読んだ。
Unix に合わせるんだったら別のコマンドにするべきじゃねぇの?
その方が実装が楽だ (getopt だけで済む) からって、人間様にとって 不便なオプション形式が推奨されるのって、なんか間違ってる気がする。 dd じゃなくて head の話ね。
89 :
名無しさん@お腹いっぱい。 :2006/03/31(金) 11:32:03
前:名無しさん@お腹いっぱい。[] 投稿日:2006/03/30(木) 14:00:48 なぁ お願いだから糞スレを立てないでくれるかな? 俺からのお願いだよ 分かったら削除依頼よろしく
90 :
名無しさん@お腹いっぱい。 :2006/03/31(金) 11:33:28
なぁ お願いだから糞スレを立てないでくれるかな? 俺からのお願いだよ 分かったら削除依頼よろしく
ff (file format) っていうコマンドを作ればいいんジャマイカ
92 :
名無しさん@お腹いっぱい。 :2006/03/31(金) 17:42:57
いいから早く削除依頼してこいハゲ
tar と find も変態
>>93 findは変態だが、tarは別に変態じゃないぞ。
tar ztvf hoge.tar.gz
の代わりに、
tar -z -t -v -f hoge.tar.gz
とも打てるわけだし。
95 :
名無しさん@お腹いっぱい。 :2006/03/31(金) 19:31:37
いいから早く削除依頼してこいハゲ
>85はお犬様。犬は帰れ。
>>96 85のどこに犬依存の記述があるんだい???
>>96 は、
>>85 を見て、
「Linuxのddではdd -i /dev/zero -o tmpfile -b 1024k -c 1024という記述ができる」
と勘違いしたようだ。
しかも、
>>85 が、「Linuxのddの書式をUNIXのddでも使えるようにしろ」と
主張しているものと勘違いしたようだ。
改善すべきだというお題目の元に改悪するのがお犬様。 85は「こんなのも使えるようになりゃいいな」って話じゃなくて、 headやsortのオプションがGNU getoptに合わないので色々 迫害されてるねえって話題の中で、「ddも改善されるべきだ」 という意見を出している。今の話の流れだと、改善されるべきだ= 旧来のオプションは消えちまえだからな。 >98 妄想たくましすぎw
妄想たくましいな。
101 :
名無しさん@お腹いっぱい。 :2006/03/32(土) 01:36:59
いいから早く削除依頼してこいハゲ
ええと getopt_long は GNU だけど getopt は POSIX なんだけど… 4.3BSD の時代から getopt はありますよ。
103 :
名無しさん@お腹いっぱい。 :2006/03/32(土) 03:58:50
いいから早く削除依頼してこいハゲ
104 :
名無しさん@お腹いっぱい。 :2006/03/32(土) 03:59:48
いいから早く削除依頼してこいハゲ
105 :
前スレのクラッカー :2006/03/32(土) 04:06:04
…とまあ、こんな感じで不定期連投スクリプトは楽々組めるよ。 それとクラッキング与太話はするつもりは無いよ僕、リスクが上昇してしまうからね、 まああの時はカナダ、ドイツ、インド、アメリカ、中国、韓国、イスラエル、ルーマニア、イタリア、オーストラリア、アイルランド、アフリカ、チェチェン、バチカン、アイスランド とこんな感じで超・多段串を刺してクラッキングしたねw まぁ君らみたいな低脳には到底不可能な芸当だよw 僕を崇めろw
>>99 お前国語能力ないな。
>>85 は、headのオプションを、-3形式の、互換性のあるものから、
-n3の、新しいけど互換性のない形式にするなら、
ddだって変えてしまってもいいことになるが、
実際にはその気配はない。
だからこういった基本コマンドのオプションは安易に変えるべきではない。
(head -3の方が良い)
と、反語的に主張しているんだよ。
違うことないなら日本語勉強するといいよ
111 :
前スレのクラッカー :2006/03/32(土) 10:26:54
おい 屑共
まあ、manとか技術文書ばかり読んでると、
ストレートな表現ばかりに慣れ過ぎて、
ちょっと捻った文章の読解能力が低下して、
>>96 >>99 >>108 >>110 みたいな香具師が登場することになるわな。
>>112 >まあ、manとか技術文書ばかり読んでると、
>ストレートな表現ばかりに慣れ過ぎて、
>ちょっと捻った文章の読解能力が低下して、
>
>>96 >>99 >>108 >>110 みたいな香具師が登場することになるわ
>な。
ぎゃはは
ばっかじゃねーのこいつ
反語的主張をする時は、最後にちゃんと「などと言えるのではなかろうか」などと入れるとか、 褒め殺しをするとか、そういうサインを入れとか無いと駄目ですよって学校で習わなかった? ひねった文章ってのは、ひねったことが読者に分かって初めて意味があるんだがなあ。 まあ、煽り文句は煽った本人のコンプレックスの現れという定理に基づくと、 「国語能力低いな」と煽った107=85は…(ry
>>115 それを言うなら「定理」じゃなくて「法則」だなw
「国語能力低いな」
>>117 命題がサインになっている。国語力低いな。
>>96 =99 だと仮定して、
>>85 の文章は「ddも改善されるべきだ」とも取れるのはその通りだとしても、
そこから、
>>96 の「犬は帰れ。」のところで理論の飛躍があると思う。
どうして犬だと思ったのか、もっとちゃんとした説明が欲しいな。
120 :
115 :2006/03/32(土) 16:44:37
>116 ああ、法則のほうがあってるね。わりいな。 >117 ああいう褒め殺しの典型みたいな文章をもってきて、 なにがいいたいのやら。85でももうちょっと技法を使って 他人に反語的表現だと理解してもらえる文章にしないと、 それができないならせめて補足を入れないと駄目だぞ。
>>120 横レススマソ。「法則」の方が合ってる(程度問題)じゃなく、
「定理」だと間違い。
定理なら証明して導かないといけない。
こういう屁理屈はunix的なものから一番遠い所にあるという事を理解してほしい つべこべ言わずにコード書け
犬アレルギーの人が一人混じっていると、 何でもかんでも犬にこじつけて排除しようとするから、 スレが荒れるなぁ・・
もう既に犬の話はどうでもよくなってる気がする。 今の話題は反語的表現。
125 :
前スレのクラッカー :2006/03/32(土) 17:54:42
なぁ屑共 お前らに話がある 大切な話だ
新スレになってから「シェルってゆーな」の人、来ないね。
来て良さそうなカキコはあったのにね。
>>103 ,104,111,125 みたいな、自動カキコのシェルを書いてる人本人なのかなぁ。
「屑」に向けての話が「大切」だとは、矛盾してないかい?
128 :
前スレのクラッカー :2006/03/32(土) 18:15:45
中の人居ますが何か? ところでお前らに大切な話があるよ屑共。
シェルってゆうな。クズ。
>>129 は偽物。本物は「シェルってゆ『ー』な」
131 :
前スレのクラッカー :2006/03/32(土) 19:07:44
おい
132 :
前スレのクラッカー :2006/03/32(土) 19:10:22
俺がこうもシェルスクリプトを嫌う理由はだな。 ・・・なんてったって遅いからだよ。 シェルスクリプトに限らず俺はインタプリタ型言語が大ッッッッッ嫌いでね。 悪いが当分の間このスレに居座り、荒らし行為をさせて貰うよ。 因みに俺の好きな言語はアセンブラ。
133 :
名無しさん@お腹いっぱい。 :2006/03/32(土) 19:14:28
アセンブラはアセンブリ言語をオブジェクトコードに変換するソフトウェア。 > 俺の好きな言語はアセンブラ。 wwwww ワロス
>128 俺には大切な話なんかないぞ。屑は帰れ。
135 :
前スレのクラッカー :2006/03/32(土) 19:43:19
そうか? どちらかと言うとお前らの方が屑だと思うぞ。
腐ったみかんどもめ
137 :
前スレのクラッカー :2006/03/32(土) 20:07:57
俺の好きな言語はコンパイラ。
このグダグダは春のせいか?
僕の家にある機械はコンバイン。
インタプリタ型言語が遅いという妄想な人か。 お大事に。
いや、インタプリタ型言語が遅いのは事実だろ。 速度以外の点でメリットがあるからシェルスクリプトを使うわけで。
143 :
前スレのクラッカー :2006/03/32(土) 20:35:59
>>138 よく分からないけど俺の世代にはアセンブラ言語と言う人間が大多数存在しているから、
間違いじゃないぞ。
あぁ〜自称プログラマーの使えないクズでしたか。すまんすまん。
>>139 お前のせいだ
>>140 意味が分からんよ全く、屑のホザくことは
>>141 実際遅いんだから、事実だろ?
俺が何年PCやプログラムに触れていると思っているんだ?
舐めるなよ。
言語の意味論によっては動的に決定せざるを得なくて コンパイルしてもたいして速くならなかったりするよ。
> 俺の世代にはアセンブラ言語と言う人間が大多数存在している えーと、歳いくつ? 世代全員そんな馬鹿だとは思えないから、たぶん君と君の友達だけだよ。 google で検索 アセンブラ言語 の検索結果 約 43,400 件 アセンブリ言語 の検索結果 約 168,000 件 43400/(43400+168000) ≒ 0.2 ∴ 人類の下位 20% に属するバカ なるほど。 φ(..)メモメモ...
正しくは「アセンブリー言語」だろ。 アセンブリー言語のことを慣習的に「アセンブラ」と呼ぶのは一般的だが、 「アセンブラ言語」という言い方は初めて聞いたな。 「言語」がくっつくと確かにおかしく感じる。
下位 0.1% とかじゃなくて良かったね。
世の中の外注会社のレベルの低さを知らないな コンパイル型言語(というかC言語)でも、インタプリタ以上に遅いコードはざら。 sscanf 一発な簡単な文字列処理でも、strxxxでコピーしてコピーしてとごちゃごちゃやってたり
>>148 一部の特例を出してきても、一般例の反論にはならないのはわかってますか?
150 :
前スレのクラッカー :2006/03/32(土) 20:47:43
>>145 無駄な労力ご苦労様。
>>146 で?
俺は一般的にはアセンブラ言語だと思っているよ。
>>147 お前は下位0.01%に含まれる屑人間だと思うよ。
>>148 レベルが低いのはお前だよ。
良い会社じゃないか、定石通りの綺麗なコードを書くんだろうなあ
>>149 黙ってろ低脳
アセンブラ使って高速化したところで、せいぜい3倍〜100倍程度しか 高速にならないが、高級言語を使ってアルゴリズムのレベルで最適化 すると、指数的オーダで改善することが多いから、高級言語の方が いいよん。 まあタイトループの最内部をアセンブラで高速化するのは時には意味 があるけど、かなり特殊な用途だね。
> 俺は一般的にはアセンブラ言語だと思っているよ。 「一般的には××だ」と主張する根拠が「俺はそう思っている」からだと。 ククク。
>>151 「タイトループ」? ってもしかしてアノ業界のプログラマ?
154 :
前スレのクラッカー :2006/03/32(土) 21:02:15
>>151 お前BASICからプログラム始めたクチだろ。
アセンブラをよく知らない屑がよく吐く屁理屈だ。
まあお前もアセンブラを深く学べば俺に同調するようになる。
>>152 それは俺が常にルールに従っているからこその自信だ。
あと
>ククク。
気色が悪いから止めてくれないか?屑野郎。
>>153 ほう、タイトスカートフェチか。
ピンクモンキーは大人しくセンズリかいて寝てろよ。
シェルスクリプトで、一部のループを高速化したいと考えています。 そこで、このループのみ、インラインアセンブラを仕込む方法を 教えてください。もちろん、Bourne Shell互換で。 OS依存なしで、お願いします。
156 :
前スレのクラッカー :2006/03/32(土) 21:07:51
>>156 あ、書き忘れました。OS依存だけでなく、CPU依存もなしでお願いします。
158 :
前スレのクラッカー :2006/03/32(土) 21:11:25
159 :
前スレのクラッカー :2006/03/32(土) 21:18:26
ところでお前ら今何してる?
今から風呂入って、上がったらセクースする予定。
161 :
前スレのクラッカー :2006/03/32(土) 21:24:53
>>160 悪いな、お前の彼女なら俺の隣で寝てるよ
162 :
名無しさん@お腹いっぱい。 :2006/03/32(土) 21:33:49
>>155 スクリプト内で動的にコード生成してコンパイルなどして実行すればー。
>>155 なに?シェルスクリプトでインラインアセンブラが使えない?
ジョジョ、それはコンパイル言語と同じにやろうとするからだよ
逆に考えるんだ
「インラインアセンブラからシェルスクリプトを呼べばいい」と
164 :
前スレのクラッカー :2006/03/32(土) 21:40:35
>>162 ,163
何このレベルの低さ
自分のスキルの無さを露呈しちゃってるよ
シェルスクリプトで、標準入力に流し込まれたマシンコード(バイナリ)を 実行する方法はありませんか? あ、テンポラリファイルに cat > tmpfile して、 chmod +x tmpfile する方法以外でお願いします。
どうでもいいが、「前スレのクラッカー」が蜂の巣をつついたように暴れてるのは、
>>126 が図星だったってことか。
オレなんかコンパイリ言語得意だけど。
168 :
名無しさん@お腹いっぱい。 :2006/04/02(日) 00:01:42
アセンブラ言語 ワロス wwww ところで、前スレのクラッカーってなんだ?
171 :
前スレのクラッカー :2006/04/02(日) 10:12:42
おはよう屑共。 今日は何をして過ごそうかなあ。
172 :
前スレのクラッカー :2006/04/02(日) 12:14:26
ごめん、もう荒らすの止めるわ・・・ 還暦間近でストレス溜まってたんだ、許してくれ
どなたかお知恵をお貸しください。
エロサイトから wget -r
http://ero.example.com という形で
ファイルをDLしてきました。このファイルには
エロ画像、エロ画像のlzh、サムネイル、html、css等が含まれています。
目的のエロ画像はero.example.com/members/女の子名/img/ 下にあります。
複数の 女の子名/img を一つのディレクトリに ln -s すれば閲覧が楽になるので
今まではシェルスクリプトを作ってlnをしていたのですが、
、今回 女の子名/img の中にサムネイルファイル t_001.jpg, t_002.jpg ... 等が混ざっており、
単純にln -sしただけではサムネイルと画像本体が混ざってしまい、大変不便な思いをしています。
ブラウザで閲覧する事もあるため、できればサムネイルファイルを消さずに
目的の画像だけを集めたディレクトリを作成したいのですが何かよい方法はないでしょうか。
1. ls -r の結果から、サムネイル以外の全ファイルを一つ一つ ln -s する方法、
2. ディレクトリごとcpしてしまってサムネイルをrmしてしまう方法
を考えたのですが、もっとスマートな方法があればお教えください。
なお、使用している画像ビューワはhtml等のフィルタリングはできますので
本番ファイルとhtmlやcssファイル等が混ざるのは問題ありません。
すみません、ググっても出てこないので教えてください。 kshを使ってるんですが、どなたか「[」のPATHを知らないでしょうか? $[ -z ];echo $? とすると「空文字」判定で「0」が出力されます。 しかし、シェルスクリプトの中に同じ命令を書くと、 「testの引数が足りない」というエラーになります。 そこで、「[」のPATHを指定してないからだとwhichを実行したのですが、 「PATHの中にはない」というエラーになります。 お手数ですけどどなたかご教示ください。
どうみてもくだ質スレです ありがとうございました
>>174 OSにもよるけど、今時のkshやshでは [ は内部コマンドになってるよ。
/bin/test とか外部コマンドはあるけど。
[ -z ] で何がしたいの?
変数が定義されてるかどうかなら [ -z "$x" ]
>>176 ありがとうございます。
やりたいことは
[ -z `grep $id $listfile`]
で「$idがリストファイルにある」「ない」で条件分岐をしたいのです。
grepでなければthen以下を実行するという感じです。
>>177 コマンドの終了状態は $? という変数で見る
grep -q hoge file 2> /dev/null
if [ $? -eq 0 ]; then
......
else
......
fi
が素直じゃない。
179 :
名無しさん@お腹いっぱい。 :2006/04/02(日) 15:29:52
>>177 そういうときって・・・
grep hoge file > /dev/null 2>&1
if (($?==0)) ; then
moge
fi
みたいに書かない?
俺だけ?
それなんてbash?
>>177 どうしても [ -z ] 方式でやりたいなら、
[ -z `grep $id $listfile` ] じゃなくて、
[ -z "`grep $id $listfile`" ] みたいに、
ダフルクォートを付けろ。
こうすれば、grepの結果がなくても "" の空文字列が残るので、
testがエラーにならない。
それより、testを使わずに、
if ! grep $id $listfile; then
で行けるよ。(!を使うのはksh依存だけど)
Bourne Shなら
if grep $id $listfile; then :; else
とやるのが普通。
>>178-179 この場合はわざわざ $? を呼び出す必要が無いな。
if grep ...
then
...
else
...
fi
else がいらないならこれでも可。
grep ... || {
...
}
>>178-182 すんません。ありがとうございます。
常に独習でやっていたので知ってる方法しか考えてませんでした。
定石みたいなのがちゃんとあるもんなのですね。
くだ質になって申し訳なかったですけど勉強になりました。
>>179 (( )) の算術式は、kshやbashでは使えるけど、
Bourne Shellでは使えないから、わざわざ使うことはないな。
シェル変数 iに数値が入っている時、 以下のシェル文法の違いを説明せよ。(30点) (1) [ $i = 3 ] (2) [ $i == 3 ] (3) [ $i -eq 3 ] (4) [[ $i = 3 ]] (5) [[ $i == 3 ]] (6) [[ $i -eq 3 ]] (7) [[ i -eq 3 ]] (8) (($i == 3)) (9) ((i == 3)) (10) test $i -eq 3
JISだと「アセンブラ言語」なんだよ。 だからJISをふまえた文書だと全て「アセンブラ言語」になってる。
187 :
前スレのクラッカー :2006/04/02(日) 18:11:53
>>186 今さら擁護はよしてくれ。
どうせ俺を叩いてたのは、世間知らずのガキ共だったのだろうから・・・
問 2
>>185 の問でシェル変数 i の中身が i='1+2' である
場合はどうなるか説明せよ。(30点)
>>185 Solarisでの実行例
$ (1) [ $i = 3 ]
syntax error: `[' unexpected
$ (2) [ $i == 3 ]
syntax error: `[' unexpected
$ (3) [ $i -eq 3 ]
syntax error: `[' unexpected
$ (4) [[ $i = 3 ]]
syntax error: `[[' unexpected
$ (5) [[ $i == 3 ]]
syntax error: `[[' unexpected
$ (6) [[ $i -eq 3 ]]
syntax error: `[[' unexpected
$ (7) [[ i -eq 3 ]]
syntax error: `[[' unexpected
$ (8) (($i == 3))
syntax error: `(' unexpected
$ (9) ((i == 3))
syntax error: `(' unexpected
$ (10) test $i -eq 3
syntax error: `test' unexpected
>>187 "assembler language" の検索結果 約 270,000 件
"assembly language" の検索結果 約 6,690,000
海外だと君は下位4%以下の阿呆だ。良かったね。0.1%に入らなくて。
>>186 へー、そうなのか。勉強になった。
変な言葉を使う割合が世界全体と比べて日本が5倍も多いのは
JIS のせいなのね。JIS もたいがいだなあ。まあこの件に限らんが。
セションとかね。
大学ではアセンブリ言語って習ったけどね。
"アセンブラ言語 site:u-tokyo.ac.jp" 38件
"アセンブリ言語 site:u-tokyo.ac.jp" 245件
38/(38+245) = 13.4%
東大は日本の平均よりは若干マシのようだな。
>>189 はいはい。 ワロス ワロス。
で、本当の回答は?
>>185 十人十色と言いましょうか、みなそれぞれ個性を持っております。
一言では語りつくせません。
>>188 一つも真となるものはありません。
>>192 >一つも真となるものはありません。
違います。真となるものがあります。
>>185 (1)(3)(10)以外は bash依存。よって論じる価値なし。
(3)と(10)は同義で、数値としての比較。
よって、仮に i=03でも真になる。
(1)は文字列としての比較。
よって、i=03の場合は偽になる。
i="i='1+2'" としたときにどうなるか教えてください。 どうしても真になるものがあるとは思えないのですが...
>>195 真になるところはbash依存だから、覚えなくていいよ。
197 :
173 :2006/04/02(日) 23:38:01
僕の質問もお願いします^^;;;
>>173 いやそれで間違ってないんじゃないでしょうか^^;;;
bashでcase文の入れ子はどう書けばいいのでしょうか?
shなら普通に書けばいい。bashでも多分そうだろ。何を悩んでるんだ?
インデントとかw
入れ子の内側の esacのあとの ;; を忘れがち、 とか、エスパーしてみるテスト。
204 :
名無しさん@お腹いっぱい。 :2006/04/03(月) 19:11:36
zshのシグナル(trap)回りの挙動を、Bourne Shellと同じにするには どうすればいいでしょうか。argv[0]を shにして zshを起動しても、 shと同じにはなりません。setoptあたりかと思いましたが、 シグナルに関するオプションは見つかりませんでした。 やっぱり、zshをBourne Shellとして使うのは無理ってことでしょうか? ちなみに、bashだと問題ありません。
bashとashは挙動が違う。
206 :
名無しさん@お腹いっぱい。 :2006/04/04(火) 12:10:53
cpコマンドで複数のファイルをあるディレクトリ以下にコピーする際、 コピー元のファイルの相対パスを保ったままコピーするには どうすればいいでしょうか? 具体的には、 cp -p hoge.txt aaa/fuga.txt bbb/ccc/boke.txt /dokoka/sonohen を実行すると、hoge.txt fuga.txt boke.txtが、 /dokoka/sonohenの直下にコピーされてしまいますが、 hoge.txtは /dokoka/sonohen/hoge.txtでいいですが、 aaa/fuga.txtは /dokoka/sonohen/aaa/fuga.txtに、 bbb/ccc/boke.txtは /dokoka/sonohen/bbb/ccc/boke.txtに、 コピーしたいのです。 シェルでパス名を文字列処理すればできると思いますが、 できればもっと簡単にコマンド一発の方法を希望します。 あと、tar等を使うのは無しでお願いします。
cp -R
質問、わかりにくすぎて途中で読むのやめた
tarが無しな理由は何?
cp -P hoge.txt aaa/fuga.txt bbb/ccc/boke.txt /dokoka/sonohen かな?
>208 んなん、forで回せばいいだろ。
tarなら tar -c hoge.txt aaa/fuga.txt bbb/ccc/boke.txt |(cd /dokoka/sonohen; tar xf -) で済むんだけど、使わないのは宿題かなんか?
>>206 GNU cpなら、
cp --parents hoge.txt aaa/fuga.txt bbb/ccc/boke.txt /dokoka/sonohen
だな。
>>211 GNU cpだと、-Pはシンボリックリンク保存オプションなので違うと思うが。
>>210 ,213
tarが無しな理由は、コピー元ファイルがシンボリックリンクだった場合に、
実体ファイルに展開して欲しいからです。
>>214 ありがとうございます。でもGNU cpが無い場合はどうすればいいですか?
>>215 symlinkだけの問題なら tarに hオプションを付ければいい。
でも cp --parentsが使える環境ならその方が簡単。
いや、ダメだろ
もうその議論秋田。
>>206 の質問だと、シェルスクリプトにせずに
直接コマンド(シェルの構文を含む)を打つとも解釈できるから、
「シェル」でもOKと思われ。
それより、いちいち「シェルってゆうな」の反応の方が鵜剤。
いい加減飽きたのは事実だが、 シェルスクリプトをシェルと言う馬鹿が絶えないのがそもそもの原因であって、 それを指摘するほうにいちいちつっかかるほうが間違い。
ウザイと思わせるためにやってるのでこれからも好き放題に書き込ませてもらうよ
今度、仕事柄、シェルを始めることにしました。 そこでお聞きしたいのですが、皆さんが最初に書いたシェルは何ですか? やっぱり、echo hello worldとかでしょうか?
>>224 まず、その仕事とやらを紹介してみたまえ。
仕事は、力×距離です。
>226 正解!
>224 つまんねーんだよ 死ねデブ
229 :
前.ス.レ.の.ク.ラ.ッ.カ.ー :2006/04/05(水) 15:26:02
>>224 のラベルでネットワーク管理者だったら笑い事だぞ。
俺の方がよっぽどスキルある。
シェルはじめました UNIXはじめました と春になると焼き肉屋に案内が出ますが どっちがブちがいがありますか?
ネットワーク管理なら、シェル作らなくてもUNIXだけで十分だよ。 ネットワーク管理で使うUNIXはパターンが限られているので、 よく使うUNIXを、コメントとともにメモ帳などで保存しておけば良い。 で、これを適宜、TELNETにコピペしてUNIXを打つ。 変にシェルを作っても、そのシェルの名前を忘れそうだし、 シェル自体がブラックボックスになって、結局使わなくなってしまうのがオチだよ。
>>231 じゃシェルはぶたなくても良いのね
UNIXを6回くらいぶつのをまとめて
スクリプトにしたいんだけど使うときは
UNIXをぶつで良いの?
次の流行語予想:UNIXを作る
シェルでUNIXを出すにはどうすればいいですか?
>>234 シェルの中で shを実行すれば UNIXが出せる。
UNIXを終る時は exitを打てば、シェルに戻る。
シェルスクリプトって略すと シェ シェル シェス シェスク シェルスクリ スクリプト プト どれが正しいですか?
全部間違い。略せない。
正解は ェルスクリプ
いや、文脈からシェルスクリプトであることが明らかな場合なら、 「スクリプト」と略すのはありだと思うよ。 そういう場合でも、「シェル」と略すのはまずいと思われ。 ただ、スクリプトだけだと、perl とか ruby のスクリプトも 含まれるから、あくまで文脈からシェルスクリプトだと分かる場合 のみ。
240 :
名無しさん@お腹いっぱい。 :2006/04/05(水) 23:10:51
本当に文脈から明らかならどういう表現をしたって勝手だろう。 ただ発言者の人格や知性が疑われることはあるだろうが、それもまたよし。
ちょっとまて UNIXとシェルの使い方が少しラフだ
よくわかんないけど単に「スクリプト」と表現したとき、
それがkshなりperlやpythonで記述されてるかどうかなんてふつう気にする?
>>236 シエル
単に「スクリプト」と表現されると、多分「何スクリプト?」って聞くと思う
UNIXを打たれるくらいなら シェルを作られる方がガマンできる
247 :
ななし :2006/04/06(木) 16:54:17
$1 が -a の時に、 [ $1 = -a ] とやるとうまくいきません。 何かいい方法はありませんか?
うまくいくよ
>>247 現行のシェルだとそのままでうまくいく。
うまく行かないのはかなり古いBourne Shell。
ちなみにどのOSのshか教えて。
うまく行かないシェルの場合は、
[ X"$1" = X-a ]
とやって回避する。が、この回避方法はバッドノウハウなので、
もうobsoleteなはずなんだが、、
>>249 なんで廃れたとか原始的とか古典的とか
爺さんの知恵袋とか
文脈に的確な日本語を当てないで
【obsolete】なんて形容詞や動詞として使うの?
>>247 イマドキのシェルだと、
>>249 の回避方法を使わなくても
そのままで桶なはずだが、それ以前の問題として、
$1を " " で囲んだ方がいい。
[ "$1" = -a ] ね。
でないと、$1が -aだった場合じゃなくて、
$1がスペースだった場合とかにエラーになる。
>>250 重箱の隅をつついいてひとり悦に入る非生産的な奴だね君
254 :
名無しさん@お腹いっぱい。 :2006/04/08(土) 00:33:08
>>206 >cp -p hoge.txt aaa/fuga.txt bbb/ccc/boke.txt /dokoka/sonohen
>を実行すると、hoge.txt fuga.txt boke.txtが、
>bbb/ccc/boke.txtは /dokoka/sonohen/bbb/ccc/boke.txtに、
>コピーしたいのです。
find hoge.txt aaa/fuga.txt bbb/ccc/boke.txt -print -depth | cpio -pdmuv /dokoka/sonohen
でできる。
コピー元がリンクなら、コピー後もリンクのまんまだよ。
>>254 欲嫁。
>>206 に「tar等を使うのは無しで」とある。
tar等には cpioも含まれると思われる。
それに、コピー後もsymlinkのままでは困るという質問だよ。
(ファイル本体をコピーして欲しいというのが質問の意図)
で、
>>214 の cp --parents ですでに解決済み。
あるファイル-Aをcatで別ファイルに出力するプログラムを作っています。
権限関係の理由で sudo と expect を使って
パスワード認証を行ってから cat する方法を取りたいと考えています。
cat だけなら問題ないのですが、
# cat A > hoge1.txt
# ./cat.exp ID PASS A > hoge2.txt
上記のようにした場合、
hoge2.txt の方が10〜300バイトほど量が増えてしまいます。
おそらくcat.expの中で無駄な出力が出てしまっているためかと
思うのですが、改善方法を教えていただけないでしょうか?
expectのマニュアルを見ましたが解決しません
ttp://kansai.anesth.or.jp/gijutu/expect/howto-expect.html --cat.exp--------------------------------------
#!/usr/bin/expect
set username [lindex $argv 0]
set password [lindex $argv 1]
set file [lindex $argv 2]
log_user 0
spawn sudo -u $username /bin/cat $file
expect "assword:"
send "$password\r"
expect eof
log_user 1
exit
>>256 expectだと改行コードがCR+LFで記録されてしまうからじゃないの?
258 :
256 :2006/04/09(日) 22:49:06
>>257 レスありがとうございます、
関連情報を調べてみようと、改行コード expect あたりでぐぐったのですが
特に見つかりませんでした。
直す方法はあるでしょうか?
ファイル出力後に変換する
260 :
256 :2006/04/09(日) 23:30:18
か、かなり大容量のファイルなんで、 できるだけ出力後に処理ってのは勘弁を・・・orz
どうせたいした容量じゃねーだろ。何メガバイトぐらいか言ってみ?
>>256 sudo がパスワード認証するんだから、
#!/bin/sh
sudo -u ahouser cat "$@"
でいいじゃん。
パスワードをコマンドラインから入れたら、ps で「もろばれ」なのはわかってんの? それでも、やりたいんだったら、sudo -S っていう手があるけどさ。正気ならそんなことしない。
どうしても、その狂気を避けられないのは「権限関係の設計が悪い」からです。僕
だったら、wrapper作るか、.ssh 作ってssh 経由でcatさせるね。
263 :
名無しさん@お腹いっぱい。 :2006/04/10(月) 10:22:34
複数のシンボリックリンクを、指定のディレクトリに移動したいのですが、 移動先のディレクトリでも、シンボリックリンクが正しく元のファイルを 指すようにするには、どういうシェルを書けばいいでしょうか? シンボリックリンクが絶対パスなら無問題ですが、 シンボリックリンクは、../.. とかを含む相対パスであり、 かつ、移動先でも相対パスでリンクする必要があります。 例えば、 /aaa/bbbディレクトリの下に hoge -> ../hage というシンボリックリンクがあったとすると、 これを/aaa/ccc/dddディレクトリの下に移動させた場合、 今度は、 hoge -> ../../hage を指すようにリンクを修正して移動したいのです。
移動先のディレクトリをシンボリックリンクにすりゃいい。
いいせんいってると思ったのになw
imake が、そんなことやってて「迷惑だな」と思った。絶対パスでリンクを生成する方が健全。cd .. がわやになるし。
268 :
名無しさん@お腹いっぱい。 :2006/04/11(火) 12:04:20
>>249 Macでこれが失敗した。
/bin/test -z = -a -o -f /etc/passwd
POSIXでも引数がたくさんある場合の評価の順序はunspecified。
269 :
名無しさん@お腹いっぱい。 :2006/04/12(水) 01:38:08
ファイルの中身を行単位で処理するために、 下記の方法でスクリプトを書いてみたのですが、 改行のみの行が処理対象とすることができません。 #==ファイルの中身=== $ cat hoge.dat 111 222 333 444 #==スクリプトの中身=== #!/usr/local/bin/bash IFS=' ' for line in `cat hoge.dat` do echo $line done #==実行結果 ここまで=== 111 222 333 444 なぜ、222と333の間の改行のみの行がわたってこないのでしょうか?
板違いでしたらごめんなさい。 2ちゃんめるって、インデントが向こうになるんですか? [半角空白][半角空白][半角空白][半角空白]echo $line ってかいたのに echo $line になってる。
自己解決しました。 ループの部分を以下のように変更したら、うまくいきました。 while read LINE do echo $LINE done < hoge.dat
空行が何行あろうと、結果が一緒じゃないかな。通常の、いわゆる空文字を無視する ようなIFSでも、並んだ空白文字であればいくつでも無視するでしょ? それと一緒。
>>271 定番だが、$LINE は "$LINE" にしておいた方が幸せだ。
zshなら $LINE のままでいいから幸せだ。
$LINEのなかみが"-n"とかだとまずくない?>bash 実行オプションがあるのに、オプション"--"を許容できないのが設計ミスのような。
>>275 それはbashだけの問題ではない。zshやashとかでも同じ問題がある。
Solarisのshだと-nの問題はないが、代わりに、
$LINEの中身が \c とかだとやはり問題になる。
元はechoコマンドの設計ミスだが、今さらもう変えられないのが現実。
で、echoの代わりにprintfを使えというのが今の結論だが、
シェルによってはprintfが組み込みじゃないので、
使うのはためらわれる。
277 :
名無しさん@お腹いっぱい。 :2006/04/12(水) 16:25:07
すいません、なんだか成り行きでメールアカウントを大量に登録するスクリプトを作らなくてはいけなくなったんですが、 今までUNIXとかぜんぜんやったことなくて何がなんだかで途方にくれてます。 そもそも質問自体どうやっていいかわけがわかってないんですが、どなたかヒントだけでもいただけませんでしょうか。 登録するリストは別にあって、だいたい800ぐらいなんです。 メールアカウントを個々に登録することは # useradd.sh NEWUSERACCOUNT@***.***.***.jp PASSWORD Creating user.NEWUSERACCOUNT on default add NEWUSERACCOUNT ってな感じで登録してるんですが・・・・。 これだけで何が言いたいかわかるでしょうか。 そもそもこのスレでいいかどうかもわかりませんが、本当に申し訳ないですがわかる方いましたらよろしくお願いいたします。
>>277 えっと、useradd.sh というスクリプトは、お前の会社とかで作成された
スクリプトだな。(一般のuseraddコマンドとは無関係)
で、
useradd.sh メールアドレス パスワード
という書式で実行すればいいんだな。
だとすると、その800アカウント分くらいあるという、
別ファイルのリストの書式を晒せ。
そのリストを読んで、useradd.shを呼び出しながらループする
シェルスクリプトを書けば桶。
#!/bin/sh while read x do useradd.sh $x done < 登録するリスト
>>277 そのリストは、
[email protected] パスワード1
[email protected] パスワード2
:
という書式だとエスパーしてみる。
すると、
while read addr pass
do
useradd.sh "$addr" "$pass"
done < リストのファイル名
でOKだよ。
もし、リスト中に余分な文字列があるなら、それを取り除く処理が必要。
>>280 もしそういう書式なら
エディタで行頭に "useradd.sh " を追加して
そのままシェルスクリプトとして実行しちゃうのが楽。
そのリストがそういう書式でコメントも何も含まれてないなら、 xargs -n2 useradd.sh < 登録するリスト
>>281 リストをエディットして直接実行する場合、
パスワード部分の文字列が、
z3xd89;rm -rf /;Eakez
とかになっていると面白いことになりそう。
284 :
277 :2006/04/12(水) 18:15:08
みなさんありがとうございます・・・・。 リスト自体は user1 password1 user2 password2 ・ ・ ・ ・ ・ ・ といった感じですが、@以下も追加しちゃえばよさそうですかね。 とりあえずがんばってやってみます。 こんな初心者に教えていただきありがとうございます。 また何か困ったらお願いしたいと思いますが、できるだけ自分でできるようがんばります。
>>284 だったら、
>>280 の回答が近い。
while read addr pass
do
useradd.sh "$addr"@example.com "$pass"
done < リストのファイル名
とすればいい。リストのエディットは不要。
>>283 おれが透視したところによると
そういう行は存在しないので無問題。
さあ突然ですがここで問題です python -c 'print __import__("sys").stdin.read()' | ruby -e 'while gets(); print $_ end' | sh -c 'while read x;do echo $x;done' | awk '{print}' | perl -pe '' | sed '' | cat 全部読み込むまでパイプしない奴は誰でしょう。(10点)
>>287 答え、python。
つーか、答がpythonになるなら、それはpythonのバッファリングの問題であって、
シェルスクリプトスレとしてはスレ違い。
>>287 毎度お約束だが、echo $x は echo "$x" にしておいた方が幸せだ。
>288 早い正解!よくわかったね、スレ違い恐縮です
いろんな言語で Hello World というのがあったが、 いろんなコマンドで catモドキを作るというのも面白そうかも。 とりあえず、 tr a a とか、 nkf -Jj とか。
俺も考えてみた。 grep '' dd 2> /dev/null (ddはメッセージを捨てる必要あり)
gzip -c | gzip -dc uuencode hoge | uudecode -p こういう組み合わせはいくらでもあるので以後禁じ手で。
>>291 ダウト! nkf -Jj は変換されてしまう。
俺からもひとつ、
tail +1
vim -es -c "wq! /dev/stdout" /dev/stdin
fjの時代からあった話題やな
俺は Fjとやらを知らん世代。 bash -c 'echo "`</dev/stdin`"'
昔の2chです<fj
fjを知っていると、今どきの 「2chは匿名だからこんなに殺伐としているんだ」 みたいな意見は嘘だと分かるよな。 fjは実名であんなに殺伐とできたのだから。
殺伐加減がひどくなったのは、 やっぱり一般のプロバイダが参入してきて fjも匿名が当たり前になってからじゃない?
fj→今の2ch は違和感ある。 nifty→今の2ch fj→スラド でしょ。
目からうろこなパイプ集ですね helloだとインがないからプログラムらしく見えなかったのか catもどきだとその処理系の癖が見えて詳しくなった気分
たぶん最短 tee
304 :
256 :2006/04/13(木) 10:56:14
>>262 うわ、言われてみれば・・・・・。
こうしたほうがsudoの場合でもセキュリティ十分に確保できると
思ってやってたんですが、psで簡単にばれちゃうとは本末転倒ですね。orz
fjが「は?それが何か」とかのレべルで殺伐してたのは昔からかと。 パソコン通信の連中が入ってきてからは、ゴミ記事と馬鹿が増えたっけ げいいんが変換できないのはおかしい、とか
fjの殺伐さ+パソ通の馬鹿=2ch といったところ?
まだまだあるcatモドキ、 comm - /dev/null
paste -
cut -f 1-
>>294 >ダウト! nkf -Jj は変換されてしまう。
nkf -t だよ。作者が言うんだから間違いない。
perl -ple 0
2ch は実名の緊張感がないので おなじ殺伐でも馴れ合いで緩和されるところがあると思う。
>>311 馴れ合いはハンドルネームなどで個人が特定可能な場合に生じるものだと
思うが。
2ch以前の掲示板文化は大体それで、常連同士の馴れ合いの場と化していた。
2chであっても、コテが集まるスレッドは概ね馴れ合いの場になるよな。
fjがあまり馴れ合い的でなかったとすれば、個人が特定可能かどうかという
問題ではなく、あの独特のスノビズムにあったのでは?と思う。
馴れ合いより議論の緊張感と個人主義を好み、知的であることを尊ぶ。
fjの有名人達にそういうキャラの人が多く集まっていて、それがfjの
空気を生んでいたと言うべきではないかと。
あの空気を読めない感とか 裏でははらわたが煮えくり返っていそうで冷静を装う文章とか どうでもいいところにいちいち丁寧に突っ込むのとかは 確かにスノッブといえばそうだな。
まあfj = voidではあるまいよ そう言ってもいい気もするがな
fj 話はよそでやってよ。
スレ違いを平然と重ね打てるのがfjクオリティ
2chのオープンさはfjに近いと思う オレなんか未だに「レス」に抵抗あるもん
フォロー
でもNetNewsと違ってクロスポストができない>2ch やるとなるとマルチになっちゃう。
モマイらfjネタは長引くか?
「ネタニマジフォロ」とか、 「マジフォロ希盆」とか 「横フォロスマソ」とかいう言葉を普及させてくれ。
2ch=地上の楽園風味だと思ってたよ(w
2chだと何でもレスって言うけど、 フォローに相当するのならレス(ポンス)で許せるが 単発の投稿をレスというのは違和感がぬぐいきれない :-(
325 :
277 :2006/04/17(月) 10:02:03
皆さんありがとうございました。 先日お聞きしたメールアカウント登録の件、無事終了できました。 パスがどうのとか権限がどうのとかいう部分からわかんない状態でしたので そもそも私みたいなもんがやることじゃなかったかもしれませんが、 勉強できてよかったです。 返答してくださった皆さん本当にありがとうございました。
326 :
名無しさん@お腹いっぱい。 :2006/04/21(金) 10:31:55
cshのスクリプトで関数って使えないの? goto文以外で。
>>326 使えないよ。tcshとか最近の拡張されたのは知らんけど
tcshでも関数は使えないよ。 (t)cshは関数だけじゃなくていろんな意味で糞だから、 決して(t)cshスクリプトを書こうなんて思っちゃいけない。
初心者はな
tcsh user が移行するとすれば、zsh だろ! 色んな意味で幸せになれる。関数もある し。UTF-8対応でないところは無視すれば良い。
シェルスクリプトはデファクトスタンダードのshに任せればおk。 ただ、shのスクリプトをまともに書けなくするbashは消されるべき。
>>333 同じことがzshにも言えるわけで・・
というか、shの範囲内だけで記述するなら、
zshよりもbashの方が互換性高いよ。
zshはsignalまわりがどうやってもsh互換にできない。
zsh 使ってる奴は、比較的その辺分かってる奴が多い。 bash 使ってる奴は、その辺、無自覚な奴が多い。 ってことでは? bash の場合、昔からそうだったってわけじゃなくて、 Linux の標準シェルになったのが不幸の始まりって気がする。 zsh もユーザが増えてきたから、最近は bash とそう事情は変わらんかも。
zshはモジュール化してるから、 シングルユーザーモードで使いにくい、というのないか? bashだと、現実にシングルユーザーモードでも使われてる。 まあ、そういう場合はsh(ash)を使えばいいんだけど。
大昔のSunOS 4.xやNEWS-OS 4.xの時代ならともかく、 今シングルユーザモードで使えないシェルってあるの?
今のSolarisの/bin/sh /bin/ksh /bin/csh等はシングルユーザーモードでは 使えない。(実体が/usr以下にあるから) 使えるのは/sbin/shのみ。
そうかな? /と/usrどちらもリードオンリでマウントされると思うんだが... % svcs -d svc:/milestone/single-user | grep filesystem online 15:53:25 svc:/system/filesystem/minimal:default % svcs -d svc:/system/filesystem/minimal STATE STIME FMRI online 15:53:25 svc:/system/filesystem/usr:default online 15:53:25 svc:/system/device/local:default
もう/bin/shをよく見たら-> /bin/bashだったって奴は Linux板のシェルスクリプトスレに行ってくれよ。
お力をお貸しください。 sh で、スクリプトを組もうとしています。 目的は、apache で、決まったユーザごとにBASIC認証をさせようとしていて、 新規のユーザが入るたびに、設定するのが面倒になったので、スクリプトを組み始めました。 取り合えずユーザ名とパスワードだけのテキストファイル(list_name)は、手動で作り user1 passwd1 user2 passwd2 for文かwhile文で書けば終わると思っていたのですが 二次元配列?のところでうまくいきません。 ユーザ名もパスワードもバラバラに引数として利用したい。 for文だと、eval を使って、出来るんでしょうか? while文で、shift 2 とかすればいいかなと思ったのですが、for文でのin に変わるものだわかりません。 なにかヒントだけでもよろしくお願いします。
>>342 read の使い方を調べると幸せになれる。
while read user pass ; do
...
done < list_name
bash の read なら配列に代入する事もできるけど、
これで充分だよね?
はい、bashはもうたくさんです。
345 :
342 :2006/04/23(日) 02:13:31
>>343 御世話になりました。
幸せになれました。
>>344 zshでも、readで配列に入れることができるが、(read -A)
するとzshも、もうたくさんですか?
はい、zshももうたくさんです。
配列の扱いって、bashとzshとで異なるよね。 で、配列が使えるkshでは、bashとkshは同じ。 kshがPOSIX準拠だとすると、bash方式の配列が正しくて、 zsh方式の配列は独自文法ということになる。 配列に関してはzshの方が糞。bashは正しい。
どうでもいいが、シェルスクリプトのスレでzshの話をしてるのは何なんだ? /bin/sh がzshのシステムなんて、無いだろ? てことは、zshスクリプトは「わざと」書いてるんだろう。 「わざと」書く分には、/bin/shと互換性が無かろうが、そいつの責任であり 勝手じゃないのか?
>287 >291 >292 >293 >294 >295 >297 >303 >307 >308 >309 >310 python -c 'print __import__("sys").stdin.read()' | ruby -e 'while gets(); print $_ end' | sh -c 'while read x;do echo $x;done' | awk '{print}' | perl -pe '' | sed '' | cat | tr a a | grep '' | dd 2> /dev/null | gzip -c | gzip -dc | uuencode hoge | uudecode -p | tail +1 | vim -es -c "wq! /dev/stdout" /dev/stdin | bash -c 'echo "`</dev/stdin`"' | tee | comm - /dev/null | paste - | cut -f 1- | nkf -t | perl -ple 0 | 危険!全部繋げて試したらカーネルパニクッた
>/bin/sh がzshのシステムなんて、無いだろ? MacOSX 10.0
expectに標準入力(パイプ)で文字列を渡すにはどう記述すればいいでしょうか? (というかそもそも可能でしょうか?)
354 :
353 :2006/04/23(日) 18:28:59
>>354 expect `cat`
でいいんじゃない?
356 :
353 :2006/04/23(日) 18:51:26
>>355 須磨祖、それはどういう意味でしょうか?
>>355 できました。ありがとう。
シェルの基本文法で良かったのですね。
359 :
353 :2006/04/24(月) 16:18:45
358は俺に何かうらみでもあるとですか?
360 :
353 :2006/04/24(月) 23:53:15
ぜ、全然レスがないですね・・、 若干すれ違い気味なせいでしょうか
>>360 expectもtclも門外漢だが、
gets stdin line
or
set line [ gets stdin ]
とかじゃいかんのか?
>>360 355 で解決しないの?
command substitution って知ってる?
363 :
353 :2006/04/25(火) 10:21:30
>>361 神サンクス!
gets stdin line でアメ語をぐぐったら例が結構見つかりました。
ただ
gets stdin old_pass
gets stdin new_pass
としている例があったんですが、2つ標準出力で渡すのはどうすればいいんでしょうか?
echo "old_pass" | echo "new_pass" | ./password.exp
とかやってみたけどもちろん無理ですた
gets stdin new_pass のみなら上手くいきました。
>>362 357氏のレスから意味のないレスだと思ってマスタ、
神レスだったのですね。
コマンド置換ってやつですね、調べてみましたが、基本的な使い方は
なんとなく理解したのですが、
この場合はいまいち使い方がわからんとです orz
結局パスワードはスクリプトを実行時に手で入れるんでしょ? だったら expect 使う意味があまり無いと思うんだが。
ファイルの内容を指定した行番号から出力させるようなコマンドってあります?
すいません、分かりました
>>362 セキュリティ的にモロ見えイクナイってのが発端なのに、
>>355 で解決するって本気で思ってんの?
Bシェルの勉強始めたばかりでくだらない質問ならすいません。 スクリプトを書いているんですが、 引数を渡さないかぎり入力待機状態にして次の行にいかない様に するようなコマンドはありますでしょうか? 教えてくださいm(。_。;)m
>>368 引数という用語がおかしいようだが、
キー入力待ちにしながらシェルスクリプトを1行ずつ実行させたいということか?
だったら、途中に、
read hoge
というコマンドをはさんどけ。
[Enter]を入力しないと次に進まなくなる。
Bシェルの引数の限界値ってどう求めるんでしょうか? Cシェルは1706が引数の制限なようですがBシェルに関しては ARG_MAXを限界値に引数に渡されるバイト数+環境との記述 をみたのだが同じ環境なら引数に渡されるバイト数は固定でないのか? 例えばls * | wc -l とかでやると(ファイル名+空白分)*ファイル数のバイト数は ファイル数が多いほど少なくなるのですが・・・。 詳しい方教えてください。
日本語でおk
>>370 引数の個数じゃなくて、
全引数の文字列のバイト数+環境変数のバイト数(変数名も含む)
で決まってるはず。
手元の環境で試してみると、
合計128KBみたいだった。
>372 レスサンクス。 書き方がわるかったのかな。 全引数の文字列のバイト数+環境変数のバイト数(変数名も含む) はオレも分かってはいるんだが 同じマシン、同じコマンドでやれば環境変数のバイト数は同じだよね? つまり全引数のバイト数は固定だと思ってるのだが・・・。 ls * | wc -lを例えば%10dの10文字のファイル名が入ったフォルダで 実行した場合の限界ファイル数と200文字のファイル名が入った フォルダでの限界ファイル数を取得したとき、文字数*ファイル数で出した数 がかなり違ってくるのでどうしてでしょうか?と聞きたい。 一応空白を考慮しても計算しているがそれでも違ってくる・・・。
試すのめんどくさいから、どう違うのかちゃんと書けよ
限界ファィル数云々付近の意味がわからんので、具体的に書け
%30dで作成した30文字のファイル名の場合、29800ファイル でls * | wc -lが引数が長すぎますとのエラーを返して で%200dで作成した200文字のファイル名の場合5000ファイルで ls * | wc -lが引数が長すぎますとのエラーを返した。 ここで空白を考慮してファイル名を31バイトと201バイトだと 考えると31*29800と201*5000では100Kぐらい差が出てくる。 全引数の文字列のバイト数だと考えるとなんでこんなに差が出るのと謎に思えたので教えてほしい
行ごとに対象ファイルの絶対パスが載っているファイルがあります。 対象ファイルの中で hoge という文字列が含まれている ファイルを表示させたいのですが、簡単な方法はないでしょうか? grep とリダイレクトあたりを使用することになると思うのですが。
>>378 xargs grep -l hoge < ファイル
今、入門UNIXシェルプログラミングを読んでるところなのですが、212ページのところのコードで 応答待ち状態にタイムアウトを設定する、というのがあります 10秒たっても入力がないときには自動で抜けるようにする、というスクリプトです trap ":" 2 (sleep 10; kill -2 $$) & echo "Would you like to ... [y/n]? \c" read ANSWER if kill -0 $! 2>/dev/null; then kill $! fi case "$ANSWER" in y | yes ) FLAG=TRUE ;; * ) FLAG=FALSE ;; esac trap 2 CentOSというLinuxのディストリで標準のbash使ってるんですが サブシェルからの割り込みをうまく受け付けてくれないようで、自動で抜けてくれません Solaris環境では意図したとおりに動きました Linuxが悪いのか、bashが悪いのか、スクリプトが悪いだけなのかよくわかりませんが うまく動かすにはどうすればいいでしょうか?
bashが変だと思うんなら、ashやkshつかえばいいんじゃ。
>378 こんな感じ? やっつけだけど。 #!/bin/sh for f in `cat ファイル` do if [ `basename $f | grep hoge` ] ; then echo $f fi done
>>381 たしかに、ash使ってみたらうまくいきました
UNIX間で互換性をもたせるにはどうすればいいのかな、と考えてたのですが
とりあえずLinuxの標準がbashになってることを恨め、って感じでしょうか・・・
>>383 それならkshに統一するとか?
Bourne shellよりわかりやすくスマートにかける場面も多いし。
いっちゃうとPerlでもいいとおもう。
そう、やがてはスクリプト言語になってしまうんだよね。でも ここはシェルスクリプトのスレッド。あくまで。
mktemp のパスが通ってない。
>>386 そういう場合はshellの引数に-xをつければいいよー。
そこだと1行目を
#!/bin/bash -x
にするとか。
>>386 crontab に必要なパスを記述していない可能性が高い。
たとえば
>>387 とか。
Linuxで書いたスクリプトUnixで動かしたらエラー。 Unixの方がexpr substrに対応してなかった。 原因わかるまで1時間以上かかったぜ。
>>390 参考までに両方の expr のバージョンを教えてくれ。
>>392 管理者の人に頼まれてLinuxで書いたからもうUnixの方は調べらんね。
実行できないって言われてmanでexpr調べたらsubstrはx86系のみ対応って書いてあった。んで、聞いたらたぶんx86系だといってたので原因わからず格闘。随分時間たっあとunameでシステムみたらSunの文字。ネットで調べたら他のCPUってオチ・・・。
UNIXとか他のCPUとかあいまいすぎ 察するにお前の知識が足らんかっただけだろう
>>394 Vine3.2(Pen4)で書いてSunOS(SPARC)で実行した。
3日前に初シェルスクリプト書いた位なので・・・知識はね
適当にググってみたが、length substr index match 演算子が GNU 拡張みたいだな。
397 :
名無しさん@お腹いっぱい。 :2006/05/12(金) 10:02:57
sh/bash って、子シェルにシェル変数を引き継ぐことできましたっけ?
>>398 THX です。
必要なものだけ環境変数に export することにします。
同じ種類のシェルなら内部でなんかうまいことパイプとか
つくって引き継いでくれるのかな?
とか都合いいこと考えてました。
>>400 シェルスクリプトのテストツール?なのかこれ?
今ソースを眺めてるけど、なんか関数が
たくさん定義されてるな。
今は眠いから処理を追いかけられねーや。
bash上で 5 だったら 0005 55 だったら 0055 555 だったら 0555 5555 だったらそのままの 5555 というように数字1〜4桁までのファイル名を0を使って4桁に揃えたいのですが for 名前 in * ; do 桁数=${#名前} [ $桁数 = 1 ] && mv $名前 000$名前 [ $桁数 = 2 ] && mv $名前 00$名前 [ $桁数 = 3 ] && mv $名前 0$名前 done こんなのしか思い浮かびません。もっとスマートで汎用的な感じにできませんでしょうか?
printf %04d 5 # -> 0005 printf %04d 55 # -> 0055 printf %04d 555 # -> 0555 printf %04d 5555 # -> 5555 printf %04d 55555 # -> 55555
aa=000055; echo ${aa:$((-4)):4} 0055
bashと限定している馬鹿には答える必要はないかもしれないが。
case "$x" in
?) y=000$x ;;
??) y=00$x ;;
???) y=0$x ;;
????) y=$x ;;
*) y=$x ;;
esac
なんて方法もある。
普通なら
>>403 を使うけど、数値しか使えないのでこういう小細工も使うことがある。
>>405 それ自体は悪くはないんだけど、
仕事でそういうのの塊のコードがあって泣きそうになったことある。
シェルスクリプトで日付計算とかね。アホかっちゅーの。
このスレの
>>1 を読めと言ってやれ。
とはいえ、「任意の日からN日後の日付」「任意の日どうしの間隔」
「任意の日の曜日」あたりを調べるのは確かに頭痛いな。
GNU date, env TZ=... dateを使うのが定番だろうけど、どっちもイマイチな気がする。
修正ユリウス日をうまく使ってすっぱりと実装できそうなんだが。
408 :
407 :2006/05/14(日) 15:03:08
とりあえず作ってみた。bc/dcでやるべきだったか… bash厨は$(())に置き換えたいだろうが、自分のマシンで勝手にやってくれ。 to_mjd() { if [ "$2" -lt 3 ]; then yy=`expr "$1" - 1`; mm=`expr "$2" + 12`; dd=$3 else yy="$1"; mm="$2"; dd=$3 fi expr $yy \* 1461 / 4 + $yy / 400 - $yy / 100 + \( 3059 \* $mm - 6118 \) / 100 + $dd - 678912 } dayofweek() { # Sun=0, Mon=1, Tue=2, Wed=3, Thu=4, Fri=5, Sat=6 expr \( "$1" + 3 \) % 7 } from_mjd() { yy=`expr \( $mjd \* 100 - 1507820 \) / 36525` m2=`expr $yy \* 1461 / 4` mm=`expr \( \( $mjd - $m2 \) \* 10000 - 149561000 \) / 306001` d2=`expr $mm \* 306001 / 10000` dd=`expr $mjd - 14956 - $m2 - $d2` if [ $mm -gt 13 ]; then yy=`expr $yy + 1901`; mm=`expr $mm - 13` else yy=`expr $yy + 1900`; mm=`expr $mm - 1` fi echo "$yy $mm $dd" } mjd=`to_mjd 2004 1 1` echo "mjd: $mjd"# => 53005 echo "dayofweek: `dayofweek $mjd`"# => 4 (Thu) echo "gregorian: `from_mjd $mjd`"# => 2004 1 1
409 :
402 :2006/05/14(日) 16:45:14
ありがとうございましあた。 printf便利ですね。 caseも勉強になりました エロ画像の生理に使います。
>>408 どうでもいいことだが mjd って何の略?
「マジで」としか変換できないバカに教えてくれ。
>>409 だったらrenameの使い方も覚えとけ。
検索一発 Modified Julian Day
413 :
407 :2006/05/14(日) 22:06:16
あうあう、from_mjdの一行目に"mjd=$1"ってのが必要なのでご注意を。 行数制限にひっかかったので、いろいろやってるうちに消してしまった… スマヌ
>>411 renameコマンドは、同名の別物コマンドが少なくとも2種類以上あって、
使い方も違うので、どのrenameのことを言ってるのか明示すること。
で、OSによって使えるかどうかわからないrenameは覚える必要なし。
named や httpd なんかが動作してるか(死んでないか)確認できる シェルスクリプトきぼんぬ!
pgrep named
つrndc apachectl pgrep
shell script じゃないじゃん。Mac OS X ではmake しても動かないし.... ps agx | grep named つうか、rc か lanuchctl で生きているかどうか確認せずに殺すことが多い。
grep使うならせめて ps -ef | grep [n]amed ps ax | grep [/]named とかしてほしいす。 # 商用Unixにも入ってるようなpgrepがOSXに無いのはオドロキ
やっぱ、 ps `cat /var/run/named.pid` だろ。 pgrepはまだ歴史が浅井。
>>421 そういうのってときどき見るけど
突然死してpidが再利用されてしまっている可能性は0とみなすの?
PDP-11の時代ならまだしも今なら最低でも31bitあるわけだし、 一巡する前に気づかないのは別の意味で問題な気が。
俺のマシンはPID_MAXが99999な件。 PDP時代ならこれだけの桁数まわすのに相当時間が かかるからよかっただろうが、 今だからこそ再利用されてしまう可能性があるんじゃないか?
>>420 FreeBSD ベースだからじゃね?
4.x は pgrep を ports で入れないといけなかった記憶がある。
流量の多い qmail なメールサーバだと数時間で1周するな。
427 :
416 :2006/05/15(月) 23:56:14
みなさんサンクスコ でさらにあふぉな質問でスマソなんですが、 プロセスが死んでる場合(PIDが存在しない)は メール、みたいな分岐処理をするにはどうすればよかとですか?
>>427 if "プロセスが死んでると判定するコマンド"
then "メール送信用のコマンド"
fi
429 :
416 :2006/05/16(火) 09:12:54
「プロセスが死んでると判定するコマンド」 は何になるのでしょうか? pgrep named はあくまで生きているプロセスを調べるためのコマンドなので これでは無いですよね?
そのプロセスと同じ uid か、あるいは root 権限で、 if kill -0 プロセスID 2>/dev/null; then 生きてる else 死んでる fi
>>429 pgrepでもできる。死んでいる(存在しない)プロセスなら、
終了ステータスで偽を返す。
if pgrep named 2> /dev/null; then
:
else
echo 'namedが死んでるよ' | mail omae
fi
432 :
名無しさん@お腹いっぱい。 :2006/05/17(水) 17:30:19
すみません、とても素人な質問させてください。 リナックスザウルスの活用の幅を広げようと思ってます。 UNIXシェルスクリプトで、ライフゲームや、HIT&BROW(四桁数字当て)ゲームは 作ることができますか?
職場の管理者が、「もうcsh系は不要」と言って削除されてしまいました。 ログインシェルをtcshにしていた人は強制zsh移行。 そこで、自宅からtcshをフロッピーに入れて ~/bin/tcshに突っ込みましたが、 chshでログインシェルが変更できません。あと、いろいろいじってるうちに ログインできなくなってしまいました。内容が内容だけに、 管理者には相談できません。どうすればいいでしょうか?
おとなしく懺悔
>>432 できなくは無いと思うが余計な苦労を強いられるだろう。
そういう挑戦に興味が無ければ、より高機能なもの(Perlなど)を薦める。
>>433 > 管理者が削除されてしまいました
ガクガクブルブル
僕も、tcsh 削除させようかな。zsh 使うのには、どうしようもない理由が必要だろうし。 function と **/*.c だけでも、zsh にして良かったと思うよ。つうか、なんで、いままでtcshなんか使っていたんだろうと反省中。
zshって、シェルスクリプトスレで延々スレ違いのインタラクティブシェルの話をする馬鹿が 使うシェルってイメージがあるから損してるよな。かわいそう。
それはむやみにフェラーリのるあほな成金がいるから フェラーリのイメージが成金趣味っぽくなるのと同じだよ。
440 :
精進 :2006/05/18(木) 12:18:31
【労働環境】営業担当者が「SEに足りないと思うスキル」とは [06/05/16]
ttp://news18.2ch.net/test/read.cgi/bizplus/1147877411/-100 「もっと顧客から課題を聞き出す力があればなあ」「専門知識を生かして積極的に提案して
もらえると助かるのだが」---。
営業担当者がITに関する商談で客先を訪問した際に、同行したSEに対してこんな不満や要望を
抱いている。顧客に対して「何をすればいいのでしょうか」と“御用聞き”に徹して提案しようと
しないSEや、顧客と積極的にコミュニケーションを図ろうとしないSEに対して、営業担当者は
もどかしい思いをしているのだ。
営業担当者がSEに抱く不満は、SEに対する期待の裏返しでもある。そんな不満や期待が込め
られた、営業担当者からSEに対するコメントをいくつかを紹介しよう。
「お客様の目の前で“それはできません”と即答しないでほしい」
「お客様を満足させていくという顧客指向を持ってほしい」
「指示・依頼を待つだけでなく、自分で考え積極的に提案してほしい」
テキストファイルから /foo .* bar/ を検索して .* の部分だけ出力するのにスマートな方法ある? とりあえず ruby で下のように書いてるけど、 長いしPOSIX標準じゃないしで、いまいち気に入らない。 ruby -e '$<.each { |line| line.sub(/foo (.*) bar/) { print $1 + "\n";} }'
sed -n -e 's@.*/foo \(..*\) bar/.*@\1@p'
443 :
441 :2006/05/18(木) 16:54:08
>>440 抜きん出たSEになるために必要なスキルだとは思うけど
SEに提案させて顧客交渉までさせたら営業いらなくなるよな
営業とSEが別の人間てのは、実際にはそうなるケースが多いにしても、 避けた方が良くないかね。
ご注文を分析すれば良いだけだろ。
規模によるな。
質問させてください。 echo で、○行目に文字を追加するにはどうしたらいいでしょうか?
米国一流企業では見積りも有料です。
「見積り」と称して散々技術コンサルを無料でさせられたのを思いだしたじゃないか。 あんな客は2度と相手にしないよ。
うちは要件定義書まで無料でやらされる場合が多いですが・・・
よし、皆わかっている事を敢えて言おう! 泥をかぶるのは俺だけでいい! 仕事の愚痴はスレ違い。
スレ違いな話から戻すため質問に答えようと
>>448 を見たが意味がわからない。
>>448 カーソルを移動させたいならこんな感じ。
adhocな方法 echo "^[[5;10H"
ちょっとましな方法 tput cup 5 10
文字の追加が具体的にどういう動作なのかわからない。
455 :
448 :2006/05/19(金) 15:37:47
>>453 >>454 さん。ありがとうございます。
echo hoge >> test.txt
この場合はtext.txtの最後の行にhogeが追加されるのですが
このような感じでhogeという文字を
指定の行に追加するにはどうしたらいいでしょうか?
457 :
448 :2006/05/19(金) 16:09:33
>>448 echoでは無理といわれているのだから、問題を再定義しなさい。
459 :
448 :2006/05/19(金) 16:29:52
すみません。できました。
客:「右足上げて、それが地面につく前に左足上げたら空飛べるじゃん」 SE:「それはできません」 営業:「お客様の目の前で“それはできません”と即答しないでほしい」
客:「抱いてくれたらええやん」 SE:「それはできません」 営業:「お客様の目の前で“それはできません”と即答しないでほしい」
ある文字列を含んだ行とその下二行を削除したい、 のですが教えていただけないでしょうか? 例:hoge を含む行とその下二行の削除 ----------------------- 1 hoge 2 3 4 hoge 5 6 ----------------------- ↓ ----------------------- 1 4 -----------------------
>>463 無理にシェルスクリプトにせず、awkやperlで書いたほうがよさそうな気がします
: ${aaa=bbb} これは aaa=bbb と等価になるのはなぜですか?
>>463 sed で簡単に出来そう。
おれは一行ごとに処理するやり方しか知らないからわからん。
newlineが扱えないsedはしらん。 sed -E -e '/hoge/{N N s/[^\n]//g }' data
>>465 先頭のコロンはよくわかんないけど
${aaa=bbb} はaaaが未定義の場合のみ代入
${aaa:=bbb} はaaaが未定義または空の場合のみ代入
:- :? :+ も同様に:の有無でちょい違う動作をする。
:なし 変数が未定義かどうかをチェックする
:あり 変数が未定義かどうか、値が空かどうかをチェックする
ということがマニュアルに書いてある。
>>468 ありがとうございます。
マニュアルの微妙な隙間に : を入れないときの動作がちゃんと書いてありました。
流し読みだったのでいつもいつも読み飛ばしてたorz
パラメータ展開のひとつという事は、先頭のヌルポマンドの引数とすることで
aaa=${aaa:=bbb}
みたいな冗長な代入にしなくてすむっぽいという事ですか。
コロンは何も実行しないコマンド。終了ステータスは常に0。 コマンドなので、引数やリダイレクトは他のコマンドと同様に処理される。
あーそか、ヌルコマンドに引数指定できるという発想はなかったわ
>>465 等価にはならない。
: ${aaa=bbb}
で値が代入されるのは、aaa が未定義の時だけ。
>>467 sed に -E というオプションは無さげ。
sed -e '/hoge/ {
a \
N
a \
N
a \
d
}'
なら、仮に \n を認識しない場合でも出来るかと。
ぐぁ、リロードしたら既に解答が… ここって案外人多いのね。
>>472 -Eでnewline(\n)が扱えるようになるsedもあるんだよ。
お前のsed(gnu sed)は行末の\でnewlineとみなしてるだけで、行末の\を
newlineとみなさないのもある。
gnu sedなら
sed -e '/hoge/{N
N
s/[^\
]//g
}' data
でも行ける。
そういえば ed は /hoge/,/hoge/+2 という範囲指定ができるんだが sed はできないんだな。
>>474 > -Eでnewline(\n)が扱えるようになるsedもあるんだよ。
いや、だから -E は POSIX 準拠でもないはずだが。
上のコマンドは間違ってた。a \ じゃなく a\ です。Append コマンドは。
スペース入れると POSIX & SUS 違反。GNU なんかじゃ通っちまうがな。
まあ、洩れ自身 GNU に冒されてるのは認めし、GNU を嫌う気持ちも分かる。
スペースいれちまったことは素直に謝りたい。
後、GNU sed なら N なんぞ使わず、/hoge/,+2 とでもしといた方が良い。
>>463 :g/hoge/.,.+2s/.*//
ってvimじゃないのか。
お勧めはしないが、sed のバージョンに 依存したくないのならこんな方法もある。 #!/bin/sh i=0 while read x ; do y='' if [ "$x" = 'hoge' ] ; then i=2 elif [ "$i" -gt 0 ] ; then i=`expr "$i" - 2` else y="$x" fi echo "$y" done < file
hogeを含む行だし、-2の意味わかんないし
ある機械のHTTPサーバが落ちている(ポート80にconnect(2)できない) かどうかを調べるのにはどうしたらよいでしょうか? HTTPで自分の状況を公開している装置Mがあります。 これの状況を定期的に wget 1.8.2 で調べようとしてるのですが、 時々MのHTTPサーバが落ちています。(OSは動いててping等に応答。) サーバが落ちていると、wget はいつまでも終了しません。 HTTPでつながらない時にはすぐあきらめるにはどうしたらよいでしょう? wget の --timeoutオプションは、connect(2)成功後のreadに対する指定 らしく、効果ありませんでした。 wgetするマシンはFreeBSD 4.10で、/bin/sh で書いてます。
ピンポンダッシュにはやっぱりnmap?
482 :
480 :2006/05/25(木) 17:56:25
ピンポンした後ダッシュせず、相手の顔色(HTML response)を確認したいっす。 でも、相手出ないのに玄関でずっと待ってるのも変で。 nmapごもっともですが、大鉈っぽくないですか?
>>480 リトライが0(=infinity)になってない?
1.10.1なら--connect-timeoutがあるよ。
>>480 Smokepingが良いよ。
単体のコマンドはechopingとか
すいません。質問があります。 あるファイルの中の情報が 正しいフォーマット(各情報がタブで分けられている) かどうか確認する方法はありますか? たとえば、example.txtというファイルの中が picture.jpg<tab>jpg word.txt<tab>txt music.mp3<space>mp3 だとすると、 このファイルのフォーマットは正しくない(3行目がスペースで分けられている)ので、 falseを返すというようなスクリプトを知りたいです。 よろしくお願いします
>>486 「正しい」の定義がよくわからんが
grep -v ' ' <example.txt >/dev/null && echo false
とか。
' ' の中は TAB 文字で。
>>487 「falseを返す」というのは「falseという文字列を表示する」という意味なのかw
>>488 まぁ、例として挙げたまで。
その辺は好きなように変えてくれ。
490 :
486 :2006/05/26(金) 18:21:45
説明が下手ですんません。 あるファイルの中の各ラインの情報が すべてタブキャラクターで分けられているか確認したいのです。 上記のexample.txtの場合、 1行目と2行目は picture.jpg<tab>jpg word.txt<tab>txt とタブで分けられていますが、 3行目は music.mp3<space>mp3 タブではなくスペースで分けられているので、 このexample.txtの書式は間違っているということが知りたいのです。
>>490 それなら
>>487 がすでに答えてるじゃん。
もっと厳密にするなら
grep -v '\<.*\> \<.*\>'
でいいかな。途中の空白に見えるところは TAB文字でね。
>>490 > あるファイルの中の各ラインの情報が
> すべてタブキャラクターで分けられているか確認したいのです。
さっきと変わってないな。
ここをきちんと定義しないとまともな解は出てこないよ。
たとえば以下のような行をどう扱うか
これじゃわからんでしょ。
a<space><tab>b
a<space>b<tab>c
<tab>b
a<tab><tab>b
a<tab>b<tab>c
>>490 a=$(cat $1 | wc -l)
b=$(cat $1 | sed -nr "/[^\t]*\t[^\t]*/p" | wc -l)
[ $a = $b ] && echo "OK" || echo "NG"
カレントディレクトリ内(サブディレクトリ含む)の特定の拡張子を持つファイルを 一括で処理させたいと思い以下のようなシェルスクリプトを組んだのですが サブディレクトリ内の一部ファイルが重複して処理されてしまいます どこがダメなのでしょうか? recursive_func() { for i in * do if [ -d $i ] then cd $i recursive_func cd .. fi if echo $i | grep '\.c$' > /dev/null || echo $i | grep '\.h$' > /dev/null then //ここに処理 fi done } recursive_func
>>494 find と xargs じゃだめなん?
>>494 シェル変数iはローカル変数じゃないよ。
再帰呼び出しした時に iの値を変化させてしまうから、
呼び出し元の iまで狂ってしまう。
>>495 find自体は知ってたんですが、まさかこんな使い方があるとは知りませんでした・・・orz
下の様に書き換えることで目的の処理は達成できました
ありがとうございました&お騒がせしました・・・
find . \( -regex ".*\.c" -o -regex ".*\.h" \) -exec //ここに処理 \;
>>496 そういうことだったんですか。シェルスクリプトはちょっと齧っただけなので
ついCの感覚で書いてました・・・
元の方も関数先頭で local i とすることでうまく動くようになりました
わざわざありがとうございました
>>494 hoge.c っていうディレクトリがあったときに
おかしくなりそうだな。
>>499 grepしてるとこelifにすりゃ良くね?
いや、ファイル名の拡張子判定するならgrepなんか使わん。 case "$i" in *.c|*.h) ここに処理;; esac で桶。
ディレクトリが空かどうかを表示するにはどうすれば?
kshにて環境変数を複数行定義したファイルを スクリプト内で読み込ませ、全行正常に読み込んだか判定したいのですが . /環境変数定義ファイル echo $? 環境変数定義ファイルの途中で読み込みエラーが発生しても 最終行が正常ならば、echoは0を返すのですが 読み込みエラーを発見する方法ってありますか。
各ディレクトリにファイルが何個あるか高速に調べる方法はありますか?
>>505 速度重視ならシェルスクリプトはやめといた方がいい。
>505 a) .で始まるファイルは数えられなくてもいーんなら find . -type d | while read DIR ; do printf "$DIR: %d\n" `find $DIR/* -prune ! -type d | wc -l` ; done b) それじゃあ困るよという場合は find . -type d | while read DIR ; do printf "$DIR: %d\n" `ls -aF $DIR | fgrep -v '/' | wc -l ` ; done iBook(500MHzのG3)で試したら、、、 a)の例 # time find /usr -type d | while read DIR ; do printf "$DIR: %d\n" `find $DIR/* -prune ! -type d | wc -l` ; done real 1m1.054s user 0m7.870s sys 0m42.810s # b)の例 # find /usr -type d | while read DIR ; do printf "$DIR: %d\n" `ls -aF $DIR | fgrep -v '/' | wc -l ` ; done real 1m18.302s user 0m10.340s sys 0m53.310s # 約17秒ほど差がでますた。(当社比約1.3倍) ※うちiBookの/usrはファイル19240コ、ディレクトリ973だぉ
>>506 iBookでやってみた感じだと、%SYSの方の比率が大きいくて
wcやfgrepの負荷は%USRの比率が大きいぉ。
とゆーことで、
ファイル名・ディレクトリ名をファイルシステム内でぐるぐる走査する時間に多くが費やされるっぽいぉ。
ならば、シェルスクリプトでも大差ない鴨よ?
lsやfindを上回るCのアプリ書くのも難しいし。
509 :
sage :2006/05/29(月) 04:53:11
find /usr -type f | wc でいいんじゃないの?
find /usr -type f -printf "%h\n" |uniq -c が速いんじゃないかな。
512 :
age :2006/05/29(月) 11:08:01
おしえてくださいお願いします。shスクリプト等で1行目の #!/bin/sh とか記述する行の事、何て言うんでしたっけ。 人の名前みたいな「○○の行」みたいな名前が付いてたと思うんですが。
514 :
age :2006/05/29(月) 11:39:09
>>513 あー、それッス!有り難うございます!有り難うございます!
昨日の夜からのモヤモヤが吹っ飛びました!
>>509 GNU findには-printfなんてのがあるのか・・・ベンリね
GNU find じゃない人は
find . -type f -exec dirname {} \; | sort | uniq -c
と書かないと動かん鴨
# FIFOなんかもファイルの数として数えたければ
# find . ! -type d -exec dirname {} \; | sort | uniq -c
516 :
名無しさん@お腹いっぱい。 :2006/05/29(月) 14:52:01
サーバーのシェルスクリプトをCGIでsystemコールして動かないんですが、 環境設定をapacheのhttpd.confに追加して動かす方法はあるのでしょうか? いま環境設定はサーバー上で FILE=data.ini export FILE で行っています。 シェルはLinuxのbashです。
>>516 SetEnv FILE data.ini
って、アンタそりゃーhttpdの使い方の話だから
シェルスクリプトの話じゃねーべ
520 :
名無しさん@お腹いっぱい。 :2006/05/29(月) 21:09:11
aaaというファイルが更新されたら次の処理に移るというスクリプトはどう書けばいいですか? 例]file_procという自作コマンドを実行してaaaというファイルが更新されたらファイルの最後に時刻を書き込む 1.file_proc1 aaaを実行 2.aaaというファイルが更新されるのを待つ 3.更新されたらそのファイルの最後に時刻を追加 4.file_proc2 aaaを実行 5.aaaというファイルが更新されるのを待つ 6.更新されたらそのファイルの最後に時刻を追加 ・ ・ ・ ・
セマフォって概念を理解するといいと思うよ
>>520 よくわからんがこんなんでええんかい?
----
FILE_WATCH=/home/foo/aaa
FILE_PREVIOUS=/tmp/watch.txt
if [ ! -f $FILE_WATCH ]
then
echo "$FILE_WATCH not found."
exit 1
fi
ls -l $FILE_WATCH > $FILE_PREVIOUS
while [ -1 ]
do
LS_CURRENT=`ls -l $FILE_WATCH`
LS_BEFORE=`cat $FILE_PREVIOUS`
if [ x"$LS_CURRENT" != x"$LS_BEFORE" ]
then
# file is updated
date >> $FILE_WATCH
fi
ls -l $FILE_WATCH > $FILE_PREVIOUS
sleep 10
done
----
>>520 file_proc1 aaa && date >> aaa
こんなのじゃだめなの?
シェルスクリプトで実行しているコマンド を実行した結果と一緒にファイルに出力したいのですが set -x としても ./abc.sh > aaa.txt のように実行したときに aaa.txtに実行した結果しか出力されません。 どうすればコマンドも出力できるようになりますか?
>>524 ./abc.sh > aaa.txt 2>&1
>>524 スクリプトの一行目に、
echo -n $0
とか書いとけばいいんじゃないかと。
>>526 は質問の意味をどう取り違えたのだろうか?
set -v じゃだめなのかな?
at- f abc.sh now + 1 minute として数分待ってメールを読む
531 :
名無しさん@お腹いっぱい。 :2006/05/31(水) 08:46:30
> aaa.txt だと標準出力だけしか書き込まないから 2>&1ってつけると標準エラー出力もファイルに書き込む
例えば c123456 cs012 という文字列がhogehogeというファイルに記述されていた場合、 cs以下の数字3つを切り取り、それを変数numとする 更にその変数numに対して 整数a≦変数num≦整数b という条件が満たされた場合にその旨を伝える …というスクリプトを作っているのですが、どうもうまくいきません if [ $num >= 0 ] ; then if [ $num <= 61 ] ; then echo
if [ $num >= 0 ] ; then if [ $num <= 61 ] ; then echo "0 <= $num <= 61" fi fi if [ $num >= 62 ] ; then if [ $num <= 122 ] ; then echo "62 <= $num <= 122" fi fi と条件を指定したのですが、numの値如何に関わらず全てのecho文が表示されてしまいます どうすればいいんでしょうか?
>= を -ge に <= を -le に と直せばいいじゃないかな
あと、カレントディレクトリに = というファイルができてしまってるはずだから、 削除するヨロシ。
[ 0 -le $num -a $num -le 61 ] とかの方が見やすそうな希ガス
だったら、↓こういう書き方もあり。 if ((0 <= num && num <= 61)); then
cshはこの辺が楽過ぎw
539 :
名無しさん@お腹いっぱい。 :2006/05/31(水) 17:48:58
cshは邪道
ムゥ、罰手異存か……まだ使い手がいたとは……
>>534 そのようにすると「unary operator expected」と出て弾かれてしまいます…
>>535 分かりました。処理しておきます
>>536 ,537
すぐには無理ですが、明日にでも試してみます。ありがとうございます
>>538 諸事情によりshでやらなければならないので…残念です
>>543 >そのようにすると「unary operator expected」と出て弾かれてしまいます…
だとすると、$numに何も代入されていない(空文字列)の可能性あり。
[ $num >= 62 ] だから、>= はリダイレクトとみなされ、引数ではないので
testコマンドには test $num 62 だけが渡り、$numが空文字列なので、
test 62 となって、これは62という文字列の長さが1以上あるので
常に真になる。
元の質問で常に真になるという現象の説明が付く。
ちなみに、正しく$numに代入されていれば、
[ $num -ge 62 ] で動かないとおかしい。
545 :
名無しさん@お腹いっぱい。 :2006/05/31(水) 21:05:05
そもそも$numにどうやって代入してるん? テキストから読み取って代入ってシェルだと結構難しいよ awkとかでやってるのか?
>>545 えーっとですね…種明かしをすると、大学の課題の一環なんです。
手元にスクリプトファイルがないので、明日また質問させていただきます。
因みにawkは使わず(使い方がよく分からない)、sedで例としてあげたcs012の"012"部分を切り取って使っています。
先生によるとそれが文字列として認識されており、整数に直す処理をしてやればよいのではないか…との事です。
んが、そのやり方が分からずに困ってます…
>>546 本当に先生がそう言ったのならその先生は信用しない方がいい。
シェルスクリプトの変数では文字列と整数を区別しない。
(testコマンドでの判定時に演算子によって区別するだけ)
あと、宿題なら回答はこれで打ち切る。
548 :
名無しさん@お腹いっぱい。 :2006/05/31(水) 23:26:11
>>546 だからそのsedで抜き出してる処理の部分を詳しく
そこが間違ってたらもともこもねえじゃん
012の部分を切り取ってるソースをここに書け
整数の場合を分け、比較に >= <= を使う shell となると… まさか、csh?
bash $ [ 010 -gt 8 ] && echo ok ok へー、これでもエラーでないのか。 知らなかった。
551 :
546 :2006/06/01(木) 14:31:53
#!/bin/sh friend="$HOME/.friendlist" friend2="$HOME/.friendlist2" echo "Do you use me?---y/n" read first while test x"$first" = xy do w | grep -v pts | sort | sed 's/\([^ ]*\) :0\/\([^ ]*\) *[^ ]* *[^ ]* *[^ ]* *[^ ]* *[^ ]*/\1\2/' | cat >>$friend read first for i in $first do grep "$i" $friend | cat >>$friend2 set tmp=`sed 's/^c[0-9]\{6\} cs\([0-9]\{3\}\)/\1/' $friend2` num=`$tmp >& /dev/null` echo " $i is here. " grep "$i" $friend2 echo "" done
>>551 num=`$tmp >& /dev/null`
↑/dev/nullに捨ててどうするw こりゃだめだ。
>>552 該当行を削除してif構文を
>>537 さんの提示してくれた文に書き換えた結果、エラーは吐き出されなくなったものの
if ((0 <= num && num <= 61)) ; then
echo "$i is in \"2nd bld.101A\"."
fi
if ((62 <= num && num <= 122)) ; then
echo "$i is in \"2nd bld.109A\"."
fi
if ((123 <= num && num <= 142)) ; then
echo "$i is in \"20th bld.107\"."
fi
if ((143 <= num && num <= 162)) ; then
echo "$i is in \"20th bld.619\"."
fi
if ((201 <= num && num <= 245)) ; then
echo "$i is in \"20th bld.310\"."
fi
if ((301 <= num && num <= 320)) ; then
echo "$i is in \"20th bld.413\"."
fi
if ((321 <= num && num <= 340)) ; then
echo "$i is in \"20th bld.613\"."
fi
のようにしているのにnumの値に関わらず一番最初の処理しか実行されません…
>>553 >該当行を削除して
削除してどうする。/dev/nullに捨てるのだけが余計。その他は必要。
あと、その前の行の set もおかしい。
これ本当にに自分で理解して書いたスクリプトじゃないだろ。
もっとシェルスクリプトの基本からやり直した方がいい。
>>554 了解しました。確かに、理解せずに書いた部分がほとんどです。
勉強して出直すことにします。ありがとうございました。
>>555 ----
#!/bin/sh
set -x
----
と、「set -x」をつけて動かしてデバッグするといいじゃないかな
---- #!/bin/sh -x ---- でいいんじゃないかな
558 :
名無しさん@お腹いっぱい。 :2006/06/02(金) 12:50:40
ファイルの頭から何バイト目を0xffとかに書き換えるってシェルスクリプトでどうやればよいでしょうか?
シェルスクリプトで八進数→十進数に変換する方法ってないものだろうか? 探しているんだが全然見つからん…orz
>>558 ヒント: head -c; tail -c
>>560 $ printf '%d\n' 0377
255
$ echo 'ibase=8;377' | bc 255 $ perl -e 'print 0377,"\n";' 255 $
シェルスクリプトの中で実行時間がちと長く掛かるコマンドを 実行している時に , 標準出力にディスプレイ 風車 ? が回って いる様にみせるにはどうすればいいでしょうか ?
俺はdcが大好き! $ echo '8i377p' | dc 255
>>565 ヒントをやるから後は自分でアレンジしな。
for i in a b c
do
echo -en "$i\r"
sleep 1
done
bc って echo で標準入力にいれないと ワンライナー計算ができないのが面倒くさい。 bc -e '1+2' くらいできてもいいのに。
bc…恐ろしい子!
いまはprintfコマンドは普通にどこでもはいってるよね? なんでつかわないんだろ。
入ってなかったらいやだからw 最近ようやくどの新しいOSにでも入ってる状態になったってことは、 後10年くらいしたらどこで使っても問題ないかなって感じだ。
規格的にはX/Open System Interface issue 4から入ってるらしいよ。1994年発行。 自分は今Solarisを使っているんだが、 実は2.5.1にはすでに入ってたのね。知らなかった。
>567 ありがとう。 ps で実行したコマンドのプロセスを確認と絡めて うまい具合に作れました。
>>568 #!/bin/sh
echo "$@" | bc
出来る子$@が恐ろしい子bcをかばったって感じ?
578 :
名無しさん@お腹いっぱい。 :2006/06/17(土) 01:14:46
教えて下さい! finde ./ の結果が AAA AAA/BBB AAA/BBB/hoge1.txt AAA/BBB/hoge2.txt AAA/BBB/hoge3.txt AAA/BBB/CCC/hoge4.txt AAA/BBB/CCC/DDD AAA/BBB/CCC/DDD/EEE AAA/BBB/FFF/GGG/hoge5.txt AAA/BBB/FFF/GGG/hoge6.txt AAA/BBB/FFF/GGG/HHH AAA/BBB/FFF/III/hoge7.txt AAA/BBB/FFF/III/JJJ AAA/BBB/FFF/III/JJJ/KKK AAA/BBB/FFF/III/JJJ/KKK/LLL AAA/BBB/FFF/III/JJJ/KKK/LLL/MMM となっていて、ツリーにファイルを持たないフォルダのみを 抜き出したいです。
579 :
名無しさん@お腹いっぱい。 :2006/06/17(土) 01:15:24
↓こんな感じです。 AAA/BBB/CCC/DDD AAA/BBB/CCC/DDD/EEE AAA/BBB/FFF/GGG/HHH AAA/BBB/FFF/III/JJJ AAA/BBB/FFF/III/JJJ/KKK AAA/BBB/FFF/III/JJJ/KKK/LLL AAA/BBB/FFF/III/JJJ/KKK/LLL/MMM 先輩は、find . -type d -emptyと言い残して旅に出ましたが 動きませんでした… OSはこれです。シェルがどうこうはよくわかりません。。。 SunOS devcvs01 5.9 Generic_118558-05 sun4u sparc SUNW,UltraAX-i2
>>579 動きませんでした…
実はちゃんと動いている、に1票。
動かしてみたらどうなったか具体的に書いてみ。
あと、次に
>>578 がここに戻ってくるときまでには、
先輩が教えたオプションの意味をman見て100%理解しとけよ。
>>579 先輩はガソリンが空っぽになったので探しながら旅をしてる
まで読んだ
582 :
578 :2006/06/17(土) 08:55:24
-emptyが無効みたいなエラーだったとおもいます。 また、UNIXのコマンドのfindのとこに-emptyオプションがなかったです。
んじゃ、-empty に相当するチェック処理を別に書けばよい。
-empty を使うと結果は
>>579 ではなく
AAA/BBB/CCC/DDD/EEE
AAA/BBB/FFF/GGG/HHH
AAA/BBB/FFF/III/JJJ/KKK/LLL/MMM
になるはず。AAA/BBB/CCC/DDD の下に AAA/BBB/CCC/DDD/EEE があるから
-empty でひっかからない。
-type d でひっかかったディレクトリのそれぞれにファイルがあるかどうかを
ひとつずつ地道に調べるしかないんじゃ?
findの結果をfindで調べればよいな。
586 :
578 :2006/06/17(土) 11:49:13
>>584 地道に調べてるのですが、いかんせんフォルダが10000くらいあって
そのうちの500フォルダくらいが空のようですが、目視はなんとも精度が低く
>>585 すみません、どんな感じにやるのですか?
587 :
名無しさん@お腹いっぱい。 :2006/06/17(土) 12:06:31
#! /bin/sh find $1 -type f|grep '^$' >/dev/null みたいなシェルスクリプトを使うのか?
>>578 Solarisのfindには、-emptyオプションが無い件については、
↓で代用できる。
find . -type d -links 2
で、サブディレクトリがあって空の場合に、
親ディレクトリは引っかからないという問題はあるけど、
どうせ、その空のディレクトリを消したいんだろ?
なら、末端の空のディレクトリを消して、再び
↑のfindをすることを数回繰り返せば、目的は果たせる。
589 :
578 :2006/06/17(土) 12:18:16
最終的には消すのが目的なのですが、先に消してもいいフォルダの 一覧をこさえて提出しないと、鬼が怒るという問題があるのです -emptyないのですか…
#!/usr/bin/perl use File::Find; no warnings File::Find; do { my %not_empty; find({'bydepth'=>1, 'no_chdir'=>1, 'wanted'=>sub { my $dir = $File::Find::dir; my $name = $File::Find::name; if (-d $name) { return if (defined ($deleted{$name})); if (! defined ($not_empty{$name})) { $deleted{$name} = 1; return; } } $not_empty{$dir} = 1; }},'.'); $old = $new; $new = length(keys %not_empty); } while ($old!=$new); print join("\n",sort keys %deleted) ,"\n"; 長過ぎ。シェルスクリプトじゃないし。しかも、この出力をrm -rf できないし。
こんな感じ #!/bin/sh for x in `find $1 -type d` ; do find $x -maxdepth 1 -type f | grep . > /dev/null if [ $? -eq 0 ] ; then continue fi echo $x done 環境が違うんでgrepの違いとかは適当に直して呉 リンクの有無とかもチェックするなら3-6行を増やせ >589 結果に責任は持たんから怒られる覚悟はしとけw
592 :
591 :2006/06/17(土) 16:01:10
>589 実はあのままだと怒られるパターンがあるが、詳しく書かないでおく。
>>591 Solarisの findには -maxdepthオプションがないというのがオチ。
あと、シェル変数を " " してないから、いろいろ危ない。
594 :
名無しさん@お腹いっぱい。 :2006/06/17(土) 17:23:24
1 find でディレクトリの一覧を得る find . -type d > a 2 find でディレクトリ以外の一覧を得る find . ! -type d > b 3 2 で得られたものから、dirname の一覧を作る cat b | sed 's,/[^/]*$,,' > c1 cat c1 | sed 's,/[^/]*$,,') > c2 以下、最も深い階層回繰り返し。 4 1 にしか含まれないものを創る cat a c1 c1 c2 c2 ... |sort |uniq -u
俺なら、指定されたディレクトリが条件を満たすかどうか調べるコマンドを作って、 それを find から -exec で起動するかな
ls -aRF | awk '/:$/{d=$0;next}NF==0{if(!f)print d;f=0;next}!/\/$/{f=1}' ディレクトリの末尾に余計なコロンがついてるが気にするな。 最上位のディレクトリだけはディレクトリだけあってファイルがひとつもなくても 結果に出てこないがそれ以外は正しいはず。目視で確認してくれ。 改行コードを含むディレクトリだとかコロンで終わるファイルとかあると おかしな結果になるがそれ以外は正しいはず。そんなファイルを作るな(w
>593 あと、サ(ry
du でいいじゃん
>>598 だめだろ。duじゃディレクトリが空か判定できんぞ。
rmdir しまくれば?
反則技 rsync -avn find diff
>591 あ、-maxdepthなんか無い方が目的に適うことに気づいてしまったw
>>602 いや、わからないですね。
ディレクトリ内のファイルの作成削除の履歴&OSによるディレクトリ管理の方法によっては、
ファイルが全くなくてもディレクトリのサイズが巨大になる場合がありえるものなんです。
シェルスクリプト内で外部プログラムを呼び出したとき、 メモリ制限やプロセス数制限でプロセス生成に失敗すると、 シェルスクリプト本体が終了してしまいますが、 終了させずに次の行へ処理を進める方法はありますか? 一定時間ウェイトしてから、リトライさせたいのですが…
>>606 $ uname -a
FreeBSD xxx 7.0-CURRENT FreeBSD 7.0-CURRENT #13: Tue May 9 14:37:19 JST 2006 xxx i386
$ mkdir /tmp/testdir
$ ls -ld /tmp/testdir
drwxr-xr-x 2 xxxx xxxx 512 Jun 19 17:40 /tmp/testdir
$ for f in $(jot 1000);do touch /tmp/testdir/$f;done
$ ls -ld /tmp/testdir
drwxr-xr-x 2 xxxx xxxx 12288 Jun 19 17:41 /tmp/testdir
$ rm /tmp/testdir/*
$ ls -ld /tmp/testdir
drwxr-xr-x 2 xxxx xxxx 12288 Jun 19 17:41 /tmp/testdir
他人にサンプル要求してるんだから「使用ファイルサイズで分かる」サンプルも提示しろよ。
>>608 Linuxなんだけど
$mkdir -p /tmp/testdir/test{1,2}
$for aa in `seq 10`; do mkdir /tmp/testdir/test1/aa$aa; done
$du -b /tmp/testdir/ |sort -nr
53248 /tmp/testdir
45056 /tmp/testdir/test1
4096 /tmp/testdir/test2
4096 /tmp/testdir/test1/aa9
4096 /tmp/testdir/test1/aa8
4096 /tmp/testdir/test1/aa7
4096 /tmp/testdir/test1/aa6
4096 /tmp/testdir/test1/aa5
4096 /tmp/testdir/test1/aa4
4096 /tmp/testdir/test1/aa3
4096 /tmp/testdir/test1/aa2
4096 /tmp/testdir/test1/aa10
4096 /tmp/testdir/test1/aa1
空のディレクトリは最小サイズだよ。
そこで、 touch /tmp/testdir/test2/hoge してファイルを作成してみるとどうなるか。
>>608 おんなじことを Linux-2.4.20 で追試させてもらった。
やっぱ同様にファイルが1つもないのに/tmp/testdirが12288と大きいままだったわい。
>>609 空じゃないディレクトリでも最小サイズだな。
もっとも真に空のディレクトリが存在したらファイルシステムが壊れているという事だけど。
$ mkdir /tmp/testdir
$ ls -ld /tmp/testdir
drwxr-xr-x 2 xxxx xxxx 4096 Jun 20 00:54 /tmp/testdir
$ touch /tmp/testdir/1
$ ls -ld /tmp/testdir
drwxr-xr-x 2 xxxx xxxx 4096 Jun 20 00:54 /tmp/testdir
ファイルシステムによるよ。 linux の reiserfs3 だと mkdir a drwxr-xr-x 2 xxxx xxxx 48 Jun 20 00:03 a/ touch a/hoge drwxr-xr-x 2 xxxx xxxx 72 Jun 20 00:03 a/ rm a/hoge drwxr-xr-x 2 xxxx xxxx 48 Jun 20 00:03 a/
614 :
604 :2006/06/20(火) 00:31:51
>>613 おっしゃるとおりです。OSとか「ファイルシステムによる」わけです。
だから、そういうことに依存したスクリプトは書いてはいけないでしょう。
最低限、
>>598 ,602のような表明には、「XXXファイルシステムとか△△△OSでは」
という条件を付さねばならなかったわけです。
615 :
604 :2006/06/20(火) 00:34:20
うっ、でも今回の場合環境がSolarisと決まってたんだっけ。(
>>579 )
ニゲヨット。
>>613 に一俵。Solarisだけど、ufs(logging付き)では
% ls -ld
drwxr-xr-x 2 xxxx users 512 Jun 20 00:38 .
% touch `yes '' | head -1000 | cat -n` ; ls -ld
drwxr-xr-x 2 xxxx users 12288 Jun 20 00:38 .
% rm * ; ls -ld
drwxr-xr-x 2 xxxx users 12288 Jun 20 00:38 .
みたいにサイズが戻らないけど、swapfs(仮想メモリディスク)上だと
% ls -ld
drwxr-xr-x 2 xxxx users 117 Jun 20 00:37 .
% touch `yes '' | head -1000 | cat -n`; ls -ld
drwxr-xr-x 2 xxxx users 60010 Jun 20 00:37 .
% rm *; ls -ld
drwxr-xr-x 2 xxxx users 117 Jun 20 00:37 .
みたいに元に戻る。
割り込んですみません >608 の jot って coreutils ( sh-utils だった ?) の seq みたいなのですか ?
>>617 そうです。
JOT(1) FreeBSD General Commands Manual JOT(1)
NAME
jot -- print sequential or random data
SYNOPSIS
jot [-cnr] [-b word] [-w word] [-s string] [-p precision]
[reps [begin [end [s]]]]
わかりくいコマンド名だな
>618-819 ありがとうございました。
↑ 訂正 >618-619 ありがとうございました。
The name jot derives in part from iota, a function in APL. だそうだ。
hoge.txt というファイルが存在したらメールで知らせる、 というシェルスクリプトきぼんぬ
if [ -e hoge.txt ];then echo hoge|mail aho fi
>>625 $ [ -e hoge.txt ]
test: argument expected
$ uname -sr
SunOS 5.10
>>626 そりゃ、SunOSみたいな古いOSじゃ動かないかもね。Solaris使えよ。
628 :
名無しさん@お腹いっぱい。 :2006/06/20(火) 22:09:18
>>627 お前、それがとても恥ずかしい発言だってわかってる? 晒し上げ www
>>627 は未来人。詳しくは禁則事項なので言えませんが
結局、一番恥ずかしいのは
>>628 ってことでFA。
632 :
名無しさん@お腹いっぱい。 :2006/06/21(水) 09:54:48
おまえら、
>>630 をよく見ろ。未来(今後)に何かあるらしいぞ。
>>627 を笑うものの方が逆に恥ずかしいみたいだから。
636 :
名無しさん@お腹いっぱい。 :2006/06/21(水) 16:59:40
URIエスケープをシェルスクリプト中でやるのって sedで地道にやる以外になんかカッコイイのない? echo -n "ほげ" | od -t x2 -A n | tr -d ' ' | sed 's/\([0-9a-z][0-9a-z]\)\([0-9a-z][0-9a-z]\)/%\2%\1/g' ↑はどっかで拾ってきたやつだけど、 変換しなくていい文字とか、スペースと+の変換とかまで考慮したのを スマートに誰か書いてちょーだい
>>636 それ以前に、その拾ってきた奴というのがバイトオーダーの問題で
環境によっては動かないはずだが。
Solaris10=SunOS5.10 Solaris9=SunOS5.9 Solaris8=SunOS5.8 Solaris7=SunOS5.7
solaris11$ uname -sr Solaris 11
Solaris11$ uname -sr Linux 2.4
Ruby >>>>>>>> シェル
$ uname -sr Darwin 8.6.2
下請けにシェルスクリプトの作成を発注する予定です 放っておくとtcshのシェルスクリプトを書くような連中なので tcsh/csh/zshのシェルスクリプトは禁止する予定なのですが、 ターゲットはSunOSなので放っておくとbash固有の機能を使いかねません。 ボーンシェルのシェルスクリプトの仕様を提示したいのですがどこかにあるでしょうか?
ボーンシェルって何ですか? Bourneシェルとは違うものですよね?
>>645 マシンも環境も同じにするのがプロの発注。
俺の経験上ヘボな奴ほどcshスクリプトを書く割合が多い。 理由はわからぬ。
仕様を提示したところでそんな連中が仕様に従うはずない。 現物(マシン+OS+sh)を貸し出してこれで動くようにしろ、 というのが確実。 で、cshで書いてしまうような外注は捨てて、 もっとマシな所に発注するのがもっとも確実。
650 :
645 :2006/06/21(水) 23:40:59
下請けの技術レベルが低いのはそのとおりですが、 元請の弊社は発注元と下請けの間の調整もせず勝手にやってというのが 基本姿勢のクズ会社なのでどっちもどっちなのです。 ポータビリティは考えずに、動作するコーンシェルのバージョンを指定しようと思います。
opengroup.orgに転がってるPOSIXのシェルの仕様でも渡したらどうよ? …英語の仕様書が読めるわけもないか。
下請けより645のレベルが心配
>>648 ヘボじゃない奴はcshではスクリプト書きにくいのにすぐ気がついて書かなくなるから
当然の帰結じゃないか。
ヘボじゃあに香具師が、foreach使いたいからcsh script を使っているのはみたことがある。
cshはいろいろヘボいけど、それを使いこなしてこそ熟練者 cshは恐くない
俺はまんじゅうが恐い
cshはいろいろヘボいので、それを廃絶してこそ熟練者 cshはUNIXの汚点
>>655 それはチューリングマシンでCGIを書くことに匹敵するほど実りの無いこと。
645はkshしらんの? Solarisからむなら普通ksh
>>659 >>650 ただし、「kshの同じバージョン」はSolaris以外では用意できないと思われ。
Linuxにあるksh(pdkshじゃなくてkshだよ)は、Solarisのkshとは
結構動作が違う。
Linuxのkshがどうだろうと、Solarisで開発すればいいのでは いまの下請けはLinux で開発すんの?
そりゃ、Solarisみたいな古いOSじゃ動かないかもね。Linux使えよ。
OpenSolarisから持ってくればいいんじゃない?
2行以上連続する空行を1行に縮めるにはどうすればいいですか?
cat -s
>>665 できました. でも質問が間違ってました. 改めて
2行以上連続する空行は1行に縮め,
1行だけの空行はその行を削除するにはどうすればいいですか?
awk '/^$/{if(++n==2){print}next}{print;n=0}'
できました. ありがとうございます.
>>666 sed -e "N; s/\n$//; /^$/{N; /^\n$/D;};"
/thumb/d
s@thumb/\([0-9]*\)s@src/\1@
このディレクトリのこんなかんじの名前のファイルがあったらこの処理をするってシェルスクリプトってどう書くのかなぁ ----------- cd /root/work if [ -f abc* ]; then 処理1 else 処理2 fi ----------- こんな感じのやつ。 でも、こんなワイルドカードの使い方ってだめなんでしょ?
>>673 ちょっとしかないなら
if ls abc* >/dev/null 2>&1; then
でどう?
マッチするファイルが何万個もある可能性のある状況で
正しく動くのを作るのはちと複雑かも
>>669 うちのFreeBSD 4.11-RELEASEの/usr/bin/sedだとうまく動かん。
あわててcygwinのGNU sedで試したら動いた。
こんなのうちだけか?
sedの何かって環境依存なのかな???(ファイル末のNの振る舞いとかか?)
ちなみに上の「動かん」ってのをkwsk書くと:
・入力が1行のみの時、それが空行かどうか関係なく、出力が全く空。(wcに渡すと0バイト)。
・ファイル末に連続する空行があった時、それに対応して出力されるべき1行の空行がでない。
(つまり出力の最後は空でない行になっている)
677 :
673 :2006/06/29(木) 23:49:24
>>674 ありがと。やってみるよ。
最近、シェルスクリプト書かなきゃならないところに異動になって困ってるんだ。
また助けてね。
その給料の何%かで助けるよ
>>676 BSDのsedとGNUのsedとは当然違います。
前者は古きよきBSDの雰囲気を留めているが、後者は独自に機能拡張してる。
もしそうなら全然上げないBSDの方が独自だと思うぞ。 何をもって独自と断定するかは難しいが。
DSCN0001.jpg〜DSCN9999.jpgのファイルを全てtravel2006GW0001.jpg〜travel2006GW9999.jpgに変更したいのですが これを実現するLinuxのシェルスクリプトはどう記述したらいいですか? それと travel2006GW0001.jpg travel2006GW0002.jpg ・ ・ ・ のようにtxtに打ち出すのもお願いします
mv DSCN0001.jpg travel2006GW0001.jpg mv DSCN0002.jpg travel2006GW0002.jpg 〜(以下同様に9999まで) echo travel2006GW0001.jpg >foo.txt echo travel2006GW0002.jpg >>foo.txt 〜(以下同様に9999まで) 2以降は'>>'なのに注意せよ。
683 :
名無しさん@お腹いっぱい。 :2006/07/06(木) 12:22:40
ちょw
>>681 rename DSCN travel2006GW DSCN*
>>681 マジレスするよ。
Linuxのシェルということはbashでいいんだよね。
だったら↓
#!/bin/bash
rm -f list.txt
for ((n=1; n<=9999; n++)) {
nnnn=`printf %04d $n`
mv DSCN$nnnn.jpg travel2006GW$nnnn.jpg
echo travel2006GW$nnnn.jpg >> list.txt
}
686 :
名無しさん@お腹いっぱい。 :2006/07/06(木) 12:50:27
マジレスうれしぃ!
>>682 こういうのを自動生成しちゃって実行する方が
楽なときもあるな。
実際に何が行なわれてるかわかりやすいし。
>>687 あーそういうのよくやる。俺の場合だと
awk 'END{for(i=1;i<=9999;i++){printf "mv DSCN%04d.jpg travel2006GW%04d.jpg\n",i, i}}' /dev/null|less
とかやって確認してから
awk 'END{for(i=1;i<=9999;i++){printf "mv DSCN%04d.jpg travel2006GW%04d.jpg\n",i, i}}' /dev/null|sh
だな。mvの起動回数とか考えると何回も使うものならperlか何かでちゃんと書くけど、
1回限りのワンライナーだと確認しながらやれるのでこの方が安心できる。
>>685 list.txtはわざわざスクリプトで作らなくても、名前の付け替えがすんだら
lsの出力をファイルに書き出せばいいだけじゃないか。
wget って保存先指定できないの?.wgetrcでも いつも直前にcdしてたんだけど不便で
>>692 ↓みたいなラッパーを、wgetという名前のスクリプトで書いて
先にPATHが通った ~/binにでも入れとけば?
#!/bin/sh
cd hoge
wget "$@"
wget -P (or --directory-prefix=hoge) ?
毎回-Pを指定するのがめんどくさければ、.wgetrcに書いとけ。 dir_prefix = STRING Top of directory tree--the same as `-P STRING'.
おおこりゃ便利 ありがとう
699 :
名無しさん@お腹いっぱい。 :2006/07/07(金) 22:32:59
700 :
名無しさん@お腹いっぱい。 :2006/07/08(土) 00:22:45
if [$old_ip!=$ip]; then ↓ if [ $old_ip != $ip ]; then [ はただのコマンド名なので特別扱いはされません。 cat fooをcatfooと書いたらだめなのと同じ理由でだめです。
701 :
699 :2006/07/08(土) 00:54:48
>>700 お答えしてくださってありがとうございます
なんとか起動できました
foreach i (1 2 3 4 5 6 7 8 9) touch $i end とか for i in 1 2 3 4 5 6 7 8 9;do touch $ done みたいな感じで、ファイルを名前を問わず 沢山作るにはどうすれば良いのでしょうか?
seq 1 100000 | xargs touch
while true; do mktemp "$(date)-XXXXXX";done
>>703 sh: seq: command not found
jotでもなんでもいいじゃんかよ
:>${RANDOM}
seqもjotもないぜ > Solaris yes '' | head -10000 | cat -nでなんとかなるが
Solaris8とかだと yesもないな。
>>709 csh -cf 'repeat 100 echo'
perlcc -e 'print $_ . "¥n" for $ARGV[0] .. $ARGV[1] ' -o seq して seq を作る。 # もちろん冗談
713 :
名無しさん@お腹いっぱい。 :2006/07/09(日) 18:50:08
ファイルを変数展開してから開くにはどうしたらよいでしょうか? aaa.txt の中身が ------------------ ${vvv} ------------------ という記述のときに #!/bin/sh vvv="VVVVV" cat aaa.txt とした場合 ------------------ ${vvv} ------------------ ファイルに書いてある内容がそのまんま表示される、これを ------------------ VVVVV ------------------ としたいのです。 要は↓と同じことをもっと簡単に出来る方法はあるかということなのですが #!/bin/sh vvv="VVVVV" v_sed=`sed \'s/\${vvv}/\'\${vvv}\'/g\' aaa.txt` ## sed 's/${vvv}/'VVVVV'/g' aaa.txt eval ${v_sed}
一般的には、開いてからshに食わせるんだけど、 変数展開だけをファイルオープン前に済ませたいのか。 難しいね。shを自作しないといけないかも。
eval echo `cat aaa.txt`
evalって今一使い方が分からない
使っているうちにわかる。
使い方はわかるが変数が絡むとキモス
変数からめないでeval使ってもつまんないだろ
720 :
713 :2006/07/10(月) 09:11:44
eval echo `cat ですか〜 ありがとうございます やりたい事が出来ました。
それじゃファイルの中味に`rm -rf `とか入ってたらどーする... あまりに危険すぎるよ...
それはそうだが前提条件次第だな。
723 :
名無しさん@お腹いっぱい。 :2006/07/10(月) 22:12:57
readを使ったときに入力文字を * でマスクしてくれる方法はありませんか? イメージとしては login 時の Passwd: のような感じです。 以下のようなスクリプトを書きたいのですが、人に説明しながらスクリプトを 実行したい場合、パスワードが見えてしまうのでなんとかしたいです。 (さっと思いついた例なので誤字文法ミスは見逃してください) #!/bin/sh echo "user: "; read user echo "passwd: "; read passwd expect -c " expect \"login: \" send \"$user\r\" expect \"passwd: \" send \"$passwd\r\" "
>>723 stty -echo
read passwd
stty echo
うほ。できました。 無知は損ですね。ものすごく助かりました。 man sttyで-echoの意味を調べたところ、 echo (-echo) Echo back (do not echo back) every character typed. ということで、そのままecho backさせないということのようです。 ありがとうございました。
>>723 read -s
たぶん bash 専用オプションだが。
シェルスクリプトで、キーボードから値を入力させる時に、 デフォルト値を表示させておく事ってできるでしょうか? 例えば 入力しろやゴルァ>hogehoge■ としておいて、 ユーザがhogehogeの部分を編集できるようにしたいのですが。 シェルはshかcshかkshが使えるようです。
編集ってのが良く分らんが、とりあえずreadlineが 使えりゃいいのかな。
729 :
727 :2006/07/11(火) 23:46:11
まぁそうなんだが、 1.Cでの開発は無理そうだ 2.多分readlineやlibeditは入っていないし、入れることはできないだろう ユーザから入力を求める際に、あらかじめ入力バッファ(?)に 文字を入れておくこととかできないのだろうか。
普通 入力しろやゴルァ [hogehoge]>■ これが気に入らないなら頑張ってくれ。
731 :
727 :2006/07/12(水) 06:07:57
気に入らないから頑張りたいんだけど、 頑張り方が分からない。
bashのreadは-eすりゃreadline使うようだが、初期値を入れる方法が みつからないね。もうCかperlかなんかでそういうコマンド用意する しかないような気がしてきた。 perlだとこう。 use strict; use Term::ReadLine; my($prompt, $preput) = @ARGV; my $term = Term::ReadLine->new('hoge'); my $s = $term->readline($prompt, $preput); print $s, "\n"; 使い方: x=`perl readline.pl '入力しろやゴルァ>' 'hogehoge'` しかしこのスレでperlのような飛び道具を使うのは気が引ける...
いいじゃん、適材適所で。
結論としては、やっぱスクリプト言語使えってことか。 言語の学習は手間暇かかるんだよね。時間も。できればシェルスクリプトで 済ませたい。 あー、俺がもっと頭良ければ、新しい言語ぐらいすぐに覚えるのに。
シェルスクリプトであれこれ工夫するほうが、適当なスクリプト言語(perlとかrubyとかpythonとか) おぼえるよりよっぽど頭使うと思う。
UIに特化したdialog(1)もよろしく
737 :
727 :2006/07/12(水) 23:10:42
>>732 dくす
だが、perlは入ってないようだ。
仕方がないから、sttyでrawモードにして、
一文字ずつキー入力を取得して編集できるようにした。shだけで。
お客に言われたとき、早いうちに「出来ねぇ」と言っておけば良かったorz...
スクリプトの場所をスクリプト自身がフルパスで知ることってできないでしょうか。 ターミナル上からならpwdに繋げてなんとかなるんだけど nautilusやrox、konquerorから実行するとそうもいかない。 $0は相対バスしか返さないし。 ちょっとしたGUIインストーラみたいのを作ってみたいんだけども
無理とはっきり分かるとすっきりしていいでつね。 どうもです。 結局ps p (PID) |sed 's/.* //g'を中で実行してなんとかしました。
>>740 それでも第0引き数いじられたら無理じゃない?
>>739 嘘を言わないように。
インタープリターがスクリプトファイルを「オープン」して「リード」する必要があるので
スクリプトファイルのファイル名は必ず渡る。
ファイル名をスクリプトに渡す方法はインタープリター依存。
sh,cshなら$0。相対パスだったらカレントディレクトリを補ってやればよい。
シンボリックリンクとかハードリンクがあるとややこしいことになるよ。
antの起動スクリプトがその辺がんばってたような気がした。
Windows育ちの俺は昔、同じことで頭を悩ませたが、 労多くして易少なかった。
747 :
名無しさん@お腹いっぱい。 :2006/07/14(金) 01:19:29
ドコのlsコマンドを どんな環境で使っても 確実にファイルのmtimeを 英数字のみのフォーマットで取得するには どうしたらベストでしょうか? ls よりもそれに適したコマンドってあります?
おれが作ったlsではそんなことさせないぜ
これでもくらえ env LC_ALL=C ls
>>747 そういうことをするには stat が便利なんだが
ポータビリティーを重視しているみたいだから
locale を固定した ls (
>>749 ) をお勧めしておく。
>>749 古いOSだと LC_ALLが使えないのがある。
LANG=C LC_TIME=C の方がよりポータブル。
>>751 env - PATH=$PATH ls のほうがポータブル
だったら、 unset LANG LC_TIME LC_ALL; ls でいいじゃん。
実行後に影響が残るので落第。
>>754 サブシェルも知らんのか。
(unset LANG LC_TIME LC_ALL; ls)
>>756 当然知ってる割には反応が遅かったな。
>>755 見てから「サブシェル」でググったのかい?
>>753 だってサブシェルは知ってると思われ。
当たり前のことは必要なければ省略するから。
たとえば、unset LANG LC_TIME LC_ALL; ls だけの1行で
シェルスクリプトが終るなら、実行後には影響出ないし。
>>753 が9:56に知っていたという証明をしてくれ。www
envなんてガイブコマンド使うより unsetの方がエレガントだな。 1行シェルスクリプトなら、あとexec付けた方がいい。 ↓ unset LANG LC_TIME LC_ALL; exec ls -l
ひっぱりすぎ。
それより、ls -lだと半年以上前のタイムスタンプがわからないとか、 秒単位がわからないとかいう問題の方が大きいな。 ls -l --full-time や ls -T はポータブルじゃないし。
>>764 diff -c /dev/null /path/to/file | sed -n 2p
>>765 残念だな。テキストファイルだとそれでいいが、
/path/to/file がバイナリファイルだと、diffが拒否するんだよ。
じゃ、こういうことか ↓ case `uname -s` in Linux) ls -l --full-time;; *BSD) ls -T;; SunOS) ls -e;; esac --full-timeの場合は LANG=ja_JP.eucJPでも関係ないみたい。
diff -caにすれば?
>>768 diff -ca にしても問題が4つある。
(1) diff -a オプション自体がポータブルじゃない
(2) 対象ファイルがディレクトリ自体だと動作しない
(3) 対象ファイルが自分のパーミッションで読めないと動作しない
(4) 対象ファイルの中身を読み出してしまうので atimeが変わってしまう
(5) 対象ファイルが empty fileだと /dev/nullと一致してしまうので時刻表示できない
ディレクトリをブックマークしたいと思って bash で↓こんな関数を作ったのですが、 Cygwin なのでディレクトリ名にスペースが入って select のところがうまくいかなくなってしまいます。 いい書き方はないでしょうか? function addbm() { pwd >> ~/.dirbookmark } function bm() { select dir in `cat ~/.dirbookmark` do cd $dir break done }
>>771 ダブルクォートしる!
"`cat ~/.dirbookmark`"
bashなら catは省略できて、
↓でも桶。
"`< ~/.dirbookmark`"
>>772 ダブルクォートだとファイル中の複数行が全部つながって解釈されるだろ。
↓が正解。IFSのあとにシングルクォートした改行コードね。
IFS='
'
774 :
771 :2006/07/19(水) 22:49:16
シェルっていうなクズ。 と最近言えなくて少し寂しい。
シェルも高くなったからなあ。
1. nkf -e $* | grep hoge の機能を果たす 2. 出力にはファイル名:行番号がついてほしい 3. ハイフンで始まる引数はすべてgrepに渡される の条件を満たすスクリプトが欲しいんですが、 簡単に作ることは可能でしょうか?
>>777 2の、 出力にファイル名:行番号を付ける処理がちょっと面倒だけど、
「可能か?」という質問なら「可能」
>>777 テストとかは自分でやってくれ。
#! /bin/sh
while [ $# -gt 0 ] ; do
case "$1" in
-*)
opt="$opt $1"
shift
;;
*)
break
;;
esac
done
nkf -e $* | grep -n -H $opt
あ、よく考えたら grep の前に nkf してるから
-n とか -H を grep につけた意味が無いな。
>>778 の面倒ってそういう事か。
確かにできなくはないけど
>>779 に
2、3 行足すくらいじゃ出来そうもないな。
>>779 それだと grepが標準入力から読んじゃうから、
ファイル名の表示ができない。
それでいいなら問題ないし、もっと簡単に書ける。
>>778 が言うように、ファイル名:行番号を付ける処理のところが面倒。
出力した後に cat -n に逃げるってのは…だめだよなあw
for i in $@; do case "$i" in -*) arg="$arg $i";; *) files="$files $i";; esac for f in $files; do nkf -e $f | grep -Hn $args done ちゃんと動くかどうかは知らね。
あ、最初の for が閉じてねーや。そのへんは察してくれ。
おれはアホか。 - nkf -e $f | grep -Hn $args + nkf -e $f | grep -n $arg | sed "s;^;$f:;"
getoptとかの使用は不可なの?
外部コマンドの getoptより、 内部コマンドの getoptsの方がモアベター。
788 :
777 :2006/07/22(土) 10:04:37
>>782 さんのものに最初の引数とパターンとみなすようにして
↓こんな感じになりました。
これだとまだ
・grep の「-e パターン」という指定方法ができない
・スペースを含むファイル名を正しく扱えない
という問題がありますが。
getopt を使えば解決できますかね?
#!/bin/sh
for i in "$@"; do
case "$i" in
-*) arg="$arg $i";;
*) if [ "$pattern" = "" ]; then
pattern="$i"
else
files="$files $i"
fi
;;
esac
done
#echo "pattern="$pattern
#echo "files="$files
#echo "arg="$arg
for f in $files; do
nkf -e "$f" | grep -n $arg "$pattern" | sed "s;^;$f:;"
done
宿題につらられる奴が大量発生。 それだけ愛に飢えているのか?
愛飢男
肺から吐く血
一日一回、Wikipedia のメインページから 季節の話題、今日の暦、今日は何の日 をプレーンテキストで取り出してメールで送るようにしたいんですが どうすればいいでしょう。 w3mかcurlでページを取得してsedを使って必要な分を取り出してmailで送るのをcronすれば いいんですよね
それPl(ry
>>792 漏れだったら、perlで全部処理するけどな。LWPモジュール+Socketモジュール+cron
俺ならwgetで取ってきてsedとtrで必要なところだけ取り出すな。
まあ、何でもすぐperlに走っちゃうのは利工じゃないってことで。
簡単にできるものを車輪の再発明してる方が(ryってことで。
シェルの方が歴史がずーーっと古いわけだが。perl自体が車輪の再発明。
perlはごった煮の闇鍋。
つーか、シェルスレで質問してる以上、シェルでのやりかたを聞いてるわけだから、 perlしか知らない厨が不安になって自己弁明するために「俺ならperlでやる」みたいな カキコするのいいかげんやめれ。
車輪の再発明ってバカみたいだよね。言ってるほうが。
シェル(スクリプト)でやることにこだわるなら答えは「できない」になりますが
それじゃお得意のシェルでやって見せてくれよw
シェルっていうなクズ。
空ageすんなクズ。
(プ
俺ならCでやる。
shでもperlでもcでもいいけど具体的なコード示したら
おねがいします、って言えよ
空ageすんな
こんなテキストファイルが有るとき(行頭の数字は行数) ---------------- 1 あああ 2 てすと 3 <html> 4 おちんぽ 5 あへあへ 6 ぶりぶりー</html> 7 あげあげ 8 ふとったーt ---------------- <html>〜</html> の間だけ抜き出したいんですがどうやったらええんでしょうか。 それぞれ行は可変です。 \nを削除してしまって一行にして、sedで s/.*<html>.*</html>/\1/g みたいなのとかは思いつくんですが イマイチ美しゅうないと思うとります。 マッチする行数をゲッツ出来れば、tail&headでがっつり抜き出せそうなんですが、 行番号をゲッツする方法が分かりませぬ。 エロ胃人お願いします
>>814 \nを削除しなくても、↓でできるよ。
sed -n '/<html>/,/<\/html>/p'
ただしこれだと<html>や</html>と同じ行のタグ外の部分も出てくるから、
あとsedの置換で<html>より左の部分と</html>より右の部分を削除すれば良い。
wikipediaのメインページ、何故こんなに重い?
818 :
名無しさん@お腹いっぱい。 :2006/07/23(日) 20:57:24
# echo "蔵" >file # /usr/bin/printf "%.1s" $(cat file) | wc -c わかれば教えてください。 一連、動作なんですが、特に書式指定子の.(ドット)の意味がわからないです。
>>818 man printf
info printf
まあどうせ探せんだろうから、.は小数点。.2は小数点以下2桁
>>819 それだとなんか英語のようなものが表示され、(END)のところでハングたので、
パソコンをリセットしてしまいました。
その釣り何度めだ。
823 :
名無しさん@お腹いっぱい。 :2006/07/24(月) 22:52:41
>> 819 さん 820 さん ありがとうございます。 コマンド実行結果は、1 or 2 のどちらが正しいのでしょうか?
>>823 オレの環境では、マンド実行結果は 0になる。
825 :
名無しさん@お腹いっぱい。 :2006/07/25(火) 16:35:46
はじめまして超初心者です。会社の嫌がらせでパソコンぐらいしか使ったことない 私にshellを作れといわれて苦労している45才です。教えてください。 問題が、日付を手入力したときに正常な日付かどうかと、うるう年の計算 方法です。たとえば20051313はエラーですが20060220は正常ですよね。そのときに 曜日も表示したいのでやり方をすいませんがはじめから詳しく教えてください。 すいませんが、お願いします。
いい加減見飽きた。
shellってゆうなクズ。
空ageすんな得た。
いまのプロジェクトでも シェルスクリプトで日付計算やってるのを数箇所で見て、げんなり。 どうしてもやりたいなら自前で演算するんじゃなくて、 ダミーファイルをtouchするとか、外部でPerlでもよんでほしい。
最近じゃdateで大概のことができるし
date -d 2006/02/02 +%A とかすりゃ曜日出るしね。日付部分は不正だとエラーにも してくれる。数字8桁はさすがに食ってくれないようだが、ちょいと/を付け足して食わせりゃ 出来上がりだ。
俺の環境ではこうなる。
↓
$ date -d 20060230
Thu Mar 2 00:00:00 JST 2006
数字8桁でもそのまま日付として食ってくれるが、
2月30日はご丁寧にも3月2日として解釈してくれる。
ま、これも、
if [ `date -d 20060230 +%Y%m%d` = 20060230 ]; then
とかでチェックすれば済むことだな。
それより、
>>825 はコピペだから詳しくは答えてあげない。
めでたくリストラされてください。
あ、もし自宅が借り上げ社宅なら、リストラ前に個人契約に変更しといた方がいいよ。
リストラ後だと保証人とかの問題で部屋が借りにくくなるから。
dateコマンドを使う方法だと、1969年以前の日付や、2038年以降の日付に対応できないな。
つcal
日付から曜日求める Zellerの公式を使って expr で計算すればできるな。
あと、日付の正当性チェックは閏年、大小の月で case文あたりで場合わけ判断と。
とは言っても、シェルスクリプト自体超初心者の
>>825 には無理。
リストラされろ。
>>825 どうしても解決したいなら、有料でもいいのだろ?
職業別電話帳見ると、街の便利屋さん(何でも屋さん)みたいなの載ってるだろ。
そこに電話して頼め。
もちろん、その便利屋さん本人はshellだのUNIXだの言っても知らないだろうが、
相手もプロだ。shellとかUNIXとかキーワードを頼りにそれ関係の詳しい人に
取り次いで問題を解決してくれる。特殊な用件だから少々高く取られるかもね。
すごくダさいと思った
超初心者的な質問ですが優しい人、教えてください。 Grepを使った検索スクリプトについて 1) あるテキストファイル(Pattern.txt)に検索対象文字列が改行単位で入っている。 2) この文字列ひとつひとつをパターン文字として、/apl/usr配下のファイルをGrepしたい。 3) 最終的にRESULTファイルに以下のような形式に保存したい。(RDB取込用ファイルの作成) <検索対象文字列> , <ヒットしたファイル名> 多分、Ptternファイルを一行ずつ読み込んで、Grepする処理を ループさせるようなスクリプトになると思うんですけど・・ ・
質問です CGIやPHPでシェルスクリプトを実行するにはどうしたらできますか? 実行方法がわからないのでおしえてください。
>>846 (1)先頭に
#!/bin/sh
のように陽にshellのmagicを書いておいて、
(2)CGIやPHPが動くときのuser id での実行許可をたてて、
(3)system()やexec()を呼ぶ。スクリプトのパスは原則フルパスで。
849 :
847 :2006/08/07(月) 03:14:47
え?駄目かえ?厨なりに一所懸命に考えたんだが。
(1) ホームセンターに行き鉄定規を購入 (2) CGI鯖のあるプロバイダに接続 (3) 鉄定規をF5キーの箇所に置き、ハイパーオリンピックの要領で弾く (4) 頃合いを見て80番ポートからログイン (5) 自分のディレクトリの実行許可を書き換え (6) /bin/shを実行
>>849 CGIとPHPが一緒くたな時点で「ちょw」
CGIは文字通りインターフェースだから、シェルスクリプト自体を直接実行できるのをわるれるな。
「わるれるな」に、ちょw
% echo a:~ a:~ となるのに、 % a=a:~ % echo $a a:/home/giko となるのはなぜですか?
なんでだろね♪
bashだからか?
>>855 NetBSD の sh と zsh でそうなりました。
$ a=a:~; export a $ export a=a:~ このふたつの違いを考えてみるとわかる。 ~ がコマンド引数の一部なのか、変数代入文なのか。
>>857 どっちの echo $a の結果は同じなのですが…
うそーん。うちの sh は違う結果になるが。
うちの、つーてもわからんか。FreeBSD 5.4 の /bin/sh。
なんでだろ〜おなんでだろ〜
PATH=~/hoge:~/fuga てことがしたくて変数代入のときだけ小細工してるから
Tilde Substitution. After alias substitution is performed, each word is checked to see if it begins with an unquoted ~. For tilde substitution, word also refers to the word portion of parameter expansion (see ParameterExpansion below). If it does, then the word up to a / is checked to see if it matches a user name in the password database (often the /etc/passwd file). If a match is found, the ~ and the matched login name are replaced by the login directory of the matched user. If no match is found, the original text is left unchanged. A ~ by itself, or in front of a /, is replaced by $HOME. A ~ followed by a + or - is replaced by the value of $PWD and $OLDPWD respectively. In addition, when expanding a variable assignment, tilde substitution is attempted when the value of the assignment begins with a ~, and when a ~ appears after a :. The : also terminates a ~ login name. つまり普通はワードの先頭が~のときしかtilde substitutionが行われないが、変数代入のときだけは:の後でもやる というわけね。これはいかにも知ってないと混乱しそうな仕様だな。便利は便利なのだろうが。
864 :
名無しさん@お腹いっぱい。 :2006/08/12(土) 22:10:32
HOME_DIR="/export/home/.../..." ; export HOME_DIR このような書き方を良く見かけるんだが、2行に分けず 1行にまとめて書いてるのは、何か技術的な理由があるの? それとも、ただ単に行の節約とか見やすさを考慮しただけ?
書いた奴の気分
866 :
名無しさん@お腹いっぱい。 :2006/08/12(土) 22:39:34
export HOME_DIR="/export/home/.../..." このような書き方を良く見かけるんだが、2行に分けず 1行にまとめて書いてるのは、何か技術的な理由があるの? それとも、ただ単に行の節約とか見やすさを考慮しただけ?
# 一個でコメントアウトできる。(という事まで考えているかは知らない)
868 :
名無しさん@お腹いっぱい。 :2006/08/17(木) 16:30:16
20060817ってな感じの日付を 基準時点 (UTC の 1970 年 1 月 1 日 00:00:00; time(3) 参照) からの秒数 に変換するスマートなやりかた教えて
>>868 date -u +%s -d 20060817
% date -d 20060817 +%s 1155740400
うちのdateだとこうかな date -j -f "%Y%m%d%H%M%S" 20060817000000 +%s
20060817がJSTなら -u は要らない。 date +%s -d 20060817
>>866 ・その文法しか知らないから
・その文法をサポートしている OS でしか動かす予定がないから
・その文法をサポートしてない /bin/sh を持つ OS への嫌がらせ
のいずれか
>>866 は、質問じゃなくて
>>864 の修正コピペだろ。
で、
>>864 は、
>>866 的な exportと代入を同時にやる bash依存文法に反対する意味をこめて
あえて1行で書いてるんだと思う。
でも、俺的には
HOGE=hoge
HAGE=hage
export HOGE HAGE
↑の書き方が好み。
875 :
868 :2006/08/17(木) 18:07:27
サンクス 869,870は無理だった 871でおk FreeBSD
>>874 export VAR=value
をbash依存文法とする根拠を述べよ。
>>876 「bashで使えて Bourne shで使えないから」そのままやん。
先に言っとくと、*BSDのsh=ash≠Bourne shだからね。
>>876 やれやれ。最近は export VAR=value がbash依存文法であることも知らない新参者が多いのう。
なぜかほこらしげ
>>878 bash依存というより、ksh依存といった方が正しい。
bash依存というけれど他がbashに合わせるべきだよね。 立場をわきまえないと。
ああ、どれが釣りなのかわからん… "export var=value"という書き方はPOSIXシェルで有効な文法で、 bash依存の仕様と言うわけではない。 SolarisではkshはPOSIXとの互換性を使いたい場合のシェルで、 /bin/shは上記文法を受け付けず、POSIXに準拠しない。
>>878 POSIXくらいは確認してから書こうな。テンプレにも入れてあるんだし。
で、POSIX準拠かどうかということが実践では役に立たないのも事実なわけで、 POSIXよりも、「/bin/shで使える文法かどうか」の方が重要。
/bin/shがPOSIX準拠でないOSにはそろそろ引退してもらいましょう
仕事で使うなら、いいわけもえり好みもできない。 だから確実性が最優先だし、選択肢が存在すると考えること自体が間違い。 /bin/shが何者か分からなければ、bourne shellサポート範囲内かつbash拡張範囲外で書くべき。 POSIXシェルでなければならない理由が本当にあるかどうか分からないが、 もし仮に本当に必要ならば明示的に指定して使ってやればいいんだよ。 /bin/bashや/bin/xpg4/sh(Solaris)や/bin/ksh(Solaris)が存在するなら ベンダが保証したPOSIXシェルとして使えるんだから、 何者か分からない/bin/shをおっかなびっくり使うよりマシ。
autoconfが生成するconfigure.shはnon-POSIXでも動くよう書かれているんだよね...
そういうクズなシステムを例にだしてもなんの意味も無い。
一番混乱させているのが、*BSD。 Linux(の多くのディストロ)は標準をbashと決めているから、そういうものとして理解すればいいが、 *BSDの/bin/shはそれぞれで勝手に拡張されているし、バージョンによってコロコロ変わってたりするから、 わかりにくい。
FreeBSDのshで、printfが外部コマンドに変更されたのは許せん。
実装違いに悩まされないためにPerlで書いてしまう手もあるが やはり/bin/shで何とかするのが心意気というものであろう
実行前にshを調べてperlで整形すれば解決ですよ。
HOGE=abcd export HOGE でも設定出来るのになんでセミコロン入れるんだろ?
>>893 古いシェルだと、内部コマンドに対して HOGE=hoge のような変数の指定が
うまく動作しないものがある。だから ; を入れるのが吉。
いや、HOGE=hoge export HOGE の場合、 exportという1コマンドに対してのみ一時的に HOGE=hogeという環境変数を設定する、 という動作が本来の仕様なのだから、 HOGE=hoge export HOGE (セミコロンなし)でもexportできてしまう方がバグと思われる。 (古いシェルの動作が正しい) たとえば、 HOGE=hoge printenv HOGE だと、printenvコマンドではhogeが表示されるが、 その後はHOGEは未設定になる動作が正しい。exportでもそうなるべきだ。
過去のしがらみも古参の権威もなくPOSIXしか拠り所のないlinuxはPOSIX優等生。 うちは昔からこうやってるなんて言いだす傲慢さは無い。 最古参のBSDは困ったちゃん。
>>896 LinuxはPOSIXに準拠してないよ。拠り所は GNU。
GNUの独自拡張だろうが、GNUで使えれば事実上の標準になってる。
つーか、「便利ならいいじゃん」がLinux。 そういって、95年当時にLinusが事務処理にはWindowsを使っ ていたことは公然の秘密だ。
>>896 POSIX準拠なのはLinuxだけじゃないし、opengroupのUNIX認証を通ってないから
結局のところPOSIX準拠であることを第三者に証明できない。
優等生ってのは言い過ぎじゃないかなあ。
>>897 「GNUで使えれば」ってどういう意味よ? 説明してみて。
opengroupのUNIX認証を通ってないから<-誤り UNIX認証を受けてない、メンバーにも入れてもらえない。 もしUNIX認証を受けるにしてもデストリごどになる。 linuxにUNIXを実装する事自体は容易、ほぼそのままでもいけるか。 現状はlinuxである方が有理なのでUNIX認証にはあまり興味が無い。 linuxはlinux認証を立ち上げた。
>>895 exportが、値を何というか環境に担ぎ出して固定する
ようなイメーヅだと思えば不思議じゃない。
$ HOGE=hoge HOGE=hoge
とやった後にHOGE=hogeに設定される、
そういう効果をもともと持つコマンドがexportってこと。
> opengroupのUNIX認証を通ってないから<-誤り
> もしUNIX認証を受けるにしてもデストリごどになる。
ほほう、UNIX認証を受けたLinuxディストリビューションが
1つでも存在するのならば知りたいものだね。興味がある。
で、「Linux認証」なるものが仮に標準たりうるとしても、
それは
>>896 の言う「BSDの権威」とどう違うのよ?という話。
Linux認証?
Stallmanを追放って... 追放が可能なためには、まずは所属してないと。
>>904 UNIX認証とは違う話をしているようだけど、
「unixの会員になる」というのが何を指すのか説明して。
>>905 彼の妄想世界では可能なんだよ、きっと。
そういや最近のGNU coreutilsはsort, head, tailとかのコマンドが 「-行数」をデフォルトで受け付けたりやめたりとずいぶん揺れてるね。 このへんはPOSIX 1003.2-1992かPOSIX 1003.1-2001かで違うみたいだ。
「UNIX」は、X/Open Company Limitedが独占的にライセンスしている米国ならびに他の国における登録商標です。
>>906 きっと美容院のことだよ。
ご紹介システムを利用すれば、1000円分のポイントもらえるよ。
「unixの会員になる」って、 レンタル・ビデオ屋UNIXの会員になるってことじゃないかな。
>>901 そのexportの解釈でもちょっと苦しいね。
あと、別の例だけど、
$ HOGE=hoge unset hoge
$ echo $HOGE
hoge
↑unsetされてない。
これはどう解釈する?
やっぱバグだろ。
912 :
911 :2006/08/21(月) 16:35:48
typoしてもうた。↓のとおり $ HOGE=hoge unset HOGE $ echo $HOGE hoge この現象が起きるのはシェルの種類によるかも。 もちろん、セミコロンを入れて $ HOGE=hoge; unset HOGE ならちゃんと unsetされる。 何が言いたいかというと、元の話題の HOGE=hoge; export HOGE の時、 念のためセミコロンを入れろということ。
いやいやいやexportの話でしょ? その言い方からすると、そのウンコシェルでもexportは効くんでしょ?
>>910 ウチの近くに本当にunixっていうレンタルやがあるぞ。
>>914 もちろん実在することを知っているからこそ書いてる。
タッパ…
Solaris9/10なんですが、教えてください。 標準出力に数値を出力するプログラムがあり、その値を シェルでexitしたいんですが、マイナス値でエラー"番号が正しくありません"になります。 簡単にいうと、エラーとなるのは↓のようなものです。 #/bin/sh EXITVALUE=-1 exit ${EXITVALUE} これ、Linuxではうまくいくんですが、Solarisではだめなんでしょうか?
うまくいく方がおかしいので、おとなしく 0 から 255 までの数を使ってください。
POSIX では 0 〜 255 までだっけ。
>>917 Linuxというより、bashだと exitの値に勝手に mod 256をとった上で
符号なし8bitとみなした 0 〜 255の値になる模様。
なので、Solarisでもbashを使えば無問題。
あるいは、exit `expr \( ${EXITVALUE} + 256 \) % 256` かな。
>>920 ありがとう。
今日環境使えたら試してみます。
受け側で、`` で受ければいいんじゃないの?
bash使ってもエラーにならなくなるだけで、親プロセスがexit statusとしてもらえる値は そのコマンドが返した値の-1ではなくてmod 256した値の255に変化してしまうのだが、 それでいいのかね?
>>922 `` で受けてる。
実際には、フォーマットが決まってるから、その後awkで切り出して、
それをEXITVALUEに代入しているけど。
で、その値がマイナスだとexitで怒られます。
>>922 呼び出し側は専用のアプリで、singned charとして扱っているから大丈夫だと
思われます。
925 :
917 :2006/08/24(木) 00:21:43
>>920 今思えば質問も的を得ていないにもかかわらず、望んでいたのは
そういうレスでした。おかげでなんとかしのげました。
ありがとうございます。
他にもレスくれた人達、ありがとう!
× 的を得る ○ 的を射る ○ 当を得る ○ 要を得る
>>927 ラリーウォールがperlの広告してる、ふう、それだけのこと
それであってさえ、`trivial scripting' にはシェルスクリプトが最適なのを 認めてしまっている罠
1ヶ月後までにやっとかなきゃいけないこと(でもできればその直前くらいがいいこと)を、 自分のメールアドレスにお知らせしてくれるリマインダーを書きたいんだけど、 どっから手を付けていいのやら。
at
アッー!
934 :
名無しさん@お腹いっぱい。 :2006/08/30(水) 15:21:50
bashでバックグラウンドジョブが終わったときの [1]+ Done kterm を表示させなくするにはどうすればいいんでしょうか?
モニタを破壊する
rm `which bash`
938 :
934 :2006/08/30(水) 15:49:15
ふつう、disown じゃね? bash だと、&! や、&| って無いのかな?
>>939 disownだと、bashを含む一部のシェルのみに依存した方法になるから、
ashでも使える
>>937 を尊重したい。
>>939 disownだと、コマンド起動直後の [1] 1234 みたいなジョブ/プロセス番号の
表示までは消せない、という話しもある。
&! は zsh依存だな。
対話的に使っているとき、bash(というかbsh系)で標準エラー出力を 簡単に捕まえる方法ってありますか? hogehoge 2>&1 | less とか打つの面倒なので、 hogehoge |& less とcsh系のみたいな簡略系がないかなと思うんですが。cshは あらゆるところがヘボイけど、これだけはうれしい。zsh使え?
>hogehoge 2>&1 | less 画面に表示するだけなら、2>&1はいらないわけだが。
>>942 自分で答え書いてるけど、zsh使えばいいんじゃない。
ちなみに、オレは hoge 2>&1 | less と打つのが苦にならない(もう指が覚えてる)。
>>944 漏れも同じ。zshでも2>&1って打ってることが多い。
これより101キーバインドと106/109キーバインドの差の方が引っかかりやすい。
日本語キーでも必ず英語配列で使う。(&はSHIFT+7) 最近は英語配列キーボードが入手困難で困るなぁ。
>q hogehoge | less qはエイリアスでも関数でも、実行プログラムででも適当にこさえる。
q() { "$@" 2>&1;} でいいね。
>>947 私は日本語キーボードを英語配列で使うと「\」が「:」の隣に来て押しやすいので
まともな英語配列キーボードより好きだったりします。どうせキートップなんて
見ないし。
英語配列は、:がshift要求するから嫌だ。
俺はカッコが1つずれてさえいなければどっちでも良いんだがな… JISキーボードを作った人はなんでわざわざずらしたんだろう。
逆だ。 英語配列が変態配列なんだよ。
>>953 カッコって"(" と ")" のことかい?
JISキーボードのShift+数字の部分は,
数字のJIS(ASCII)コード - 0x10
になるように配置されている.
気持としては 0x21 から 0x2f までの範囲のコードは
shift+<0x31 から 0x3f までのキー>
でコード化したかったのではあるまいか?
一部逆転してるけど...
このほうがハードだけでコード化するのが楽.
大昔のやつさがせば shift+0 でスペースを出力する
キーボードがあったかも知れない.
どっちかって言うと, USキーの方が不思議な並び.
タイプライターってどんな並びだったんだっけ?
昔のタイプライターだと、ゼロとイチはなくて、ゼロは大文字のオー(O)、 イチは小文字のエル(l)を使っていた。
( ・∀・)つ〃∩ ヘェーヘェーヘェー
英語キーボードは今も昔と同じぐらい普通に売ってる気がする。 いや20年前のことはしらないが。
>>958 売ってるとこ教えて。ちなみに近所のPC量販店では皆無。
ネット通販でも見かけない。
あと、HHKもパスでお願い。フルサイズのが欲しいので。
「キーボード」でググるだけで相当でてくるが。。。
>>960 それだとS/N比が非常に悪いですが。。
>>961 HHK系はパスだとおっしゃってますが。。
urlだけ見て喋るなカス
キーボードが{こわれた,タッチが気に入らない}ので、 ちょっと近所の **{電気,無線,カメラ}まで行って 英語キーボード買ってくるか、と思った場合、 5-6年前なら売ってたけど、今は日本語キーしか売ってないよ。 キーボードは現物触ってからじゃないと買いにくいし、 確かに困るね。
うちの庭に埴輪の鶏がいる。
家に埴輪鶏がいる。
シェルスクリプト用(/bin/sh)のlintみたいなのあったら教えてください。
sh -n
>>970 できました。どうもありがとうございました。
>>959 「英語 キーボード 価格」
でぐぐってみ?
スレ違いゴメソ。
973 :
名無しさん@お腹いっぱい。 :2006/09/06(水) 10:48:16
bashでshellscriptを書いています。 scpする前に、ネットワーク上のサーバにscp可能かどうかを 確認するif文などは可能でしょうか。 この意味ではsshもscpも等価だと思うので 例えばsshをtryしてみてログイン可能だったら次にすすむ、 という感じで可能でしょうか?
調べた直後にネットワークが不調になったり相手の設定がかわるかもしれないから、 結局scpできない可能性は残るので対策が必要。となると事前に確認する意味は どのくらいあるか...
>>973 実際に scp やってみて返り値見るとかじゃだめなん?
それより次スレよろ。
978 :
973 :2006/09/06(水) 11:07:59
これかな〜、と思ったけどうまくいきませんでした・・・orz
#!/bin/sh
PATH=/bin:/usr/bin:/usr/local/bin
ssh
[email protected] if test -e Sites/rute/*
echo "file exists. exited the server."
else
echo "unable to login the server."
fi
>>976 それはナイスアイデアですね!
で、返り血はどうやってみるんですか??
hogehoge.comは実在しま(ry
> それはナイスアイデアですね! > で、返り血はどうやってみるんですか?? ( ゚д゚)
返り血は みるんじゃなくて あびる優 おそまつ
だから
>>973 の質問を見た瞬間、答える甲斐のない糞質と見抜いたわけだが…
bashで解決できないならcommand.com使うしかないな。
bashのシェルスクリプトをnice付けて起動したらシェルスクリプトから呼び出した アプリケーションプログラムもniceの影響を受けるのかな?
試してみ。
スレ立て行ってきます
987 :
名無しさん@お腹いっぱい。 :2006/09/07(木) 13:07:58
$?
1
先に前スレ埋めろよage
980越えたらほっときゃ落ちる。
梅
ume