1 名前:名無しさん@お腹いっぱい。 [2009/07/01(水) 09:42:48 ] シェルスクリプトの総合スレです。 スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずは注意点、リンク、地鎮祭など(>>1-6 くらい)をご覧ください。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashなので特に注意。 FreeBSDユーザは/bin/shの正体がashなので注意。 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。 src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/ heirloom.sourceforge.net/sh.html ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルスクリプトのことをシェルってゆーな ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 前スレ シェルスクリプト総合 その14 pc12.2ch.net/test/read.cgi/unix/1233179688/
554 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/26(月) 22:17:39 ] >>552 whileループはC言語で書いてるんだろ。(プログラムは出てるじゃん) コマンドラインで直接 ./play を実行すると1秒毎に処理されるのに、 >>551 のシェルスクリプト経由で ./play を実行すると1秒待たずにループする、 という話だろ。
555 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/26(月) 22:20:28 ] で、答えは?
556 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/26(月) 22:20:58 ] >>551 sleep()関数はシグナルで中断される可能性がある。 シグナルが到着すればsleep(1)は1秒未満で終了する。 代わりにnanosleep()使え。 たぶん、シェルスクリプト経由の時だけシグナルが発生するような 別の条件が加わってるんだろ。
557 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/26(月) 22:36:54 ] >>551 play コマンド側は特に何もせずシェルスクリプト側で sleep 1; すればいいんじゃね?
558 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/26(月) 22:58:35 ] >>556 ありがとうございます。 試してみましたが同じ状態になりました。 説明が不足していてすみません GNU Chessを改造していたので、その部分のコードを切り抜いても分かりづらいので自分なりに説明したのですが、説明力がなくてすみません。 ファイルの読み込み部分の処理は while(true){ sleep(1); if(rlogfp=fopen("./black.log","r")){ fgets(inp, MAXSTR, rlogfp); fclose(rlogfp); remove("./black.log"); break; } } black.logというのは次の手を指定した文字列が収められているファイルです。 C言語で書くのもうまくないので下手なコードですが、ご了承ください。
559 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/26(月) 23:01:09 ] >>557 whileで監視しているのでsleep(1)がないとファイル作成時に読み込みが実行されるのか、うまくデータが受け取れないので sleep(1)を追加している次第です。
560 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/26(月) 23:39:32 ] 後からこんなことを追加するのはすみませんが どうやら監視しているファイルが存在しないのに、ファイルがあるように動いているみたいで、 ファイル読み込む→whileを抜け出す→間違った手だと解釈→whileに入りファイルを読み込む を繰り返すようになっているみたいです。 シェルスクリプトではなくターム上で実行するとうまくいくのに スクリプトだとこの現象がおこるのはどういったわけでしょうか?
561 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/26(月) 23:56:55 ] >>560 シェルスクリプトの cd $DIR/file あたりがうまく行ってないとか。 別のディレクトリの black.logを読んでループしてるとか。
562 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 00:11:19 ] >>561 レスありがとうございます 他のディレクトリではblack.logは生成していないのでそのケースはないかと思います ディレクトリの場所も間違いはないです
563 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 00:23:15 ] sleepはループの先頭なの?それなら確実に1秒待つでしょ? 説明に一貫性がないと回答者も混乱するし、いいことないよ。 あとは、fgets, fclose, removeの戻り値をちゃんとチェックしてみる。
564 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 00:30:07 ] ぱおーん ってそれはエレファント
565 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 00:40:24 ] >>551 >シェルスクリプトで実行すると1秒待たずにwhileループが回っている これはどうやって確認したの? 原因を切り分ける為に、問題を再現出来る最小限の プログラムを作ってみると良いと思うよ。
566 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 00:46:46 ] >>563 ,565 アドバイス通り明日調べてみます。
567 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 08:05:15 ] >>559 > whileで監視しているのでsleep(1)がないと > ファイル作成時に読み込みが実行されるのか、 > うまくデータが受け取れないので busy waitになるだけでちゃんと動くはずだろ。 だから動かないのは、sleep()以外のところがおかしい。
568 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 11:08:26 ] そのファイル、NFS かなんかの領域に置いてないか? おかしなキャッシュが効いてるような気がする。
569 名前:名無しさん@お腹いっぱい。 [2009/10/27(火) 11:38:40 ] >>568 特に変わった場所には置いてません。 とりあえずthreadやwhileループとファイルの読み込みの部分だけ同じ形でtestファイルを作ってみたのですが 直接実行、シェルスクリプトで実行で共に問題がなかったので、もっと別の場所だと分かりました。 もう少し試行錯誤してみたいと思います。
570 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 12:26:31 ] ちょっと説明が長くなるのでアップロードしてみました。 お手数をおかけしてもうしわけありません。 DLkey:unix www1.axfc.net/uploader/Sc/so/49655.txt
571 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 13:04:39 ] input_threadが動き出す前にwait_for_inputに入ると、 input_statusが初期値(INPUT_NONE)のままなので、whileを抜けてしまう。
572 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 21:14:09 ] test が表示されないという現象はウチでは一度も再現しませんでした。 Dual Core の Mac です。 外してたらスマソ。 test.sh を実行する Ctrl-C で test.sh を止める a.out のプロセスは残ったまま とかじゃないよね? まあそれでも test が表示されない理由にはなりませんけど。
573 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 21:50:45 ] 一度目がその症状があって もう一度試したら治っていました >>571 どのように記述すれば回避できるのでしょうか? 丸投げのようですみません^^;
574 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 00:03:20 ] 以前動作していたスクリプトが動かなくなってしまいました… ここ最近kshのアップデートを行ったのが原因なのでしょうか… 何か情報をお持ちの方いらっしゃいましたらご教授願います。 <事象> 特に問題なく見えるkshがsyntax Error `(' unexpectedで異常終了 コメント内のスペースを1つ削除or2つ追加すると正常に動作する <やったこと> kshとbashのアップデート ksh 20060214-1.4 → 20080202-14.el5 bash bash3.1-16.1 → bash3.2-21.el5 <環境> redhat Linux 5.1 uname -a結果 Linuc 2.6.18-53.el5 #1 SMP Wed Oct 10 16:34:19 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux <備考> ksh -nで構文チェックをかけると、構文エラー以外に「" quote may be missing」という警告が必ずついてきます。 コメントを弄ってエラーを抑止するとこの警告も発生しなくなります。
575 名前:551 mailto:sage [2009/10/28(水) 00:05:16 ] . play.shで実行したらうまく動きました。 結局原因はわかりませんでしたが、サブシェルだと何か環境とちがったのかな?と素人ながら思います。 お騒がせしてすみませんでした。
576 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 00:59:40 ] それたまたまだから
577 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 01:16:52 ] while(true)なんてしないで、openの返り値でなんとかならんの?
578 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 07:06:37 ] >>574 おいおい、redhat 5.1というのは10年くらい前のOSで、 カーネルは2.0の時代のもの。(libc5からやっとglibc2に変わった時代) カーネル2.6で動くわけがない。
579 名前:574 mailto:sage [2009/10/28(水) 11:18:44 ] >>578 今確認したところ、redhat 5.1ではなく RHEL 5.1でした redhatLINUXとRHELを混同していました 申し訳ありません
580 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 11:43:19 ] >>574 スクリプト晒せ
581 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 11:44:15 ] libc5なつかしいな。 glibc2(libc6)になってようやくLANG関係がマトモになったんだっけ
582 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 11:44:22 ] どうせShift_JISのコメントだろ。
583 名前:574 mailto:sage [2009/10/28(水) 23:54:47 ] >>580 手元にスクリプトがない上に動く動かないの条件がよく分からないので再現できず… 申し訳ないです。 >>582 コメント等もう一度文字コードを見直しましたが、すべてUTF-8でした。
584 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 23:56:51 ] 手元にスクリプトがないのにコメント等見直した?意味が分からんのだが
585 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 23:57:32 ] 不思議な話だなw
586 名前:名無しさん@お腹いっぱい。 [2009/10/29(木) 22:50:29 ] LOTO6用の数字列を生成する for x in $(seq 1 5); do echo $(seq 1 43 | shuf | head -6 | sort -n); done
587 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/30(金) 23:17:20 ] >>586 for((i=0;i++<5;)){ echo `shuf -i 1-43 -n 6 | sort`; } ↑の方が簡単
588 名前:名無しさん@お腹いっぱい。 [2009/11/10(火) 09:10:20 ] 質問です。記法1と2では違いがありますか?どちらが正しいとか… doの後に改行入れるべきかどうなのか,ということですが。 記法1 for i in * do echo $i done 記法2 for i in * do \ echo $i done
589 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/10(火) 09:48:42 ] >>588 記法2は間違いではないがバックスラッシュが余分。 もともと do の直後には、空白、タブまたは改行の区切り文字があればなんでも良い。 「行の継続」をする必要はないので、バックスラッシュは不要。
590 名前:588 mailto:sage [2009/11/10(火) 11:02:41 ] >>589 ありがとうございました。
591 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/10(火) 11:33:58 ] 今のトレンドは↓の書き方。 bash依存じゃないぞ。純正シェルでもちゃんと動くから安心して使え。 for i in * { echo $i }
592 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/10(火) 11:37:50 ] どこのトレンドだよwwwww
593 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/10(火) 11:43:46 ] for は { ... } でもいいけど、 while は do ... done じゃないといかんというのがアレ。
594 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/12(木) 08:07:11 ] kshで標準出力と標準エラーをデフォルトでファイル&画面に出力するやり方はありますか? 毎行、| tee -a hoge.log を書くのが大変なので。
595 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/12(木) 08:19:07 ] >>594 ( command1 command2 command3 : ) 2>&1 | tee -a hoge.log
596 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/12(木) 08:41:02 ] >>594 scriptコマンドは?
597 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/12(木) 08:58:07 ] 俺はそういうとき telnet localhost | tee hoge.log ってやってる
598 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/12(木) 09:27:34 ] 正解(>>595 )が出た後にボケ回答(>>596-597 )が出てくる、の法則
599 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/13(金) 19:18:09 ] 自分よりいい答えが出たのがそんなに悔しかったのか
600 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/13(金) 19:57:03 ] > 毎行、| tee -a hoge.log を書くのが大変なので。 毎行と言っているし、ここはシェルスクリプトスレなのでスクリプトの中での記述に 関しての質問だと言う事が容易に予想できる。 スクリプトに関しての質問にscript使えだの、telnetをリダイレクトしろだの、 ボケまくりの回答してる奴らは何なのだろう? 匿名掲示板だからボケ回答も恥ずかしくないのだろうか?
601 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/14(土) 03:03:51 ] 必死だなw
602 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/20(金) 10:11:52 ] >>599 只の知ったかだろ 半角数字とか学生の分際で早くも理系気取りかよ
603 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/20(金) 10:44:29 ] >>602 日本語で頼むわ……
604 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/20(金) 20:00:12 ] > 半角数字とか学生の分際で早くも理系気取りかよ これは新コピペになりそうな気がする
605 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 01:23:51 ] >>604 新コピペとか学生の分際で早くも理系気取りかよ …こんな感じ?
606 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 02:02:27 ] bashを使用しています。 数字が入っている変数に3桁毎にカンマを入れる方法が分かりません。 どうやれば3桁毎にカンマを入れれるようになりますか?
607 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 12:27:50 ] >>606 printf "%'d" "$var"
608 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 22:05:46 ] >>607 これはいいことを聞いたと、試してみたができないぞ? $ bash --version GNU bash, version 4.0.28(2)-release (i686-pc-linux-gnu)
609 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 22:13:00 ] >>608 varの中にちゃんと数字入れてるか?
610 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 22:17:56 ] >>607 では printfの書式に改行が入ってないから、 シェルのプロンプト設定によってはprintfの出力をプロンプトが上書きしてしまう とエスパー。 それとは別に、zshの内蔵printfでは動作しないね。
611 名前:606 mailto:sage [2009/11/21(土) 23:23:18 ] >>607 さん 有難うございました。ウチの環境ではうまくいきました。
612 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/22(日) 14:57:44 ] $ printf "%'d\n" "123456" 123456 $ var="12345667" $ printf "%'d\n" "$var" 12345667 なにがいけないのかねー
613 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/22(日) 17:20:06 ] $ printf "%aqd\n" "123456"
614 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/22(日) 17:29:35 ] >>612 localeの設定じゃない? printf(3)によると、 >>printf("%'.2f", 1234567.89); >>results in '1234567.89' in the POSIX locale, in '1234567,89' in the nl_NL locale, >>and in '1.234.567,89' in the da_DK locale.
615 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 00:52:46 ] >>614 ロケールの問題でした。ありがとう。 ちょっと気になるのは、printfコマンドする時に LC_ALLを明示的に与えても上手く動作しなかったんですよね 組み込みコマンドだと伝わらないのかな? $ locale LANG=ja_JP.eucJP LC_CTYPE="ja_JP.eucJP" LC_NUMERIC=C LC_TIME=C LC_COLLATE="ja_JP.eucJP" LC_MONETARY="ja_JP.eucJP" LC_MESSAGES=C LC_PAPER="ja_JP.eucJP" LC_NAME="ja_JP.eucJP" LC_ADDRESS="ja_JP.eucJP" LC_TELEPHONE="ja_JP.eucJP" LC_MEASUREMENT="ja_JP.eucJP" LC_IDENTIFICATION="ja_JP.eucJP" LC_ALL= $ LC_ALL=da_DK printf "%'d\n" "123456789" 123456789 $ LC_ALL=da_DK bash $ locale LANG=ja_JP.eucJP LC_CTYPE="da_DK" (省略) LC_ALL=da_DK $ printf "%'d\n" "123456789" 123.456.789
616 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 06:55:47 ] $ printf "%'d" "123456789" printf: %': invalid directive
617 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 13:08:26 ] >>615 >>$ LC_ALL=da_DK printf "%'d\n" "123456789" LC_ALL を LC_NUMERIC にしてもダメ?
618 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 15:32:07 ] (優先される)強さは、 強 LC_ALL > LC_個別 > LANG 弱 のはずだから、LC_ALL があってダメなら LC_NUMERIC でもダメな希ガス。
619 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 15:44:54 ] >>617 ダメでした。 というかlocale(7)に書いてあるロケールの決定順序を見る限り $ LC_ALL=da_DK printf "%'d\n" "123456789" で動かなければ、LC_NUMERICを使っても同じなのではないかと。 ところで、 $ LC_ALL=da_DK locale の結果は$ LC_ALL=da_DK bashで作ったシェル上でlocaleした (参考>>615 の2個目のlocale)のと同じ結果になります。 (つまりLC_ALLも、LC_NUMERICもda_DK) その癖に、 $ LC_ALL=da_DK printf "%s\n" "$LC_NUMERIC" と $ LC_ALL=da_DK echo "$LC_NUMERIC" はどちらも「C」が出力 (参考>>615 の1個目のlocale)になるんですよね。LC_ALLはもちろん、改行のみです。 環境変数の伝わり方が変ですよね? つまり、 localeだとLC_ALL(もしくはLC_NUMERIC)がexportされてて、 printfとechoはexportされない。 それと、 >>615 で「組み込みコマンドだと・・・」といいましたが、 $ type -a echo したら、builtinと/bin/echoの2つのエントリがあったので、 どちらも試してみましたが、exportされませんでした。 どういうメカニズムでこうなっちゃうんでしょう。
620 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 15:54:16 ] >>618 とレスが一部被ってしまった 連レスですみませんが、 コマンドの前に環境変数定義をつけるシンタックスって なんという名前で呼ばれていますか? そもそもどういうものなのかを調べたいのですが、ググりづらくて。
621 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 16:04:31 ] >>620 shじゃなくてbashのマニュアルで申し訳ないが、 A simple command is a sequence of optional variable assignments followed by blank-separated words and redirections, and terminated by a control operator. だそうな。 optional variable assignments (省略可能な変数代入)
622 名前:608,612,615,619 mailto:sage [2009/11/23(月) 18:22:28 ] >>621 ありがとう。man bash読みました。 組み込みコマンドでの、optional variable assignmentの挙動についてまとめてみました。 COMMAND EXECUTION ENVIRONMENT節に以下の記述があります。 When a simple command other than a builtin or shell function is to be executed, it is invoked in a separate execution environment つまり組み込みコマンドはseparate execution environmentで呼び出されない。 これは当たり前のことで、組み込みコマンドは別シェルで実行されないということですよね。 そして個人的に新たに知ったのは、optional variable assignmentは別シェルにしか 伝えられないということです。(現在のシェル変数には代入されない) だから、>>615 で $ LC_ALL=da_DK printf "%'d\n" "123456789" がコンマ区切りにならなかったんですね。 だったら、敢えてシェル変数を伝えられた実行環境を作って、printfするとどうなるか。 #include <stdlib.h> int main() { system("printf \"%s\n\" \"$LC_NUMERIC\""); system("printf \"%'d\n\" \"123456789\""); return 0; } をコンパイルしたa.outに対して試してみました。 (a.outは組み込みコマンドではないので別シェルで実行され、 optional variable assignmentが伝えられる)
623 名前:608,612,615,619,622 mailto:sage [2009/11/23(月) 18:25:17 ] $ ./a.out C 123456789 $ LC_NUMERIC=da_DK ./a.out da_DK 123.456.789 $ LC_ALL=da_DK ./a.out C 123.456.789 となりました。 >>615 の後半のようにLC_ALL=da_DK bashで環境作ってからやる方が楽なので、 本末転倒になりましたが。。。 ところで、これで興味深いのは、LC_ALLはLC_NUMERICに影響を及ぼさないことです。 >>615 では LC_ALL=da_DK bash 後にlocaleすると、LC_ALL=LC_NUMERIC=da_DKになりますが、 bashの初期化処理でLC_ALLの値をLC_NUMERICにコピーしているのかも? 最後に。619の訂正。 SIMPLE COMMAND EXPANSIONの節の 4.にあるように、 parameter expansionされてからコマンドが実行されるようなので、 $ LC_NUMERIC=da_DK printf "%s\n" "$LC_NUMERIC" はコマンドが実行される前に引数の$LC_NUMERICが「C」(参考>>615 )と展開される。 そのため、Cが表示される。 長文失礼しました。
624 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 18:52:34 ] 組み込みコマンドがseparate execution environmentで呼び出されないのは bashの場合の話。 kshでは組み込みコマンドでもseparate execution environmentで動作する。
625 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 19:12:34 ] やはり、sh系といえども、何を使っているかは明示すべきなんだな。
626 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 19:17:36 ] 確かにその通りですね。 上は全部>>608 の環境で試してた。
627 名前:名無しさん@お腹いっぱい。 [2009/11/26(木) 14:47:50 ] "aa-1125.txt" "aa-0001.txt" "aa bb-1125.txt" "aa bb-0001.txt" "aa bb cc-1125.txt" "aa bb cc-0001.txt" 同じディレクトリにこの6ファイルがあるとします。 この中から「aa bb-????.txt」の形式で且つ最も新しいファイルを 探したいんですが、 (当然のことですが)ls -ltr "aa bb-????.txt"|tail -1とやるとエラーになってしまいます。 どうすればいいでしょうか?シェルはbashです。
628 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 15:01:32 ] ls -ltr (ここに6個のファイル名を羅列)|tail -1
629 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 15:01:41 ] ls -lt aa\ bb-????.txt | head -1
630 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 15:14:14 ] bbの無いファイルもあるぞ
631 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 15:28:45 ] あるよ だから?
632 名前:名無しさん@お腹いっぱい。 [2009/11/26(木) 15:49:56 ] 申し遅れましたが、 実際にはファイル数、ハイフンより前の部分のファイル名は不定です。 >>627 は単純化した例です。 >>627 の時点で知りたかったことは自動でエスケイプする方法もしくはそのコマンドです。
633 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 16:00:11 ] 一体何がしたいんだよ 何とマッチさせたいんだ?
634 名前:名無しさん@お腹いっぱい。 [2009/11/26(木) 16:07:04 ] >>627 の下から2行めをエスケイプしたものが >>629 なわけですが、(実質的に) そのようなことをスクリプト内で自動でおこないたいということです。 sed,awkを使うのかなと思いますが、インタラクティブだと[tab]キーを押すと できるようなことなので、bash内部でも出来ないかなとも思います。
635 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 16:13:40 ] ハイフンより前にスペースが含まれていようがいまいが *-????.txt で>>627 の6ファイル全てにマッチするんだけど それで何か困るのか
636 名前:名無しさん@お腹いっぱい。 [2009/11/26(木) 17:03:15 ] unix超ど素人です。 本を参照しても見つからないので、 質問させてください。 ちなみにここで推奨されてないcshを使っています。 例えば80.0というように小数点がある数字を 80といった整数に書き直すスクリプトをつくりたいのですが、 うまくいきません。 #!/bin/csh set y_info = 80.0 echo int($y_info) > aaa.dat どうすれば解決できますでしょうか?
637 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 17:23:05 ] 解決の第一歩は、cshを捨てる事だ。
638 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 17:24:52 ] >>627 スペースだけをクォートすればいい。シングルクォートの方がお勧め ls -ltr ??' '??-????.txt | tail -1
639 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 17:30:24 ] >>636 cshは捨てさせていただくので、shでどうぞ。 #!/bin/sh y_info=80.0 printf '%.0f¥n' $y_info
640 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 20:10:12 ] >>636 cshなら拡張子を削る機能が組み込まれてるので、 悪くないチョイスだよ #!/bin/csh set y_info=80.0 echo $y_inf:r > aaa.dat なんと :r を付けるだけで小数点以下を削れるんだぜ
641 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 20:11:11 ] echo $y_info:r > aaa.dat のミス
642 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 20:13:04 ] あと、csh スクリプトは #!/bin/csh -f にした方がなにかと幸せ
643 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 20:30:51 ] >>640 それだと、 .5 みたいに頭の 0が省略されてる小数で誤動作する。
644 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 20:34:08 ] >>640 (数値じゃなく)拡張子とみなして削る方式なら shでもできる。 #!/bin/sh y_info=80.0 echo ${y_info%.*} csh(笑)の出番なし。
645 名前:636 mailto:sage [2009/11/26(木) 21:13:03 ] >>640 うまくいきました トンクス 他の方もレスありがとうございます シミュレーションで得られたデータを出力する際にスクリプトを使用しています。 周りがcsh使ってたので、それを使ってましたが、 shの方が問題点が少なそうなので、 そっちにシフトしてみようと思います。
646 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 21:16:33 ] 半導体屋か? あいつら何でcsh好きなんだ?
647 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 21:19:13 ] >>640 だと四捨五入されない。>>639 がお勧め。
648 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 11:45:22 ] 以前にcshで作って、それですんでりゃそうなるだろう。
649 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 12:14:17 ] tcsh以外に便利なインタラクティブシェルがなかった時代の負債といえようか
650 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 12:33:23 ] ちょっとしたスクリプトの場合、cshの方が書きやすい場合もある。 四則演算が出来るとか配列が使えるとか、要はケースバイケース
651 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 12:38:06 ] >>650 四則演算も配列も、今時のsh(系)でできる。
652 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 12:46:50 ] ケースバイケースでcshスクリプトなんて混ぜられちゃ迷惑だ
653 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 13:18:36 ] コピペで数千行を超えるのcshスクリプト作るんだぜ。 ちょっとしたを遥かに超越している。
654 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 13:23:31 ] 実績があります、とか言ったりなんかしちゃったりして