- 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あたりに色々と。
- 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
できました!ありがとうございました。
|

|