1 名前:名無しさん@お腹いっぱい。 mailto:sageteoff [2015/08/14(金) 23:42:01.51 .net] シェルスクリプトの総合スレです。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。 FreeBSDユーザは/bin/shの正体がashなので注意。 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。 src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/ heirloom.sourceforge.net/sh.html ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) ・シェルスクリプトのことをシェルってゆーな □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも awkまたはperlの方が適した処理にはそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 □回答者への注意事項: ・シェルスクリプトでの処理方法を質問しているのに、よくわからずに 「そういうのはperl使いましょう」と回答するのはやめましょう。 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。 前スレ シェルスクリプト総合 その24 peace.2ch.net/test/read.cgi/unix/1415634843/
122 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/29(木) 04:20:02.34 .net] 教えを乞うてるくせにお腹いっぱいなのが気にくわない。
123 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/29(木) 06:23:24.26 .net] unixの管理をしています。 ユーザーはソフトのインストール禁止ですが、 最近、ユーザーでも自分のホームフォルダーにソフトをコピーし、 X権限をすることによってソフトが実行できてしまうことが判明しました。 これはOSのセキュリティーボールではないのでしょうか? ユーザーのフォルダーではたとえX権限がされていても 実行できないようなおすすめのunixって何ですか? 必要ならカーネルにバッチを当てる方法も、やもうえません。
124 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/29(木) 07:39:00.78 .net] >>119 お腹いっぱいとは?
125 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/29(木) 08:29:26.09 .net] 名前じゃね
126 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/29(木) 09:02:26.07 .net] シェルスクリプトっていう性質上、ある程度仕方ない面もあるけども 最近は余りにもスレ違いな話題が多くないか?
127 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/29(木) 10:15:07.66 .net] スレ違いでも板違いでもかまってもらえるからな
128 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/29(木) 11:15:37.67 .net] >>120 お前脳みそついてなくてUnix使ってんのか? Windowsでも使ってろよ 希望してることができるから
129 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/29(木) 12:04:46.30 .net] コピペに釣られんな
130 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/29(木) 22:18:02.02 .net] >>123 >>123
131 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/30(金) 11:01:24.94 .net] >>124 軌道修正したレスができるなら相手して構わないんだけど、自演が疑われるような受け売り回答って不要だよな。
132 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/01(日) 13:31:00.57 .net] ${@:+"$@"}という変数の記法がわかりません たとえば/usr/bin/sensible-browserでは /usr/bin/x-www-browser ${URL:+"$URL"} のように使われています なぜこう書くのかヒントをいただけたら…
133 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/01(日) 14:16:24.02 .net] man bash Parameter Expansion の項(日本語訳では パラメータの展開 の項) を見るよろし。てか
134 名前:エがしょっちゅう見直すとこだわソレw [] [ここ壊れてます]
135 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/02(月) 12:13:01.41 .net] ポータビリティーの話( "$@"; が 何も無し にならないで、""; と解釈されてしまう対策の事 )が参考になるかな What does ${1+"$@"} mean? www.in-ulm.de/~mascheck/various/bourne_args/ Autoconf www.geocities.jp/fut_nis/html/autoconf-ja/Shell-Substitutions.html#Shell%20Substitutions # 例えば、 $URL が未定義や、ヌルなら /usr/bin/x-www-browser "$URL" # は、この様な意味になるが /usr/bin/x-www-browser "" /usr/bin/x-www-browser ${URL:+"$URL"} # は、こうなる /usr/bin/x-www-browser test.sh 引数の数に違いが出る(bash の方で理解しやすいので #!/bin/bash で) #!/bin/bash -vx foo="hoge" bar="" bash -vxc 'echo "$#, " "$@"' "dummy" "$foo" bash -vxc 'echo "$#, " "$@"' "dummy" "$bar" bash -vxc 'echo "$#, " "$@"' "dummy" "$baz" bash -vxc 'echo "$#, " "$@"' "dummy" ${bar:+"$bar"} bash -vxc 'echo "$#, " "$@"' "dummy" ${baz:+"$baz"}
136 名前:129 mailto:sage [2015/11/02(月) 14:09:15.67 .net] >>130 アドバイスありがとうございます。自分もよくそこ見ます 環境はlinuxのbashなのですが、"$@"と書いておけば ${@:+"$@"}と結果的に同じになるはずなのに わざわざ後者のように書くのはどうしてかなと疑問に思った次第です
137 名前:129 mailto:sage [2015/11/02(月) 14:12:02.34 .net] >>131 有益な情報ありがとうございます なるほど"$@"が""になってしまうことがあるためなのですね 違いを確認するためのスクリプトまで用意していただいて感謝です おかげで長い間疑問だったことが氷解しました /usr/bin/sensible-browserは、#!/bin/shですし ポータビリティを十分に考えて作られているわけですね なぜAdobeのacroreadなどでも使われているか納得できました とっても勉強になりました
138 名前:131 mailto:sage [2015/11/03(火) 18:32:53.39 .net] >>133 > ポータビリティを十分に考えて作られているわけですね /usr/bin/sensible-browser は、Debian 系で使われているスクリプトのようなので dash で動けば十分でしょう ポータビリティのサイトは参考になるかと貼りましたが、${1+"$@"} と違って /usr/bin/x-www-browser ${URL:+"$URL"} の場合、関係無いかと思います 念の為 dash 等で内容がヌルの場合に、"$URL" と、 "$@" で展開の結果に違いが有る事を、強調しておきます LANG=C PAGER='less -p "Special Parameters"' man dash > @ Expands to the positional ...略... If there > are no positional parameters, the expansion of @ generates > zero arguments, even when @ is double-quoted.
139 名前:名無しさん@お腹いっぱい。 [2015/11/04(水) 10:19:47.91 .net] ADB shellを使ってるのですが.shで保存したadbのスクリプトを順番に実行させることって可能ですか? 例えばダブルクリックした時点で1.shが動いて〜10秒後に2.shを動かして〜というような感じにしたいです。 お力貸していただけると幸いです。
140 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/04(水) 12:50:56.08 .net] ADB shellを実行するのがWindowsかlinuxによってバッチかシェルスクリプトかでわかれるが、 最初に/data/local/tmpあたりに転送して、chmodして、それをwait含めて実機で実行するのが 良いんじゃないの。 何をやりたいのか書いてないのでアレだが、操作する側で10秒開けるのか、実機で10秒ウェイトするのか。 あと、なぜ10秒あける必要があるのか、10秒後までに実行した端末で何が起きているのか、 その判定は必要なのか、などを考える必要があるし、 さらには泥のことをよく理解できてないオッサンたちが、こういう話題は、ここではスレチじゃね? と煽ってくるので、飛来するオッサンたちを黙らせる技術も必要とされる
141 名前:名無しさん@お腹いっぱい。 [2015/11/04(水) 13:12:49.86 .net] すみません 記述が足りてないようでした。 現在はwindowsでbatファイルを利用してuwscというフリーソフトを使って1.batを起動させて〜10秒後に2.batといった具合にやってます。 最近linuxでも開発を始めたいと思い同じようなことがしたいです。 シェルスクリプトでwindowsでやってるuwscのような制御ができないかなぁと思って質問させていただきました。 そんなめんどくさいことするよりlinuxならこのフリーソフト使って制御しとけみたいなのがあれば 教えていだだけると幸いです。
142 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/04(水) 13:15:27.82 .net] >uwscというフリーソフトを使って1.batを起動させて〜10秒後に2.batといった具合に この10秒後に、という処理自体をbatでやればいいんじゃないの? なぜuwscを挟む必要があるの?
143 名前:名無しさん@お腹いっぱい。 [2015/11/04(水) 13:29:28.23 .net] >>138 おっしゃる通りなのですがcallを使って次のbatを呼び出すことよりも先にツールを使って呼び出すことを覚えてしまったもので・・・ 独学でやってるうえに無知な状態からまだ2ヶ月くらいしか経ってないものでこのスレのレベルの方からしたら程度が低い質問かもしれませんが他に聞けるような環境がないもので;;
144 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/04(水) 13:33:00.98 .net] あとは、何をやりたいのか具体的に書くしか ちなみにゲームの自動制御とか、その手の話だったら俺は降りる
145 名前:飛来したオバハン mailto:sage [2015/11/04(水) 13:33:27.01 .net] アンタ泥とかwindowsとかイタチじゃないの?
146 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/04(水) 17:24:19.98 .net] PATH の dirctory に無いスクリプトは、相対、絶対パスで起動するか、PATH に追加する 例えばカレントディレクトリのスクリプトは、 ./script.sh で起動出来る ダブルクリックで起動するには、 .desktop ファイル作る #!/bin/sh ./1.sh sleep 10 ../2.sh /home/username/bin/3.sh PATH="/home/username/bin:$PATH" 4.sh PATH=".:$PATH" 1.sh
147 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/04(水) 17:24:50.70 .net] 又は、android 上で launcher.sh を書いておいて起動する それをアプリから起動するなら、GScript Lite とか使うんや。よー知らんけど #!/system/bin/sh ./1.sh sleep 10 ./2.sh ついで @echo off call 1.bat ping localhost -n 11 > nul call 2.bat
148 名前:名無しさん@お腹いっぱい。 [2015/11/04(水) 21:13:41.29 .net] みなさんありがとうございました。すこし足がかりが得られました。 やっぱりlinuxのほうが軽くて動作も安定してる感じなのでこれからはlinux中心にデバッグを行っていけたらと思います。
149 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/08(日) 19:54:14.49 .net] echoで\tを出力してるんだけど raspbianだとTABに置き換わってるんだけど Sientific Linuxだと\tのままなんだけど何でかわかる? シェルスクリプトをそのまま持っていって実行したら そんな感じになってた・・・
150 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/08(日) 20:08:08.87 .net] シェルスクリプトと違って、シェルの話だと思う echo の違いではない? man dash echo [-n] args... If any of the following sequences of characters is encountered during output, the sequence is not output. Instead, the specified action is performed: man bash echo [-neE] [arg ...] -e オプションを指定した場合、以下に示す、バックスラッシュの エスケープ文字が解釈されるようになります。
151 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/08(日) 20:14:18.70 .net] シェルスクリプトのポータビリティーの話とも言えるか... 訂正
152 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/08(日) 20:37:50.28 .net] ありがとうございます 確か実装したときにecho -eオプションは使っていたのですが raspbianの/bin/shで実行すると echo -e "test\ttest" が -e test test になってしまっていろいろ試した挙句 -eいらないじゃんってことになったのを思い出しました
153 名前:。は双方とも/bin/shを使っているのですが 上記のようになるのはraspbianの/bin/shだけで /bin/bashを使うと双方とも期待したとおりの結果になりました どこかのデストリのいずれかのシェルが 実は利用者が意識してるもの(パスが示すもの)と違うというのを 見た覚えがあるのですがraspbianの/bin/shだったかは思い出せません 継続して調べてみますが取り急ぎありがとうございました [] [ここ壊れてます]
154 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/08(日) 22:14:22.18 .net] echo じゃなくて printf 使うとか printf 'TAB\tTAB\n' # 少なくとも dash/bash/zsh では printf は shell の builtin function そういや、ファイルの中に -n だけの行があって、 cat hoge.txt | while IFS= read str do echo "$str" done ってしたらその行が出力されなくてハマったことがあった…
155 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/09(月) 12:53:41.77 .net] >>149 どうやって回避したの?参考までに知りたい
156 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/09(月) 18:25:32.86 .net] え? 単に printf '%s\n' "$str" ってしただけだよ
157 名前:名無しさん@お腹いっぱい。 [2015/11/09(月) 22:29:31.56 .net] echoはposixでその動作が決まってるわけじゃないから 移植性重視ならprintf安定 とorilyに書いてあった
158 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/11(水) 18:21:45.18 .net] 1週間位試行錯誤するもうまくいかないから、ここで必要質問しようと思ったら 単にファイル名にスペースが入っていただけだった 風俗行って頭をすっきりしてます
159 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/11(水) 19:33:08.21 .net] それは書き込まなくてよかったんじゃないか
160 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/12(木) 14:52:38.27 .net] 複数ファイルのダウンロードアルゴリズムについて教えてください 今シェルスクリプトを作ってテキストファイルに書かれてある URLからファイルをダウンロードしています 早くダウンロードしたいため多重(多重度は回線の帯域などを考慮して3〜15で任意で設定)で ダウンロードしていますが全体の終了時間を早めたいため ファイルサイズでソートして大きいファイルからダウンロードしています ただこの方法だと初めの方に大きいファイルばかりダウンロードするため 成果が上がってるように見えません またもっと効率のよい方法があるのではとも思っています お勧めのダウンロード順(を求めるアルゴリズム)があれば教えてください なおちょっとしたシェルスクリプトは書いていますが やってることは以下のコマンドと大差はありません xargs -P 10 -n 1 wget -nv -c < downlist.txt 私のほうで考えられるのはたとえば10多重の場合 大きいものからを5多重で 小さいものからを5多重で 順にダウンロードすることくらいでした でもこの方法だと全体のダウンロード完了が 遅くなる可能性があると思います
161 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/12(木) 15:11:44.91 .net] なんで大きいファイルから始めると全体の終了時間が早くなるの?
162 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/12(木) 15:27:23.69 .net] ちょっとうまく説明できませんが 大きなファイルは時間がかかるので 複数ファイルを多重でダウンロードしても 最長時間になる可能性があるためです たとえば100MB、50MB、40MB、30MB、10MBのファイルを2多重でダウンロードするとき 以下のようにすればそれぞれ平均化されるため 1つめ:100MB→10MB 2つめ:50MB→40MB→30MB なお以下のようになるのは最悪なパターンだと思います。 1つめ:100MB→50MB 2つめ:40MB→30MB→10MB 全体の終了時間が短くなる想定です また当然ダウンロード速度は一定ではないため 特定のファイルに時間がかかった場合 小さなサイズのファイルだと調整がしやすいというのもあります 1つめ:100MB→30MB→10MB 2つめ:50MB(時間がかかった)→40MB 実際はスクリプト内でpsコマンドで多重度は監視しており whileでループしながらダウンロードしているため そのあたりの調整は楽にやれます
163 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/12(木) 15:28:52.53 .net] 例えば他のファイル全部の合計より大きなファイルが一つある場合、 この大きなファイルのダウンロードを最初からスタートさせれば 全体ダウンロード時間はこのファイルのダウンロード時間になるけど、 この大きなファイルのダウンロード開始を遅らせると 全体ダウンロード時間もそれだけ長くなることになるってことだよね
164 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/12(木) 15:31:56.60 .net] >>158 そのとおりです (大きなファイルはクリティカルパスになりえるってことです)
165 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/12(木) 16:43:29.68 .net] >>155 > ただこの方法だと初めの方に大きいファイルばかりダウンロードするため > 成果が上がってるように見えません この場合の成果とはより短い時間で完了することであるわけだが 大きいファイルを先に転送すると短い時間で済む筈だったが実際には逆で より長い時間掛かってしまうから何とかしたい、ということですか?
166 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/12(木) 17:51:07.33 .net] 俺の予想では、プログレスバー的なのを表示したいけど、 大きいファイルが先だとはじめはなかなか進まないってことじゃないかな。 どんなコマンドでダウンロードしてるか知らないけど、 たいてい転送バイト数を出力できるはずだから、 頑張って出力を解析して計算すればいいかと。 あるいは手元のファイルサイズを監視したほうが早いか。
167 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/12(木) 17:59:30.65 .net] でも質問はより効率のよダウンロード順(を求めるアルゴリズムだぜ
168 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/12(木) 18:33:07.59 .net] max procが10なら、大きいファイルから10個を多重でwgetする。 その時、残りのファイルのダウンロード順はまだ決めない。 その10個のwgetのうち、どれか先に終了したもの(ファイルサイズ最小のもののことが多いがネット環境によりそうとは限らない) について、その時点で残りのファイルのうちサイズ最大のものを割り当てて ダウンロードさせる。 以下、残りファイルがなくなるまで繰り返し。
169 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/12(木) 20:25:10.34 .net] 厳密な重さのわからないナップサック問題って感じだな。 ダウンロード時間があらかじめ分かっていたとしてもとても難しい問題。 数学苦手なのでテキトーに聞き流してもらえると助かるが、多分 NP hard って呼ばれる問題と 同等で、全通り試さないと厳密解は得られないんじゃね? 現実的には >>163 の言う貪欲法(greedy algorithm)的な?アルゴリズムが一番だろうな。
170 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/12(木) 22:52:33.75 .net] 複数のファイルが全部同じサーバーにあるのかとか、別々だとしても 自分側のバンド使い切っていないかとか、もっと条件詰めないと そもそも議論出来ない気がするけど。
171 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/13(金) 02:37:34.17 .net] 多重ダウンロード禁止
172 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/13(金) 02:48:29.59 .net] 分割ダウンロード禁止
173 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/13(金) 12:04:00.88 .net] エロ画像ダウンロード禁止
174 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/13(金) 12:06:28.52 .net] \(^o^)/
175 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/13(金) 23:16:03.31 .net] むしろ、トラフィックを監視して、一定以下になったらwget開始するスクリプトじゃ駄目なの?
176 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/14(土) 00:11:59.24 .net] 回線異常で止まった時にさらに追い討ちかけるのか
177 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/14(土) 00:39:23.96 .net] ん、ヒントにならなかったか ファイルを分割してダウンロードすればいい
178 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/15(日) 12:35:05.13 .net] >>171 異常だったらtcp二階建てとかしてない限りロストしてるんだから どんどん長くなるタイムアウトをボケっと待ってたって仕方がないじゃん むしろ定期的に試行するようにしたほうが復旧を即感知できるんじゃないか?
179 名前:名無しさん@お腹いっぱい。 [2015/11/19(木) 07:18:13.65 .net] ルート所有のテキストファイルに、テキストを追加するために以下のコマンドを 実行するのですが、許可がないとはねられます。パスワードを入力しろ、も出て きません。 実行者はもちろん、visudoでUSER ALL=(ALL) ALLの権限を与えられています。 $sudo echo "abc" >> /path/a.txt bash: /path/a.txt: 許可がありません 何が問題なのでしょうか?
180 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/19(木) 07:28:16.93 .net] sudo コマンドが >>/path/a.txt を持って行ってしまうのが問題(だと思う) sudo sh -c 'echo "abc" >> /path/a.txt'
181 名前:名無しさん@お腹いっぱい。 [2015/11/19(木) 07:30:35.56 .net] 174です。 ぐぐったら答え書いてありました。失礼しました。 最初のechoだけsudoで評価されて、リダイレクトはそうじゃないと。
182 名前:名無しさん@お腹いっぱい。 [2015/11/19(木) 09:35:05.07 .net] >>175 さんくすです。なるほど。 ググり先を参考に、evalを使いました。 また、引数が複数の場合も含めて、スクリプトにしました。 パイプを使わない分、>>175 さんのほうがスマートですね。 for i in "$@"; do eval echo $"$i" | sudo tee -a /path/a.txt done
183 名前:名無しさん@お腹いっぱい。 [2015/11/19(木) 09:36:39.66 .net] まちがった。 >ググり先を参考に、evalを使いました。 evalじゃなくて、teeだった。すんません
184 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/19(木) 13:15:22.39 .net] ググると、これらはよく見る様になりました sudo sh -c 'echo "hoge" > "teki tou"' echo hoge | tee "teki tou" >/dev/null 他の解決方法を考えてみました # /dev/null 反対 echo hoge | sudo sed -ne w"teki tou" # tee の様にファイル名を引数で受け取る echo hoge | sudo sh -c 'cat > "$0"' "teki tou" # pipe は無しの方向で sudo sh -c 'echo "hoge" > "$0"' "teki tou"
185 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/19(木) 22:35:50.88 .net] >>179 スレ違い というかシェルスクリプトにすれば問題ないのに
186 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/20(金) 13:29:04.21 .net] どういう事? スクリプトで使う要点の一行を書くのは、このスレでなくともよく有る事では? sudo を使っていてスクリプト向けの行ではないって事かな?
187 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/20(金) 13:42:47.00 .net] >>181 違うよ。 リダイレクトを含めてスクリプトに書いておけば sudoで(リダイレクトの)問題が起きないという意味。
188 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/20(金) 13:54:47.85 .net] なんでスレ違い?
189 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/20(金) 14:14:40.64 .net] ラベルが低いから。
190 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/20(金) 14:38:57.72 .net] 要点を貼るのはいいんだが スクリプトの意図がよくわからない
191 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/20(金) 19:37:14.93 .net] 自演くさっ
192 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/20(金) 22:49:21.30 .net] 引数を元に関数の中{と}の中を表示するコマンドありませんか? test.txt int main() { printf("\n"); } int hoge() { モジモジ 文字文字 } void pyo() { もじもじ } -------------- $コマンド test.txt hoge モジモジ 文字文字
193 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 00:03:09.77 .net] 無い
194 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 00:06:00.44 .net] じゃ、GNU grep で。 #!/bin/sh grep --null-data -Po "(^|\n).* $2\(.*?\)(.|\n)*?{(.|\n)*?\n\K(.|\n)+?(?=\n?})" "$1"
195 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 00:15:34.13 .net] >>187 ありません というか、何のためにそういうコマンドが必要か書いた方が 的確なアドバイスもらえる可能性高そう
196 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 00:18:18.23 .net] >>189 保守性ゼロ、使い回せる可能性ゼロのいい見本だな
197 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 00:48:31.94 .net] いいんじゃない、それで
198 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 00:52:28.46 .net] >>189 できました、ありがとうございます! >>190 目的は外部ファイルにある関数を調べたかったのでcatで連結して 一括で調べたかっただけなのです…
199 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 01:00:24.01 .net] >>193 え、できたのw ネタのつもりで書いたのにw まぁ真面目な話、関数内にブロックがあったら途中でちょん切れるので気をつけて。
200 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 01:04:07.86 .net] >>193 if文とか無いの? 関数の中に } が有れば、そこで切れると思うよ
201 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 01:05:28.85 .net] かぶってた
202 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 01:12:31.11 .net] きちんとインデントされていて、関数ブロックの終端が必ず "\n}" である、という条件なら以下で grep --null-data -Po "(^|\n).* $2\(.*?\)(.|\n)*?{(.|\n)*?\n\K(.|\n)+?(?=\n})" "$1"
203 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 01:26:46.64 .net] indent(1) と組み合わせればどうか
204 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 02:25:44.08 .net] tag作れよ
205 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 17:10:42.13 .net] sedならどうなの?
206 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 18:12:48.25 .net] GNU版grep2.5.4で「『条件A』または『条件Bかつ条件C』」という指定をするにはどうすればよいのでしょう 例えば、以下のようなテキストで 111 aaa 222 bbb 〜 ccc 〜 bbb 〜 ddd 〜 「aaa」または「bbbかつccc」だけ抜き出して aaa bbb 〜 ccc 〜 を抜き出したいです grep aaa sample.txt grep -e bbb -e ccc sample.txt として、個別の条件で出力できるところまでは分かったのですが、 テキストに出てくる順番も重要なので、何とかうまくできないかと思ってます それともawkとかを使う必要があるのでしょうか…
207 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 18:21:02.93 .net] こんなんでいいんじゃない grep -E 'aaa|bbb.*ccc|ccc.*bbb' a.txt
208 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 18:27:53.77 .net] >>202 できました 「bbb.*ccc」「ccc.*bbb」という書き方が思いつきませんでした ありがとうございました
209 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/21(土) 18:57:13.66 .net] 関数の内部を切り出すような処理は yacc(よく知らないんだけど)なんかは関係ない?使えないの?
210 名前:名無しさん@お腹いっぱい。 [2015/11/22(日) 19:30:02.70 .net] ファイルのリネームについてご教授ください 01.mp4 02.mp4 … 25.mp4 という動画ファイルがあります それとは別のテキストファイル (List.txt) があり、内容は orange 01「みかん」 orange 02「ぽんず」 … orange 25「かんきつ」 動画ファイルを、テキストファイルから取得した文字列で リネームしていきたいですが良い方法を知りたいです sedやawkでも構いません よろしくお願いします 環境はMac El Capitanです
211 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/22(日) 20:11:25.81 .net] >>205 for i in {01..25} do mv $i.mp4 $(grep $i List.txt).mp4 done
212 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/22(日) 20:56:26.91 .net] >>206 usage: mv [-f | -i | -n] [-v] source target mv [-f | -i | -n] [-v] source ... directory というメッセージエラーで上手くいかなかったです List.txtの空白スペースに対応してなかったようで orange 01「みかん」→ orange01「みかん」にしておくと うまくいきました
213 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/22(日) 20:57:02.29 .net] ありがとうございます
214 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/23(月) 10:43:36.03 .net] 常にダブルクォートを心がけること
215 名前:名無しさん@お腹いっぱい。 [2015/11/23(月) 14:52:02.86 .net] >>187 >>200 私はsedでこういう使い方なら使用度高いな。 ただCの関数の抜き出しなどはこれだけじゃ全然足りないね。 readf () { sed -n '/[[:space:]]*[int|void][[:space:]]\+'$1'[[:space:]]*(.*)/b filter1; d; :filter1; n; /[[:space:]]*{/n; :filter2; /[[:space:]]*}/q; p; n; b filter2' $2 }
216 名前:名無しさん@お腹いっぱい。 [2015/11/23(月) 14:53:07.97 .net] ごめん引数の順序が逆になってる。
217 名前:名無しさん@お腹いっぱい。 [2015/11/23(月) 15:08:42.76 .net] でもまぁ書換えたりしない場合、大抵の事は前の人が書いてるように grepの-Pを使うといいと思う。
218 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/23(月) 21:42:42.57 .net] >>206 bashism このスレ的にだけでなく一般的にも bash 依存のスクリプトには、#!/bin/bash を付けた方が良いよ
219 名前:名無しさん@お腹いっぱい。 [2015/11/24(火) 04:40:58.26 .net] こんなのもありかな。以下だと表示するだけ実際にやる時は echoを外してunset rをしてから行う事。 cat List.txt |while read do printf '%02d\n' $(( ++r )) |xargs -i echo mv {}.mp4 ${REPLY}.mp4 done
220 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/11/24(火) 06:19:42.03 .net] そういう、スペース入りファイル名未対応回答はいいです
221 名前:名無しさん@お腹いっぱい。 [2015/11/24(火) 07:10:44.29 .net] ごめんねーzshだと大丈夫なんだけどな。 じゃあちょっと分らないな。
222 名前:名無しさん@お腹いっぱい。 [2015/11/24(火) 07:13:51.39 .net] しかし根本的なお勧めな解答をするならば、fileにはわざわざ音楽名をつけない事だね。