1 名前:1様 [2009/04/03(金) 22:17:43 ID:0qFlvOW9] UNIX板のスレを見ている方も多数おられるかと思いますが、 まあそれはそれとして、BASHウゼーとか言われる心配なく 平和にLINUX的スクリプト談義しましょうよ。 初めての自作スクリプト、自信ないから見てください。な初心者から トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで いろいろな人に参加して頂けると嬉しいです。 perlやらPythonやらの話が混ざっても良いんでない? Part4 : pc11.2ch.net/test/read.cgi/linux/1210999497/ Part3 : pc11.2ch.net/test/read.cgi/linux/1184077033/ Part2 : pc11.2ch.net/test/read.cgi/linux/1154578200/ Part1 : pc8.2ch.net/test/read.cgi/linux/1121994321/ >>2-5 あたりに色々と。
706 名前:login:Penguin mailto:sage [2010/03/16(火) 18:17:49 ID:7rwiLleU] >>705 すみません、また後出しですが、一応言っておきます。 わざわざ変数 list に格納しているのは、後で自分が参照するからです。
707 名前:login:Penguin mailto:sage [2010/03/16(火) 22:36:09 ID:vMRJlqrh] はいはい次どぞー
708 名前:login:Penguin mailto:sage [2010/03/16(火) 22:41:29 ID:7rwiLleU] え、いいんですか?次
709 名前:login:Penguin mailto:sage [2010/03/20(土) 00:18:55 ID:qKxWTBVf] ファイルから丸括弧(開く) "(" だけの行を読み込んだ際、 if [ \( "$LINE" = "$CHK1" -o "$LINE" = "$CHK2" \) -a \( "$A" = "$B" -o "$C" = "$D" \) ]; then といったif文でエラーとなってしまいます。 何がまずいのでしょうか?
710 名前:login:Penguin [2010/03/20(土) 07:41:24 ID:SCWfCSZ4] >>709 if [ \( "x${LINE}x" = "x{$CHK1}x" だと通りませんか。
711 名前:login:Penguin mailto:sage [2010/03/20(土) 12:14:57 ID:qKxWTBVf] >>710 早速の回答、ありがとうございます。 マシンが平日しか使えないので、火曜日に試してみます。 ところで、$LINE="("の場合だと、 if [ \( "$LINE" = "$CHK1" \) ]; then だとエラーとなりますが、 if [ "$LINE" = "$CHK1" ]; then だとエラーとなりませんでした。 何か書き方が間違えているのでしょうか?
712 名前:login:Penguin mailto:sage [2010/03/20(土) 12:17:45 ID:qKxWTBVf] 連投すません。 どちらの書き方も、$LINE="(A"とかだとエラーとなりません。 "("の場合のみ、エラーとなります。 なんでだろ?
713 名前:login:Penguin mailto:sage [2010/03/20(土) 22:21:20 ID:7Z9+G9O/] 例外処理ってどうすればいいだろうか。 for x in ... do 処理A && \ 処理B && \ 処理C && \ continue # エラー? 後片付け、そして次のアイテム done サブルーチン化するもの手だけど、それも大袈裟な場合ってどうやるのがスマートだろうか。 すべてを && を繋げる方法しか思いつかない。。
714 名前:login:Penguin [2010/03/20(土) 22:33:44 ID:SCWfCSZ4] >>713 ttp://www.unix.com/shell-programming-scripting/38127-exception-handling.html に、 cleanup_script() { echo "Cleaning ..." } trap 'cleanup_script' ERR set -e ってコードがあったです。set -e が肝らしい。
715 名前:login:Penguin mailto:sage [2010/03/20(土) 22:43:49 ID:7Z9+G9O/] >>714 ありがとう。便利ですが、/bin/sh(DebianだとDASH)ではうまく動作しませんでした。 BASHなら問題ありません。 handler() { echo "Trap ERR!" exit 1 } set -e trap ?handler? ERR for x in $(seq 1 10) do echo $x [ $x -eq 5 ] && false done 実行結果: 1 2 3 4 5 Trap ERR!
716 名前:login:Penguin mailto:sage [2010/03/20(土) 22:47:11 ID:7Z9+G9O/] SIGUSR1 30,10,16 Term ユーザ定義シグナル 1 SIGUSR2 31,12,17 Term ユーザ定義シグナル 2 これを使うのもアリか...
717 名前:login:Penguin mailto:sage [2010/03/20(土) 23:28:40 ID:7Z9+G9O/] あともう一つ質問! #!/bin/sh echo $@ exit 0 というプログラムがあったとして(test.shとする)、 ./test.sh 'hoge' 'fuga' > fileA ./test.sh > fileB 'hoge' 'fuga' をすると、fileAとfileBの両方とも同じ結果になるんだけど、これはどう違うの?
718 名前:login:Penguin mailto:sage [2010/03/21(日) 01:59:46 ID:AC+zwoRf] シェルスクリプトで他のサーバにあるファイルを弄ることは可能ですか? 具体的には、 ローカルPC、サーバA、サーバBという3台のPCがありまして サーバA上の特定のファイルを編集してサーバBにアップロードし、さらにAにある他のファイルをBにアップロードする という処理をローカル上のシェルスクリプトで自動化したいのです。 しかしsshコマンドで他サーバに繋ごうとするとパスワードを聞かれる所で止まってしまいます。
719 名前:login:Penguin mailto:sage [2010/03/21(日) 02:04:15 ID:65tFCowN] つ公開鍵認証
720 名前:login:Penguin mailto:sage [2010/03/21(日) 02:11:15 ID:AC+zwoRf] なるほど…やはりそうなるのですね 公開鍵とやらを勉強することにします mysql -u root -prootみたいに指定できればいいのになぁ
721 名前:login:Penguin mailto:sage [2010/03/21(日) 02:16:36 ID:AC+zwoRf] というか、仮にsshで繋げたとしても 実行環境が他サーバに移るわけじゃないし他サーバのファイルをいじるのは無理なのかな? シェルスクリプトはcdコマンドの実行結果すら次の行に持ち込まないですよね 全ての実行行は独立したシェルで実行されるとか何とかで。
722 名前:login:Penguin mailto:sage [2010/03/21(日) 02:36:57 ID:65tFCowN] こんな感じで編集も転送もできる ssh -i 秘密鍵A ユーザ名A@Aサーバ "任意のコマンド(編集ならsedとかawk)" ssh -i 秘密鍵A ユーザ名A@Aサーバ "任意のコマンド(転送ならscp -i 秘密鍵B 編集したファイル ユーザ名B@Bサーバ:保存場所 )" エラー処理とかちゃんとしたいならAサーバに編集、転送用のスクリプト置いてクライアントからは引数だけ渡せばいいし
723 名前:login:Penguin mailto:sage [2010/03/21(日) 06:55:40 ID:s8pDEsGz] >>721 expectは?
724 名前:login:Penguin mailto:sage [2010/03/21(日) 09:41:21 ID:oiz+h8tr] >>721 >シェルスクリプトはcdコマンドの実行結果すら次の行に持ち込まないですよね #!/bin/sh cd /tmp ./hoge.sh 上記は/tmpに移動して、/tmpにあるhoge.shを実行するけど?
725 名前:login:Penguin mailto:sage [2010/03/21(日) 10:09:43 ID:s8pDEsGz] ssh host cd /tmp ssh host ./hoge.sh こんなアホをやっていると予想。 シェルスクリプトを予めscpで送っておくとか、標準入力の内容をスクリプトとして実効できたり出来ないんかね。
726 名前:login:Penguin [2010/03/21(日) 17:30:12 ID:cuEg7ODK] echo "( cd /tmp ; ./hoge.sh )" | ssh host でいいですよね。
727 名前:login:Penguin mailto:sage [2010/03/21(日) 17:55:39 ID:gIM4/doG] >>712 -x をつけて実行してみるとなんとなくわかるかも。 文字列の比較のときは710氏の方式で前後に固定文字を入れたほうが誤動作しにくい。 ただタイプミスだと思うけど、中括弧の位置が間違ってて if [ \( "x${LINE}x" = "x${CHK1}x" だけどね。
728 名前:login:Penguin mailto:sage [2010/03/21(日) 20:47:12 ID:NvA+aKwG] >>727 ありがとう。 固定文字列を入れて比較するのは、いいアイディアですね。 (なんで思いつかなかったんだろう…)
729 名前:login:Penguin mailto:sage [2010/03/24(水) 01:16:09 ID:fusHHN2e] お願いします。 ・forの入れ子構造ってOKなんでしょうか? #!/bin/bash #nekoneko.sh for var in aaa do for fstype in fs do hogehoge=neko done echo $var/$hogehoge done #sh nekoneko.sh aaa/neko 期待結果は得られているのですが、勉強中なのであっているかどうかがわかりません。 ・forでテキストファイルの読み込みってできないのでしょうか? dosのバッチで言うところの for /f %%a in (nekoneko.txt) do 〜のような方法です。 よろしくお願いします。
730 名前:login:Penguin mailto:sage [2010/03/24(水) 01:24:36 ID:KIBvvI04] >・forの入れ子構造ってOKなんでしょうか? OK >・forでテキストファイルの読み込みってできないのでしょうか? DOSのforはしらんが for a in `cat nekoneko.txt` でいいのか?
731 名前:login:Penguin mailto:sage [2010/03/24(水) 10:02:51 ID:qcQ/2FhI] >>729 インデントしようよ。 全角空白で書くけど、半角空白に変換してくれ。 #!/bin/bash for var in aaa; do for fstype in fs; do hogehoge=neko done echo $var/$hogehoge done ファイル読んで回すのは while read とか使うんじゃね。
732 名前:login:Penguin mailto:sage [2010/03/24(水) 12:47:43 ID:D4crZAMy] >>731 全角空白のインデントはやめろ! 半角空白のほうがいい お前の専ブラ変えろ馬鹿
733 名前:login:Penguin mailto:sage [2010/03/24(水) 12:51:42 ID:D4crZAMy] #!/bin/bash for var in aaa; do for fstype in fs; do hogehoge=neko done echo $var/$hogehoge done
734 名前:login:Penguin mailto:sage [2010/03/24(水) 12:58:21 ID:pFOtZDrD] 恥ずかしいね。
735 名前:login:Penguin mailto:sage [2010/03/24(水) 13:12:41 ID:D4crZAMy] usamimi.info/~linux/d/up/up0503.png usamimi.info/~linux/d/up/up0504.png 生ログにはタブと半角空白はきちんと記録されてるから。 素直に表示する専ブラで見れば奇麗にインデントされる。
736 名前:login:Penguin mailto:sage [2010/03/24(水) 13:18:59 ID:pFOtZDrD] おいおい、pre要素以外では連続する空白文字は一つにまとめられるのだが。 2ちゃんねるのデータ書式はウンコだけど、連続する空白文字をそのまま 表示する仕様なんてないぜ? そういうブラウザを押しつけるのはどうなの、って思うけど。
737 名前:login:Penguin mailto:sage [2010/03/24(水) 13:25:53 ID:qcQ/2FhI] >>732 うちの環境では半角空白でも見えるけど 相手の環境で見えるとは限らないから。
738 名前:login:Penguin mailto:sage [2010/03/24(水) 13:29:31 ID:pFOtZDrD] これはブラウザ依存だと思うね。 空白文字をそのまま扱うものもあれば、HTMLの仕様に準じて無視するものもある。 を使う手もあるのだが、これを同処理するかもブラウザ依存。 まあ2ちゃんねるがクソなんだが。
739 名前:login:Penguin mailto:sage [2010/03/24(水) 13:31:53 ID:KIBvvI04] おまいらスクリプトについても語ってやれよ・・・
740 名前:login:Penguin mailto:sage [2010/03/24(水) 13:37:19 ID:D4crZAMy] >>737 アンタ良い人だね。 でもな、コード貼る事が多いスレを見てるんなら閲覧者のほうでインデントするブラウザにしたほうがお互いに楽だぜ。 貼るほうもコピーする側もそのまま使えるんだから。うっかり全角空白入れたまま使う事もない。 スクリプトスレなら困る事少いかもだが、全角空白の入ったパッチ貼られたりしたら目もあてらんねぇよ?
741 名前:login:Penguin mailto:sage [2010/03/24(水) 13:39:50 ID:qcQ/2FhI] >>740 だから「変換してくれ」って書いたじゃん。 閲覧者の環境まで責任持てん。
742 名前:login:Penguin mailto:sage [2010/03/24(水) 13:40:45 ID:qcQ/2FhI] 良い人とかってよりも、portability を重視しただけだよ。 書く環境と読む環境が同じとは限らない。 こういう配慮はスクリプト書きもいっしょ。
743 名前:login:Penguin mailto:sage [2010/03/24(水) 13:48:01 ID:D4crZAMy] とりあえず「全角空白を推奨」するのだけは勘弁してくれ。 それが無きゃ俺も黙ってさ。
744 名前:login:Penguin mailto:sage [2010/03/24(水) 13:53:55 ID:qcQ/2FhI] 推奨なんてしてないよ。
745 名前:login:Penguin mailto:sage [2010/03/24(水) 14:04:24 ID:D4crZAMy] >インデントしようよ。 >全角空白で書くけど、半角空白に変換してくれ。 インデントは推奨してるが、改めて見直すと全角空白推奨ではないと言われたら確かにそうだな。 いきなり俺の言い方がきつかったのは謝る。数日前にム板で同じような事があってココでもか!と思ったもんだからついな。 すまんかった >ID:qcQ/2FhI
746 名前:login:Penguin mailto:sage [2010/03/24(水) 14:05:59 ID:eh1BmETO] 藻前ら、モティツケ /\⌒ヽペタン / /⌒)ノ ペタン ∧_∧ \ (( ∧_∧ (; ´Д`))' ))(・∀・ ;) / ⌒ノ ( ⌒ヽ⊂⌒ヽ .(O ノ ) ̄ ̄ ̄()__ ) )_)_) (;;;;;;;;;;;;;;;;;;;)(_(
747 名前:login:Penguin mailto:sage [2010/03/24(水) 15:40:14 ID:8MgVQE42] 全角文字やTABなどを記号で表示するようにしておけば、 そうそう事故はないのでは?jaspace.elとか便利だよ。
748 名前:login:Penguin mailto:sage [2010/03/24(水) 15:52:39 ID:c/AsI/YT] 学習用のネタとかならともかくパッチを 2ch に貼んのはやめたほうがいいんじゃね 書き込み確認のとこに 投稿者は権利の何もかもを管理者に無償譲渡することを承諾しますみたいなこと書いてあるぜ
749 名前:login:Penguin mailto:sage [2010/03/24(水) 16:12:14 ID:o3qxm3DD] どうしたんだ突然
750 名前:login:Penguin mailto:sage [2010/03/24(水) 18:28:22 ID:JGtYY8P/] find -exec command {} + はもっと知れ渡るべき 日経Linux
751 名前:login:Penguin mailto:sage [2010/03/24(水) 21:53:30 ID:LVpGQGYh] xargsに慣れちゃって、手が勝手に打っちゃうんだよな
752 名前:login:Penguin mailto:sage [2010/03/25(木) 00:42:02 ID:AS83wWPj] >>730 hww
753 名前:login:Penguin mailto:sage [2010/03/25(木) 05:46:35 ID:bk8Jf0RP] ちゃんと理解しながら読んでいればインデントなんて枝葉末節。 自分のコードならばこだわるかも知れないけどね。
754 名前:login:Penguin [2010/03/25(木) 07:38:08 ID:woPIYugI] >>728 UNIX板で知った ttp://www.opengroup.org/onlinepubs/009695399/utilities/test.html の、APPLICATION USAGE から先が勉強になったです。 -a や -o より && や || でつなぐ方がよいとか。お題の部分についてはこれ。 test "$1" = "bat" -a "$2" = "ball" syntax errors occur if $1 evaluates to '(' or '!'. One of the following forms prevents this; the third is preferred: test "X$1" = "Xbat" -a "X$2" = "Xball" test "$1" = "bat" && test "$2" = "ball" test "X$1" = "Xbat" && test "X$2" = "Xball"
755 名前:login:Penguin mailto:sage [2010/03/25(木) 10:18:07 ID:Bu4gYkWT] >>750 man find したら、-exec command {} +の下に -execdir command とか -execdir command {} + とかを見つけた。勉強になった。 こういう事があると電子辞書より紙の辞書の方がいいかもと思う。
756 名前:login:Penguin mailto:sage [2010/03/25(木) 23:03:23 ID:AS83wWPj] >>753 とかほざく輩に限ってテストパターンは無限大な開放系のソースを書いちゃうの。 要はモデル化ができてないと。愚直というか馬鹿正直と言うか。
757 名前:login:Penguin mailto:sage [2010/03/25(木) 23:09:11 ID:P4/zjZQS] >>745 お前いいやつだなw
758 名前:login:Penguin mailto:sage [2010/03/26(金) 03:02:23 ID:y6rsP+OO] >>756 読解力ないんだな(プ
759 名前:login:Penguin mailto:sage [2010/03/26(金) 07:00:58 ID:joqM+Eq0] >>758 より多くの人に読解できることを目的にしていないロジックはオナニーだろう。
760 名前:login:Penguin mailto:sage [2010/03/26(金) 07:13:10 ID:jyaRuxPh] つまり日本語はオナニー
761 名前:login:Penguin mailto:sage [2010/03/26(金) 07:49:22 ID:WwpVuIlf] セックスよりも気持ちいい
762 名前:login:Penguin mailto:sage [2010/04/02(金) 15:42:26 ID:la5bZF10] bashなどで標準出力はデフォルトで画面となっていますが、具体的にはどのファイルになりますか? debianですと/dev以下にあるのだと思いますが。
763 名前:login:Penguin mailto:sage [2010/04/02(金) 16:00:38 ID:FvuB/nMw] >>762 ls -l /proc/$$/fd/1
764 名前:login:Penguin mailto:sage [2010/04/05(月) 20:18:53 ID:HX4Ssz6U] フラシュメモリ をマウントするとき # mount /dev/sdb1 /mnt/usb こんな感じでやると思いますが、 もし、フラシュメモリが挿されていて、かつ、マウントされていない場合これを実行し その他の場合、実行しないという、シェルスクリプトを教えてください
765 名前:login:Penguin mailto:sage [2010/04/05(月) 20:31:37 ID:hbFmdj3V] >>764 問題点は ・フラッシュメモリがささってないことをどうやって判定するか ・マウントされていないことをどうやって判定するか でしょ。 それシェルスクリプトの話じゃないよ。
766 名前:login:Penguin mailto:sage [2010/04/05(月) 21:02:20 ID:HX4Ssz6U] >>765 やはり無理ですか、 ・フラッシュメモリがささってないことをどうやって判定するか ・マウントされていないことをどうやって判定するか ここは、Cか何かで実装し、結果によって、振る舞いを決めるしかなさそうですね
767 名前:login:Penguin mailto:sage [2010/04/05(月) 21:12:06 ID:8DwAi4Rq] /dev/disk/by-uuid/ 見てそのUSBメモリがささってるか判定して マウントは /proc/mounts とか /etc/mtab 見ればわかる
768 名前:login:Penguin mailto:sage [2010/04/05(月) 21:58:19 ID:HX4Ssz6U] >>767 できました、ありがとう。 それにしても >それシェルスクリプトの話じゃないよ。 とは・・・・
769 名前:login:Penguin mailto:sage [2010/04/05(月) 22:26:27 ID:bIAGjuYt] え、どこがシェルスクリプト?
770 名前:login:Penguin mailto:sage [2010/04/05(月) 22:26:30 ID:V3kmV0qU] シェルの機能に全く関係ない話だから、スレ違いと言われても仕方ない
771 名前:login:Penguin mailto:sage [2010/04/05(月) 23:04:52 ID:10PWkAma] >>769-770 君たちはきっとUNIX板のシェルスクリプトスレのほうが馴染むよ 向こうに移ったら?
772 名前:login:Penguin mailto:sage [2010/04/05(月) 23:09:37 ID:Do3l7NFE] シェルの文法と組み込みコマンド以外は スレ違い。
773 名前:login:Penguin mailto:sage [2010/04/06(火) 00:29:43 ID:cl/KUIMr] そこまでは言わないけどさ、 >>764 のスクリプトって >>765 && mount /dev/sdb1 /mnt/usb で終わりじゃん。 あとは >>765 の条件をどう書くかだけ。 そこはシェルスクリプトの話じゃない。
774 名前:login:Penguin mailto:sage [2010/04/06(火) 23:07:19 ID:hKo4mn1/] 退屈すぎるんだよ ただ手順を羅列していくだけの命題はこのスレではシェルスクリブトではない判定
775 名前:login:Penguin mailto:sage [2010/04/08(木) 12:37:33 ID:FdKyqazj] /path//mydirというディレクトリが確かに存在します。 rm -rf path/mydir とすれば削除できるのに if [-d /path/mydir ]; then rm -rf path/mydir とすると削除できません。 何故でしょうか。
776 名前:login:Penguin mailto:sage [2010/04/08(木) 12:49:32 ID:BdM60+Gl] すばやくシェルスクリプトを作る方法を教えてください。
777 名前:login:Penguin mailto:sage [2010/04/08(木) 13:03:15 ID:ahHfR+UP] >>775 if [ -d /path/mydir ]; then rm -rf /path/mydir
778 名前:login:Penguin mailto:sage [2010/04/08(木) 13:11:54 ID:YRM82Sus] >>776 俺は指におもりをつけて毎日8時間訓練している。 だいぶ重いスクリプトも楽々書けるようになった。 でもやり過ぎには注意な。 知り合いに、焦点性ジストニアになってシェルスクリプターへの道を絶たれたやつが何人も居る。
779 名前:login:Penguin mailto:sage [2010/04/08(木) 15:13:49 ID:FdKyqazj] 揚げ足はいいからさっさと答えろボケ
780 名前:login:Penguin mailto:sage [2010/04/08(木) 15:21:34 ID:0e8PS1D/] まず服を(ry
781 名前:login:Penguin mailto:sage [2010/04/08(木) 15:24:54 ID:rTqLBiaG] >>779 問いが支離滅裂なので回答不能です
782 名前:login:Penguin mailto:sage [2010/04/08(木) 15:27:17 ID:ahHfR+UP] >>779 ん? >>777 じゃ違った? んじゃ権限まわりを確認。
783 名前:login:Penguin mailto:sage [2010/04/08(木) 16:01:31 ID:P25bssZd] いきなりifとrmまとめずに if [-d /path/mydir ]; then echo hoge がhogeを出力するかどうかぐらい切り分けしようぜ。
784 名前:login:Penguin mailto:sage [2010/04/08(木) 16:03:13 ID:ahHfR+UP] >>783 [ と -d は離さないとだめだよ。
785 名前:login:Penguin mailto:sage [2010/04/09(金) 16:33:43 ID:8l460jgK] 最近の初心者は、[ も一つのコマンドであることすら知らんのか?
786 名前:login:Penguin mailto:sage [2010/04/09(金) 16:36:53 ID:wbxQcOPK] 昔の初心者もそうだよ。
787 名前:login:Penguin mailto:sage [2010/04/09(金) 17:26:28 ID:ZKESoIes] おじいちゃん、乙!
788 名前:login:Penguin mailto:sage [2010/04/09(金) 19:57:43 ID:1H+gjPy/] [ ってコマンドだったの? 玄人だけど始めて知ったよ?orz
789 名前:login:Penguin mailto:sage [2010/04/09(金) 20:04:23 ID:5ssP89Ht] LPICレベル3coreに受かったばかりの素人だけど []はtestコマンドの略式じゃなかったかな
790 名前:login:Penguin mailto:sage [2010/04/09(金) 20:26:24 ID:wbxQcOPK] >>788 type [ help [
791 名前:login:Penguin mailto:sage [2010/04/09(金) 20:27:45 ID:i0zzyora] >>788 コマンドじゃないなら何なんだよ
792 名前:login:Penguin mailto:sage [2010/04/09(金) 22:04:47 ID:+RKMLUfB] >>791 構文。 C言語の == は関数ではないし。
793 名前:login:Penguin mailto:sage [2010/04/09(金) 22:06:05 ID:StH4VNmO] 昔は、[ は test へのハードリンクと決まってたもんだが、 いま手元のFedora 12を見たらそうじゃなかった。(ファイルサイズも違うし…) やっぱり日々勉強ですな。
794 名前:login:Penguin mailto:sage [2010/04/09(金) 22:10:28 ID:wbxQcOPK] >>793 coreutils の lbracket.c 読んでみ。
795 名前:login:Penguin mailto:sage [2010/04/09(金) 22:27:52 ID:StH4VNmO] >>794 読んだ。 面白いけど、Coolとは言えんなぁ…
796 名前:login:Penguin [2010/04/10(土) 23:41:09 ID:IGsQWo8s] grepで検索行以外の行を抽出する方法は無いでしょうか?
797 名前:login:Penguin mailto:sage [2010/04/11(日) 00:27:05 ID:eH4Novr7] grep -v '文字列'
798 名前:login:Penguin [2010/04/11(日) 00:34:34 ID:3KDsWIIS] >>797 ありがとう
799 名前:login:Penguin mailto:sage [2010/04/11(日) 16:13:06 ID:1yJmv1GD] 初めてシェルスクリプトを加工としていまうs サブルーチンを作る参考にしようと#!/bin/shなファイルを見ているんですが 関数を使ったスクリプトはほとんどありません こういうものでしょうか? 任意の値を返せないのでグローバルな変数を介する必要があると思いますが 保守性が低下しないうまい定義の仕方というのはあるんでしょうか あるいは関数を使わなくてもいいようなシェルスクリプトの特有のコンセプト とか書き方があるんでしょうか 漠然とした質問ですいません
800 名前:login:Penguin mailto:sage [2010/04/11(日) 16:21:22 ID:ESnWs44w] 漠然としてるねぇ。 もうちょっとスクリプト書きに慣れてから考えればいいんじゃないかな。
801 名前:login:Penguin mailto:sage [2010/04/11(日) 17:04:57 ID:btbPPhym] いやそれより、初心者向きの参考書でも買って 一からじっくり勉強した方が良いと思う。 >>799 は、ここで質問して解決するスキルレベルに程遠い。
802 名前:login:Penguin mailto:sage [2010/04/11(日) 17:49:36 ID:O63F6ul8] >>801 さんまじかっけー
803 名前:login:Penguin mailto:sage [2010/04/11(日) 20:21:58 ID:bAKRtVTC] >関数を使ったスクリプトはほとんどありません >こういうものでしょうか? いえ。 ただ、スクリプトは、 1) 手っ取り早く仕上げる事が多いので十分に最適化されない 2) 最適化されたスクリプトは必ずしも可読性がよくないので敢えて最適化しない といったことはあると思います。
804 名前:login:Penguin mailto:sage [2010/04/11(日) 20:51:15 ID:eH4Novr7] わざわざ外部関数までつくって何でもシェルスクリプトでやるより多言語から単体のシェルスクリプト叩かせたほうが安心できる
805 名前:login:Penguin mailto:sage [2010/04/12(月) 01:55:25 ID:56zfLj4c] >>803 回答ありがとうございます 最適化というのがどういうものか具体的には分かりませんが、例えば関数を組み合わせようと すると値をやり取りするグローバル変数が必要になるのではと考えました。しかし、必要に なるごとに関数内で定義、参照するとそういった変数がどこでどう利用されているか確認しなければ ちょっとした変更も危険になると思います。あるいはメインの手続き側に定義を羅列するとしても どう利用するのかはコメントでもしないかぎり分からないし、そもそも構造内部を関数へと段階的に 隠蔽する目的を果たせなくなってしまい、やはり可読性保守性は低下します。一方でルールベース の対策でこういった問題を解決できるようにも感じたので、そういったことについてベーシックな議論を している人たちがいるのではと思い質問しました。 しかしこのスレッドを読んでいると>>803 (1)や>>804 にあるように、そういう道具だと割りきって使う ものだという風にも思いました。シェルスクリプトの欠点を何千万人もの人があえて見なかったこと にして使っているとすると、とても面白いことですね。それだけ目的を満足させる道具で、また知っ て初めて分かる魅力があるということなんでしょうかね (2)については一枚目から鱗が落ちました。習作のつもりでUTF8のテキストをEUC-JPに変換して からa2psでポストスクリプトを生成するコードを再発明しているのですが、たしかに関数を使っても 全然読みやすくなっていない! いや、正確には処理の始点と大枠の処理の流れは把握しやすく なっていますが、コード量は後付けでどんどん増加するし、ちょっとした読みやすさのために定義 したマクロ的関数は、それ単体でみるとなんとも得体の知れないものになっていました。 色々な機能を試したいというのもあるのですが、やはり簡潔で読みやすいコードを書くということを 前提にして、そのうえでシェルスクリプトらしい書き方を身につけるようにします
806 名前:799,805 mailto:sage [2010/04/12(月) 02:02:53 ID:56zfLj4c] 勢いでいい子ちゃんぶった嘘をつきました・・ たぶん動けば汚くてもいいやの精神でなんだかよく分からないコードを書き続けると思います ゴメンナサイです
807 名前:login:Penguin mailto:sage [2010/04/12(月) 11:43:55 ID:Qe0ukjkj] /usr/binの中に'['とかゴミがあったので削除したら、起動しなくなったという 笑い話をよく聞いたな。
808 名前:login:Penguin mailto:sage [2010/04/12(月) 12:14:55 ID:Cm3bm4a3] >>807 ほう、それは初耳だ。 いまどきの sh は [ を内蔵しているので、 外部コマンドの [ を意図して呼ばないかぎり存在しなくても問題ない。 [ が外部コマンドだった昔は、[ は /usr/bin ではなく /bin にあった。 # つーか、/usr/bin/[ なんて今でも linux だけ。
809 名前:login:Penguin mailto:sage [2010/04/12(月) 13:13:25 ID:s3PYGw84] ここはLinux板ですから
810 名前:login:Penguin mailto:sage [2010/04/12(月) 13:31:44 ID:FrL0zKPd] 「[ を消してうんぬん」は Linux 以前の時代の話だと思う。
811 名前:login:Penguin mailto:sage [2010/04/12(月) 18:27:16 ID:rk0wy3GT] プロプラの古いshを使ってないと通じないジョークだな
812 名前:799 mailto:sage [2010/04/17(土) 23:26:31 ID:f4tmK5PF] 先だっては大変お世話になりました なんとか動くっぽいもの書けました 根本的に間違ってるところやイディオムに直すべきところなど多々あるんだろうと 思うんですが、身近に聞ける人がいなくて困ってます。ので誰かにレビューして欲しいです なにとぞ、なにとぞー up.af/015849
813 名前:799 mailto:sage [2010/04/17(土) 23:38:16 ID:f4tmK5PF] すんません私のファイルはこっちでした 上のTシャツおっぱいは忘れてください^^ up.af/015867
814 名前:login:Penguin mailto:sage [2010/04/17(土) 23:41:35 ID:xq8djkPZ] わざ。わざ
815 名前:login:Penguin mailto:sage [2010/04/18(日) 13:57:11 ID:XFWJRzoK] 献上品のTシャツおっぱいが404なので眺めるだけな >#!/bin/sh dashで動作確認したのなら素直に#!/bin/dash > file_num=`expr $file_num + 1` exprいらなそう file_num=$((file_num + 1)) > local num=0 > for num in `seq 1 $file_num`; do > source_files_get $num > MESSAGE "converting: $file" > cat "$file" | $NKF -e > "$temp_dir/${file##*/}" > done seqとcatいらなそう local num=1 while [ $num -le $file_num ]; do source_files_get $num MESSAGE "converting: $file" $NKF -e "$file" > "$temp_dir/${file##*/}" num=$((num + 1)) done >local status=1 local使う意味なし&多分bashでコケる
816 名前:login:Penguin mailto:sage [2010/04/19(月) 01:23:48 ID:ZAvND9//] >>815 式展開というものが色々あるんですね むやみに外部コマンドを呼ばないという発想もなかったです マニュアルを引いてあれこれ確認したいと思います レスありがとうございました
817 名前:login:Penguin mailto:sage [2010/04/21(水) 22:02:51 ID:CZfDlwcf] >>813 python風のループだな。 LLみたいに関数を使いたければ値をやり取りするフレームワークを書けばよいかも。
818 名前:login:Penguin mailto:sage [2010/04/22(木) 23:27:27 ID:eajRO0wt] commandA > file commandB > file と { commandA; commandB; } > file はどっちの方がいいの? 後者の場合は、シェルによってはサブシェルが起動するって聞いたけど本当貝。
819 名前:login:Penguin mailto:sage [2010/04/22(木) 23:48:35 ID:sUoTjkov] >>818 上意味違うだろ。
820 名前:login:Penguin mailto:sage [2010/04/22(木) 23:52:47 ID:eajRO0wt] 間違えた! 前者は commandA > file commandB >> file
821 名前:login:Penguin mailto:sage [2010/04/23(金) 00:01:08 ID:sUoTjkov] 正直、目くそ鼻くそじゃね?
822 名前:login:Penguin mailto:sage [2010/04/23(金) 00:03:10 ID:4U7Ovp/A] そう? じゃあ気にしないでいいか。
823 名前:login:Penguin mailto:sage [2010/04/23(金) 00:10:54 ID:Odx5g+6A] 悩んでるうちに書いて実行した方が仕事は早く終わるだろ。
824 名前:login:Penguin mailto:sage [2010/04/23(金) 05:48:09 ID:0SL93pt/] >>818 後者のほうが効率いい
825 名前:login:Penguin mailto:sage [2010/04/24(土) 12:19:07 ID:uV1EwGDC] >>824 スクリプトの一文が長すぎる。 パイプラインもメンドイ。
826 名前:login:Penguin mailto:sage [2010/04/24(土) 22:06:24 ID:F/lhQSxk] >>818 前者の場合、commandAの出力はどうなるのかな?w
827 名前:login:Penguin mailto:sage [2010/04/24(土) 22:21:58 ID:loCBys/t] ↑ 大丈夫かな、この人・・・
828 名前:login:Penguin mailto:sage [2010/04/24(土) 22:57:54 ID:XH+rWnSs] 笑っとけ笑っとけ。
829 名前:login:Penguin mailto:sage [2010/04/24(土) 23:02:02 ID:/2NBYvX3] >>826 修正してるじゃないか、 >>820 で
830 名前:login:Penguin mailto:sage [2010/04/24(土) 23:03:08 ID:loCBys/t] 恥ずかしいね
831 名前:login:Penguin mailto:sage [2010/04/24(土) 23:51:55 ID:ra/w56Dm] >>825 あれで長いって、普段どんなスクリプト書いてんだ?
832 名前:login:Penguin mailto:sage [2010/04/25(日) 09:35:32 ID:iXPvNLwg] >>831 いや、引数が100個とかになってきたら。 潰しが利かない。
833 名前:login:Penguin mailto:sage [2010/04/25(日) 09:37:17 ID:pW61wlqY] 意味不明
834 名前:login:Penguin mailto:sage [2010/04/25(日) 09:39:20 ID:iXPvNLwg] >>833 脊髄じゃなく、脳で考えてください。
835 名前:login:Penguin mailto:sage [2010/04/25(日) 10:09:49 ID:ZtdJByaw] その価値のある文章を頼む。 引数とはどの部分の引数なのか? 潰しが利かないという主張の根拠は?
836 名前:login:Penguin mailto:sage [2010/04/25(日) 10:39:21 ID:MLqGsd45] これ以上この話を続けても有益な情報は得られないと思う。
837 名前:login:Penguin mailto:sage [2010/04/25(日) 11:27:46 ID:iXPvNLwg] >>818 commandA > file commandB >> file と { commandA; commandB; } > file コマンドが100個になったのでwhileで省力化したい。 上の方 rm -f file 2>/dev/null while read cmd;do $cmd >> file done < cmds.txt 下の方 xargsを使えば出来そうだけど{}が内部コマンドなのが気になる。 1行のコマンドラインの文字数制限があるシェルもある。 ので、汎用性が無い。
838 名前:login:Penguin mailto:sage [2010/04/25(日) 11:34:27 ID:iXPvNLwg] 制御構造の使えないシェルスクリプトなんて、バッチファイルの如く、無価値である。
839 名前:login:Penguin mailto:sage [2010/04/25(日) 11:37:39 ID:GR3waYM0] >>837 よくわかんねえけど そのcmd.txtって、事実上シェルスクリプトだよな 単に sh cmd.txt >file でいいんじゃねえの
840 名前:login:Penguin mailto:sage [2010/04/25(日) 11:46:22 ID:gQNuPSjh] wwww
841 名前:login:Penguin mailto:sage [2010/04/25(日) 11:49:42 ID:iXPvNLwg] >>839 そだな。それが最適解だ。
842 名前:login:Penguin mailto:sage [2010/04/27(火) 22:06:55 ID:HNWNlh/r] for((i=0; i<6; i++)){ array=("${array[@]}" "i") } echo "${array[@]}" これを実行すると下記のように出力されます。 0 1 2 3 4 5 カンマ区切りで下記のように出力する方法ありますか? 0, 1, 2, 3, 4, 5
843 名前:login:Penguin mailto:sage [2010/04/27(火) 23:08:31 ID:3UTvz9hd] >>842 最後の出力を実現するのなら seq -s ', ' 0 5 で済むけど、 配列の各要素を任意の区切文字で繋げて出力する方法を知りたいということかな zsh/ksh なら echo ${(j:, :)array} でできるけど、bash でどうなのかは知らない
844 名前:login:Penguin mailto:sage [2010/04/27(火) 23:18:40 ID:HNWNlh/r] >>843 説明不足で申し訳ないです。 配列の各要素をカンマ区切りで出力する方法です。 ・訂正します array=(1 2 a b 3 c ) echo "${array[@]}" これを実行すると下記のように出力されます。 1 2 a b 3 c カンマ区切りで下記のように出力する方法ありますか? 1, 2, a, b, 3, c echo ${(j:, :)array} は使えませんでした。
845 名前:login:Penguin mailto:sage [2010/04/27(火) 23:37:13 ID:wOLuHHkh] >>844 IFS="," ; echo "${array[*]}"
846 名前:login:Penguin mailto:sage [2010/04/28(水) 10:15:03 ID:ttzp8AMm] echo "${array[@]}" | sed 's/ /, /g'
847 名前:844 mailto:sage [2010/04/28(水) 11:26:50 ID:+626EOW1] >>845-846 できました!ありがとうございました。