シェルスクリプト総合 その9
レス数が1000を超えています。これ以上書き込みはできません。
0001名無しさん@お腹いっぱい。
2007/08/15(水) 07:25:02スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。
前スレ
シェルスクリプト総合 その8
http://pc11.2ch.net/test/read.cgi/unix/1171517324/
0002名無しさん@お腹いっぱい。
2007/08/15(水) 07:25:49シェルスクリプト総合 その7
http://pc10.2ch.net/test/read.cgi/unix/1157601611/
シェルスクリプト総合 その6
http://pc10.2ch.net/test/read.cgi/unix/1143302182/
シェルスクリプト総合 その5
http://pc10.2ch.net/test/read.cgi/unix/1137801629/
シェルスクリプト総合 その4
http://pc10.2ch.net/test/read.cgi/unix/1131026501/
シェルスクリプト総合 その3
http://pc10.2ch.net/test/read.cgi/unix/1124889646/
シェルスクリプト総合 その2
http://pc10.2ch.net/test/read.cgi/unix/1113664637/
シェルスクリプト総合 その1
http://pc10.2ch.net/test/read.cgi/unix/1101820646/
□関連スレ:
sed
http://pc10.2ch.net/test/read.cgi/unix/1085730992/
正規表現
http://pc10.2ch.net/test/read.cgi/unix/1039165754/
おまえら! shell は何を使っているんですか?
http://pc10.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc10.2ch.net/test/read.cgi/unix/1102921590/
0003名無しさん@お腹いっぱい。
2007/08/15(水) 07:27:17「誰にでも」シリーズ
ttp://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/publications/dareUni/
/bin/shプログラミング入門
ttp://freebooks.info.nara-k.ac.jp/archive/ShellProgramming/
シェルを使おう - 導入からプログラミングまで -
ttp://www.netfort.gr.jp/~tomokuni/lms/shell/text/
□入門者向け書籍:
プロフェショナルシェルプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4756116329/
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
http://www.amazon.co.jp/exec/obidos/ASIN/4797321946/
UNIXシェルプログラミング徹底解説
http://www.amazon.co.jp/exec/obidos/ASIN/4822280489/
入門Kornシェル
http://www.amazon.co.jp/exec/obidos/ASIN/4873110149/
入門bash
http://www.amazon.co.jp/exec/obidos/ASIN/4900900788/
□参考リンク:
UNIXの部屋 (沢山のコマンドの簡単な紹介など)
http://x68000.q-e-d.net/~68user/unix/
POSIX: Shell & Utilities (標準規格)
http://www.opengroup.org/onlinepubs/009695399/utilities/contents.html
0004名無しさん@お腹いっぱい。
2007/08/15(水) 07:28:56(2004/03) UNIXシェルスクリプトハンドブック 関根 達夫 (著)
http://amazon.co.jp/o/ASIN/4797326522/
(2004/10) UNIXシェルスクリプト逆引き大全333の極意 中橋 一朗 (著)
http://amazon.co.jp/o/ASIN/4798008842/
(2004/11) 仕事に使えるLinuxシェルスクリプト 千葉 真人 (著)
http://amazon.co.jp/o/ASIN/4822282090/
(2004/12) UNIXシェルスクリプトサンプルブック デイブ・テイラー (著)
http://amazon.co.jp/o/ASIN/4797327286/
(2005/02) シェルスクリプト基本リファレンス 山森 丈範 (著)
http://amazon.co.jp/o/ASIN/4774122610/
(2005/04) LinuxWorldスクリプト 月刊リナックス・ワールド総集編 月刊LinuxWorld特別 (著)
http://amazon.co.jp/o/ASIN/4872802349/
(2005/05) UNIXシェルスクリプトコマンドブック 山下 哲典 (著)
http://amazon.co.jp/o/ASIN/4797330635/
(2005/05) わかる&使える UNIX基礎講座 シェルスクリプト編 中井 獏 (著)
http://amazon.co.jp/o/ASIN/4774123625/
0005名無しさん@お腹いっぱい。
2007/08/15(水) 07:30:05(2005/07) UNIX シェルスクリプト辞典 川井 義治 (著)
http://amazon.co.jp/o/ASIN/4798109231/
(2005/08) シェルスクリプト ポケットリファレンス bash編 宮原 徹 (著), 川原 龍人 (著)
http://www.amazon.co.jp/o/ASIN/4774124818/
(2005/12) 図解でわかるLinuxシェルスクリプト・正規表現 小泉 修 (著)
http://www.amazon.co.jp/o/ASIN/4534040067/
(2006/01)詳解 シェルスクリプト アーノルド ロビンス (著), ネルソン・H.F. ベーブ(著), Arnold Robbins (原著), Nelson H.F. Beebe (原著), 日向 あおい (翻訳)
http://www.amazon.co.jp/o/ASIN/4873112672/
(2007/3) Linuxシェルスクリプトユーザー便利帳―bash2/bash3対応 伊藤 幸夫 (著), 寒川 陽美 (著)
http://www.amazon.co.jp/o/ASIN/4798015954/
0006名無しさん@お腹いっぱい。
2007/08/15(水) 07:30:56FreeBSD 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
0007名無しさん@お腹いっぱい。
2007/08/15(水) 09:20:11乙
0008名無しさん@お腹いっぱい。
2007/08/15(水) 09:34:030009名無しさん@お腹いっぱい。
2007/08/15(水) 13:53:050010名無しさん@お腹いっぱい。
2007/08/15(水) 13:57:07↓
シェルスクリプト総合@LINUX Part3
http://pc11.2ch.net/test/read.cgi/linux/1184077033/l50
0011名無しさん@お腹いっぱい。
2007/08/18(土) 13:14:390012名無しさん@お腹いっぱい。
2007/08/18(土) 20:14:080013名無しさん@お腹いっぱい。
2007/08/18(土) 22:19:20そこでは、ファイル名を扱う変数が $file みたいにクオートなしで書かれていて、
昔はこれで問題なかったようですが、今はとくにSambaの公開ディレクトリなどで
エラーというか、正常に動作しない事態が起きまくります。
そこで、ひとつずつ、$file を "$file" に書き直すとかしてますが、
それを一発で解決できる方法ないですか?
0014名無しさん@お腹いっぱい。
2007/08/19(日) 16:46:11sedでというのも難しそうな。
とりあえずは#!/bin/shになってるのをzshにしてしまうのが楽かも。
zshはクオートされてなくても分割されないから。
0015名無しさん@お腹いっぱい。
2007/08/22(水) 00:53:34インタラクティブに置換するのが簡単かと。
でもこのスレ的に求められている答えではないか
0016名無しさん@お腹いっぱい。
2007/08/24(金) 10:23:23どうやればできる?
0017名無しさん@お腹いっぱい。
2007/08/24(金) 10:27:20変数hooが、空文字列の場合でも「設定されていない」とみなしていいなら、
if [ "$hoo" ]; then
0018名無しさん@お腹いっぱい。
2007/08/24(金) 10:36:00grep '\<if\>.*\<hoo\>.*\<then\>'
ということじゃないかと。だとするとスレ違いだが。
0019名無しさん@お腹いっぱい。
2007/08/24(金) 12:57:04複数行にわたる場合も有るし、
if以前とthen以降は出力しないんだから、
sedとかの方がふさわしいと思う。
0020名無しさん@お腹いっぱい。
2007/08/24(金) 13:03:240021名無しさん@お腹いっぱい。
2007/08/24(金) 16:09:42イメージ
xxcmd | ローテーションコマンド サイズ 世代 ファイル名
xxcmdはfdをオープンしたまま書き出すので、loglotationではNGです。
いいのありますかね?
0022名無しさん@お腹いっぱい。
2007/08/24(金) 16:13:05rotatelogs
0023名無しさん@お腹いっぱい。
2007/08/24(金) 16:38:19ありがとうございます。
あやうく、Log4Perl を選びそうになりました。
0024名無しさん@お腹いっぱい。
2007/08/25(土) 00:45:19root権限で実行しているシェルスクリプト内で実行するコマンドはroot権限で実行されるはず。
例えば、
--------------
#!/bin/sh
whoami
exit 0
--------------
をsudoで実行したらwhoamiはrootを返すはず。
以上の認識は間違ってないですよね?
というのは、とある開発中のUNIXでwhoamiがログインユーザ名を返してきました。
これをバグであると捉えていいのか迷ったので。
0025名無しさん@お腹いっぱい。
2007/08/25(土) 01:16:25root権限で動いていなけりゃバグと言えるが、whoami云々はまた別の話。
002624
2007/08/25(土) 02:26:53例えとして悪かったですね。
whoami以外の何かを呼んでも、それらはroot権限で動いていませんでした。
気になっているのは、「シェルスクリプトそれ自体がroot権限で動いていれば、
そこから呼び出すコマンドもまたroot権限で動くはず」
と考えていた僕は間違っていたのか?ということです。
0027名無しさん@お腹いっぱい。
2007/08/25(土) 02:43:35その考えは正しい。
% echo Hello > /tmp/hoge
% sudo chown root /tmp/hoge
Password:
% sudo chmod 400 /tmp/hoge
% ls -l /tmp/hoge
-r-------- 1 root wheel 6 Aug 25 02:37 /tmp/hoge
% cat /tmp/hoge
cat: /tmp/hoge: Permission denied
% sudo cat /tmp/hoge
Hello
% echo "cat /tmp/hoge" > /tmp/test.sh
% sh /tmp/test.sh
cat: /tmp/hoge: Permission denied
% sudo sh /tmp/test.sh
Hello
って、Macで試したんだが、ちゃんとroot権限で動いてる。
0028名無しさん@お腹いっぱい。
2007/08/25(土) 07:12:42行の左端に書いてある % はなんの意味があるのですか?
002927
2007/08/25(土) 12:05:07% はプロンプトです。$ の方が良かったかな。
>>whoami以外の何かを呼んでも、それらはroot権限で動いていませんでした
というのが間違っているんじゃないかと思う。
その確認をしてみたのが >>27
0030名無しさん@お腹いっぱい。
2007/08/25(土) 12:25:15シェルスクリプトにsetuidしたつもりとかいうオチじゃないだろうな。
003116
2007/08/25(土) 22:36:45遅れてスマソ。
こんな感じでできるかな?と自分で書いてみた↓
awk '/if/,/then/{print $0}' input.file|sed -n '/then/{\
x\
s/\n/\t/g\
/hoo/p\
d\
}\
H'
003224,26
2007/08/26(日) 02:11:24root権限で動かす意味がないですよね。
で、バグじゃねーかと開発者に報告しようと思っていたところ、
その開発中UNIXの最新ビルドが出て、改めて確認してみたら、
スクリプト内で呼び出すコマンドはroot権限で動くようになっておりました
(whoamiもrootを返すようになっていました)。やはりバグだったようです。
レス下さった方ありがとうございました。
0033名無しさん@お腹いっぱい。
2007/08/29(水) 23:50:27rm *.log
としたときに*.logが存在しなかった時に表示される
「一致しませんでした」というメッセージを抑止するには
どうしたらいいのでしょうか?
0034名無しさん@お腹いっぱい。
2007/08/30(木) 00:21:330035名無しさん@お腹いっぱい。
2007/08/30(木) 00:49:08ということをしたいのですが、どのようにすればよいでしょうか?
ファイルの内容
-----------------------
aaa
bbb
ccc
ddd
eee
-----------------------
表示したい内容(最後から二行だけ表示しない)
-----------------------
aaa
bbb
ccc
-----------------------
よろしくご教授お願いします。
0036名無しさん@お腹いっぱい。
2007/08/30(木) 01:30:00http://www.tt.rim.or.jp/~rudyard/torii009.html
0037名無しさん@お腹いっぱい。
2007/08/30(木) 01:31:47>>35
linux板の方のスレに以前書いたけど、たとえば末尾3行を落とすなら
sed -e '1h;1!H;1,3!{g;P;s/[^\n]*\n//;h;};d' file
行数に合わせて3を適当に変更してくれ。
tailに-rオプションがある一部の環境なら
(tail -r|sed 1,3d|tail -r) < file
というのもできる。ファイルを2回ひっくり返すからかなり計算機の無駄遣いだけど。
0038名無しさん@お腹いっぱい。
2007/08/30(木) 10:24:24sedスレでも最近似た質問があったね。
http://pc11.2ch.net/test/read.cgi/unix/1085730992/198
0040名無しさん@お腹いっぱい。
2007/09/08(土) 01:57:19http://www.google.co.jp/search?hl=ja&q=2ch&btnI=I%27m+Feeling+Lucky&lr=
が返す(つまり、ブラウザで飛ぶことが出来る)サイトアドレス(この場合は2ch.net)
を複数、定期的に観測する
素直に考えればwgetかなと思い、--spiderオプション付きでログを取っていくことを
考えました。
しかし、リダイレクトのしかたが違うからか他の「移転しました」のサイトとは違い
403 forbiddenがでます。
なにか良い方法があればご教授ください。
004140
2007/09/08(土) 02:14:11googleのI'm feeling luckyにかけたい対象キーワードは複数あります。
それらの対象キーワードのgoogleランキングの変遷を知りたいという
わけです。
質問は多分二つに切り分け可能で、I'm feeling luckyによるリダイレクトジャンプを
wgetはフォローできるかというのが一つ、もう一つが英数字以外の文字列によって
構成されている
http://www.google.com/search?q=2ch
といったページをwgetでどうやって取得するか、という問題です。後者が出来れば
一応ソースを取得して検索順位第一位のサイトアドレスを取得することは
何とか出来ます。
0042名無しさん@お腹いっぱい。
2007/09/08(土) 06:20:400043名無しさん@お腹いっぱい。
2007/09/08(土) 10:12:00なんで犬板で聞かないのだ?
0044名無しさん@お腹いっぱい。
2007/09/08(土) 11:15:400045名無しさん@お腹いっぱい。
2007/09/08(土) 18:08:000046名無しさん@お腹いっぱい。
2007/09/08(土) 18:10:33cshやzshより圧倒的に利用者が多いしbashが標準みたいなもんなのに。
0047名無しさん@お腹いっぱい。
2007/09/08(土) 18:35:31Linux的には単にシェルと言ったらbashを指す。
0048名無しさん@お腹いっぱい。
2007/09/08(土) 20:32:05シェルスクリプト総合@LINUX Part3
http://pc11.2ch.net/test/read.cgi/linux/1184077033/
0049名無しさん@お腹いっぱい。
2007/09/09(日) 12:25:29自分の環境に wget が無くて curl ならあるんで直接的な回答じゃなくてスマンが。
curl だと -L オプションでリダイレクトをたどってくれる。
wget は知らない。調べてちょ。ダメだったら wget はあきらめて curl で代替するのがお勧め。
後、curl の User Agent だと Google から嫌われるので、
-A ' -A 'Mozilla/5.0 (hogehoge)'
のオプションを付けてブラウザのフリをさせる。知ってるかも知れないけど。
0050名無しさん@お腹いっぱい。
2007/09/09(日) 12:40:04ちとやってみたがユーザーエージェントではじかれてるだけっぽい
-U 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'
とかでUA指定すればよいが、とりあえず'a'とか適当な名前でも通るようだ
>>41の質問だが
-O foo.htmlとか適当な名前を出力先に指定するなり
-O -などとして標準出力に吐かせてシェル側で受け取るなり好きに汁
0051名無しさん@お腹いっぱい。
2007/09/09(日) 13:07:11そういう問題みたいだね。
>英数字以外の文字列
たとえば「ソニー」の場合のURLは
http://www.google.co.jp/search?hl=ja&q=%E3%82%BD%E3%83%8B%E3%83%BC&btnI=I%27m+Feeling+Lucky&lr=
になる。「ソニー」をUTF-8でURLエンコードして「%E3%82%BD%E3%83%8B%E3%83%BC」
にするんだが、そこから先の細かい話はWebProg板とかで聞いた方が良い。
005240
2007/09/09(日) 21:03:32いただいたヒントを元にネットで検索した結果、手元の環境で
curl -L -A 'a' -w %{url_effective} "http://www.google.co.jp/search?hl=ja&q=2ch&btnI=I%27m+Feeling+Lucky&lr="
にて出力される最後の1行だけをテキスト処理していくことで、思っていることが
出来ることがわかりました。
板違いの分も含めてお騒がせしました。
0053名無しさん@お腹いっぱい。
2007/09/12(水) 00:12:12while read line; do echo $line; done < file
であってますか?
0054名無しさん@お腹いっぱい。
2007/09/12(水) 00:21:400055名無しさん@お腹いっぱい。
2007/09/12(水) 01:14:370056名無しさん@お腹いっぱい。
2007/09/12(水) 02:55:39for でファイル数分処理したいと考えています。
例: find で見つかったファイルが /home/abc/1.txt /home/abc/2.txt
であれば、
for i in /home/abc/1.txt /home/abc/2.txt
do ......
といった感じです。
この場合に、find で見つけたファイルを変数に、
「arg1 arg2 arg3 ...」と代入する方法がわかりません。
お助けください、おながいします。m(_ _)m
0057名無しさん@お腹いっぱい。
2007/09/12(水) 04:28:01> for で
ここが間違い
0058名無しさん@お腹いっぱい。
2007/09/12(水) 06:40:33あってるお
>>56
find . | while read line; do echo $line; done
0059名無しさん@お腹いっぱい。
2007/09/12(水) 08:45:19あってないよw
せっかく >>55 がくれてるヒント守れよ
でないと誤動作するよ
0060名無しさん@お腹いっぱい。
2007/09/12(水) 10:38:11完全な方法はないってことで。
# \ は read -r で動作を変えられるけど。
0061名無しさん@お腹いっぱい。
2007/09/12(水) 10:56:32/home/fuga/2.txt
/home/ahan/3.txt
このパスから
Unixユーザ名部分(上記の場合、hogeとfugaとahan)を
抜き出して変数に代入するにはどうすればよいでしょうか。
正規表現を使うということはなんとなくわかります。
0062名無しさん@お腹いっぱい。
2007/09/12(水) 10:59:39雑でいいなら
awk -F/ '{ print $3 }'
で出るけど、他に条件あるなら言ってくれ。
006361
2007/09/12(水) 11:10:04ありがとうございます、
お言葉に甘えて
Unixユーザ名が
[a-z0-9-]+
の場合、という条件も加えてもらえるでしょうか。
それで awk の使い方などを調べてみます。
0064名無しさん@お腹いっぱい。
2007/09/12(水) 11:19:210065名無しさん@お腹いっぱい。
2007/09/12(水) 12:58:10スクリプトfoo.shは、trapを用いて、SIGINTのハンドラを記述しています。
スクリプトbar.shは、スクリプトfoo.shをバックグラウンドで起動します。
foo.shをコマンドラインからフォアグラウンドで実行した場合。
foo.shをコマンドラインからバックグラウンドで実行した場合。
foo.shをdaemonで実行した場合。
いずれのケースでも、foo.shにSIGINTを送ると、foo.shのハンドラは
実行されます。
しかし、bar.shからバックグラウンドで起動されたfoo.shに対して
SIGINTを送っても、foo.shのハンドラは実行されません。
また、foo.shから起動しているコマンドにSIGINTを送っても、
無視されている様子です。
なぜでしょう?
また、bar.shからバックグラウンドでfoo.shを起動した場合でも、
foo.shのハンドラが実行され、foo.shから起動しているコマンドも
同様にSIGINTを受け付けてくれるようにする為にはどうすれば
良いのでしょうか?
006665
2007/09/12(水) 12:59:09スクリプト foo.sh
#!/bin/sh
trap 'HANDLE' INT
HANDLE()
{
touch /tmp/foo.log
exit
}
echo "START"
/bin/rm -f /tmp/foo.log
/bin/sleep 30
echo "END"
スクリプトbar.sh
#!/bin/sh
/tmp/foo.sh &
0067名無しさん@お腹いっぱい。
2007/09/12(水) 13:15:52バックグラウンドで起動されたプロセスは、
最初から SIGINT無視の状態で起動される。
これは、シェル上で trapを実行しても再設定されない。
シェルスクリプトでは不可能。
006865
2007/09/12(水) 13:19:32perlのスクリプトにしても同じでした。
0069名無しさん@お腹いっぱい。
2007/09/12(水) 13:21:31>>67
0070名無しさん@お腹いっぱい。
2007/09/12(水) 13:32:35直接起動する場合に限り、バックグラウンドで起動してもSIGINTは無視されない。
しかしこれは例外と考えるべき。
ジョブコントロールは、プロセスグループを変更することによって管理していて、
fgでフォアグラウンドになる時のために、
SIGINTを無視しないようになっているだけの話。
007165
2007/09/12(水) 13:42:08shのソースを見てましたが、確かにバックグラウンドで起動されたときは
SIGINT,SIGQUITをSIG_IGNしているみたいです。
ひとつ賢くなりました。
daemonで起動することにします。
0072名無しさん@お腹いっぱい。
2007/09/12(水) 16:01:50のfileだけ返すようなコマンドってないでしょうか。
0073名無しさん@お腹いっぱい。
2007/09/12(水) 16:21:270074名無しさん@お腹いっぱい。
2007/09/12(水) 16:47:520075名無しさん@お腹いっぱい。
2007/09/12(水) 16:53:28アフォか。/hoge/hage/boke/file だったらどうすんだよw
0076名無しさん@お腹いっぱい。
2007/09/12(水) 16:55:41サンクスです!!
0077名無しさん@お腹いっぱい。
2007/09/12(水) 16:55:49後からそんな条件追加されてもな。
0078名無しさん@お腹いっぱい。
2007/09/12(水) 17:06:15正解が出る前にわざとボケるならまだしも、
>>73 に正解が出た後でボケてもウケないよ。
0079名無しさん@お腹いっぱい。
2007/09/12(水) 17:38:55と
find /home -regex "/home/.*\.c"
ってCPUやHDDへの負荷って変わりますか?
後者の方が良い気がしますが、現在全て前者で作っちゃってます。
0080名無しさん@お腹いっぱい。
2007/09/12(水) 18:27:30やってみればすぐわかるのに
あと、cのソース探すのに、-regexは過剰だろ。-nameで十分
0081名無しさん@お腹いっぱい。
2007/09/12(水) 18:30:50どっちでもいいんじゃないかな。たまには痛い目を見るのもいい経験だよ。
008261
2007/09/12(水) 18:33:59ありがとうございます。
今回のケースはこれでいけそうです。
何度もすいません、今後のために聞いておきたいのですが、
/home/hoge/abc.txt
の.txtを除いたファイル名、つまりabcを取得したい場合、
などには
どんな方法があるでしょうか。
0083名無しさん@お腹いっぱい。
2007/09/12(水) 18:37:19008461
2007/09/12(水) 18:42:02abc.txt ではなく、 abc を取得したいと思います。
0085名無しさん@お腹いっぱい。
2007/09/12(水) 18:50:290086名無しさん@お腹いっぱい。
2007/09/12(水) 18:57:34それだとなんか英語のようなものが表示さ(ry
0087名無しさん@お腹いっぱい。
2007/09/12(水) 18:59:40黙らせるためにずばり答え書いてやれよ。
basename /home/hoge/abc.txt .txt
008861
2007/09/12(水) 19:06:57サンクスです
0089名無しさん@お腹いっぱい。
2007/09/12(水) 19:11:12>>61 は awkなんか使わなくてもできる。
basename `dirname /home/hoge/1.txt`
0090名無しさん@お腹いっぱい。
2007/09/12(水) 22:20:18監視(ここでは適当なcommand)したいです。
syslogやmessegesはローテートしているので
前回の監視(1時間前)後にログが切り替わった場合と
そのまま使われている場合で実行commandを変えたいのですが
どのようなシェルスクリプトにしたらできるでしょうか?
たとえばどのログも切り替わっていない場合はcommandA、
syslogが切り替わった場合はcommandB、
messegesが切り替わった場合にはcommandCを
実行するというようなシェルスクリプトが書きたいのですが^^;
0091名無しさん@お腹いっぱい。
2007/09/12(水) 22:36:41name=/home/hoge/1.txt; name=${name#/*/}; echo ${name%%/*}
0092名無しさん@お腹いっぱい。
2007/09/12(水) 22:39:40どっちも切り替わった場合は?
というのは置いといて、
前回と今回見ているファイルの実体同じかどうかのチェックということなら、
切り替え時に必ずi-node番号が変わるという前提で、
ls -iでi-node番号を取得して、保存しとくしかないだろうな。
oldinode=`cat /var/log/oldinodestore`
ls -i /var/log/syslog | awk '{print $1}' >/var/log/oldinodestore
newinode=`cat /var/log/oldinodestore`
if [ $newinode -eq $oldinode ]; then
kawattenai
else
kawatta
fi
0093名無しさん@お腹いっぱい。
2007/09/12(水) 22:44:43あってるだろがwwwwwwwwwww
ばかかwwwwwwwww
0094名無しさん@お腹いっぱい。
2007/09/12(水) 22:50:16あってねーよ。池沼。WWWW
(echo " aaa"; echo " bbb")|while read line; do echo $line; done
0095名無しさん@お腹いっぱい。
2007/09/12(水) 22:55:10切り替わってなくて commandA を実行しはじめたとたんに、
あるいはその直前に、切り替わっても問題ないという前提か?
009690
2007/09/13(木) 10:35:28>>92
ありがとうございます。
いただいたShellで試してみますね。
いつか自分でもShellがすらすら書けるようになるのかなぁ。。
>>95
そこまでシビアなタイミングは前提にしていないようです。
最悪1時間後の監視でひっかかればよいという前提です。
>90を訂正します。
syslog、messegesどちらが切り替わってもcommandBを
実行すればよいみたいです。
syslog、messegesが切り替わっていたらcommandBを実行。
切り替わっていなかったらcommandAを実行できればよいようです。
0097名無しさん@お腹いっぱい。
2007/09/13(木) 10:40:56009890
2007/09/13(木) 10:49:31先日区別しなくてはいけないと読んだばかりでした><
0099名無しさん@お腹いっぱい。
2007/09/13(木) 13:00:29>1時間ごとにのsyslog、messegesを
>監視(ここでは適当なcommand)したいです。
新人君かな?それじゃなきゃ、おわってるけどw
君には、このギョーカイ向いて無いぞ
でも、そんなの関係ねぇー♪なら、いいけどさ。
分からないことは、聞くんじゃ無くて検索するようにすれば、生き残っていけるから頑張れ!!
0100名無しさん@お腹いっぱい。
2007/09/13(木) 13:23:47新入社員です^^;
シェルスクリプトを勉強し始めましたが
自分で作れるほどにはなっていなくて><
0101名無しさん@お腹いっぱい。
2007/09/13(木) 18:09:32CPU使用率を跳ね上げた状態で試験がしたいのです。
それで、CPU使用率がバカ上がる(目標90%)シェルかスクリプトを簡単に作りたいんです。
Whileでfindやgrepやsortをまわしたんですが、70%越えが精一杯。
もっと凶悪なものないでしょうか?
0102名無しさん@お腹いっぱい。
2007/09/13(木) 18:19:13while :; do :; done
とかは?
0103名無しさん@お腹いっぱい。
2007/09/13(木) 18:21:52whileで無限ループはかけてますよ。
0104名無しさん@お腹いっぱい。
2007/09/13(木) 18:33:29単にシェルのなかでビジーループするだけのほうがCPU占有するだろうと
思えるから書いたんだが。
0105名無しさん@お腹いっぱい。
2007/09/13(木) 18:44:01>>103 みたいな、恩を仇で返すような質問者にはなりたくないなぁ
0106名無しさん@お腹いっぱい。
2007/09/13(木) 19:03:590107名無しさん@お腹いっぱい。
2007/09/13(木) 19:06:19実験注意
0108名無しさん@お腹いっぱい。
2007/09/13(木) 19:13:45ようこそ、バーボンハウスへ。
このしょっぱいロールケーキはサービスだから、まず食べて落ち着いて欲しい。
実は、君に一生セクロス出来ない呪いをかけたんだ。
うん、「また」なんだ。済まない。
仏の顔もって言うしね、謝って許してもらおうとも思っていない。
↓このスレに「こんばんは、プッシーキャットです」とレスすれば呪いは解ける。
http://ex21.2ch.net/test/read.cgi/voiceactor/1189073996/
じゃあ、注文を聞こうか。
0110名無しさん@お腹いっぱい。
2007/09/13(木) 20:02:20どうでもいいが、君は>>101かな?
レス番ずれとるぞ
0111名無しさん@お腹いっぱい。
2007/09/13(木) 23:40:34それのどこがファイル表示してんだ?wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
ばかばっかりwwwwwww
0112名無しさん@お腹いっぱい。
2007/09/14(金) 00:12:41( ・ω・)んも〜
○={=}〇,
|:::::::::\, ', ´
、、、、し 、、、(((.@)wwwwwwwwwww
0113名無しさん@お腹いっぱい。
2007/09/14(金) 00:36:44>>94は「行頭行末の空白が出ない」って言いたいんだろ。 >>60 参照。
0114名無しさん@お腹いっぱい。
2007/09/14(金) 19:39:12ファイルからコマンドラインを読み込んでるだけですよね?
だったら、なぜシェルスクリプトのモード(?)の時は、
プロンプトが出ないんですか?
プロンプトを出す方法はありますか?
0115名無しさん@お腹いっぱい。
2007/09/14(金) 20:25:19させたいのですが、bashで乱数を発生させるのにはどうすれば
良いでしょうか?
何に使うかというと、
OSはCentOS5.0です。NFSサーバが一台、NFSクライアントが100台です。
NFSクライアントの個々のlocal HDDのファイルを土曜深夜に
自動バックアップさせようと思っていますのでcrontabに一行
書こうと思っています。1台あたりのバックアップは10秒もか
かりません。
うんで、100台が一斉にバックアップはじめるとサーバが死ぬので
ランダムにsleepを居れたいのですが、、、
100台のcrontabの時間を1分刻に変更してくなんて、めんどくさい
にょろ。
0116名無しさん@お腹いっぱい。
2007/09/14(金) 20:27:50sleep $((RANDOM*1800/32768))
0118名無しさん@お腹いっぱい。
2007/09/14(金) 20:32:040119名無しさん@お腹いっぱい。
2007/09/14(金) 21:03:49次はこっちで聞こうな。
シェルスクリプト総合@LINUX Part3
http://pc11.2ch.net/test/read.cgi/linux/1184077033/
0120名無しさん@お腹いっぱい。
2007/09/14(金) 21:25:44>ファイルからコマンドラインを読み込んでるだけ
違う。
プロンプトではコマンドラインしか実行できないが、
シェルスクリプトではコマンドラインの他、
if文とかfor文とか、変数の代入とかもできるようになる。
そもそも別物なので、プロンプトは出ない。
0121名無しさん@お腹いっぱい。
2007/09/14(金) 21:49:470122名無しさん@お腹いっぱい。
2007/09/14(金) 22:08:09$ for i in hoge
for: Command not found.
って出るし。
変数も使えない。
$ HOGE=hage
HOGE=hage: Command not found.
0123名無しさん@お腹いっぱい。
2007/09/14(金) 22:33:150124名無しさん@お腹いっぱい。
2007/09/14(金) 22:46:57シェルがプロンプトを出力するのは、ユーザに入力を受け付ける事ができるようになった事を表すため。
なので、基本的にその必要のない、非対話的(>シェルスクリプトのモード)な動作をするときはプロンプトを出力しない。
この対話的、非対話的であるということは起動時に決定され移行する手段もないためスクリプト実行中にプロンプトを出力する事は出来ない。
0125名無しさん@お腹いっぱい。
2007/09/14(金) 23:37:55set -i すればプロンプト出るよw
0127名無しさん@お腹いっぱい。
2007/09/15(土) 08:45:14これで満足か? イケヌマ君。www
echo " aaa" >file
while read line; do echo $line; done <file
0128名無しさん@お腹いっぱい。
2007/09/16(日) 21:05:08こんなどうしようもないショボい釣り針は初めて
うっかり釣られたけど、どうやったらこんなショボいこと浮かぶの?
0129名無しさん@お腹いっぱい。
2007/09/16(日) 21:08:42本当に使えないんですが,,,
使えるようになる設定とかあるんですか???
0130名無しさん@お腹いっぱい。
2007/09/16(日) 21:21:06もし使えたらおかしなことになるだろ。
例えば forだったら、doneコマンドを実行したら
doコマンドのところまで後ろにジャンプしないといけない。
コマンドラインでは、打ったコマンドを順番に実行するだけだから、
後ろに戻るような動作はできない。
forを使いたきゃ、シェルスクリプトに一旦書くしかない。
0131名無しさん@お腹いっぱい。
2007/09/16(日) 21:51:01コマンドラインでfor文を使いたければ、Cシェル系(foreach)でも使ったら?
0132名無しさん@お腹いっぱい。
2007/09/16(日) 22:02:42もしかしてマジ?そんな環境があるのか知らないけど
取り合えず以下でも受け付けない?
for x in a b; do echo $x ; done
0133名無しさん@お腹いっぱい。
2007/09/16(日) 22:09:27for: Command not found.
x: Undefined variable.
0134名無しさん@お腹いっぱい。
2007/09/16(日) 22:18:59$ csh
%set prompt='$ '
$ for x in a b; do echo $x;done
for: Command not found.
x: Undefined variable.
0135名無しさん@お腹いっぱい。
2007/09/16(日) 22:20:51まじですまないがググらんと原因が分からないんでパス
0136名無しさん@お腹いっぱい。
2007/09/16(日) 22:26:14いやプロンプトをどうするかは自由だけどね
0137名無しさん@お腹いっぱい。
2007/09/17(月) 10:19:560138名無しさん@お腹いっぱい。
2007/09/17(月) 18:50:07でも >>129-131 の時点で自演に気付けなかった自分にorz
参りました一生romってます
0139名無しさん@お腹いっぱい。
2007/09/18(火) 19:37:25非常に簡単なスクリプト、たとえば以下のような場合ですが
このままでいいのですかね?
もうちょっとスクリプトらしく書けとかありません?^^;
役割果たすならシンプルが一番なのかもしれませんが
シェルスクリプトというよりコマンドの羅列なので・・
#!/bin/sh
ls -i /var/log/syslog > var/log/check.log
date >> var/log/check.log
0140名無しさん@お腹いっぱい。
2007/09/18(火) 20:15:57var/log/check.logを、わざわざ相対PATHで書いてるのはなぜ?
これだと、このシェルスクリプトを / で実行しないと
期待通り動かないよ。
もうちょっとシェルスクリプトらしくするには、
例えば↓
#!/bin/sh
CHECK_LOG=/var/log/check.log
{ ls -i /var/log/syslog; date; } > $CHECK_LOG
0141139
2007/09/18(火) 22:35:51おぉー、シェルスクリプトになっていますね。
こういうのは慣れなのでしょうか^^;
相対パスになっていたのも気がつきませんでした。
これも慣れるんでしょうかね・・
がんばります。アドバイスどうもありがとうございました。
0142名無しさん@お腹いっぱい。
2007/09/18(火) 23:10:07#!/bin/sh
CHECK_LOG=/var/log/check.log
exec > $CHECK_LOG
ls -i /var/log/syslog
date
0143139
2007/09/19(水) 00:41:33レスありがとうございます。
なるほど、execコマンドって便利そうですね。
本で読んでみましたが最初よくわかりませんでしたw
リダイレクトの章を読んでで納得^^
こんな簡単な処理でもいろんな書き方があって
奥が深いですねヽ(´ー`)ノ
0144名無しさん@お腹いっぱい。
2007/09/19(水) 08:11:38>>142 は半分ネタだろ。真に受けるなw
execリダイレクトしてしまうと、今後この後に別のコマンドを追加した場合、
すべてリダイレクトされてしまって、保守性の悪いスクリプトになる。
0145名無しさん@お腹いっぱい。
2007/09/19(水) 08:29:17/root/test.1.txt
/root/test-1.txt
があります。
find / -regex "/root/[a-z0-9\-\.]+\.txt"
としても
/root/test-1.txt
だけ見つかりません。
\.をはずすと
なぜか
/root/test-1.txtが見つかるのですが、これはなぜでしょうか?
0146名無しさん@お腹いっぱい。
2007/09/19(水) 08:40:10正規表現の [ ] の中で、\ は意味ないわけだが。\- としてもだめ。
0147名無しさん@お腹いっぱい。
2007/09/19(水) 08:41:110148145
2007/09/19(水) 08:54:43find での正規表現の利用の
仕方が関係ある気がします。
perl互換の正規表現を使ってperlなどでは
[a-z-.]でいけるんですが、
find でこれを使うと Invalid range end が表示されてしまいます。
0149名無しさん@お腹いっぱい。
2007/09/19(水) 09:04:420150名無しさん@お腹いっぱい。
2007/09/19(水) 09:33:06find /root -regex "/root/[-.a-z0-9]+\.txt"
0151名無しさん@お腹いっぱい。
2007/09/19(水) 09:35:010152名無しさん@お腹いっぱい。
2007/09/19(水) 18:54:590153名無しさん@お腹いっぱい。
2007/09/19(水) 20:16:33見た感じfork爆弾なのかなと思ったけど、どうなんだろ。
#!/bin/sh
$0 & $0 &
でよさそーな気もする。
0154名無しさん@お腹いっぱい。
2007/09/20(木) 13:26:36この{}の意味って何なのでしょうか?
()のサブシェルとの違いは?
0155名無しさん@お腹いっぱい。
2007/09/20(木) 13:28:51意味以前に、{ } の文法間違ってる。それでは正しく動かない。
0156名無しさん@お腹いっぱい。
2007/09/20(木) 15:53:30zshなら動くみたい
>>154
cd; foo=''; { cd /tmp; foo=bar; }; pwd; echo $foo
と
cd; foo=''; (cd /tmp; foo=bar); pwd; echo $foo
を実行してみればわかるかも
0157名無しさん@お腹いっぱい。
2007/09/20(木) 16:21:490158名無しさん@お腹いっぱい。
2007/09/20(木) 17:31:38もちろん、SHELL=/bin/sh と、あらかじめ設定されてます。
#!$SHELL
echo helloworld
0159名無しさん@お腹いっぱい。
2007/09/20(木) 17:35:19( ゚д゚ )
( ゚д゚ )
0160名無しさん@お腹いっぱい。
2007/09/20(木) 17:44:060161名無しさん@お腹いっぱい。
2007/09/20(木) 17:45:310162名無しさん@お腹いっぱい。
2007/09/20(木) 18:00:590163名無しさん@お腹いっぱい。
2007/09/20(木) 20:12:04exportは既にしています
>>162
ありがとうございます。zshにしたら動きました
0164名無しさん@お腹いっぱい。
2007/09/22(土) 18:06:21ls fileA | awk '{print $5}' ってな感じで抜き出して比較しないとダメですか?
0165名無しさん@お腹いっぱい。
2007/09/22(土) 18:26:34testコマンドではファイルサイズが0かどうかの判定しかできないね。
ls | awk じゃ無駄。
wc -c を使うと良い。
if [ `wc -c < fileA` -gt `wc -c < fileB` ]; then
みたいに。
wc -cの結果にファイル名が出ずにファイルサイズの数字のみになるように、
wc -c fileA じゃなくて wc -c < fileA にするのがコツ。
0166名無しさん@お腹いっぱい。
2007/09/22(土) 18:48:12wcの-cオプションて国際化されててもバイト数を返すんだな。
-mで文字数か。
0167名無しさん@お腹いっぱい。
2007/09/23(日) 00:40:46どのへんのOSに入ってるかまでは把握してない...
0168名無しさん@お腹いっぱい。
2007/09/23(日) 03:12:27Coreutils か Shellutils じゃなかったっけ?
0169名無しさん@お腹いっぱい。
2007/09/23(日) 05:30:150170名無しさん@お腹いっぱい。
2007/09/23(日) 11:20:40stat -c %s file
で、ファイルサイズだけ表示できるが、
FreeBSDのstatはcoreutilsのではなくて、
オプションは違うし、互換性がない。
Solarisではstatはない。
0171名無しさん@お腹いっぱい。
2007/09/25(火) 10:35:27tcsh がない OS もあるけど、stat よりはマシ。
tcsh -fc 'filetest -Z filename'
0172名無しさん@お腹いっぱい。
2007/09/25(火) 10:37:40いや、tcsh使うくらいなら >>165 の wc -c < file で決まりだろ。
0173名無しさん@お腹いっぱい。
2007/09/25(火) 10:39:100174名無しさん@お腹いっぱい。
2007/09/25(火) 10:41:54wc はファイルをオープンするので read permission がないファイルでコケるし、
読めても巨大なファイルでは I/O に時間がかかる。
filetest はその問題はない。
0175名無しさん@お腹いっぱい。
2007/09/25(火) 10:45:05おいおい、本気でファイルなめると勘違いしてたのかよ。
wc -c < file ならファイルはなめないよ。
open()して、ファイルサイズ取得するだけ。
巨大なファイルでも一瞬。
0176名無しさん@お腹いっぱい。
2007/09/25(火) 10:47:150177名無しさん@お腹いっぱい。
2007/09/25(火) 10:55:45うんにゃ。実装依存なので期待しない方がいい。
俺の知ってるかぎりでは GNU の wc 以外でそれをやるものはない。
パーミッションの問題は変わらないし。
0178名無しさん@お腹いっぱい。
2007/09/25(火) 11:16:07wc -c < file だとなめるけど、
wc -c file だとなめないね。
ファイル名表示されるのが邪魔だけど、
wc -c file の方使えばいいか。
0179名無しさん@お腹いっぱい。
2007/09/25(火) 14:32:430180名無しさん@お腹いっぱい。
2007/09/25(火) 22:37:120181名無しさん@お腹いっぱい。
2007/09/26(水) 00:16:57lrwxr-xr-x 1 root wheel 7 Sep 26 00:13 $SHELL -> /bin/sh
$ cat scr
#!$SHELL
echo a
$ ./scr
a
0182名無しさん@お腹いっぱい。
2007/09/26(水) 10:18:400183名無しさん@お腹いっぱい。
2007/09/26(水) 12:20:36ファイル名が表示されたら、そもそもの [ x -gt y ] が使えないとおも
0184名無しさん@お腹いっぱい。
2007/09/26(水) 12:28:03set `wc -c fileA`
A=$1
set `wc -c fileB`
B=$1
if [ $A -gt $B ]; then
0185名無しさん@お腹いっぱい。
2007/09/26(水) 13:10:43それだったら、↓の方が簡単
set `wc -c fileA` `wc -c fileB`
if [ $1 -gt $3 ]; then
…
0186名無しさん@お腹いっぱい。
2007/09/26(水) 15:52:53>>185
このsetの使い方ってどういうことなのでしょうか?
理解すれば幅が広がりそう。
0187名無しさん@お腹いっぱい。
2007/09/26(水) 17:09:39ポジショナルパラメータをセットする
0188名無しさん@お腹いっぱい。
2007/09/27(木) 23:09:07下記のような入力データから、ワークに1行入力して、
ABCDE 12
BC 123
A
BB
CCCCC 2
変数Xへ、2番目のフィールドを取り出す場合は
どうすればよいでしょうか。
もちろん、2番目で空白の場合は、0または読み
飛ばしする。
0189名無しさん@お腹いっぱい。
2007/09/27(木) 23:24:54while read dummy x; do
echo ${x:-null}
done < file
0190名無しさん@お腹いっぱい。
2007/09/27(木) 23:32:34ありがとうございました。勉強になりました。
0191名無しさん@お腹いっぱい。
2007/09/29(土) 11:38:30NGの場合:
# A=/
# expr substr A 1 1
シンタックスエラー
このシンタックスエラーになる理由がわかりません。Linux(Plamo)ではOKみたいす。
OKの場合:
# A=/a
# expr substr A 1 1
# /
勉強不足ですいませんが、ご教示ください。
0192名無しさん@お腹いっぱい。
2007/09/29(土) 11:44:02HP-UXのexprがsubstrをサポートしていないんじゃないの?
LinuxのはGNU coreutilsのexprを使っていることが多いので、
いろいろ拡張されているよ。
Macの/bin/exprもsyntax errorになった。
0193名無しさん@お腹いっぱい。
2007/09/29(土) 11:56:31>The use of string arguments _length_, _substr_, _index_ or _match_ produces unspecified results.
とあるな。未定義ということは、鼻から悪魔が出てきてもOK。
0194名無しさん@お腹いっぱい。
2007/09/29(土) 12:09:410195名無しさん@お腹いっぱい。
2007/09/29(土) 12:17:46>>192 193
よくわかりませんが、未定義の動作かも知れませんね。
0196名無しさん@お腹いっぱい。
2007/09/29(土) 12:28:35>>192
0197名無しさん@お腹いっぱい。
2007/09/29(土) 12:36:01ほとんど対応していないことが多いSolarisのexprでさえ、
substrには対応してる。POSIXがどう言っていようが、
業界標準的にはexprはsubstrが使えるべきだろう。
0198名無しさん@お腹いっぱい。
2007/09/29(土) 12:42:14ポータビリティ考えたら、exprじゃなく、
echo $A | cut -b1
を使うべきだな。
0199名無しさん@お腹いっぱい。
2007/09/29(土) 12:42:25確かに互換性を考慮するれば、使えるべきですね。
特定の場合だけ、エラーになるということは、(HP-UX)の不具合なのかも
知れませんね。
0200名無しさん@お腹いっぱい。
2007/09/29(土) 12:44:04別な方法があるのですね。勉強になります。
0201名無しさん@お腹いっぱい。
2007/09/29(土) 12:46:16古い cutでは -bオプションが使えない。
cut使うなら↓にするべき。
echo $A | LANG=C cut -c1
0202名無しさん@お腹いっぱい。
2007/09/29(土) 13:01:47変数$Aに "/etc 123" という文字列情報(空白がある)があった場合、
123を取り出したい場合は、どうすればよいでしょうか。
"AAA /etc 123"
"AAA BBB /etc 45"
という場合もあり、一番右側の数値だけを取り出したい場合です。
0203名無しさん@お腹いっぱい。
2007/09/29(土) 13:10:47A='AAA BBB /etc 45'
set $A
shift `expr $# - 1`
echo $1
0204名無しさん@お腹いっぱい。
2007/09/29(土) 13:16:20なるほど、ありがとうございます。勉強になります。
# スキル不足のため、トライ・エラー繰り返しです。(泣)
0205名無しさん@お腹いっぱい。
2007/09/29(土) 20:31:47echo ${A##* }
0206名無しさん@お腹いっぱい。
2007/09/29(土) 21:22:12Bourne shellの範囲外。失格。
0207名無しさん@お腹いっぱい。
2007/09/29(土) 21:28:07expr "$A" : '.* \([^ ]*$\)'
0208名無しさん@お腹いっぱい。
2007/09/29(土) 21:36:37上記の意味は、日本語で解説していいただかないとわかないです。
0209名無しさん@お腹いっぱい。
2007/09/29(土) 21:48:38A='AAA BBB /etc 45'
set $A; while [ $# -gt 1 ]; do shift; done
echo "$1"
0210名無しさん@お腹いっぱい。
2007/09/29(土) 21:53:33/ / ̄⌒ ̄\
/ / ⌒ ⌒ | | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| / (・) (・) | | てめーなんだよこの糞スレは!!
/⌒ (6 つ | | てめーは精神障害でもあんのか?
( | / ___ | < 何とか言えよゴルァァァァァァ!
− \ \_/ / \__________________
// ,,r'´⌒ヽ___/ ,ィ
/ ヽ ri/ 彡
/ i ト、 __,,,丿)/ ζ
| ! )`Y'''" ヽ,,/ / ̄ ̄ ̄ ̄\
! l | く,, ,,,ィ'" /. \
ヽヽ ゝ ! ̄!~〜、 / |
ヽ / ̄""'''⌒ ̄"^'''''ー--、 :::|||||||||||||||||||||||||||||||||
Y'´ / """''''〜--、|||||||||||||||||)
( 丿 ,,;;'' ....::::::::::: ::::r''''"" ̄""ヽ |
ゝ ー--、,,,,,___ ::: ::,,,,,ー`''''''⌒''ーイ ./
ヽ \  ̄""'''"" ̄ \____/-、
ヽ ヽ :::::::::::::::::::: / `ヽ
ヽ 丿 ) / ノ ゝ ヽ ,〉
ゝ ! / ∀
! | / 人 ヽ ヽ
| ,;;} !ー-、/ ヽ _,,,-ー'''''--ヘ
|ノ | | / Y ヽ
{ | | j ) >>1 ヽ
0211名無しさん@お腹いっぱい。
2007/09/29(土) 22:10:12POSIXだから範囲内。 俺の圧勝。
0212名無しさん@お腹いっぱい。
2007/09/29(土) 23:06:00そういう問題じゃない。Solarisでは動かないし。
0213名無しさん@お腹いっぱい。
2007/09/29(土) 23:10:470214名無しさん@お腹いっぱい。
2007/09/29(土) 23:14:12POSIXではあるが、実際の使用は推奨されない。
0215名無しさん@お腹いっぱい。
2007/09/30(日) 00:21:16xpg4使えばいい。
0216名無しさん@お腹いっぱい。
2007/09/30(日) 00:27:23各OS共通で
#!/bin/sh
って書くのに、どうやってxpg4を使うって言うんだい。
#!/usr/xpg4/bin/sh
なんてスクリプト見たことないし、
逆に、こう書いてしまうとSolaris以外で動かなくなる。
0217名無しさん@お腹いっぱい。
2007/09/30(日) 00:30:03NEWS-OS(4) で動かない。xpg4もない。
0218名無しさん@お腹いっぱい。
2007/09/30(日) 00:40:36NEWS-OSまで遡らなくても、SunOSでも動かないよw 当然 xpg4も無い。
0219名無しさん@お腹いっぱい。
2007/09/30(日) 00:45:53それはお前がへぼだから。POSIX shellであることを判定して偽なら
/usr/xpg4/bin/shをexecするとか幾らでも方法はある。
>>217-218
はいはい。板違い。
http://bubble6.2ch.net/i4004/
0220名無しさん@お腹いっぱい。
2007/09/30(日) 00:48:52POSIX shellであることを判定して偽なら
/usr/xpg4/bin/shをexecしているような
シェルスクリプトを未だに見たことがないがw
あと、>>217-218 が言うように xpg4がないOSではどうすんだよwww
0221名無しさん@お腹いっぱい。
2007/09/30(日) 00:53:57わざわざ動作環境限定して ## とか %% とかで書くことはない。
0222名無しさん@お腹いっぱい。
2007/09/30(日) 01:04:250223名無しさん@お腹いっぱい。
2007/09/30(日) 01:07:020224名無しさん@お腹いっぱい。
2007/09/30(日) 01:23:430225sage
2007/09/30(日) 01:33:530226名無しさん@お腹いっぱい。
2007/09/30(日) 01:36:080227名無しさん@お腹いっぱい。
2007/09/30(日) 01:42:26何で「昔のPC」なんだ?
NEWS-OSってSVR4系UNIX-WSなんだけど。
>>222, 224
客からcshでスクリプトを書くよう強制されたときの事を思い出す。
ファイルのクローズができなくて大変だったな....
ところで、 >>223 のようなkshの無い環境で、顧客からの許可が得られない場合、どうやってkshをつかえばいいのか、教えていただけますか?
それだけ強く要求するのですから、きっと万能な解決策をごぞんじなんでしょう?
0228名無しさん@お腹いっぱい。
2007/09/30(日) 07:19:290229名無しさん@お腹いっぱい。
2007/09/30(日) 08:51:16シェルスクリプトを異機種間で共有することは稀だからな。
お前が共有したい(#!/usr/xpg4/bin/shは嫌だ)と言い出したんだぞ。
>>221
POSIXを仮定すれば、1ワードで書けるものを水増しする必要は無い。
>>227
保守切れてるWSなんてゴミだよ。
そもそもまともなところなら、セキュリティパッチが出ないマシンは
ネットワーク接続禁止。だから昔のPC。
>>227
そんな仕事受けない。
見積もりで3倍くらいふっかける、それだけ手間がかかるんだから当たり前だ。
0230名無しさん@お腹いっぱい。
2007/09/30(日) 08:58:06シェルスクリプトは異機種間で共有する際に威力を発揮する。
異機種間で共有する必要がないならC言語で書いた方がいい。
たとえば、GNUのconfigureスクリプトとか。
異機種間で共有できなければそもそもconfigureの目的を果たせない。
0231名無しさん@お腹いっぱい。
2007/09/30(日) 09:33:00>>230
configureスクリプトはautomake/autoconfに吐かせる(つまり自分では書かない)
のが普通でしょう
手書きしないのは、それが一種の黒魔術でありバッドノウハウのカタマリであるから、
といっていいんじゃないのかな
0232名無しさん@お腹いっぱい。
2007/09/30(日) 13:49:59自分でconfigure.inとか書いたことない人?
カスタムルール書こうとすると自分でシェルスクリプト(+m4)書かなきゃ
いけないんですけど。
んでその断片がLinux依存になってたりすることもままある。
0233名無しさん@お腹いっぱい。
2007/09/30(日) 14:25:45あなたのその見解が、何故>>231への反論になりえるのかが理解できない。
汚い泥仕事は自動化したい・最小化したいが
完全に自動化できない場合があるからその場合は仕方なく泥仕事を
自分でやる必要がある、というだけのことでしょう。
それが泥仕事であることの否定にはなっていませんよ。
0234233
2007/09/30(日) 14:28:54問題はポータブルなスクリプトを書くのが泥仕事であるかどうかではなく、
そういう必要性があるかどうか、の話だったね。
それなら、ある人にとってはあるでしょうし、無い人にとってはないでしょう。
TPOをわきまえずに常にポータブルに書けというのはナンセンスだと思いますが。
0235名無しさん@お腹いっぱい。
2007/09/30(日) 14:35:50それをSolarisやNEWS-OSで動かないと文句言ってる奴に言ってやれ。
0236名無しさん@お腹いっぱい。
2007/09/30(日) 14:38:11経験のある老害の愚痴なんだろうから
そっとスルーしといてやれ
0237名無しさん@お腹いっぱい。
2007/10/01(月) 13:17:210238名無しさん@お腹いっぱい。
2007/10/01(月) 14:32:130239名無しさん@お腹いっぱい。
2007/10/01(月) 19:13:07cd /usr/
FULL_PATH=`getfullpath "A/B"`
echo $FULL_PATH
で /usr/A/B を出力、といったようなことがしたいのです
0240名無しさん@お腹いっぱい。
2007/10/01(月) 19:36:12FULL_PATH=$PWD/"A/B"
.とか..とかあったら知らんが絶対パスには違いない。
0241名無しさん@お腹いっぱい。
2007/10/01(月) 20:01:24単に `pwd` だと、シェルによってはシンボリックリンクを解決しないPATHを返してしまう。
`/bin/pwd` にした方が良い。シェルによっては `pwd -P`も使える。
0242名無しさん@お腹いっぱい。
2007/10/01(月) 21:34:34(
cd ${1%/*} && echo `/bin/pwd`/${1##*/}
)
0243名無しさん@お腹いっぱい。
2007/10/01(月) 22:14:03dirname basenameあるんだからそれ使えよ。
0244名無しさん@お腹いっぱい。
2007/10/01(月) 23:13:120245名無しさん@お腹いっぱい。
2007/10/01(月) 23:15:260246名無しさん@お腹いっぱい。
2007/10/01(月) 23:27:380247239
2007/10/01(月) 23:39:15環境はMac OS Xですがrealpathはコマンドラインとしてはないようです(関数はある)
pwdでも良さげですがpwdが返すパスは必ず/で終わっていない、という保証もなさそうで
ちょっと不安なので、自分でrealpathのような事をするツールを作る事にします。
0248名無しさん@お腹いっぱい。
2007/10/01(月) 23:45:16pwdが返すpathは、/ディレクトリ以外は / では終らないよ。
だから、`pwd`/A/B とする場合に、/ に居る場合のみ、
pwdの結果の単独の / を取り除く処理が要るね。
0249名無しさん@お腹いっぱい。
2007/10/01(月) 23:46:18変数Aの中を、キーワード検索するには、どうすれば
よいでしょうか。たとえば、/usr があるかどうかを検索
したい場合、キーワードはランダムな位置にある。
A="aaaaa /usr bbb 789 ccc"
↑キーワード
0250名無しさん@お腹いっぱい。
2007/10/01(月) 23:48:51GK乙
0251名無しさん@お腹いっぱい。
2007/10/01(月) 23:49:21普通に、
case $A in */usr*) /usrがあった場合の処理;; esac
0252名無しさん@お腹いっぱい。
2007/10/01(月) 23:53:47どうも、ありがとうございます。ちょっと実現に向けてがんばってみます。
0253名無しさん@お腹いっぱい。
2007/10/02(火) 01:36:48aaaa,bbbb
bbbb,cccc
aaaa,cccc
bbbb.aaaa
aaaa,dddd
bbbb,eeee
こんな感じにならんでいるものを
aaaa,bbbb
aaaa,cccc
aaaa,dddd
bbbb,cccc
bbbb,aaaa
bbbb,eeee
と並べ替えたいのですが、どうやればいいでしょうか。
0254名無しさん@お腹いっぱい。
2007/10/02(火) 01:44:11普通に sort の -k あたり使えばいいんじゃね?
man sort 参照。
0255名無しさん@お腹いっぱい。
2007/10/02(火) 01:47:32すみません。書いた後気がつきました^^;
お手数かけました。
0256名無しさん@お腹いっぱい。
2007/10/03(水) 00:07:24標準出力をif文の制御をパイプでつなぎたいですが、
下記の例で、if文の制御で可能でしょうか、だめの場合は、
別な方法はあるでしょうか。
例:
if [[ $? -nq 0 ]]; then
ls -x |
else
cat /etc/hosts |
fi
while read line
do
:
0257名無しさん@お腹いっぱい。
2007/10/03(水) 00:29:38if [[ $? -nq 0 ]]; then
ls -x
else
cat /etc/hosts
fi |
0258名無しさん@お腹いっぱい。
2007/10/03(水) 00:33:08どうもありがとうございます。やってみます。
0259名無しさん@お腹いっぱい。
2007/10/03(水) 01:40:420260名無しさん@お腹いっぱい。
2007/10/03(水) 01:44:110261名無しさん@お腹いっぱい。
2007/10/03(水) 01:48:580262名無しさん@お腹いっぱい。
2007/10/03(水) 07:35:15でも、bourneで使えないから、[[ ]] は普通使うべきじゃない。
## %% を使うべきじゃないのと同じ。
0263名無しさん@お腹いっぱい。
2007/10/03(水) 08:03:05-nq
のほうが引っかかるのだが、
何でみんなスルーするのだ?
0264名無しさん@お腹いっぱい。
2007/10/03(水) 20:38:08then節またはelse節がエラーになった場合、
標準出力をパイプに渡したくないするのに、よい方法
はあるでしょうか。エラーがあった場合は、メッセージ
を出したexitするようなことはできないでしょうか。
if [ $? -nq 0 ]; then
ls -x ← エラーがあった場合
else
cat /etc/hosts ← エラーがあった場合
fi |
while read line
do
:
0265名無しさん@お腹いっぱい。
2007/10/03(水) 20:42:50エラーがあった場合、
echo 'エラーメッセージ' 1>&2
exit
とすればいいだけ。標準エラー出力に出るので、
パイプには渡されない。
-nq はいい加減に直せよ
0266名無しさん@お腹いっぱい。
2007/10/03(水) 21:14:47-nq を -ne に修正します。
ようわからないのですが、
正常ケースだと、echoで指定したメッセージが渡されて
しまいそうなんですが。
0267名無しさん@お腹いっぱい。
2007/10/03(水) 21:31:46正常ケースについては言っていない。
エラーが出た場合のエラーメッセージの出し方を言っているのだが。
もしかして、$? での判断の方法とか知らないの?
0268名無しさん@お腹いっぱい。
2007/10/04(木) 00:38:550269名無しさん@お腹いっぱい。
2007/10/04(木) 03:16:20パイプの前で exit してもスクリプト自体は終了しないから
>>265 を入れてもあまり意味が無いんじゃね?
0270名無しさん@お腹いっぱい。
2007/10/04(木) 06:46:06while read で、パイプから読もうとしているから、
broken pipe で終了するよ。
もし、パイプの先が標準入力(=パイプ)を読まないコマンドばかりだったら
確かにすぐには終了しないけどね。
よって、>>265 で正解。
0271名無しさん@お腹いっぱい。
2007/10/04(木) 20:53:04シェルを書く時、まず最初の方で、
#!/bin/sh みたいに、シェルをインクルードしますよね。
でも、この前インクルードしなくても動いてしまったんですよ。
結局インクルードは必要ないんでしょうか?
Cで、printf()を使う程度だったら<stdio.h>を
インクルードしなくていいのと同じですか?
0272名無しさん@お腹いっぱい。
2007/10/04(木) 21:42:37シェルスクリプト総合 その4
http://pc10.2ch.net/test/read.cgi/unix/1131026501/33-
http://www.bookshelf.jp/2ch/unix/1131026501.html
0273名無しさん@お腹いっぱい。
2007/10/05(金) 08:31:250274名無しさん@お腹いっぱい。
2007/10/05(金) 08:54:330275名無しさん@お腹いっぱい。
2007/10/05(金) 09:09:240276名無しさん@お腹いっぱい。
2007/10/05(金) 15:53:060277名無しさん@お腹いっぱい。
2007/10/07(日) 15:08:28a=hoge
b=a
こういう時
echo "$b"
↓b=aなので
echo "$a"
↓a=hogeなので
hoge
みたいな処理をしたいのですができますでしょうか?
0278名無しさん@お腹いっぱい。
2007/10/07(日) 15:21:340279名無しさん@お腹いっぱい。
2007/10/08(月) 05:23:270280277
2007/10/08(月) 06:08:15変数の中に変数を入れることはできないでしょうか?
自分の応用力の無さが嫌になります
hoge_A=AAA
foo=A
${hoge_$foo}
↓foo=Aなので
${hoge_A}
↓
AAA
0281名無しさん@お腹いっぱい。
2007/10/08(月) 06:29:01eval "echo \"\${hoge_$foo}\"
>>277 ならbash 限定かもしれんが eval なしでもできる
echo "${!b}"
0282名無しさん@お腹いっぱい。
2007/10/08(月) 08:02:57eval echo \"\$hoge_$foo\"
変数の中に空白とかがなければ
eval echo \$hoge_$foo
でも桶。
>>281 のひとつ目の解答、ダブルクォートがおかしいよ。
0283名無しさん@お腹いっぱい。
2007/10/08(月) 20:38:58>>278は
入力: eval echo \$$b
↓ 変数展開($b)・エスケープ解釈
シェルが実行する文: eval echo $a
↓ そのevalコマンドを実行……
入力: echo $a ←←※
↓ 変数展開($a)
echo hoge
evalを使う式を作る場合は欲しい文※からスタートしてさかのぼればいい。
echo "$hoge_A" ←←※実行させたいケースの例
↓ Aを変数fooの参照に戻す・$などをエスケープ
echo \"\$hoge_$foo\"
↓ 頭にevalをつける
eval echo \"\$hoge_$foo\"
0284277
2007/10/08(月) 21:08:00283さんの解説を見つついろいろ試して理解しようと思います。
0285名無しさん@お腹いっぱい。
2007/10/10(水) 02:28:09echo 'aaa bbb aaa ccc" | sort
0286名無しさん@お腹いっぱい。
2007/10/10(水) 02:53:480287名無しさん@お腹いっぱい。
2007/10/13(土) 10:12:10sedでやる(置換して戻す二度手間が少しダサい)
echo "aaa bbb aaa ccc" | sed 's/ /\
/g' | sort | sed ':loop
N;s/\n/ /;$!b loop'
awkでやる(長い。一目見て何をしているのか解らない)
※とりあえず「行が長すぎる」と投稿時に怒られたので、分割しますたが元は一行です。
echo "aaa bbb aaa ccc" | \
awk '{ sizeOfArray = split($0,words," ")
for (i = 2; i <= sizeOfArray; ++i) {
for (j = i;(j-1) in words && wrods[j] < words[j-1]; --j) {
tmp = words[j]; words[j] = words[j-1]; words[j-1] = tmp
}
}
for (i = 1; i < sizeOfarray; ++i) printf("%s ",words[i])
print words[i]
}'
sortアルゴリズムを工夫すると更に訳解らん一行コマンドになりそうw
0288名無しさん@お腹いっぱい。
2007/10/13(土) 10:50:03s/\n/ /g'
0289名無しさん@お腹いっぱい。
2007/10/13(土) 11:26:440290名無しさん@お腹いっぱい。
2007/10/13(土) 11:43:340291名無しさん@お腹いっぱい。
2007/10/13(土) 12:39:03ただし、awkを使う場合はawkだけにしてsedは使わないのが美しい。
0292名無しさん@お腹いっぱい。
2007/10/13(土) 14:49:020293287
2007/10/13(土) 15:27:47済みません。perl 知らないんですw
シェルスクリプトや sed,awk なんかも勉強し始めたばかりで、
もう少し上達したら、次は perl を学ぼうと思ってます。
0294名無しさん@お腹いっぱい。
2007/10/13(土) 15:53:04ああいうの、まわりに迷惑かけてるよなぁ。
0295名無しさん@お腹いっぱい。
2007/10/13(土) 17:32:280296名無しさん@お腹いっぱい。
2007/10/13(土) 17:44:540297名無しさん@お腹いっぱい。
2007/10/13(土) 17:47:48perl -ne 'print join(" ", sort(split(/\s+/))), "\n"'
0298名無しさん@お腹いっぱい。
2007/10/13(土) 17:49:04でた、口だけ番長。
0299名無しさん@お腹いっぱい。
2007/10/13(土) 17:51:200301名無しさん@お腹いっぱい。
2007/10/13(土) 19:08:530302名無しさん@お腹いっぱい。
2007/10/13(土) 20:56:42「シェルをかく」と大して変わらん。
シェルはシェル、スクリプトはスクリプト。
0303名無しさん@お腹いっぱい。
2007/10/13(土) 21:15:30日本語大丈夫ですかw
「シェルを書く」は間違い。
「シェルで書く」は桶。
「シェルで書く」→「シェルで記述する」
→「シェルをインタプリタとして(コマンドを)記述する」
逆に、
「シェルスクリプトで書く」は間違い。
書かれたもののことを「シェルスクリプト」と言うのだから、
「シェルスクリプトで書く」だと、
「(別の)シェルスクリプトを自動的に書いてくれるようなシェルスクリプトを使う」
みたいな意味になってしまう。
0304名無しさん@お腹いっぱい。
2007/10/13(土) 21:20:49もしかすると世の中にはシェルスクリプトで書かれたエディタがあったりして
……と書いてこの「シェルスクリプトで」はあってるのか間違ってるのか
わからなくなってきた
0305名無しさん@お腹いっぱい。
2007/10/13(土) 21:25:480306名無しさん@お腹いっぱい。
2007/10/13(土) 21:46:23「てにをは」が通用しないケースが有るだけのこと。
くだくだしく文法を語らなくてよろし。
0307名無しさん@お腹いっぱい。
2007/10/15(月) 00:22:28やっぱり逃げたな。口だけ番長。
0308名無しさん@お腹いっぱい。
2007/10/15(月) 09:31:23俺はシェルで書けば直ぐ終わるものをJavaしか
書けないから?と言う理由で全部Javaで書いて
帰って行った外注さん知ってるぞ。
0309名無しさん@お腹いっぱい。
2007/10/15(月) 15:27:51chmod(相当)だって、やっと1.6で出来るようになったのに。
0310名無しさん@お腹いっぱい。
2007/10/15(月) 20:14:03権限関連の操作と、ファイルのコピー、移動は、javaから子プロセス起こしてシェルスクリプト実行してる。
1.3,1.4の環境だと実装が面倒&パフォーマンス悪すぎなので。
0311名無しさん@お腹いっぱい。
2007/10/17(水) 01:48:54#!/bin/sh -
とした方が安全、みたいなことを読んだことがあるような
気がするんですが、そういう話ってありますか?
なんかごにょごにょして予期しないオプションを渡されないように、
みたいなことだったと思うんですが。
0312名無しさん@お腹いっぱい。
2007/10/17(水) 06:03:25とりあえず、ファイルのフルパスのみ、もしくは、ファイル名のみであれば以下で表示できるのですが、
find `/bin/pwd` -type f -print -exec ls {} \;|xargs -i dirname {}
find `/bin/pwd` -type f -print -exec ls {} \;|xargs -i basename {}
これを同時に行って
/hoge/hoge bar.txt
/hoge/hoge foo.txt
/hoge/hoge/hoge foo.txt
のように表示することはできないでしょうか?
あるコマンドの処理結果の一行に対して複数コマンドを発行する、ということになると思うのですが。
一旦 set -A で配列に入れてからloopで一行づつ処理することも考えたのですが、ファイル数が多すぎる場合Errorになってしまいます。
どなたかご教示ください
0313名無しさん@お腹いっぱい。
2007/10/17(水) 09:05:20話はそれからだ。
0314名無しさん@お腹いっぱい。
2007/10/17(水) 09:12:11でどうかな。
0315名無しさん@お腹いっぱい。
2007/10/17(水) 09:12:53適当に直してください。
0316名無しさん@お腹いっぱい。
2007/10/17(水) 09:14:22できたよ。
find `/bin/pwd` -type f -exec sh -c 'echo `dirname {}; basename {}`' \;
0317名無しさん@お腹いっぱい。
2007/10/17(水) 13:53:01> s/.../.../g は GNU 拡張で s|...|...|g にしたから、/ にする所は
それってGNU拡張?
雉も鳴かずば撃たれまいに……w
0318名無しさん@お腹いっぱい。
2007/10/18(木) 01:54:00うぉ、実はedからこういう挙動なのね:
$ echo hogehoge > a
$ ed a
9
,s,hoge,fuga,g
w
9
q
$ cat a
fugafuga
なんとなくPerlとかそういう無節操な時代になってからの事だとばかり・・・(恥
0319名無しさん@お腹いっぱい。
2007/10/18(木) 19:51:23find "`/bin/pwd`" -type f -exec sh -c "echo \`dirname '{}';basename '{}'\`" \;
または312のようにそれぞれ一方だけを出力する方法はわかるのなら
それぞれ出力して後からくっつけるとかでもいいし
find 〜 -exec dirname '{}' \; > /tmp/dirname.txt
find 〜 -exec basename '{}' \; > /tmp/basename.txt
paste -d ' ' /tmp/dirname.txt /tmp/basename.txt
もしくはリストを出力させてwhileループで料理してもいい
find 〜 -print | while read f; do
echo "`dirname $f` `basename $f`"
done
他にはfindに-execを複数並べて、後から2行を1行にまとめるのでも。
find 〜 -exec dirname '{}' \; -exec basename '{}' \; | while read d; do read b; echo "$d $b"; done
0320名無しさん@お腹いっぱい。
2007/10/18(木) 19:55:240321名無しさん@お腹いっぱい。
2007/10/20(土) 08:46:44先頭に#があり、行の終わりにキーワード(Japan_A)がある行
から次の#と行の終わりにキーワード(Japan_X)がある直前まで読み込む
方法を考えています。
readとwhile文で簡単に実現するにはどうすれば、よいでしょうか。
while の条件がよくからないです。
====データ構造
BBB nnn
AAAA
#△△ABC△△△△Japan_A ← このパターンを検出して、次の行を読み込む。
:
123△△456
:
:△789△10
:
#△△ABC△△△△Japan_Z ← ここのひとつ前の行まで、
:zzz△12
:
====
0322名無しさん@お腹いっぱい。
2007/10/20(土) 09:58:25whileの条件: コマンドの終了ステータスが0ならループ
その例はsedでやるのが簡単で速いけど。
0323名無しさん@お腹いっぱい。
2007/10/20(土) 12:09:46変数に代入するのってどうやればいいでしょうか?
0324名無しさん@お腹いっぱい。
2007/10/20(土) 12:30:470325名無しさん@お腹いっぱい。
2007/10/20(土) 13:24:38で変数numが1〜10の値の場合、
という処理をしたい場合、
下記って正式にサポートされている構文なんでしょうか。
一応動きますが。。。
if [ ${num} -ge 0 ] && [ ${num} -le 9 ]
また、${num}が1〜9の値の場合、
echo "${num} is 1-9."
というコマンドを実行したい場合、
下記のような記述の仕方も認められているんでしょうか?
if [ ${num} -ge 0 ] && [ ${num} -le 9 ] && echo "${num} is 1-9."
0326名無しさん@お腹いっぱい。
2007/10/20(土) 14:10:17「正式サポート」って、Bourne shell桶っていう意味かな?
であればすべて桶。無問題。
一番下の行、間違ってるよ。ifは要らん。
× if [ ${num} -ge 0 ] && [ ${num} -le 9 ] && echo "${num} is 1-9."
○ [ ${num} -ge 0 ] && [ ${num} -le 9 ] && echo "${num} is 1-9."
0327名無しさん@お腹いっぱい。
2007/10/20(土) 14:40:32if文の条件式のところに書くのは「リスト」
リストというのは、1つ以上のコマンド(のパイプ列)を&&や||でつないだもの
[ ${num} -ge 0 ] && [ ${num} -le 9 ] がリストとして正当な以上、
if文の条件としても正当。
0328名無しさん@お腹いっぱい。
2007/10/20(土) 15:04:29if文の中の&&が正式サポートされているという事ですが、
if文がないのに、条件式だけ&&で書いても実行できてしまうのは
正式サポートなんですか?
0329名無しさん@お腹いっぱい。
2007/10/20(土) 15:20:55それがリスト。
&&の機能は、左のコマンドが成功したら(0を返したら)右のコマンドを実行する。
||の機能は、左のコマンドが失敗したら(非0を返したら)右のコマンドを実行する。
他に ; てのもあって、これは左のコマンドを実行し、続いて右のコマンドを実行する。
0330名無しさん@お腹いっぱい。
2007/10/20(土) 15:36:38if [ ${num} -ge 0 ] && [ ${num} -le 9 ]; then
↓
if [ ${num} -ge 0 -a ${num} -le 9 ]; then
今時はないが、[ ] が外部コマンドになってるシェルの場合、
下の方法の方がtestが1回で済むため速い。
あと、変数numが空の場合にtestが混乱するのを避けるため、
常にダブルクォートを付ける癖を付けた方がいい。
さらに、単純な変数参照では { } は不要。
以上を考慮すると、
↓
if [ "$num" -ge 0 -a "$num" -le 9 ]; then
となる。
ところが、実はこの場合はif文じゃなくてcase文で書いた方が簡単。
すべて内部コマンドになり、少しだけ速い。
case $num in [0-9]) 実行したいコマンド;; esac
0331名無しさん@お腹いっぱい。
2007/10/20(土) 15:36:53具体的には、
&&は、左のコマンドが失敗したらそのステータス値を返して終了。
成功なら、まだ終わらず、右のコマンドの結果をステータス値を返す。
||は、左のコマンドが成功したら0で終了。
失敗なら、右のコマンドのステータスを返す。
となる。これ自体はシェルの正式な動作。
で、if 条件式…だと思っているものは正しくは if リスト ... であり、
リストを実行し、成功なら(0を返したら) then以下を〜という構文。
testというのはいろんな条件を調べて、成り立つなら成功(0)で終了、
成り立たないなら0以外を返すコマンド。if文に書くときにカッコに
見えるように [ という同機能のコマンドも用意されている。([という
名前で実行する場合は、カッコのペアに見えるように最後に ] という
引数を付ける。
0332名無しさん@お腹いっぱい。
2007/10/20(土) 22:51:51支援ありがとうございました。
sed ですか。あまり、熟知していないなぁ。
0333名無しさん@お腹いっぱい。
2007/10/21(日) 01:48:28データが収められているのが file とするとこんな感じ。
flag='false'
while read line ; do
if echo "$line" | grep -q '^#.*Japan_A' ; then
flag='true'
elif echo "$line" | grep -q '^#.*Japan_Z' ; then
flag='false'
elif $flag ; then
echo "$line"
fi
done < file
あまり効率の良いコードじゃないので、これは叩き台として使ってくれ。
0334名無しさん@お腹いっぱい。
2007/10/21(日) 05:53:04FILE[0]=a
FILE[1]=b
FILE[2]=c
この配列をforを使ってechoしたいのですがどうしたらいいでしょうか?
0335334
2007/10/21(日) 06:04:470336名無しさん@お腹いっぱい。
2007/10/21(日) 06:34:27親切な、詳細コードありがとうございます。感謝いたします。
参考にさせていただきます。
0337名無しさん@お腹いっぱい。
2007/10/22(月) 23:18:56grep の検索キーを変数などで、変更可能でしょうか。
例: 1022の部分を変数などで変更する方法?は
grep 'ABC_071022' $line
↓
grep 'ABC_???' $line
0338名無しさん@お腹いっぱい。
2007/10/22(月) 23:39:570339名無しさん@お腹いっぱい。
2007/10/22(月) 23:53:19ありがとうございます。試してみます。
( ' → " になるのですね。)
0340名無しさん@お腹いっぱい。
2007/10/23(火) 00:00:32基本から勉強しなおしてみたら?
0341名無しさん@お腹いっぱい。
2007/10/23(火) 00:05:24ご指摘のとおりかと思います。やはり基本からですね。
0342名無しさん@お腹いっぱい。
2007/10/23(火) 22:28:140343312
2007/10/25(木) 01:22:35御礼が遅くなりました。すいません。
>>314
ある出力に対して二回処理を行うのではなくて、出力自体を加工するってことですね。
問題なく実行できました。
ありがとうございます。
>316, 319
find `/bin/pwd` -type f -exec sh -c 'echo `dirname {}; basename {}`' \;
find "`/bin/pwd`" -type f -exec sh -c "echo \`dirname '{}';basename '{}'\`" \;
これ両方うまくいかないんですよね。
どうなるかというと. {} って出力がfindの結果数分続きます。
dirname, filename の引数を{}として実行するとそれぞれ "."と"{}"になるので、
{}にfindの結果が入っていないような動きだと思うんですが原因が分かりません。
よく分からなかったので試しに実験してみたところ、
find `/bin/pwd` -type f -exec echo {} \;
の出力はファイル名が出力されるのに、
find `/bin/pwd` -type f -exec sh -c echo {} \;
だとfindの結果行数分の改行(Blank行が延々続く)になってしまいます。
{}が単独で置かれていなければならないような findもある、
というmanの記述を見つけたのですが、今回のケースがそれなんでしょうか?
http://www.linux.or.jp/JM/html/GNU_findutils/man1/find.1.html
いずれにせよ環境が問題な気もするんですが、どなたか回避策ご存じないですか?
ちなみにOSはAIXです。
0344名無しさん@お腹いっぱい。
2007/10/25(木) 04:17:32多分 find じゃなくて最後の sh に与える引数のクォートが
上手くいってないんじゃないかな。
これならどうよ?
find `/bin/pwd` -type f -exec sh -c "echo {}" \;
find `/bin/pwd` -type f -exec sh -c "echo \`dirname \"{}\";basename \"{}\"\`" \;
0345名無しさん@お腹いっぱい。
2007/10/25(木) 12:12:46AIXスレでそういう特有の事情がないか聞いてみるとか。
0347名無しさん@お腹いっぱい。
2007/10/26(金) 10:20:35ここはうに板だ。
GNUでしかできないことを書き込むときはきちんと断りを入れよう。
0348名無しさん@お腹いっぱい。
2007/10/26(金) 10:55:33GNUじゃないよ。FreeBSDのfindでもうまくいく。多分、AIXのfindの問題。
0349名無しさん@お腹いっぱい。
2007/10/26(金) 11:09:58ちなみに3大商用Unixでは、どれもできなかった。
0350名無しさん@お腹いっぱい。
2007/10/26(金) 13:35:300351名無しさん@お腹いっぱい。
2007/10/26(金) 14:10:33業務用とかでも全く相手にされないオモチャなのにw
0352名無しさん@お腹いっぱい。
2007/10/26(金) 15:38:530353名無しさん@お腹いっぱい。
2007/10/26(金) 16:38:04ktkr
0354名無しさん@お腹いっぱい。
2007/10/27(土) 00:02:490355名無しさん@お腹いっぱい。
2007/10/27(土) 09:21:53getopts でのオプション解析の使用方法は下記でよいでしょうか。
comand.sh - /etc/passwd このケースの場合は、固まるような。
例:
comand.sh -p /etc/passwd
-- オプション解析部
while getopts p: option
do
case $option in
p)
AA='a'
;;
?)
echo "usage: xxxxxxxxxx"
exit 1
;;
esac
done
0356名無しさん@お腹いっぱい。
2007/10/27(土) 10:01:40case /etc/passwd in p) echo p;; *) echo '*';;esac
0357名無しさん@お腹いっぱい。
2007/10/27(土) 10:10:45それで合ってるよ。comand.sh - /etc/passwd の場合でも別に固まらない。
>>356 は何をどう勘違いしたのか知らんが、全く頓珍漢。→ 無視で桶。
0358名無しさん@お腹いっぱい。
2007/10/27(土) 10:23:06どうもご支援ありがとうございます。安心しました。
0359名無しさん@お腹いっぱい。
2007/10/27(土) 23:23:12確か case の ? は任意の一文字だから
? 自体にマッチさせたいのならエスケープが要るよ。
0360名無しさん@お腹いっぱい。
2007/10/28(日) 23:57:31といったことがしたいのですが、方法はありますでしょうか。
0361名無しさん@お腹いっぱい。
2007/10/29(月) 00:33:240362名無しさん@お腹いっぱい。
2007/10/29(月) 02:37:16% (cmd 2>&1 >&3 | tee /dev/tty) > /tmp/out 3>&1
または/dev/fd/*があるなら
% (cmd 2>&1 >&3 | tee /dev/fd/3) 3>/tmp/out
zshなら少し横着できて
% (cmd 2>&1 2>&3 >&3) 3>/tmp/out
ただし、ファイルへの出力で標準出力と標準エラー出力に別々に出力されたものの
順序を保存するのは無理。
理由は、標準エラー出力の分岐が必要だけど、それはteeのようなプロセスを
介さずにはできないから。
zshではさも分岐できるように書けるけど、裏でzshがteeの役をやっている。
0363名無しさん@お腹いっぱい。
2007/10/29(月) 07:44:29>zshなら少し横着できて
↑より上の行は zshじゃないんだよね?
だったら %のプロンプト使うなよ。csh系は 2>&1 とかの文法使えない糞シェルだから。
0364名無しさん@お腹いっぱい。
2007/10/29(月) 14:12:27ネットマスク255.255.255.0を
CIDR表記192.168.1.0/24のように置換したいのですがどうしたらいいでしょうか?
0365名無しさん@お腹いっぱい。
2007/10/29(月) 14:16:39http://pc11.2ch.net/test/read.cgi/linux/1193299060/152
http://pc11.2ch.net/test/read.cgi/linux/1136593433/452
0366名無しさん@お腹いっぱい。
2007/10/29(月) 14:17:260368名無しさん@お腹いっぱい。
2007/10/29(月) 14:37:470369364
2007/10/29(月) 14:47:41シェルスクリプトはちょっとだけわかります。
シェルスクリプトで教えてください。
0370名無しさん@お腹いっぱい。
2007/10/29(月) 14:51:410371364
2007/10/29(月) 15:00:210372名無しさん@お腹いっぱい。
2007/10/29(月) 15:19:380373名無しさん@お腹いっぱい。
2007/10/29(月) 15:21:57男子ですか?
女子なら考えますよ
0374364
2007/10/29(月) 15:25:070375名無しさん@お腹いっぱい。
2007/10/29(月) 16:18:15awk -F. '
BEGIN {
tbl[255] = 8; tbl[254] = 7; tbl[252] = 6; tbl[248] = 5;
tbl[240] = 4; tbl[224] = 3; tbl[192] = 2; tbl[128] = 1;
tbl[0] = 0
}
/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {
result = 0
for (i = 1; i <= 4; ++i) {
if (!($i in tbl))
next
result += tbl[$i]
}
print result
}'
0376364
2007/10/29(月) 18:33:06awk -F. '
BEGIN {
tbl[255] = 8; tbl[254] = 7; tbl[252] = 6; tbl[248] = 5;
tbl[240] = 4; tbl[224] = 3; tbl[192] = 2; tbl[128] = 1;
tbl[0] = 0
}
/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {
result = 0
for (i = 1; i <= 4; ++i) {
if (!($i in tbl))
next
result += tbl[$i]
}
print result
}'
すみません。これ実行してもできません。。。
0377名無しさん@お腹いっぱい。
2007/10/29(月) 19:21:30どっから説明したらいいんだ?
まず、シェルスクリプトの基本からやれや。
0378名無しさん@お腹いっぱい。
2007/10/29(月) 20:20:360379名無しさん@お腹いっぱい。
2007/10/29(月) 20:22:500380364
2007/10/29(月) 20:51:20どうしたら・・・
0381名無しさん@お腹いっぱい。
2007/10/29(月) 21:38:16そりゃ、実行するだけじゃ何もしないさ。
標準入力から255.255.255.0とかいう入力を1行ずつ読み込んで、
24とか出力するプログラムになっている。とりあえず素で実行して
手で入力して動作を試してみろ。
それをどう使うかは自分で考えれ。
つか、シェルスクリプトの基礎の話になるから、どっかのサイトか本で
自分で勉強汁。そこまで一から教えるのは不可能だ。
0382名無しさん@お腹いっぱい。
2007/10/29(月) 22:36:57$ MASK=255.255.255.192
$ echo -n "`echo obase=2.$MASK|tr . \;|bc|tr '0\012' '\0\0'`"|wc -c
ちょっと空白の削り方が美しくないが、かろうじて一行に収まった。
0383364
2007/10/29(月) 22:54:51ありがとうございます!大感謝です!
ちなみに結果を$CIDRに代入したいのですがどうしたらいいですか?
バカですみません。。。
0384名無しさん@お腹いっぱい。
2007/10/29(月) 23:01:04学生は答ではなく原理や方法を考える手間を惜しんじゃいけないでしょ。
ていうかシェルスクリプトを書く中学生とは一体??
(最近は高校生でカーネルメンテナとかいるから普通なのか・・・)
0385名無しさん@お腹いっぱい。
2007/10/30(火) 00:40:34今後年食って頭悪くなる一方だから。
0386名無しさん@お腹いっぱい。
2007/10/30(火) 01:02:00$ M=255.255.255.255
$ echo obase=2.$M|tr . \;|bc|tr -d 0\\n|wc -c
さすがに限界?段々ゴルフになってきたな。
0387名無しさん@お腹いっぱい。
2007/10/30(火) 08:51:55#!/usr/bin/ruby
n=$*[0].to_i;puts [24,16,8,0].map{|i|~(~0<<n)<<32-n>>i&255}.join(".")
0388名無しさん@お腹いっぱい。
2007/10/30(火) 18:12:450389名無しさん@お腹いっぱい。
2007/10/30(火) 21:29:260390初心者です
2007/11/01(木) 02:00:47abcで始まり、数字で終わる文字列を取得したいと思ってます
例)MOJI='abc123onegaisimasu'
この場合「abc123」を取得したい
0391名無しさん@お腹いっぱい。
2007/11/01(木) 02:18:07つ $ echo hogehogeabc123hogehoge | sed -ne 's/.*\(abc[0-9]*\).*/\1/p'
0392初心者です
2007/11/01(木) 02:29:58ありがとうございます!
0393名無しさん@お腹いっぱい。
2007/11/01(木) 08:20:550394名無しさん@お腹いっぱい。
2007/11/01(木) 13:18:410395名無しさん@お腹いっぱい。
2007/11/01(木) 13:56:20grepによる検索やsedでの置換で、正規表現を使って
複数行に渉る任意の文字列を対象にすることが出来ますか?
・・・って意味ですか?
日本語は難しいので、詳しく書いてもらえないと分からないです。(perl知らないし)
ちなみに上記の意味ならば、sedである程度対応出来るのは知ってるけど、grepは知らね。
(perl知ってるなら、そっちを使えばいいと思う。awkでも条件満たせるだろうけど、わざわざ使う意味無)
0396名無しさん@お腹いっぱい。
2007/11/01(木) 15:33:410397名無しさん@お腹いっぱい。
2007/11/01(木) 16:42:55テンプレにあるPOSIXのリンクを参照。
0398名無しさん@お腹いっぱい。
2007/11/01(木) 17:05:26すみません。その通りです。
sedでどのようにしてできるのでしょうか?
0399396
2007/11/01(木) 19:38:47アドバイスありがとです。ざっと読みましたが言及されていないので
bash 拡張のようですね。man bash もしてみましたが・・・
0400395
2007/11/02(金) 10:26:30Nで次行追加読み込みするので。正規表現で\nを使うと複数行中の改行にマッチする。
置換対象文字列に改行を使用するときは、\の後ろで実際に改行する。
:の後ろにラベル名を書く(末尾に空白や区切り文字が有ってはいけない)
bで処理の流れを変える(下の場合最終行意外「$!」は最後に出力する前に先頭に戻る)
$ cat a.txt
aaaa
bbbb
cccc
dddd
$ sed ':loop
N;s/\(^.*\)\n\(.*$\)/\2\
\1/;$!b loop' a.txt
dddd
cccc
bbbb
aaaa
0401名無しさん@お腹いっぱい。
2007/11/02(金) 20:37:21resultやrvalをみなさんはなんと読んでいますか?
0402名無しさん@お腹いっぱい。
2007/11/02(金) 20:38:09UNIXに関する言葉のひらがな読みスレッド
http://pc11.2ch.net/test/read.cgi/unix/1001358861/
0403名無しさん@お腹いっぱい。
2007/11/03(土) 16:32:39ファイル名がフルパスで5,000行位書かれている$LISTから、キーになるリスト$KEY_LISTから一行ずつ取り出し
ひとつにマッチした物を$okそれ以外を$ngにカウントして結果を表示するスクリプトを作っています。
LIST="/home/share/list"
[1] aaa/bbb/ccc/ddd/eee/A社ボツ/商品A企画書/hoge.txt
[2] aaa/bbb/ccc/ddd/eee/A社/商品B企画書/hoge.txt
[3] 営業部終了分/iii/jjj/kkk/lll/mmm/nnn/page.txt
[4] 営業部/xxx/jjj/kkk/lll/mmm/nnn/page.txt
KEY_LIST="/home/share/key_list"
[1] aaa/bbb/ccc/ddd/eee/A社/商品A企画書/hoge.txt
[2] 営業部/iii/jjj/kkk/lll/mmm/nnn/page.txt
だだ上記のように親ディレクトリの名前が変更されているのと、違う親ディレクトリ名で同じファイル名が存在するので
単純にgrepするのではうまくいかないのでこんなかんじで作ってみました。
0404403
2007/11/03(土) 16:33:23for i in `cat $KEY_LIST`
do
key=`echo "$i" | awk -F/ '{print$NF}'` #処理A
much=`grep "/$key$" $LIST | wc -l`
if [ "$much" -eq 1 ] ; then
((ok++))
else
key=`echo "$i" | awk -F/ '{b=NF-1} {print$b"/"$NF}'` #処理B
much=`grep "/$key$" $LIST | wc -l`
if [ "$much" -eq 1 ] ; then
((ok++))
else
((ng++))
fi
fi
done
echo "OK $ok"
echo "NG $ng"
処理Aでは、$KEY_LIST[1]行目の「hoge.txt」で$LISTをgrep すると$LIST[1],[2]マッチするので else
処理Bでは、$KEY_LIST[1]行目の「商品A企画書/hoge.txt」でgrepすると$LIST[1]のみにマッチするので、okになります。
しかし、$KEY_LIST[2]と$LIST[3]は同じファイルなのですが、$LIST[4]ともマッチしてしまいngになります。
さらに処理C〜処理Gを追加すればokになるのですが、実際のリストは20階層くらいあり
うまくループで作れないものかと思っています。よろしくお願いします。
0405名無しさん@お腹いっぱい。
2007/11/03(土) 19:29:48こんなので使えますか?
#!/bin/sh -
LIST="/home/share/list"
KEY_LIST="/home/share/key_list"
awk -F/ '
{
for(i = NF; i >= 1; --i) {
for(j = i; j <= NF; ++j) {
if(j == 1) {
sizeOfArray = split($j,array," ")
result = array[sizeOfArray]
}
else if(j == i) result = $j
else result = result"/"$j
}
count = system ("grep -c " result" ""'$LIST'"" >/dev/null 2>&1")
result = ""
if(count == 1) {
ok++
break
}
}
ng++
}
END {
printf("%04d\n%04d\n", ok, ng)
}
0406405
2007/11/03(土) 19:32:45' $KEY_LIST
0407405
2007/11/03(土) 19:47:13忘れてください。
0408名無しさん@お腹いっぱい。
2007/11/03(土) 20:19:57どうもよくわからん。行いたい処理じゃなくて、目的から説明できる?
同一ファイルの重複検査ならmd5sumとってsort+uniqとか、不可思議な
パス名の切り貼り検索以外の解決策があるのではないかという気がする。
0409405
2007/11/03(土) 22:10:30私は純粋に頭の体操と思ってチャレンジさせてもらってます。
で、>>403 の解釈だけど、
key_list の各行に対して ok または ng の判定をするということでよいですか?
だったら(一行全部マッチする可能性も有るので)一行読む毎に一度ゼロを入れて、
ゼロになる直前のマッチ数が1で有ったら、おkって解釈でいいよね?
で ok と ng の合計が、key_list と一致するという考え方でいいですか?
ならば以下で再挑戦です。
#!/bin/sh -
LIST="/home/share/list"
KEY_LIST="/home/share/key_list"
A="` echo | tr '\012' '\001' `"
COUNT=`awk -F/ '
{
for(i = NF; i >= 1; --i) {
for(j = i; j <= NF; ++j) {
if(j == 1) {
sizeOfArray = split($j,array," ")
result = array[sizeOfArray]
}
else if(j == i) result = $j
else result = result"/"$j
}
system("grep -c " result" ""'$LIST'")
result = ""
}
system("grep -c ""'$A'"" ""'$LIST'") # 全部が一致する可能性も有るので無理やりゼロになるぐれっぷを実行
} ' $KEY_LIST`
続く。
0410405
2007/11/03(土) 22:14:14echo $COUNT | awk 'BEGIN {RS = " "}
{
if($0 == 0) {
if(tmp == 1) ok++ # ゼロになる直前の検索ヒットが一つだけならok
else if(tmp > 1) ng++
}
tmp = $0
}
END {
printf("%04d\n%04d\n", ok, ng)
}'
0411403
2007/11/03(土) 22:52:55おお!ありがとうございます。
>>408
すみません、これでは意味が分からないですよね。説明しづらいので>>403は例として書きました。
目的は、rsyncで毎日サーバのバックアップをインターネット越しにとっているのですが、親ディレクトリ
の名前を変えるとそのディレクトリ以下のすべてのファイルを一度消して、再コピーする動作をするために
ディレクトリの容量がでかいと1日でバックアップが終わらなくなってしまいます。
そこで、rsyncの機能(-n)で実際には動作せず結果だけを出力できるので、それを$LISTに書き出します。
削除されたファイルは頭に「deleting」がつくので grep "^deleting" $LIST > $KEY_LIST に書き出します。
>>403とは条件分岐が変わってしまいますが、親ディレクトリの名前が変わったファイルは、頭が「deleting」で
始まる行とそれがつかないコピーを表す行の2つにマッチするので、そのカウント数が多ければ親ディレクトリの
名前が変更されたと判断して、あとは人力で$LISTを確認してバックアップ側のディレクトリ名をサーバ側と同じに
すれば、消去してしまう事をふせぎます。
実際は、毎日crontabでバックアップのスクリプトを走らせているのですが、一定以上カウントされたらバックアップを
やめて、メールで通知する機能をついかしたいなあとおもっています。
0412405
2007/11/03(土) 23:24:34>>>>405
>>おお!ありがとうございます。
そいつは間違いです。
awk の system 関数の戻り値を取り違えているし、
ng++ の位置も根本的におかしいです。
>>409 の解釈が妥当かどうかはともかく、
考え方として、はこっちの方がマシでしょう。
0413名無しさん@お腹いっぱい。
2007/11/04(日) 18:24:36#!/bin/sh
for i in `cat $KEY_LIST`
do
key=`basename $i`
while echo ${i} | grep "/" > /dev/nill
do
much=`grep "/$key$" $LIST | wc -l`
if [ "$much" -eq 1 ] ; then
((ok++)); break
else
i=`dirname $i`; x=`basename $i` key=`echo $x"/"$key`
fi
done
if [ "$much" -ne 0 ] ; then
((ng++))
fi
done
echo "OK $ok"
echo "NG $ng"
0414名無しさん@お腹いっぱい。
2007/11/04(日) 18:28:390415名無しさん@お腹いっぱい。
2007/11/04(日) 19:00:34あっ、あとファイル名とかにスペース入ってるとまずいから
IFS="
"
とかした方がいいよ。
0416名無しさん@お腹いっぱい。
2007/11/04(日) 23:03:511. ローカルのファイル構成をリモートのファイル構成と同じにしたい
2. できる限りローカルのファイルの再配置で転送量を削減したい
ってことだよね。別解でこんなのどう?
#!/usr/bin/ruby
# Usage: treesync this.lst that.list
# - this.lst のファイル構成を that.lst の構成に work/ 以下で再構成するシーケンスを出力する
# - this.lst/that.lst は共に find ... -type f -print | xargs md5sum > this.lst などと生成
src_p2h = Hash[*open(ARGV.shift).read.split.reverse]
dst_p2h = Hash[*open(ARGV.shift).read.split.reverse]
src_h2p = Hash[*src_p2h.to_a.flatten.reverse]
dst_p2h.each do |path, hash|
puts "mkdir -p `dirname work/#{path}`"
if src_h2p[hash]
puts "ln #{src_h2p[hash]} work/#{path}"
else
puts "remote-get #{path} work/#{path}"
end
end
これでローカルのa/ツリーを元に、work/フォルダ以下に最小転送量で
リモートのb/ツリーに同期したフォルダを再構成する。remote-getコマンドは自分で用意。
0417名無しさん@お腹いっぱい。
2007/11/05(月) 05:07:01しかも内容同じだとみなlnだから、同期と言い難い。
同期ごとにls -iR吐いておいて、rsyncの前段として前回と比較して
lnかmvするとしておけばいいのでは。
0418405
2007/11/05(月) 13:01:19後から読んだら、その>>405ってのは私を指していて、
特に405のレスの事ではないみたいですね。スマソ
>>413
おお!素晴らしい。シェルスクリプトらしい構文ですね。
ちょっと気になったのは、whileループ中に$muchの値が2以上から一気に0に
変化する場合も(つまりファイル名から同じだけ遡ったパスが一致する複数ファイルが、
もう一階層上にあがると全て一致しなくなるケース)あり得るので、
その場合[ "$much" -ne 0 ] が偽の場合でもngを加算するべきだと思うのですが、
如何でしょうか?
>>403 を読むと、そもそも初めのファイル名が一致しない場合に関して触れられていないので、
$much の値が最初っからずっと0というのは除外して考えて良いんじゃないでしょうか?
つまりwhileループを抜けた時点で無条件に((ng++))で良い様な気がします。
0419405
2007/11/05(月) 14:25:36>>413は、そのままではウチの環境では動きませんでした。
修正して試していると[ "$much" -ne 0 ]の意味が理解できました。
[1]や[2]対策ですね。
しかし、上記の問題が有ると思うので、forループに入った所で$muchを1に初期化しておき、
((ng++)) の前の条件判断を、if [ "$much" -eq 1 ] ; then continue ; fi
とかにするのはどうでしょうか?
でもそんなことするんだったら、catの代わりにsed使った方が分かりやすいかも。
0420名無しさん@お腹いっぱい。
2007/11/05(月) 15:40:35>#!/bin/sh
を
>#!/bin/ksh
にする。
0421403
2007/11/06(火) 00:16:00色々とありがとうございます。こちらこそ失礼しました。
>>413の解説ほんとにありがたいです。半分理解するまで2時間かかった、、
>>413 >>416
ありがとうございます。いろんなやり方がありそうですね。
0422名無しさん@お腹いっぱい。
2007/11/06(火) 15:55:08echo .*
だと今いるディレクトリと親ディレクトリにもマッチしてしまう。
zshだとドットファイルのみ展開してくれるけど、shだとどうなの
0423名無しさん@お腹いっぱい。
2007/11/06(火) 16:00:47http://www.nurs.or.jp/~asada/FAQ/UNIX/section2.11.html
環境によっては、ls -A とか。
0424名無しさん@お腹いっぱい。
2007/11/06(火) 16:02:58文字列を書き込むにはどのようにすればよいのでしょうか?
0425名無しさん@お腹いっぱい。
2007/11/06(火) 16:09:11環境によっては
sed -i 'Nihoge' a.txt
0426名無しさん@お腹いっぱい。
2007/11/06(火) 16:21:52ありがとう。FAQでしたか
0427名無しさん@お腹いっぱい。
2007/11/07(水) 18:02:48いろいろやり方はあると思いますが、何か定番ってあるのでしょうか?
0428名無しさん@お腹いっぱい。
2007/11/07(水) 18:32:090429名無しさん@お腹いっぱい。
2007/11/07(水) 19:49:25それだと、特定ディレクトリの特定ファイルの有無。
>>427は、多分任意のディレクトリに何らかのファイルが有るかどうかと言うこと。
0430名無しさん@お腹いっぱい。
2007/11/07(水) 19:56:420431名無しさん@お腹いっぱい。
2007/11/07(水) 20:11:38普通に日本語を解すればエスパーでも何でもない。
>>ディレクトリにファイルがあるかどうかの分岐
財布にお金が有るかどうかの分岐。
>>if [ -f "$dir/$file" ]
if [ -f "$my_saifu/$hyakuenndama" ]
これくらいの違いを何故理解できない?
0432名無しさん@お腹いっぱい。
2007/11/07(水) 20:15:240433名無しさん@お腹いっぱい。
2007/11/07(水) 20:17:37ってことじゃないのか?
0434名無しさん@お腹いっぱい。
2007/11/07(水) 22:38:560435428
2007/11/08(木) 00:18:45if [ `find "$dir" -maxdepth 1 -type f | wc -l` ]; then
0436428
2007/11/08(木) 00:22:040437名無しさん@お腹いっぱい。
2007/11/08(木) 00:24:04結局readdirして見るしかないだろうなぁ。
とりあえず別案。たぶんちょっとだけ速い:
$ test "`echo .* *`" = ".* *" && echo empty
何かあれば展開元パターンと違う文字列になるから条件成立しない。
0438名無しさん@お腹いっぱい。
2007/11/08(木) 00:33:230439名無しさん@お腹いっぱい。
2007/11/08(木) 00:52:33お前頭いいな
0440名無しさん@お腹いっぱい。
2007/11/08(木) 06:29:55諸手を挙げて賛成したい気分だが、なぜか躊躇する。
何でだろう?
0441名無しさん@お腹いっぱい。
2007/11/08(木) 07:43:15それ間違い。空のディレクトリでも . と .. は必ず存在するので、
echo .* * の結果は .. . になる。
0442名無しさん@お腹いっぱい。
2007/11/08(木) 10:53:24しまった、bashismに染まってしまった。今は反省している。
rmdirがいちばんエレガントだね。そのフォルダにプロセスがいたら
根無し草になるというのが躊躇の原因だろうけど。
0443名無しさん@お腹いっぱい。
2007/11/08(木) 12:28:010444名無しさん@お腹いっぱい。
2007/11/08(木) 13:09:570445名無しさん@お腹いっぱい。
2007/11/08(木) 13:15:38test1.shに echo 100
test2.shに echo $1
と書いて
sh test1.sh | sh test2.sh
として、100が表示されることを期待してるんですが、何も表示されません。。
根本がわかってないと思うのですが、このあたり、ご教示頂ければ幸いに思います。
あるいは、こういった部分に触れているサイトがありましたら、リンクを頂く形でも
幸いです。。よろしくお願い致します。
0446445
2007/11/08(木) 13:31:06ttp://oshiete1.goo.ne.jp/kotaeru.php3?q=1508581
を見てわかりました。先のtest2.shは
read line
echo $line
などとすればいいんですね。お騒がせしました。
0447名無しさん@お腹いっぱい。
2007/11/08(木) 15:56:500448名無しさん@お腹いっぱい。
2007/11/08(木) 16:04:47消えたら作ればいいと思いつつも>>440が出てきている。
あと、>>444で。
0449名無しさん@お腹いっぱい。
2007/11/08(木) 19:13:21権限なかったら、ダメじゃないの?
0450名無しさん@お腹いっぱい。
2007/11/08(木) 19:33:32ということは、判定ができんということになるな
0451名無しさん@お腹いっぱい。
2007/11/08(木) 22:49:43rmdirの減点にはならないかと。
0452名無しさん@お腹いっぱい。
2007/11/08(木) 23:02:28親のwがないといかんというのは厳しいだろ
0453427
2007/11/10(土) 04:04:04私は [ -z "$(ls dir/)" ] としてましたが、これだと何か問題はあるでしょうか?
しかし、定番って無いのですね。
0454名無しさん@お腹いっぱい。
2007/11/10(土) 04:25:29if ! /bin/ls -a "$dir" | egrep -qv '^\.\.?$'; then
echo 空っぽ
end
0455名無しさん@お腹いっぱい。
2007/11/10(土) 10:20:35ドットファイルがあると判定を誤る。
[ $(ls -a) != 2 ]
0456名無しさん@お腹いっぱい。
2007/11/10(土) 10:50:15ってだめなんだっけ
0457名無しさん@お腹いっぱい。
2007/11/10(土) 12:53:480458名無しさん@お腹いっぱい。
2007/11/10(土) 20:14:03ls -a なんてするから . と .. を除外する余分な処理が増える。
0459名無しさん@お腹いっぱい。
2007/11/10(土) 21:23:19↑が、モストエレガント
0460名無しさん@お腹いっぱい。
2007/11/11(日) 00:49:49tcsh の場合どう記述すればいいんでしょうか?
bash の場合は分かるのですが。。
while true; do ; ps -ef ; sleep 60 ; done
ヒントだけでも良いのでアドバイスお願いします。
0461名無しさん@お腹いっぱい。
2007/11/11(日) 01:35:130462名無しさん@お腹いっぱい。
2007/11/11(日) 01:49:37確か一行じゃできんかったような.
sh -c "while true; do ; ps -ef ; sleep 60 ; done"
じゃ駄目かw
0463名無しさん@お腹いっぱい。
2007/11/11(日) 04:00:30シェルはBournシェル(sh)で書け。(昔、cshで書いて苦労した)
クォートできないケースが多々存在するわ、
標準エラーはパイプに流し込めないわ、
最悪なのが、ファイルを閉じることができないこと。
あと、コンソール入力が一行入力 $< 以外、つかいものにならんから、ユーザ入力が必要なときに苦労するぞ
0464名無しさん@お腹いっぱい。
2007/11/11(日) 08:06:240465名無しさん@お腹いっぱい。
2007/11/11(日) 09:24:02do のあとに ; いらんけどな。
0466名無しさん@お腹いっぱい。
2007/11/14(水) 10:50:21#!/bin/bash
num="1
2
3
4
5"
num2=3
while true ; do
echo "$num" | while read line; do
if [ "$line" -eq "$num2" ]; then
echo $line
break 2
fi
done
done
このスクリプトがbreakできないのですが、どこに間違いがあるのでしょうか?
/bin/bash を zsh に変えれれば動きます。
0467名無しさん@お腹いっぱい。
2007/11/14(水) 11:23:34break 2 ではなくふつーにサブシェルが終了したようにしか見えない。
0468名無しさん@お腹いっぱい。
2007/11/14(水) 11:48:18シェルの実装違い。
似たものに
while read〜do〜done < FILE
これについても各種シェルで動きが違う。
0469名無しさん@お腹いっぱい。
2007/11/14(水) 22:54:11↓ここも参照しる。
http://blog.goo.ne.jp/cars-kitahefu/e/4190a337427d7a8cfcb5a62f515c6936
0470466
2007/11/15(木) 02:30:33なんじゃそりゃという話でした…
0471名無しさん@お腹いっぱい。
2007/11/15(木) 18:33:38連番のファイルを作りたいんだけど、
なんかいい手ある?
for i in ${ABC}
do
cp XXX.txt ${i}.txt
done
個人的には、↑みたいなので簡単に出来るかと思ったけど
${ABC}にハメるAAA,AAB,AAC〜ZZZのリストが
作れなくて。
助けてエロい人。
0472名無しさん@お腹いっぱい。
2007/11/15(木) 18:49:30for in in {A..Z}{A..Z}{A..Z}
do
:
0473471
2007/11/15(木) 18:55:57スマソ、言葉足らずだった。
ウチのシステムsolaris8でbash-2.03なんだ。うん。
{A..Z}って、bash-3.0からの拡張機能だったような。
0474名無しさん@お腹いっぱい。
2007/11/15(木) 18:57:49を3回まわせばいいじゃん。
0475471
2007/11/15(木) 19:54:07言わんとしてることがイマイチ汲み取れなんだ。ごめん。
アホな俺にも分かるようにもうちょいとkwsk説明してくれん?
for i in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do
cp XXX.txt ${i}.txt
for i in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do
cp XXX.txt ${i}.txt
for i in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do
cp XXX.txt ${i}.txt
done
done
done
こう、ネストしろとか…じゃないんだよな。
0476名無しさん@お腹いっぱい。
2007/11/15(木) 20:32:50do
for j in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do
for k in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do
cp XXX.txt $i$j$k.txt
done
done
done
0477471
2007/11/15(木) 20:39:19本気でありがとう神様
0478名無しさん@お腹いっぱい。
2007/11/18(日) 03:10:54の http://xxx だけ抜き出したいのですが、ズバッと一つのコマンドで
できないでしょうか?
0479名無しさん@お腹いっぱい。
2007/11/18(日) 07:07:460480名無しさん@お腹いっぱい。
2007/11/18(日) 08:09:360481名無しさん@お腹いっぱい。
2007/11/18(日) 11:18:480482名無しさん@お腹いっぱい。
2007/11/18(日) 17:37:56478がどういうのを求めているか知らんが、それだと汎用性がなくて使えないのでは?
というかexprって計算以外にも使えるんだ
0483無名
2007/11/18(日) 20:05:48echo '<a href="http://xxx">' | sed 's/[^"]*"\(.*\)".*/\1/'
0484名無しさん@お腹いっぱい。
2007/11/18(日) 20:17:38汎用的にアンカー抜き出したいんなら、素直にHTMLパーサが利用できる
言語使えや
0485名無しさん@お腹いっぱい。
2007/11/19(月) 02:13:59perl -e 'for ($val = "AAA"; $val ne "AAAA"; $val++) { print $val, "¥n";}'
0486名無しさん@お腹いっぱい。
2007/11/19(月) 08:23:440487名無しさん@お腹いっぱい。
2007/11/19(月) 08:52:11perl -e 'print "$_\n" for "AAA".."ZZZ"'
0488名無しさん@お腹いっぱい。
2007/11/19(月) 09:56:22汎用性求めてるならそう書いてくれないと。
0489名無しさん@お腹いっぱい。
2007/11/20(火) 23:47:47シェルを作成したいのですがどのような構文を使用すれば
良いか教えて頂けないでしょうか。よろしくお願いします。
0490名無しさん@お腹いっぱい。
2007/11/20(火) 23:49:420491名無しさん@お腹いっぱい。
2007/11/20(火) 23:58:04if fi else test echo -eq -ge -le -a $1 $2
0492名無しさん@お腹いっぱい。
2007/11/21(水) 00:05:400493名無しさん@お腹いっぱい。
2007/11/21(水) 01:06:18シェルを作成したいのですがどのような構文を使用すれば
良いか教えて頂けないでしょうか。よろしくお願いします。
0494名無しさん@お腹いっぱい。
2007/11/21(水) 01:07:480495名無しさん@お腹いっぱい。
2007/11/21(水) 01:30:51>>493
構文としては順序構文と条件文でできるんじゃない?
0496名無しさん@お腹いっぱい。
2007/11/21(水) 01:54:440497名無しさん@お腹いっぱい。
2007/11/21(水) 06:52:410498名無しさん@お腹いっぱい。
2007/11/21(水) 07:13:300499名無しさん@お腹いっぱい。
2007/11/21(水) 21:36:16>>1 参照
0500名無しさん@お腹いっぱい。
2007/11/21(水) 21:43:34アフォか? >>1 のどこに書いてあるのかと。
0501名無しさん@お腹いっぱい。
2007/11/21(水) 22:00:33>>499はtypoにも気づかず流れも読めなかったのだろうね
0502名無しさん@お腹いっぱい。
2007/11/23(金) 15:22:11⊂二二二( ^ω^)二⊃ ブーン
0503名無しさん@お腹いっぱい。
2007/11/24(土) 07:02:18マジレス頼む。
0504名無しさん@お腹いっぱい。
2007/11/24(土) 09:23:110505名無しさん@お腹いっぱい。
2007/11/24(土) 11:05:490506名無しさん@お腹いっぱい。
2007/11/24(土) 19:48:21カーソル移動にはhjklを使えってことなんでしょうけど、でもviクローンなんかはカーソル有効になってるのも多いですよね。いい方法ないかなぁ。
0507名無しさん@お腹いっぱい。
2007/11/26(月) 13:01:12perlだとNGってことありますね。perl読み書きできない管理者多いし。
shスクリプトの場合は「読めない香具師が悪い」が正論として通る。
# ある程度の規模のものは perl, python, ruby で何とかしたい…
# ただの愚痴でした。
0508名無しさん@お腹いっぱい。
2007/11/26(月) 16:54:12かめれすだが、
perl -le 'print for "AAA".."ZZZ"'
で十分
0509名無しさん@お腹いっぱい。
2007/11/26(月) 23:16:16そうかなあ、用途によっちゃperlで作るけどね。
ただ鯖管理用途?だとシェルスクリプトのほうがシンプルにできると思うけど
0510名無しさん@お腹いっぱい。
2007/11/27(火) 15:00:07今の時間から明日の15時までの秒数、とかが知りたいのだが。
時刻はどちらも date コマンドの出力を前提に考えているけど、
少々なら事前にフォーマットをいじれる。でも UNIX TIME で
記録するのは勘弁な。
0511名無しさん@お腹いっぱい。
2007/11/27(火) 15:12:44普通に、
expr `date +%s -d 'tomorrow 15:00'` - `date +%s`
0512名無しさん@お腹いっぱい。
2007/11/27(火) 23:19:54511じゃないけど、これをperlでやるとなるとかなり面倒くさい。
だから鯖管理者にいやがられるんじゃないかな。
0513名無しさん@お腹いっぱい。
2007/11/28(水) 12:29:41そらぁシェルでかけるのをわざわざperlで書いたら怒られるだろ。
もっとこう、複雑なフィルタとか、DB使うとか、簡単でいいからメニューが欲しいとかいう
要求があるときにperlとかすんなり使わせてくれよということじゃないの?
0514名無しさん@お腹いっぱい。
2007/11/29(木) 02:15:11システム処理があって、
hogehoge | perl -e '
...
' | fugafuga
みないなことをする必要が出たりすると、#!/usr/bin/perl で書いた方が
きれいかも・・・と悩むことが極稀にあるな。もっともそうすると
$foo = `hogehoge`
system("fugafuga")
open("| herohero")
とかなって、今度は #!/bin/sh で書いた方がきれいかも・・・と悩むのだけど
0515名無しさん@お腹いっぱい。
2007/11/29(木) 06:18:040516510
2007/11/29(木) 15:09:20動かないなぁと悩んでたら、GNU の date じゃないと -d がないのね。
Mac で試してたんできがつかなかった..orz。
ターゲットマシンは Linux で問題なく動作しますたので、この方法で
いきます。
0517名無しさん@お腹いっぱい。
2007/11/29(木) 22:43:51非常に気持ち悪いんですけれど。
何か理由があるんでしょうか?
0518名無しさん@お腹いっぱい。
2007/11/29(木) 22:59:280519名無しさん@お腹いっぱい。
2007/11/29(木) 23:10:57もともとエラーコードだから。
エラーなしが 0 。だから 0 が真。
0520名無しさん@お腹いっぱい。
2007/11/29(木) 23:24:55どんな原因でエラーになったのか調べなきゃいかんからな。
0521名無しさん@お腹いっぱい。
2007/11/30(金) 00:59:52&&や||が逆転してやりづらかったとかとか。
0522名無しさん@お腹いっぱい。
2007/12/04(火) 16:36:46テキストエディタで、
#!/bin/sh
echo Hello World
って書いて、名前を付けて保存をして、
プロパティで実行属性にチェックを入れて、
ファイルのアイコンをクリックしたんですけど、
何も出てきません。何か設定が要るのでしょうか?
0523名無しさん@お腹いっぱい。
2007/12/04(火) 17:37:520524名無しさん@お腹いっぱい。
2007/12/04(火) 18:40:580525名無しさん@お腹いっぱい。
2007/12/04(火) 22:51:08「OSは何ですか」という質問を期待しているのだろうか?
0526名無しさん@お腹いっぱい。
2007/12/04(火) 23:18:49拡張子を .command にする。
どうだ?
0527名無しさん@お腹いっぱい。
2007/12/05(水) 20:18:44echo Hello World じゃなくて、
xmessage Hello World にしてみろ
0528名無しさん@お腹いっぱい。
2007/12/05(水) 22:59:26echo "Hello World"
って、誰も指摘せんの?
俺、空気読めてない?
0529名無しさん@お腹いっぱい。
2007/12/05(水) 23:02:42echo Hello World を、
echo Hello World にしても、間隔が広くなりません、という質問だったらよかった。
0530名無しさん@お腹いっぱい。
2007/12/05(水) 23:03:19Hello World
0531名無しさん@お腹いっぱい。
2007/12/05(水) 23:04:580532名無しさん@お腹いっぱい。
2007/12/06(木) 00:23:080533名無しさん@お腹いっぱい。
2007/12/06(木) 00:45:46オマイそんなこと知らないで
よく今までスクリプト組めたな
罰として、まずモナスクリプト書け
等幅フォント用とモナフォント用だ
0534531
2007/12/06(木) 00:50:490535名無しさん@お腹いっぱい。
2007/12/06(木) 01:16:01Hello World
Hello World
Hello World
0536名無しさん@お腹いっぱい。
2007/12/06(木) 07:50:42できました!! xmessageにしたらシェルが出ました
でも本には echoって書いてあったんですよ。ミスプリでしょうか?
0537名無しさん@お腹いっぱい。
2007/12/06(木) 08:52:370538名無しさん@お腹いっぱい。
2007/12/09(日) 21:07:10例えば、moreコマンドなんかの後のスペースキーだとかを
more /hoge/a.txt <<EOF
???
???
???
EOF
なんかで出来ないものでしょうか?
よろしくお願いします。
0539名無しさん@お腹いっぱい。
2007/12/09(日) 21:17:200540名無しさん@お腹いっぱい。
2007/12/10(月) 13:18:591000回程度のループ計算なんですが、計算式部分はfortranでサンプル拝借、代入&出力処理をシェルで書いてみました。
なんとなく出来上がったんですが、ひとつ疑問が浮上し、すぐに解決出来ないのでアドバイス下さい。
fortran90で全て書いた場合と、どの程度速度は劣るのでしょうか?
0541名無しさん@お腹いっぱい。
2007/12/10(月) 13:43:380542540
2007/12/10(月) 14:34:13他のスレではシェルを使っている人がいるか居るのか定かではありません。
僕のような2通りの方法で書いて比較した経験のある方がいらっしゃるのでは?
という淡い期待を持って質問した次第です。
すみません。スレ違いならこの質問は脚下でいいです。
0543名無しさん@お腹いっぱい。
2007/12/10(月) 20:39:200544名無しさん@お腹いっぱい。
2007/12/10(月) 21:16:20気になるなら自分で実測するのが確実。
(shの走る環境の、CPU性能メモリ量の差は非常に幅広いため、答えがない)
0545名無しさん@お腹いっぱい。
2007/12/10(月) 21:22:53CPU、メモリの差による違いは直接関係ないと思うが。
0546名無しさん@お腹いっぱい。
2007/12/10(月) 21:32:37>>542で「僕のような2通りの方法で書いて比較した経験のある方が」と言っている。
CPUやメモリ量が異なる環境での結果と、質問者の環境での結果を、比較しても無意味だ。
(ARM上の結果とCell上の結果を比較しても意味なかろ)
0547名無しさん@お腹いっぱい。
2007/12/10(月) 21:43:10どんなCPU/メモリ環境であろうが、
shとFortranとの速度差は同じような傾向になる。
よって、「CPU性能メモリ量の差は非常に幅広い」としても、
それは質問の本質には関係ない。答えはある。
0548名無しさん@お腹いっぱい。
2007/12/10(月) 21:47:29ARM上のshとFortranとの比較データがあれば、
それはCell上のshとFortranとの速度差(比)を推定する手がかりになる。
よって、大いに意味ある。
0549名無しさん@お腹いっぱい。
2007/12/10(月) 21:52:02ゆとり教育の成果か?
0550名無しさん@お腹いっぱい。
2007/12/11(火) 14:32:22bshで、あるテキストを2行ごとに1行にまとめたいのです。
たとえば、
$ cat aaa.txt
aaa
bbb
ccc
ddd
eee
fff
を
$ cat bbb.txt
aaa bbb
ccc ddd
eee fff
にしたいのです。
sedで置換したり、whileで回したりとかいろいろあるでしょうけど
確かコマンド一つで出来た記憶があるのです。
$ cat aaa.txt | コマンド . . > bbb.txt
うろ覚えですが、そのコマンドにパラメータを二つ(ドットを二個)で、
2行を1行にまとめる。。。だったような気がするのですが、
知っている人いたら教えてください。
0551名無しさん@お腹いっぱい。
2007/12/11(火) 14:40:28paste - - か?
あと、cat | じゃなく < でおk。
0552名無しさん@お腹いっぱい。
2007/12/11(火) 14:44:12pasteです。完全に思い出しました! そうですね、ハイフンですね。
すばやいレスありがとうございました。
0553名無しさん@お腹いっぱい。
2007/12/11(火) 18:00:200554名無しさん@お腹いっぱい。
2007/12/11(火) 18:04:40http://www.netmeister.org/misc/useless_use.pdf
0555名無しさん@お腹いっぱい。
2007/12/12(水) 01:57:08A
B
C
とあって、
2行目の下(この場合はBの下)に
BB
を入れて、
A
B
BB
C
とする
指定行数の下に文字列を挿入する
シェルスクリプトを作りたいのですが、
なにか良いアイデアはないでしょうか?
0556名無しさん@お腹いっぱい。
2007/12/12(水) 02:22:17sed '2a¥
BB
' < old > new
のようにすればできる。
行と挿入する文字列を変数展開するようにすればいいんじゃね?
0557名無しさん@お腹いっぱい。
2007/12/12(水) 02:22:570558名無しさん@お腹いっぱい。
2007/12/12(水) 22:55:420559名無しさん@お腹いっぱい。
2007/12/13(木) 02:40:12以下のHTMLタグがあるとします。
<option name=myname value="a1">b1</option>
<option name=myname value="a2">b2</option>
<option name=myname value="a3">b3</option>
上記の中から文字列処理を行い、以下の結果を導き出したいです。
a1,b1
a2,b2
a3,b3
このようにするにはどのように処理すればよろしいでしょうか?
よろしくお願いいたします。
0560名無しさん@お腹いっぱい。
2007/12/13(木) 03:12:040561名無しさん@お腹いっぱい。
2007/12/13(木) 08:25:29>>559
ほんとうにこの例だけなら、
sed -e 's/.*="//' -e 's/">/,/' -e 's/<.*//'
0562名無しさん@お腹いっぱい。
2007/12/14(金) 00:10:270563名無しさん@お腹いっぱい。
2007/12/14(金) 00:14:430564名無しさん@お腹いっぱい。
2007/12/14(金) 01:21:16m(__)m
全然分からなくて…
0565名無しさん@お腹いっぱい。
2007/12/14(金) 01:40:44wとかwhoとかlastとか調べてみるといいかもしれん
0566名無しさん@お腹いっぱい。
2007/12/14(金) 01:48:27そういうのは普通E4X
var x = <html>
<option name="myname" value="a1">b1</option>
<option name="myname" value="a2">b2</option>
<option name="myname" value="a3">b3</option>
</html>;
for each (var opt in x.option) {
print("" + opt.@value + "," + opt);
}
じゃなかったらXSLT
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="option">
<xsl:value-of select="@value"/>,<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
0567名無しさん@お腹いっぱい。
2007/12/14(金) 01:50:22while true; do
if [ ! -f /tmp/last.txt ] ; then
touch /tmp/last.txt
fi
mv /tmp/last.txt /tmp/last.txt.old
last > /tmp/last.txt
diff /tmp/last.txt.old /tmp/last.txt
sleep 5
done
基本はこんな感じか。これでもログイン/ログアウトの度に反応がでる。
あとは画面を生diffの結果から、も少し整形する必要があるわな。
< user pts/3 192.168.0.1 Fri Dec 14 01:43 still logged in
---
> user pts/3 192.168.0.1 Fri Dec 14 01:43 - 01:43 (00:00)
行の頭からログイン時刻までを一本の文字列にしてawkとかの連想配列のキーにして、
ログアウト時刻(またはstill logged inn)を保持しておくか...
あとlastのお尻の方はだんだん削られていくから、これも何とかする必要があるな。
0568名無しさん@お腹いっぱい。
2007/12/14(金) 02:00:24diff /tmp/last.txt.old /tmp/last.txt > /dev/null 2>&1
if [ $? -ne 0 ] ; then
clear
cat /tmp/last.txt
fi
こうやっちゃうとかな。監視コンソール風。
0569名無しさん@お腹いっぱい。
2007/12/14(金) 03:19:03また俺のIPがサンプルに使われてる(´・ω・`)
攻撃の的になるからやめてよ
0570名無しさん@お腹いっぱい。
2007/12/14(金) 03:38:510571名無しさん@お腹いっぱい。
2007/12/14(金) 04:26:20最近、インターネットにアクセスできないと思ったらお前のせいかー
0572名無しさん@お腹いっぱい。
2007/12/14(金) 09:18:48過去スレ保存している人いませんかね?
0573名無しさん@お腹いっぱい。
2007/12/14(金) 11:52:490574名無しさん@お腹いっぱい。
2007/12/15(土) 01:59:33http://www32.atwiki.jp/shellscript/
よかったらここにアップしていただけないでしょうか。
0575名無しさん@お腹いっぱい。
2007/12/16(日) 11:59:59で /home/***/text/***.txt
を探しているのですが、
どうもかなり遅めでload averageもあがりやすいようです。
ls あたりで代替策を探してるのですが、
ls /home/*/text/*.txt
あたりが良いかなと思ったのですが、*は/も含むと聞いて困ってます。
(試したところ、速度はfindと比べてかなり早かったのですが。。。)
どなたか助言お願いします。
0576名無しさん@お腹いっぱい。
2007/12/16(日) 13:07:30ヤキいれてあげるから、そういうデタラメを教えた奴を連れてきなさい。
0577名無しさん@お腹いっぱい。
2007/12/16(日) 13:13:56locate (+grep)とか。
0578名無しさん@お腹いっぱい。
2007/12/16(日) 15:13:40-regexの * は / も含むよw
ヤキいれられるのはオマエww
0579名無しさん@お腹いっぱい。
2007/12/16(日) 15:21:47日本語読めない低脳は引っ込んでいなさい。-regexの*の事ではない。
> ls /home/*/text/*.txt
> あたりが良いかなと思ったのですが、*は/も含むと聞いて困ってます。
0580名無しさん@お腹いっぱい。
2007/12/16(日) 21:15:33の場合、*は/を含む(ディレクトリ階層を縦断する)
ls */*
の場合、*は/を含まない(/で区切られたディレクトリ階層だけを探す)
0581名無しさん@お腹いっぱい。
2007/12/16(日) 23:34:21文字列「aaa」と書いた1.txtをsedで「bbb」に変えて保存したい。
どのようにしたらいいでしょうか?
0582名無しさん@お腹いっぱい。
2007/12/16(日) 23:38:270584名無しさん@お腹いっぱい。
2007/12/17(月) 01:04:43文字列「aaa\taaa」←水平タブ入りが書いてある1.txtを
文字列「bbb\tbbb」に変えて保存したい。
どうしたらいいでしょうか?
エスケープシーケンス入りの文字列の扱いがわからない。。。
0585名無しさん@お腹いっぱい。
2007/12/17(月) 03:28:20タブ・エスケープは関係ない。/gをつけるとマッチしたもの全てを置換する(globalのg)。
gなしだと最初の一個だけ
0586584
2007/12/17(月) 05:11:44じゃ、じゃあ
文字列aaaを
aaa
bbb
のように改行付きで置換したいとき
sed -i -e 's/aaa/aaa\nbbb/g' 1.txt
としても改行されません。
FreeBSDのsedはエスケープシーケンス使えない?
0587名無しさん@お腹いっぱい。
2007/12/17(月) 06:24:56aaa
% sed -e 's/aaa/aaa\nbbb/g' /tmp/1.txt
aaa
bbb
% sed --version
GNU sed 4.1.1版
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
(後略)
0589573
2007/12/17(月) 10:00:25アップロードし直した(shellscript_.tar.bz2)
0590名無しさん@お腹いっぱい。
2007/12/17(月) 10:30:05\を前置して改行をそのまま書く。
% echo aaa|sed 's/aaa/aaa\
bbb/'
0591名無しさん@お腹いっぱい。
2007/12/18(火) 03:47:42scriptコマンドでコマンドログをとりたくて、ログイン時に自動的に呼び出されるよう
profileに書きましたが、ターミナルを終了する時にexitを何回も打たなくてはならないのが
気持ち悪いです。
例えば、一回のexit入力で、scriptとログインシェルの2回分を実行するというのは可能ですか?
0592名無しさん@お腹いっぱい。
2007/12/18(火) 07:11:01exec script
0593名無しさん@お腹いっぱい。
2007/12/18(火) 07:42:32ありがとう
0594名無しさん@お腹いっぱい。
2007/12/18(火) 20:27:05どうすればよいですか?
APPLE,150円
APPLE,140円
APPLE,180円
とあったら、1フィールド目のみでuniqして先頭の行を出力したいです。
もちろん値段もほしいです。
ご教示お願いします。
0595名無しさん@お腹いっぱい。
2007/12/18(火) 20:29:22perl かなんかで書いちゃった方が早いんじゃね。
0596名無しさん@お腹いっぱい。
2007/12/18(火) 20:31:180597名無しさん@お腹いっぱい。
2007/12/18(火) 20:34:35早っ! ご教示ありがとございます
awkにします
0598名無しさん@お腹いっぱい。
2007/12/18(火) 21:00:260599名無しさん@お腹いっぱい。
2007/12/18(火) 21:04:490600名無しさん@お腹いっぱい。
2007/12/18(火) 22:02:220601名無しさん@お腹いっぱい。
2007/12/18(火) 22:25:210602名無しさん@お腹いっぱい。
2007/12/18(火) 22:26:410603名無しさん@お腹いっぱい。
2007/12/18(火) 23:53:32しね
0604名無しさん@お腹いっぱい。
2007/12/18(火) 23:57:25しね
二度と現れるなボケ
0605名無しさん@お腹いっぱい。
2007/12/19(水) 00:46:050606595
2007/12/19(水) 00:54:10よく知らないシェルスクリプトでがんばるより
便利で得意な言語で書いちゃった方が早いこともあるよ、
ってだけの話なんだけど。
0607名無しさん@お腹いっぱい。
2007/12/19(水) 00:57:45俺>>598じゃねーよw
おまえ、二度と現れるなと言っただろ?w
0608名無しさん@お腹いっぱい。
2007/12/19(水) 01:01:44おまえまだわかんねーのかよ?
おまえが言ってることは「ググレカス」と同レベル
どんな質問でも当てはまってしまうアホな回答。
0609名無しさん@お腹いっぱい。
2007/12/19(水) 01:06:000610名無しさん@お腹いっぱい。
2007/12/19(水) 01:07:070611名無しさん@お腹いっぱい。
2007/12/19(水) 01:48:57>>595は自演が下手だな
こんな時間に過疎スレで1分後にレスって明らかに自演。
0613名無しさん@お腹いっぱい。
2007/12/19(水) 02:19:310614名無しさん@お腹いっぱい。
2007/12/19(水) 02:41:340615名無しさん@お腹いっぱい。
2007/12/19(水) 02:49:04あとは応用例だが、
perlのラクダ本は電話帳みたいな本が上下2巻。クックブックは別にある。
よってawkの勝ち
0616名無しさん@お腹いっぱい。
2007/12/19(水) 02:57:180617名無しさん@お腹いっぱい。
2007/12/19(水) 03:12:02awkの原典は、初学者が手にするとちょっとな。途方にくれるというか何というか。高い本なのに。
perlのラクダ本はその点は抜かりなく、初心者もすんなりと中に入り込んでいける。
awkの入門書で良書というと、ASCIIのawk256倍本くらいしか思いつかない。俺は今でも愛用してるけど、
あんな昭和の時代の本、いまどき手に入るはずもなく
0618名無しさん@お腹いっぱい。
2007/12/19(水) 03:17:310619名無しさん@お腹いっぱい。
2007/12/19(水) 03:49:30その本初心者でもわかりやすい?
0620名無しさん@お腹いっぱい。
2007/12/19(水) 10:07:59perl -aF, -nle '$X{$F[0]} or print; $X{$F[0]} = 1'
0621名無しさん@お腹いっぱい。
2007/12/19(水) 12:19:590622名無しさん@お腹いっぱい。
2007/12/19(水) 12:39:17タブ(\t)は置換できるのですが改行(\n)が置換できません。
例えば # cat a.txt
aaa
bbb
aaa(タブ)bbb
3行目の(タブ)区切りは置換できるけど1行目と2行目にマッチした文字を置換できません。
sedじゃ無理?こういうのawkでできたりしますか?
0623名無しさん@お腹いっぱい。
2007/12/19(水) 12:47:27sedについてはこちらへ
↓
sed
http://pc11.2ch.net/test/read.cgi/unix/1085730992/
0624名無しさん@お腹いっぱい。
2007/12/19(水) 12:56:240625名無しさん@お腹いっぱい。
2007/12/19(水) 13:09:34ファイル名を前にもってきたいなら、せめて、
< /tmp/a.txt awk ...
と書け。
0626名無しさん@お腹いっぱい。
2007/12/19(水) 13:21:070627名無しさん@お腹いっぱい。
2007/12/19(水) 15:50:37そうか?
0628名無しさん@お腹いっぱい。
2007/12/19(水) 21:32:17a.txtの内容
----------
aaa
bbb
ccc
bbb
----------
このa.txtを
----------
aaa
bbb
ccc
ddd
----------
↑のようにa.txtを置換して保存したい。
この文字は何行目にあるか不明だとして
一番下のbbbをdddに置換することはできますか?sedでもawkでもいいのです。
2chなのになぜかたらい回しにされてるのですがよろしくお願いします。
0629名無しさん@お腹いっぱい。
2007/12/19(水) 22:00:52ed a.txt << EOS > /dev/null
\$a
.
?bbb?c
ddd
.
\$d
wq
EOS
いったん末尾に1行挿入するのがコツ
0630628
2007/12/19(水) 22:06:310631名無しさん@お腹いっぱい。
2007/12/19(水) 22:33:42かなり、とっつきは悪い。
特にsed編は、使用目的がtroffマクロの置換とか、プリンタ整形言語の整形とか、訳分からん。
awk編はまあ、用例も身近なのが結構有るけど・・・
でも、内容は極めて濃い。
金を出して購入し、何度も読み返す価値は有ると思う。
0632名無しさん@お腹いっぱい。
2007/12/19(水) 22:37:34いっている意味が良く分からんが、
エスパーすると、それはawkよりsedの方が得意だと思う。
0633名無しさん@お腹いっぱい。
2007/12/19(水) 22:44:440636名無しさん@お腹いっぱい。
2007/12/19(水) 22:59:58おいおい、>>633 じゃ大間違いだと思うがww
0637名無しさん@お腹いっぱい。
2007/12/19(水) 23:05:57そうじゃなくて、>>628 のやりたいのは、
「ccc<改行>bbb」を「ccc<改行>ddd」に置換したいということだろ?
複数行に渡る置換をしたいということ。
sedスレの方に、すでに解答が出てるよ。1行コマンドで行ける。
0638名無しさん@お腹いっぱい。
2007/12/19(水) 23:09:21aaa
bbb
ccc
bbb
aaa
bbb
ccc
ccc
bbb
aaa
bbb
ccc
bbb
% cat /tmp/a.txt | perl -e '($_ = join("", <>)) =~ s/(aaa\nbbb\nccc\n)bbb/$1ddd/g; print '
aaa
bbb
ccc
ddd
aaa
bbb
ccc
ccc
bbb
aaa
bbb
ccc
ddd
0640名無しさん@お腹いっぱい。
2007/12/19(水) 23:31:14お前さんは自分が直面している問題を自分で把握してないのか?wwww
sedではないが別解がひとつ上にある。"aaa改行bbb改行ccc改行bbb"を
全て"〜ddd"に痴漢する
0641名無しさん@お腹いっぱい。
2007/12/21(金) 02:21:54ふつーに見かけるぞ? >awk256倍
しかしこの本が初心者向けかどうかはちと首をひねるがな。
0642名無しさん@お腹いっぱい。
2007/12/21(金) 14:28:09ファイルにひとつフィールド列(固定文字)を足したいんですが、
while read do でループより簡潔に書きたいんです。
paste file1 file2 のfile1には固有文字を入れている感じです
お願いします
0643名無しさん@お腹いっぱい。
2007/12/21(金) 14:37:23awkっての使えばいいことに気がつきましたすみません
0644名無しさん@お腹いっぱい。
2007/12/22(土) 00:04:45「気がつく」のだから、相当な洞察力だな。
0645名無しさん@お腹いっぱい。
2007/12/22(土) 00:20:23学校の宿題とか新人研修の課題を聞きに来る子供ばっかり?
0646名無しさん@お腹いっぱい。
2007/12/22(土) 01:56:01つ 鏡
0647shell
2007/12/22(土) 12:45:37変数 TODAY=20071212(任意指定)として1970-01-01 00:00:00基準からの
経過時刻を秒数で表示したいのですが、方法はありませんか?
0648名無しさん@お腹いっぱい。
2007/12/22(土) 12:46:410649shell
2007/12/22(土) 12:48:50text.txtに
11 11 11 111 222 333 E
33 44 666 6666 E
と2行記入しているのですが、これを1行ずつ変数に代入できるスクリプトはありますか?
行の空白は半角スペースで最後にEは表示されています。行中の文字は任意の文字列です。
0650shell
2007/12/22(土) 12:49:54自分で指定した日付で求めたいです。
0651名無しさん@お腹いっぱい。
2007/12/22(土) 12:59:520652名無しさん@お腹いっぱい。
2007/12/22(土) 13:08:24「dateは本日の日付を求める…」違います。
せっかく >>648 で正解を教えてもらっているのに、礼も言わずに
そういうことを言う人には質問する権利はありません。
はい、次の方どうぞ
↓
0653名無しさん@お腹いっぱい。
2007/12/22(土) 13:10:36> echo "[$str]"
> done
[11 11 11 111 222 333 E]
[33 44 666 6666 E]
$
0654名無しさん@お腹いっぱい。
2007/12/22(土) 13:12:04つ read hoge; read fuga
0655shell
2007/12/22(土) 22:55:46試してみます。
ありがとうございます。
「dateは本日の日付を求める…」違うですか...
調べます。
0656名無しさん@お腹いっぱい。
2007/12/22(土) 23:09:02何でもウィンドウの隠喩w
0657名無しさん@お腹いっぱい。
2007/12/22(土) 23:15:08DOS時代(ニフ)の頃からある表現なので、
ファイルオープンからきた「開く」だと思ってたけど?違うの?
0658名無しさん@お腹いっぱい。
2007/12/23(日) 02:42:27いちいち相手しないほうがいいっすよ。
貶すことしかできないやつってどこにでもいますから。
まあこういうやつに限って現実では貶されまくってるわけですけどね。
0659名無しさん@お腹いっぱい。
2007/12/23(日) 18:22:15/home/hoge/fuga/.data
が本来セットであるはずなんですが、
設定ミスで、一部ユーザには
/home/hoge/fuga/
はあっても
/home/hoge/fuga/.data
がありません。
.dataが存在しないフォルダを簡単に調べる方法はないでしょうか。
0660名無しさん@お腹いっぱい。
2007/12/23(日) 19:03:27for dir in /home/*/fuga
do
[ -f $dir/.data ] || echo $dir
done
0661名無しさん@お腹いっぱい。
2007/12/24(月) 08:08:48echo $line|sed -e s/$old/$new/ だと、
$oldや$newが'/'を含んだ時にエラーになってしまうから、
bashの${line/$old/$new}を使ってしまうのだけど、
他にポータブルないい方法ないでしょうか。
0662名無しさん@お腹いっぱい。
2007/12/24(月) 08:33:45「,」に逃げるとかはできないしな
0663名無しさん@お腹いっぱい。
2007/12/24(月) 10:22:220664名無しさん@お腹いっぱい。
2007/12/24(月) 12:30:10line, old, newがそれぞれ実在のパス(フルパス、相対パス、パスの一部のいずれか)
だと保証できる場合はどうでしょうか。
そもそもsedだと置換え前の文字を正規表現と扱ってしまうから、
期待しないマッチングが発生する可能性もあるけれども。。。
適当なスクリプトに、3つの引数を与えて
その中で処理させたほうがいいのかなぁ。
0665名無しさん@お腹いっぱい。
2007/12/24(月) 14:16:55パスとして使用可能だからなぁ、、
0666名無しさん@お腹いっぱい。
2007/12/24(月) 14:50:27これ本当ですか?
Ctrl-Aと/以外はファイルやディレクトリ名に使えるってこと?
横から質問で申し訳ない
0667名無しさん@お腹いっぱい。
2007/12/24(月) 14:52:420668名無しさん@お腹いっぱい。
2007/12/24(月) 14:59:370669名無しさん@お腹いっぱい。
2007/12/24(月) 15:20:480670名無しさん@お腹いっぱい。
2007/12/25(火) 17:49:340671名無しさん@お腹いっぱい。
2007/12/25(火) 18:00:350672名無しさん@お腹いっぱい。
2007/12/26(水) 00:06:340673名無しさん@お腹いっぱい。
2007/12/26(水) 00:32:280674名無しさん@お腹いっぱい。
2007/12/26(水) 03:49:58ときどき転職したくなる。
0675名無しさん@お腹いっぱい。
2007/12/26(水) 10:48:21プラグインとかだけでなく、サービス起動スクリプトまでtcl使っているのがあるし。
0676名無しさん@お腹いっぱい。
2007/12/26(水) 11:38:44ベースとなる拡張可能なスクリプト言語として開発されたからね。
だから半導体の世界では多い。
独自言語使わないで済むのはTCLのおかげ。
Tkとくっついてから他の世界にも普及した。
0677名無しさん@お腹いっぱい。
2007/12/27(木) 11:54:46#!/usr/bin/ksh
PALALLEL(){
mp=$!; sp=$$
echo "ぱられる ${mp} ${sp}"
}
PALALLEL &
PALALLEL &
とやったとき最初のmpが取れないんですがどうするべき?
ご教示おねがいします
0678名無しさん@お腹いっぱい。
2007/12/27(木) 11:58:48当たり前だろ。
最初のPALALLEL()にとっては、$!は存在しないから。
0679名無しさん@お腹いっぱい。
2007/12/27(木) 12:07:29・・有難うございました(汗
0680名無しさん@お腹いっぱい。
2007/12/29(土) 19:59:29zshだとif [[ -z $EMACS ]]のようなやりかただと警告がでて嫌なのです
0681名無しさん@お腹いっぱい。
2007/12/29(土) 20:37:240682名無しさん@お腹いっぱい。
2007/12/30(日) 02:56:40grepする内容
-------------------------------
ex xxx
aaa
ex yyy
bbb
ex zzz
-------------------------------
ここからexで始まる行のみをgrepで抽出する(xxx,yyy,zzzは同じディレクトリのメンバ名)
-------------------------------
ex xxx
ex yyy
ex zzz
-------------------------------
これをawkでメンバ名だけ抽出しfileに書き込む
awk '{print $2}' >file
各メンバの行数を表示
foreach i (file)
wc -l $i
end
とやるとfileの行数(この場合3)と出てしまいます。
本当はメンバxxx,yyy,zzzの行数を表示したいのですが、どのようにすればよろしいでしょうか?
fileにはメンバ名が出力されています。よろしくご教授ください。
tcshを使用しています。
0683名無しさん@お腹いっぱい。
2007/12/30(日) 04:59:50既にcshで書かれたプログラムをメンテする必要があるとか、
cshが強制されてるでもなければ、
bshにしときなさい。
0684名無しさん@お腹いっぱい。
2007/12/30(日) 10:27:30>>1
> ・csh/tcshのシェルスクリプトは推奨されません。
> (理由は「csh-whynot」でググれ)
0685名無しさん@お腹いっぱい。
2007/12/30(日) 10:37:16思うが。馬鹿の一つ憶えも程々にしてはどうか。
0686名無しさん@お腹いっぱい。
2007/12/30(日) 10:40:380687名無しさん@お腹いっぱい。
2007/12/30(日) 10:43:40やむなく仕事でtcsh使ってるが、
ループ処理の時だけbash起動してる俺。
0688名無しさん@お腹いっぱい。
2007/12/30(日) 11:21:51$ sh -c 'for i in `cat file`; do wc -l $i; done'
0689名無しさん@お腹いっぱい。
2007/12/30(日) 11:39:34ありがとうございます
ぱっと見、なにが行われてるかよくわかりませんでしたが
一応bashのmanに載ってる書式なんですね
0690名無しさん@お腹いっぱい。
2007/12/30(日) 12:12:19[[ -z "$EMACS" ]] でよかろう。
0691名無しさん@お腹いっぱい。
2007/12/30(日) 18:26:58bash依存じゃない。POSIX準拠だ。
0692682
2007/12/30(日) 22:03:40皆様ありがとうございました。
仕事の環境がtcshを使うので>>1は読んでいましたが質問させていただきました。
また、対話形式でもなく(対話でもいいのですが)、スクリプトで実行したかったんです。
初心者の為、頂いた回答でも分らない部分がありますが、
年明け会社で試してみます。
ありがとうございました。
0693名無しさん@お腹いっぱい。
2007/12/30(日) 23:18:24簡単な使い方の例を挙げると、
% foreach i ( * )
と入力すると、ループ中を示すプロンプトが出てくるので、
foreach? (ここで変数$iを使った文)
foreach? :
foreach? end
みたいに実施する。
例えば拡張子が.logなファイルがある場所で、
% foreach i ( *.log )
foreach? echo "ファイル名 $i 、行数=`wc -l $i`"
foreach? echo "--- 先頭10行 ---"
foreach? head $i
foreach? echo "--- 末尾10行 ---"
foreach? tail $i
foreach? end
こんなことするときに便利なりよ。
0694名無しさん@お腹いっぱい。
2007/12/31(月) 00:21:27bashみたいに foreach i ( * ) ; do echo $i; end # do は要らないんだろうけど
みたいには使えないの?
強制的に対話モードになってしまうのが嫌なの。
0695名無しさん@お腹いっぱい。
2007/12/31(月) 16:44:41それだと、$EMACS が空文字列の場合にも
未定義と判断されてしまう。
>>681 は、空文字列の場合でも、定義済みかどうかをちゃんと判断できる。
0696名無しさん@お腹いっぱい。
2008/01/04(金) 00:49:17& が一致した箇所に置換されます
これを変数の中で bbb=\& とエスケープしないでそのまま置換させたいのですが
いい方法はないでしょうか?
またはsedじゃなくても正規表現を無視して置換するコマンドってあります?
0697名無しさん@お腹いっぱい。
2008/01/04(金) 18:00:48やりたいことは1.5GBもあるファイルをgzipを使って圧縮したいのですが、
レンタルサーバーのため負荷が高いせいか途中でkillされてしまい、
圧縮が最後まで出来ません。何か解決策をご教授いただけないのでしょうか?
宜しくお願いします。
gzip fileName
0698名無しさん@お腹いっぱい。
2008/01/04(金) 18:10:12分割して圧縮?
0699名無しさん@お腹いっぱい。
2008/01/04(金) 18:55:23レンタル鯖のルールがよくわからんが、ファイルの大小に関係なくファイル圧縮の
CPU使用率なんてタカが知れているから、おそらくCPU時間を測っていて、タイムアウト的に
討ち取られていると思う(CPU負荷は小さいがCPU時間は長くなる)
というわけで>>698の言う通り、splitして分割圧縮するしかないな。
0700名無しさん@お腹いっぱい。
2008/01/04(金) 19:09:510701名無しさん@お腹いっぱい。
2008/01/04(金) 19:37:54僕のPCのシェルはXtermというものみたいです。
これは、シェル系に当てはめると何シェル系なんでしょうか?
0702名無しさん@お腹いっぱい。
2008/01/04(金) 19:39:360703江戸っ子
2008/01/04(金) 21:34:590704名無しさん@お腹いっぱい。
2008/01/04(金) 23:11:46マジレスするとxtermはshellじゃない。
0705名無しさん@お腹いっぱい。
2008/01/05(土) 00:18:57僕のPCのシェルはTeraTermというものみたいです。
これは、シェル系に当てはめると何シェル系なんでしょうか?
0707名無しさん@お腹いっぱい。
2008/01/05(土) 01:31:180708名無しさん@お腹いっぱい。
2008/01/05(土) 08:59:59ddで先頭から順に適当な長さずつ切り出しながら | gzip -c >> file.gz に繋ぐ。
dd if=file bs=適当 skip=0 count=1 | gzip -c > file.gz
dd if=file bs=適当 skip=1 count=1 | gzip -c >> file.gz
dd if=file bs=適当 skip=2 count=1 | gzip -c >> file.gz
...
0709名無しさん@お腹いっぱい。
2008/01/05(土) 09:05:05せんせー、ktermは?
0710名無しさん@お腹いっぱい。
2008/01/05(土) 09:54:280711名無しさん@お腹いっぱい。
2008/01/05(土) 10:16:01ひねりが足りない。
0712名無しさん@お腹いっぱい。
2008/01/05(土) 10:42:030713名無しさん@お腹いっぱい。
2008/01/05(土) 17:02:33n=2 の時は
command "$1" "$2"
n=4 の時は
command "$1" "$2" "$3" "$4"
というように、変数nに応じて引数の数を変える処理をしたいと思ってます。
command "$1" ... "$n"
どうすれば実現できるでしょうか?
0714名無しさん@お腹いっぱい。
2008/01/05(土) 17:13:030715名無しさん@お腹いっぱい。
2008/01/05(土) 17:13:270716名無しさん@お腹いっぱい。
2008/01/05(土) 17:20:44'があるため展開されずに困っているのですが、
どうすればいいでしょうか?
----------------------------------------
hensu=123
command arg='${hensu}'
----------------------------------------
0717名無しさん@お腹いっぱい。
2008/01/05(土) 18:11:44それ、gzファイルが切れ目なくくっついちゃって、解凍できなくないか?
0718名無しさん@お腹いっぱい。
2008/01/05(土) 18:17:37'を使わない。
0719名無しさん@お腹いっぱい。
2008/01/05(土) 18:34:06知らないなら試せよ。
0720名無しさん@お腹いっぱい。
2008/01/05(土) 19:42:03レスありがとうございます。
いや、'を使わないとcommandの処理が正常に終了したいので、
どうにかして'付きで渡したいんです。宜しくお願いします。
0721名無しさん@お腹いっぱい。
2008/01/05(土) 19:57:50'で囲まれるとパラメーター置換は行われない。'で囲む事とパラメーター置換を行う事は排他。
0722名無しさん@お腹いっぱい。
2008/01/05(土) 20:11:42教えていただいて、ありがとうございます。難しいですね。
そうしたら、例えば、phpでいうと、
"'" . $hensu . "'"
のような文字列を結合することってできますか?
0723名無しさん@お腹いっぱい。
2008/01/05(土) 20:11:440724名無しさん@お腹いっぱい。
2008/01/05(土) 20:12:36$hensu を展開した上で、commandには ' ' を付けて渡したいということだろ?
だったら、
command arg=\'$hensu\'
>>721
知らないなら黙ってればいいのに。
0725名無しさん@お腹いっぱい。
2008/01/05(土) 20:19:31初めて知った
gzipはパイプ前段でddが動いてることも、>>でシェルが同じファイルに追加書きしてることも
わからないと思うんだけど、どうやって同じファイルを分割圧縮してるんだ?
0726名無しさん@お腹いっぱい。
2008/01/05(土) 20:43:53ハイハイ>>722見て後出し。>>721の何処が正しくないんだ言ってみろクズ。
0727名無しさん@お腹いっぱい。
2008/01/05(土) 20:50:33' ' で囲んだ上でパラメータ置換を行なうことはできる。排他ではない。
0728名無しさん@お腹いっぱい。
2008/01/05(土) 21:08:09クォートで渡すとhensuに空白文字があったときに面倒なことになる気がす
0729名無しさん@お腹いっぱい。
2008/01/05(土) 21:34:54>>724は囲んでいるのではなく、'を連結しているだけ。 しかも>>728が指摘しているとおり無様。
>>728は一見囲んでいるようには見えるが、arg="'${hensu}''"でも通るので却下。
0730名無しさん@お腹いっぱい。
2008/01/05(土) 21:37:28>>728は>>722の回答としては正しい。
> 'で囲まれるとパラメーター置換は行われない。
の反例としては却下。
0731名無しさん@お腹いっぱい。
2008/01/05(土) 21:42:10dd if=file bs=適当 skip=0 count=1 | gzip -c > 1.gz
dd if=file bs=適当 skip=1 count=1 | gzip -c > 2.gz
dd if=file bs=適当 skip=2 count=1 | gzip -c > 3.gz
cat ?.gz > file.gz
とやったfile.gzでも、gzip -dで全体が解凍できたわ。一方gzipをcompress/uncompressに
変えたら、ファイル蛾物故割れて解凍できなかった。圧縮時は単なるファイルの連結でも、
解凍時にgzipが連結ファイルであることを認識して、続きを解凍してくれてるんだな。
0732名無しさん@お腹いっぱい。
2008/01/05(土) 23:03:18>の反例としては却下。
却下
0733名無しさん@お腹いっぱい。
2008/01/05(土) 23:57:08↓これへの反論も出来ない池沼は黙ってればいいのに。
>>728は一見囲んでいるようには見えるが、arg="'${hensu}''"でも通るので却下。
0734名無しさん@お腹いっぱい。
2008/01/06(日) 00:07:54それがどうした。
却下
0735名無しさん@お腹いっぱい。
2008/01/06(日) 12:52:56du -sh 以外で高速な方法はないでしょうか。
ファイル数や容量が多い場合、
du -sh にかなり時間がかかることが多いためです。
0736名無しさん@お腹いっぱい。
2008/01/06(日) 20:28:38それらファイルの所有者を測定用ユーザにしてquotaを設定しとく
0737名無しさん@お腹いっぱい。
2008/01/07(月) 02:33:08n=1
var${n}=foo
echo var1=foo
直接はできないっぽいんですが、こういう時の上手い手ってありますか?
0738名無しさん@お腹いっぱい。
2008/01/07(月) 02:59:13eval var$n=foo
0740名無しさん@お腹いっぱい。
2008/01/08(火) 16:30:29shスクリプトの中で、readで読んだ変数に改行コードらしきコードが入っていて、
うまく処理が動きません。
シェル変数 AAA,BBBの最後の1バイトを取ってあげれば動くと思うんですが、
どうやれば良いでしょうか?
以下がサンプルのスクリプトです。
コマンドラインで起動すると、PATH_VARは、キーボードから入力した2つの文字列が
'/'で連結されて表示されるのですが、これをinetd経由でtelnetから起動すると、
PATH_VARが変な文字(シェル変数AAAが設定されない?)となってしまいます。
#!/bin/sh
read AAA
read BBB
PATH_VAR="$AAA/$BBB"
echo $PATH_VAR
0741名無しさん@お腹いっぱい。
2008/01/08(火) 16:38:40readで読み込むと、改行コードは自動的に取り除かれる。
問題になってるのは、改行 \n じゃなくて 復帰 \r (^M) じゃないのかな
^M を取り除くには tr とか使う。
0742名無しさん@お腹いっぱい。
2008/01/08(火) 16:44:33read AAA
read BBB
PATH_VAR=`echo "$AAA/$BBB" | tr -d '\015'`
echo $PATH_VAR
0743名無しさん@お腹いっぱい。
2008/01/08(火) 16:59:36THXです。
おっしゃる通り、改行ではなく復帰でした。
だから、PATH_VARを表示した時に、AAAが表示されなかったんですね。
大変助かりました、どうもありがとうございました。
改修バージョンはこんな感じになりました。
#!/bin/sh
read line ; AAA=`echo $line | tr -d \\\r`
read line ; BBB=`echo $line | tr -d \\\r`
PATH_VAR="$AAA/$BBB"
echo $PATH_VAR
0744名無しさん@お腹いっぱい。
2008/01/08(火) 17:48:070745名無しさん@お腹いっぱい。
2008/01/08(火) 19:03:22そういうやり方もありですね。
>>745
echo $AAA | hd
ってやるとちゃんと制御コードが確認出来ました。
シェル変数の中身ってこうすればHEXでみれたんですね。
\とか、"とか、'とか、`とかをシェル変数に突っ込むときに、
いつも困ってたんですが、良いこと聞きました。
ありがとう。
0746名無しさん@お腹いっぱい。
2008/01/09(水) 13:39:560747名無しさん@お腹いっぱい。
2008/01/09(水) 13:45:28よりポータブルには、od -Ax -t x1 だな。
0748名無しさん@お腹いっぱい。
2008/01/17(木) 00:04:480749名無しさん@お腹いっぱい。
2008/01/17(木) 00:23:08read v1 v2 v3
0750名無しさん@お腹いっぱい。
2008/01/17(木) 01:03:42read -d ,
0751名無しさん@お腹いっぱい。
2008/01/17(木) 03:52:18find . -type f -regex ".*\.[ch]\(pp\|xx\)?"
で*.cppとか.hだけを列挙できるわけですが
updatedbの--findoptionsに
updatedb --findoptions='-type f -regex ".*\.[ch]\(pp\|xx\)?"' --localpath='./' --output='/home/someone/sources.db'
などと同様に指定してもうまくフィルタリングされません(上のコマンドで生成されたものを使うと普通にディレクトリ名や要らないファイルが引っかかる)
どうにかupdatedbで生成されるデータベースの内容をコントロールする手は無いんでしょうか?
0752名無しさん@お腹いっぱい。
2008/01/18(金) 00:42:15そんなオプションがあるんだ。
プラットフォームは何?
クォートに問題がある気がするんだけど、これならどう?
--findoptions="-type f -regex \".*\.[ch]\(pp\|xx\)?\""
0753名無しさん@お腹いっぱい。
2008/01/18(金) 22:20:53OSによって違うだろうけど道具はあるはず。
多少牛刀な気もするがシステムコールのトレースとか。
0754名無しさん@お腹いっぱい。
2008/01/19(土) 00:57:26おっぱいが牛みたいな可愛い女の子剣士?
0755名無しさん@お腹いっぱい。
2008/01/19(土) 02:36:191. 「牛をぶった切るための刀」
2. 「牛刀をもって鶏を割く」の略
3. 「おっぱいが牛みたいな可愛い女の子剣士」
好きなの選べ
0756名無しさん@お腹いっぱい。
2008/01/19(土) 02:55:18OSによって違うだろうけど道具はあるはず。
多少おっぱいが牛みたいな可愛い女の子剣士な気もするがシステムコールのトレースとか。
0757名無しさん@お腹いっぱい。
2008/01/19(土) 10:17:30実装によるが、updatedbからのfindの呼び出しが、絶対PATHじゃないなら、
findの偽物スクリプトを作って、PATHを先に通して
引数を表示させれば良い。
#!/bin/sh
echo "$@"
みたいな。
絶対PATHの場合はちょっと厄介だが、
/usr/bin/findを一時的にリネームして、偽物findスクリプトに置き換える。
0758名無しさん@お腹いっぱい。
2008/01/19(土) 10:51:510759名無しさん@お腹いっぱい。
2008/01/19(土) 10:53:30>絶対PATHの場合はちょっと厄介だが、
>/usr/bin/findを一時的にリネームして、偽物findスクリプトに置き換える。
客先でそれやった馬鹿がいた。しかも本番環境で……
cronで動いていた業務処理が止まり、大騒ぎに。
0760名無しさん@お腹いっぱい。
2008/01/19(土) 11:01:09#!/bin/sh
echo $@
find $@
0761名無しさん@お腹いっぱい。
2008/01/19(土) 11:12:19そ〜ゆ〜のは、テスト環境でやるもの。
0762名無しさん@お腹いっぱい。
2008/01/19(土) 11:18:480763名無しさん@お腹いっぱい。
2008/01/19(土) 12:02:32それ、スクリプト無限ループw 釣りか?
あと、$@ は "$@" にしないと $@ の意味をなさない。
0764名無しさん@お腹いっぱい。
2008/01/19(土) 12:30:000765名無しさん@お腹いっぱい。
2008/01/19(土) 13:17:500766名無しさん@お腹いっぱい。
2008/01/19(土) 13:26:50思いもよらなかった。
execをすり替えてロギングするライブラリ作ってLD_PRELOADあたりを
想定していたんだが。
0767名無しさん@お腹いっぱい。
2008/01/19(土) 13:40:24LD_PRELOAD だと、コンパイルが必要。
シェルスクリプトでできるものはシェルスクリプトで済ませる方がエレガント。
まさかとは思うが、>>766 は wrapper scriptの類を、
いちいちexecv() とかで書いてコンパイルしてるのかな?
0768名無しさん@お腹いっぱい。
2008/01/19(土) 13:50:17つか, あるもん使えばいいんじゃね?
0769名無しさん@お腹いっぱい。
2008/01/19(土) 13:52:31それと、「コンパイル不要」とがどう結び付くんだよ。
あと、FreeBSD限定の話をされてもな
0770名無しさん@お腹いっぱい。
2008/01/19(土) 14:40:32そんな面倒な事しなくても DTrace 使えば良いじゃない
0771名無しさん@お腹いっぱい。
2008/01/19(土) 17:16:190772名無しさん@お腹いっぱい。
2008/01/19(土) 17:28:10>>759
> 客先でそれやった馬鹿がいた。しかも本番環境で……
0773名無しさん@お腹いっぱい。
2008/01/19(土) 17:39:20それこそおっぱいが牛みたいな可愛い女の子剣士だろ
0774名無しさん@お腹いっぱい。
2008/01/19(土) 17:47:030775名無しさん@お腹いっぱい。
2008/01/19(土) 23:12:58Cron+Cシェルで
http://www.hoge.com/hoge.php
を実行するのを書かなきゃいけなくなってしまいました。
1:同一サーバー内の、hoge.phpを実行するにはなんて書けばいいでしょうか?
SHELL=/bin/csh
** Cronの設定 **
/home/*****/www.hoge.com/hoge.php
2:外部のサーバー(これもCシェル)からからの場合は、http〜と直接書けるのでしょうか?
SHELL=/bin/csh
** Cronの設定 **
http://www.hoge.com/hoge.php #OK?
0776名無しさん@お腹いっぱい。
2008/01/19(土) 23:42:580777名無しさん@お腹いっぱい。
2008/01/19(土) 23:49:020778名無しさん@お腹いっぱい。
2008/01/19(土) 23:52:420779名無しさん@お腹いっぱい。
2008/01/19(土) 23:53:080781775
2008/01/20(日) 01:03:14解決しました。 wgetのそういう使い方もあるんですね。
Cshなのは、鯖屋さんの関係です。
0782名無しさん@お腹いっぱい。
2008/01/25(金) 22:42:49使えそうなのはawkくらいだが、こいつは秒が変わる前に二度呼ぶと
同じ値を返してしまう。
awk 'BEGIN{srand();print rand()}'
$RANDOMはbash依存。jotはBSD系。/dev/randomもあるかどうかわからん。
perl -e 'print rand()'が一番ましだろうか。
0783名無しさん@お腹いっぱい。
2008/01/25(金) 22:50:06exprで乱数計算。
0784名無しさん@お腹いっぱい。
2008/01/26(土) 00:42:39dateのmanを見ていたら、
%N nanoseconds (000000000..999999999)
というのがあった。こんな感じ
% echo -n `date +%N`
431218994 % echo -n `date +%N`
857494685 % echo -n `date +%N`
269031777 % echo -n `date +%N`
803351248 % echo -n `date +%N`
195538275 % echo -n `date +%N`
538357509 % echo -n `date +%N`
058776188 %
453 名前:login:Penguin[sage] 投稿日:2008/01/16(水) 23:09:59 ID:PJonPFmQ
jotはたぶんBSD系限定だよな。
jot -r 10 1 6
/dev/urandomは10進数テキストで得るのがめんどーだろうか。
dd if=/dev/urandom bs=2 count=1 2>/dev/null | od -vd
左カラムがじゃまだな。 sed 1q |cut -f2 -d' ' とかで削るか。
454 名前:login:Penguin[sage] 投稿日:2008/01/16(水) 23:21:36 ID:KAlEWwYc
>452,453 なるほど.date +%Nはいい感じ.
jot便利そうだよ,jot.犬にもこんなの欲しいな.
ありがとう
455 名前:login:Penguin[sage] 投稿日:2008/01/16(水) 23:24:18 ID:HQvmxN1E
od -t u1 /dev/urandom | awk '{print $2;exit}'
0785名無しさん@お腹いっぱい。
2008/01/26(土) 09:53:030786名無しさん@お腹いっぱい。
2008/01/26(土) 10:44:55でどうよ。
余計なrand()一発は、FreeBSDの実装で、srand直後のrandがおかしいため。
+%sもない前時代までポータブルにしないといかんか?
0787名無しさん@お腹いっぱい。
2008/01/26(土) 11:19:04じゃあ、date +%s がない Solaris10 は前時代のOSなんだw
0788名無しさん@お腹いっぱい。
2008/01/26(土) 12:24:46シーラカンスだろ
0789名無しさん@お腹いっぱい。
2008/01/26(土) 14:52:380790名無しさん@お腹いっぱい。
2008/01/26(土) 15:07:360791名無しさん@お腹いっぱい。
2008/01/26(土) 23:11:38全てのディレクトリ・ファイルを削除したい
http://virus.okwave.jp/qa2500406.html
こいつは馬鹿なの?
http://virus.okwave.jp/user.php3?u=296068
というかなんでこれが良解答なの?
0792名無しさん@お腹いっぱい。
2008/01/26(土) 23:26:41find . ! -name '*.txt'
でいいかな?
0793名無しさん@お腹いっぱい。
2008/01/26(土) 23:45:55> rm -rコマンドを使用して、「*.txt」以外の
> 全てのディレクトリ・ファイルを削除したい
という要求は実現不可能。*.txtを含むディレクトリは除外なら
find . -depth -not -name '*.txt' -a \( -type d -a -empty -o -type f \) -exec rm -rf '{}' ';'
0794名無しさん@お腹いっぱい。
2008/01/29(火) 23:10:16> というかなんでこれが良解答なの?
一般人しかいないQAサイトじゃそんなもんだろ。
0795名無しさん@お腹いっぱい。
2008/01/30(水) 03:01:04みんなどうやってる?
普通に read DUMMY 入れたらバッファである<STDIN>から一行取られて終わり
だよね。
forで回避 or 子shellに分ける以外に俺の行く道はないんすかね?
==== hoge.sh START ================
#!/bin/sh
cat << EOF > ./hoge.list
AAA
BBB
CCC
DDD
EOF
while read i
do
echo "$i"
echo "<push enter>"
read DUMMY
done < ./hoge.list
==== hoge.sh END ======================
ちょっと気になってググったら
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=34340&forum=10&2
>試しましたが、できましたよ。
とか回答してるやつがいた。
まじすか?
0796名無しさん@お腹いっぱい。
2008/01/30(水) 04:29:25/dev/ttyを使えばプロセスの制御端末から読める。
read _ </dev/tty
例:
head foo.txt |sh -c 'i=1;while read -r l; do printf "%3d: %s\n" $i "$l";i=$((i + 1)); read _ </dev/tty; done'
0797名無しさん@お腹いっぱい。
2008/01/30(水) 05:04:54>>796 の方が素直だが、別の fd を用意する方法もある。
例えば、ファイルを fd3 から読むのなら、こんなかんじ。
exec 3< "./hoge.list "
while read i 0<&3
do
echo "$i"
echo "<push enter>"
read DUMMY
done
0799名無しさん@お腹いっぱい。
2008/02/01(金) 21:46:35~/.forwardをバックアップするスクリプトを書いてたのですが、
最初これでいいかなと思ったのですが、
cd /home; tar cvf /tmp/tmp.tar */.forward
よく考えたらユーザ数が非常に多い環境ではエラーになります。
それで試行錯誤して、こうしたのですが、
( cd /home ; find . -name .forward -maxdepth 2 -print | tar cvf /tmp/tmp.tar -T - )
エレガントではない。もっと綺麗な書き方はないですかね。
0800名無しさん@お腹いっぱい。
2008/02/01(金) 21:48:51ホーム直下以外に .forward というファイルがあるから
です。
0801名無しさん@お腹いっぱい。
2008/02/01(金) 21:55:29というかエレガントでないとも思わないが.
0802名無しさん@お腹いっぱい。
2008/02/01(金) 21:58:010804名無しさん@お腹いっぱい。
2008/02/01(金) 23:41:07状況限定だろうし。あえていうなら-Tよりは-Iの方がポータブル?
0805799
2008/02/01(金) 23:53:10いやま、それを言うなら、うちはユーザ数が400名程度だから、
事実上、これでも全く問題ないわけなんです。
cd /home; tar cvf /tmp/tmp.tar */.forward
shellの引数の最大値は幾つぐらいだったか忘れたけど、数千のオーダーだろうし。
0806名無しさん@お腹いっぱい。
2008/02/02(土) 00:18:030807名無しさん@お腹いっぱい。
2008/02/02(土) 07:19:21以下のように変数にスペースを含む文字列(ファイル名)を入れ、それを
別の変数の定義に使おうとしています。
FILE="foo bar.txt"
FLAGS="-l $FILE"
ls $FLAGS
しかしこれだとうまくいきません。
foo: No such file or directory
bar.txt: No such file or directory
ほかに FLAGS="-l \"$FILE\"" とか ls "$FLAGS" とか試しましたが
間違いでした。
どう書けばいいのでしょう?
0808名無しさん@お腹いっぱい。
2008/02/02(土) 07:41:41FLAGS="-l '$FILE'"
だけどその例だと
FLAGS="-l"
ls $FLAGS "$FILE"
の方が適当なんじゃないの。
別解としては
FLAGS='-l "$FILE"'
eval ls $FLAGS
0809名無しさん@お腹いっぱい。
2008/02/02(土) 08:29:20>しかしこれだとうまくいきません。
これはこれで、うまくいってるよ。
No such file or directory(そんなファイルやディレクトリはないよ)
と言われてるんだから、単にカレントディレクトリに foo と bar.txt が無いだけだよ。
正しくは >>808 の言う通りだと思う。
0810名無しさん@お腹いっぱい。
2008/02/02(土) 10:19:27set -- -l
set ${1+"$@"} "$FILE"
ls ${1+"$@"}
0811名無しさん@お腹いっぱい。
2008/02/02(土) 10:44:29明らかに1つ以上 setしてるんだから、${1+"$@"} なんて書き方する必要なし。
"$@" だけでOK。
あと、引数が0の場合であっても現行のシェルなら "$@" ですべてOK。
${1+"$@"} という書き方はもう古いので、そろそろ撲滅すべし。
0812名無しさん@お腹いっぱい。
2008/02/02(土) 11:12:57set -- -l
と、これ
FILE="foo bat.txt"
と、これ
set ${1+"$@"} "$FILE"
ls ${1+"$@"}
が、別々のモジュールになるかも知れないので、安全な方に倒すのが当然だね。
お前のプログラムってバグだらけだろう。
> ${1+"$@"} という書き方はもう古いので、そろそろ撲滅すべし。
Solaris10ではまだ必要。
0813名無しさん@お腹いっぱい。
2008/02/02(土) 11:34:33>Solaris10ではまだ必要。
嘘書くな。Solaris10上で、$# = 0 の状態で "$@" が問題なく消えてくれる
(空文字列が残らない)ことは確認済み。
${1+"$@"}が必要なようなシェルは今は残っていない。
0814名無しさん@お腹いっぱい。
2008/02/02(土) 11:50:01条件はSolaris10じゃなかった。
set -uされている状態で使われる可能性がある場合。
0815名無しさん@お腹いっぱい。
2008/02/02(土) 12:04:03言うと思った。set -u の話なんて誰もしてない。後出し乙
結論: ${1+"$@"} は不要
0816名無しさん@お腹いっぱい。
2008/02/02(土) 12:06:40これを後出しと言わずして、何を後出しといおうか… 大笑い。
0817名無しさん@お腹いっぱい。
2008/02/02(土) 12:13:13Solarisのバグだと思うぞ。
そもそも set -u なんてすることは滅多にないし、そういう意味でも "$@" 推奨。
0818名無しさん@お腹いっぱい。
2008/02/02(土) 12:21:52そこには、
引数が0個の場合とか、
シェルスクリプトが別ファイルにわかれる場合とか、
set -uする場合とか、
一切書いていない。
勝手な条件を後出しで付け加えたのは >>810
さらに言うと、>>810 の方法では位置パラメータが破壊されるから
そもそも setを使うのは効果的じゃない。そんなことしなくてもできるし。
0819名無しさん@お腹いっぱい。
2008/02/02(土) 12:38:45ashでも
@: parameter not set
という警告がでるが。
> そもそも set -u なんてすることは滅多にないし、そういう意味でも "$@" 推奨。
お前perlでuse strictしないの? ダメな奴だな。
>>818
後出しでケチつけていくのがみっともない。しかも致命的な欠陥の指摘じゃないから反論される。
> さらに言うと、>>810 の方法では位置パラメータが破壊されるから
破壊されても問題ない場合や、シェルファンクションで使える。
> そもそも setを使うのは効果的じゃない。
根拠なし。
> そんなことしなくてもできるし。
別解という言葉を調べてみることをお勧めする。
0820名無しさん@お腹いっぱい。
2008/02/02(土) 12:44:48$ ash
$ set -u
$ echo $#
0
$ echo "$@"
$
問題なしw
0821名無しさん@お腹いっぱい。
2008/02/02(土) 12:54:11FreeBSD orz 8.0-CURRENT FreeBSD 8.0-CURRENT #1: Tue Jan 29 01:35:03 JST 2008 root@:/usr/obj/src/sys/orz i386
$ sh
$ set -u
$ echo $#
0
$ echo "$@"
@: parameter not set
実例が提示されたので、以下は嘘。
> ${1+"$@"}が必要なようなシェルは今は残っていない。
0822名無しさん@お腹いっぱい。
2008/02/02(土) 12:59:31だから、set -u の話は後出し
> ${1+"$@"}が必要なようなシェルは今は残っていない。
のは、"$@" が "" (空文字列) に展開されるような古いシェルのこと。
よって、
> ${1+"$@"}が必要なようなシェルは今は残っていない。
は、正しい。
0823名無しさん@お腹いっぱい。
2008/02/02(土) 13:06:51ハイハイ、後出し。wwww
> ${1+"$@"}が必要なようなシェルは今は残っていない。
これは嘘。
0824名無しさん@お腹いっぱい。
2008/02/02(土) 13:14:38${1+"$@"}が必要な理由として、
set -- -l と FILE="foo bat.txt" と、set ${1+"$@"} が
別々のモジュールになるかも知れないので、
と言っている。
これは、引数が0個になる場合があるから、と言う意味に他ならない。
それに対する反論として、
>>813 で、${1+"$@"} は不要と言っている。
その「後」で、>>814 が set -u の話を持ち出している。
よって、>>814 の set -u が後出し。
あと、未だに set -u で "$@" がエラーになる FreeBSDもバグ持ちと言うことだな。
0825名無しさん@お腹いっぱい。
2008/02/02(土) 13:20:240826名無しさん@お腹いっぱい。
2008/02/02(土) 13:27:40・set -uで警告が出る(ので回避する)
は排他じゃない。
>>811は、${1+"$@"}を空文字列への展開を避けるためと思い込んで、突っ込み(>>811)を
入れたのはいいが、set -uでの警告を知らなかったため、しどろもどろで反論を続けている。
かなり見苦しいぞ。www
> あと、未だに set -u で "$@" がエラーになる FreeBSDもバグ持ちと言うことだな。
FreeBSDだけじゃなく、Solaris10でも同じように警告が出るぞ。
ところで、お前が試したashって何処のashだよ。
ash -> bashじゃねーのか? www
0827名無しさん@お腹いっぱい。
2008/02/02(土) 14:21:040828名無しさん@お腹いっぱい。
2008/02/02(土) 14:42:22・>>811 ${1+"$@"}という記法に因縁つける。
・>>810 反論のついでに「お前のプログラムってバグだらけだろう。」と煽る。>>812
・>>811 必死の再反論を試みるが迎撃され、逃亡。 <<=== 今ココ
0829名無しさん@お腹いっぱい。
2008/02/02(土) 15:06:570830名無しさん@お腹いっぱい。
2008/02/02(土) 15:35:02となってる。実際、ラッパーの類とか、皆 "$@"で書かれてるよ。
0831名無しさん@お腹いっぱい。
2008/02/02(土) 16:04:20・>>811 ${1+"$@"}という記法に因縁つける。
・>>810 反論のついでに「お前のプログラムってバグだらけだろう。」と煽る。>>812
・>>811 必死の再反論を試みるが迎撃され、逃亡。
・>>811 噴飯物の社内標準を持ち出す。 <<=== 今ココ
0832名無しさん@お腹いっぱい。
2008/02/02(土) 16:09:10set +u
hoge "$@"
って記述すれば委員じゃないの? 何がそんなに問題なの?
0833名無しさん@お腹いっぱい。
2008/02/02(土) 16:09:49ポータビリティと簡潔さのトレードオフだとは思うんだけど.
0834名無しさん@お腹いっぱい。
2008/02/02(土) 16:14:450835名無しさん@お腹いっぱい。
2008/02/02(土) 16:23:08特殊パラメータとして定義されている。
この定義は、たとえ位置パラメータの個数が0個の場合でも変わらない
(=未定義にはならない)ので、
$@は、位置パラメータの個数が0個の場合でも定義されていると考えられる。
よって、set -u 状態での $@ の参照を、
「未定義パラメータの参照」とみなしてしまう一部のシェルの実装は
バグと考えて良い。
0836名無しさん@お腹いっぱい。
2008/02/02(土) 16:25:45冗長な記述を否定するために、より冗長な記述を持ってきても説得力ないぞ。
しかも戻すために処理後にset -u必要だし。
いや、nounsetが設定されていることを確認しないといかんな。
if set -o | egrep 'nounset *on' >/dev/null 2>&1; then
set +u
hoge "$@"
set -u
else
hoge "$@"
fi
こうか? www
>>833
噴飯物の社内標準がなければ${1+"$@"}と書いても5文字増えるだけだ。
>>834
お前がやれ。理由は「社内標準が守れないから」とでもしとけ。www
0837名無しさん@お腹いっぱい。
2008/02/02(土) 16:33:04unsetできるのはシェル変数だけ。
それとは別に、「位置」パラーメータは未設定の場合もあり得る。
そして、$@は、「位置」パラーメータではなく
「特殊(←ここ重要)」パラメータであるということ。
set -u はそもそもシェル変数や「位置」パラーメータのように、
未設定である場合があり得るパラメータに対してチェックするためのもの。
その set -u が、「特殊」パラメータである $@ に反応してしまうのはおかしい。
0838名無しさん@お腹いっぱい。
2008/02/02(土) 16:35:51いや、その説明だと、特殊パラメータの $! は、バックグラウンド起動歴が
なければ未設定になるから、説明にならない。
>>835 の説明の方が正しいんじゃないか?
0839名無しさん@お腹いっぱい。
2008/02/02(土) 16:39:38↓こう主張してね。
> あと、引数が0の場合であっても現行のシェルなら "$@" ですべてOK。
> ${1+"$@"} という書き方はもう古いので、そろそろ撲滅すべし。
0840名無しさん@お腹いっぱい。
2008/02/03(日) 04:03:25ウチでは set -u 必須としてて環境的に ${1+"$@"} せざるを得ないんで
> 結論: ${1+"$@"} は不要
と言われても全然結論じゃないんだけどな "$@"にしたら問題起きるんで書き直しだし
まぁ言語仕様的には "$@" で問題起きない方が正しいのかもしれんが
シェル開発者や仕様企画者の集まりっていうならともかく
元々伝統的な方法でもあるんで必死こいて ${1+"$@"} を否定する意味が分からない
0841名無しさん@お腹いっぱい。
2008/02/03(日) 07:40:37set -u 必須ってどんな環境?
俺の認識では、set -u はあくまでデバッグ用であって、
本番スクリプトでset -uを記述するなんてあり得ないんだけどな。
で、set -u必須だったとして、例えば、あるオプション変数がセットされてれば
使うけど、セットされてなければ黙って無視したいような場合、
hoge_command $HOGE_OPT
って書いちゃ駄目なんだよね? (不便だな)
いちいち
hoge ${HOGE_OPT+HOGE_OPT}
って書くのかなw
0842名無しさん@お腹いっぱい。
2008/02/03(日) 08:20:12hoge ${HOGE_OPT+HOGE_OPT}
わらた
タイプミスで初期化してない変数を見てしまうバグが未然に防げる可能性があるだろ
0843名無しさん@お腹いっぱい。
2008/02/03(日) 08:42:59つねに ${HOGE_OPT+$HOGE_OPT} って書かなければならないルールになっちゃうから、
${HOGE_OPT+$HOGE_ORT} っていうタイプミスすると防げない。
0844名無しさん@お腹いっぱい。
2008/02/03(日) 08:58:040845名無しさん@お腹いっぱい。
2008/02/03(日) 08:59:22中身がないかどうかを set -u の状態で ifで判定ってできる?
0846名無しさん@お腹いっぱい。
2008/02/03(日) 09:09:300847名無しさん@お腹いっぱい。
2008/02/03(日) 09:16:38シェルスクリプト内部で定義する変数なら最初空文字列で初期化でいいけど、
起動時に環境変数で渡される変数だと、
結局セットされてるかどうかの判定が必要になるからあまり意味ないね
0848名無しさん@お腹いっぱい。
2008/02/03(日) 09:25:25if [ -n "$HOGE" ]; then
みたいなよくやる書き方もできないわけだ。
いちいち
if [ -n "${HOGE+$HOGE}" ]; then
って書くのかな?
あるいは最初にいちいち
: ${HOGE=}
とかするのかな。いずれにしても不便だなw
0849名無しさん@お腹いっぱい。
2008/02/03(日) 09:30:58[ -n "${HOGE+$HOGE}" ]
なんてしなくても、
[ -n "${HOGE-}" ]
で十分。
ところが、いつも${HOGE-}する癖がつくと結局 set -u の意味がなくなる。
rm -i をaliasしても無意味なのと似てる。
0850名無しさん@お腹いっぱい。
2008/02/03(日) 09:46:07俺は意味は分かるし、見かけたこともあるが、
なぜそんな冗長な書き方をしていたのかは
今の流れで初めて分かった。
で、set -u のバグがあるのは FreeBSD だけ?
0851名無しさん@お腹いっぱい。
2008/02/03(日) 11:13:41素人さんにプロのテクニックを教えてやろう。
set -uはタイプミスを検出するために使うんだよ。全ての変数は明示的に初期化する。
従って未定義の変数はタイプミスだ。
0852名無しさん@お腹いっぱい。
2008/02/03(日) 11:49:24なるほど。
一つ賢くなった気がする。
0853名無しさん@お腹いっぱい。
2008/02/03(日) 11:55:26その説明だと、未定義の場合もアリのスクリプトが書けない。
変数を他から引き継ぐ場合、初期化するわけにもいかない。
定義済みかどうかの判定がどこかで必要になる。
で、定義済みかどうかの判定自体が set -u に引っかかるから、
>>849 が指摘してるように冗長な記述が必要になる。
そこまで代償を払って set -u する必要もなかろう。
0854名無しさん@お腹いっぱい。
2008/02/03(日) 12:09:06> 変数を他から引き継ぐ場合、初期化するわけにもいかない。
> で、定義済みかどうかの判定自体が set -u に引っかかるから、
未定義ならば代入という記法があるので問題ない。(何度も出ているが${parameter=word})
いい加減に負け認めて引っ込みなよ。見苦しい。
・>>810 位置パラメータを用いた別解をだす。
・>>811 ${1+"$@"}という記法に因縁つける。
・>>810 反論のついでに「お前のプログラムってバグだらけだろう。」と煽る。>>812
・>>811 必死の再反論を試みるが迎撃され、逃亡。
・>>811 噴飯物の社内標準を持ち出すも撃破される。
・>>811 ムキになって反論するも、無知をさらけ出す結果に陥る。 <=== 今ココ
0855名無しさん@お腹いっぱい。
2008/02/03(日) 12:10:30>未定義ならば代入という記法があるので問題ない。
だから、その記述が冗長といってるんじゃないかw
0856名無しさん@お腹いっぱい。
2008/02/03(日) 12:16:23全ての変数は初期化するといってるだろ。
これが冗長だというならperlでも冗長だからuse strictしてないんだろうな。
「お前のプログラムってバグだらけだろう。」 www
0857名無しさん@お腹いっぱい。
2008/02/03(日) 12:17:16つうわけでアンケート.
変数は使うときまで宣言しない派?最初に宣言しとく派?
0858名無しさん@お腹いっぱい。
2008/02/03(日) 12:20:39その場ですぐ使えるのがメリットだろ。
堅苦しく変数宣言必須にするならメリット半減だな。
0859名無しさん@お腹いっぱい。
2008/02/03(日) 12:21:080860名無しさん@お腹いっぱい。
2008/02/03(日) 12:28:27関数のローカル変数を設定する時ぐらいだな。
0861名無しさん@お腹いっぱい。
2008/02/03(日) 12:28:45それとも本文に set -u 入れてるの?
あまり見かけないけど
0862名無しさん@お腹いっぱい。
2008/02/03(日) 12:33:57キミのしょぼいスクリプトを基準に語られても困る。
0863名無しさん@お腹いっぱい。
2008/02/03(日) 12:36:43ずっと使っていくようなものも書ける
その幅の広さがシェルスクリプトのいいところじゃね?
0864名無しさん@お腹いっぱい。
2008/02/03(日) 13:47:22わからないから、なぜそう書くのか理解できない。
0865名無しさん@お腹いっぱい。
2008/02/03(日) 13:57:57なので、${1+"$@"}は位置パラメーター$1がセットされていると"$@"に展開される。
0866864
2008/02/03(日) 14:51:45ありがとう。manには:+しかなかったから別物だと思った。
見なおしたら"If the colon ( :) is omitted〜"って文があった。
www.cs.princeton.edu/~jlk/kornshell/doc/man88.html
0867名無しさん@お腹いっぱい。
2008/02/04(月) 21:43:38警告でないのはRedhat 4のashだけだ。FreeBSD 8も合わせてバグ報告しとけ。www
★SUSE LINUX Enterprise Server 9 (x86_64) p3
$ /bin/ash -cu 'echo "$@"'
/bin/ash: @: parameter not set
$ /bin/ksh -cu 'echo "$@"'
/bin/ksh: @: parameter not set
★Redhat 4 u5
$ /bin/ash -cu 'echo "$@"'
$ /bin/ksh -cu 'echo "$@"'
/bin/ksh: @: parameter not set
★Solaris10 8/07
$ /bin/sh -cu 'echo "$@"'
/bin/sh: @: parameter not set
$ /bin/ksh -cu 'echo "$@"'
/bin/ksh: @: parameter not set
$ /usr/xpg4/bin/sh -cu 'echo "$@"'
/usr/xpg4/bin/sh: @: parameter not set
★SFU(Service for UNIX) 3.5
$ /bin/sh -cu 'echo "$@"'
/bin/sh: @: parameter not set
$ /bin/ksh -cu 'echo "$@"'
/bin/ksh: @: parameter not set
0868名無しさん@お腹いっぱい。
2008/02/04(月) 21:46:31もはやこれは愛だな
0869名無しさん@お腹いっぱい。
2008/02/04(月) 22:03:43file1に入っている文字を、file2の中で検索し、あればエラーなしという
スクリプトを書きたいのですが、どなたかご教授願えないでしょうか?
file1には以下のような文字が200行程度、入っています。
aaa 12345678
bbb 12345678
ccc 12345678
file2には以下のような文字が300行程度入っております。
aaa 09876543
bbb 09876543
ccc 09876543
ddd 09876543
このfile1に入っている頭3文字の行全てを、file2の頭3文字にあるかないか、
といったスクリプトを書きたいのですが、シェルの基本程度しかしらず
悪戦苦闘をしております。なにとぞ、ご教授願いますよう、お願いします。
0870名無しさん@お腹いっぱい。
2008/02/04(月) 22:11:16kshじゃなくても、普通のshで書けるね。
↓
#!/bin/sh
while read key other
do
if grep -q $key file2; then
echo "$key は file2にある"
else
echo "$key は file2にない"
fi
done < file1
0871869
2008/02/04(月) 22:16:58さらに運悪くジョブ管理までやらされるはめに。
ご迷惑をおかけしますが、何卒よろしくお願いします
0872名無しさん@お腹いっぱい。
2008/02/04(月) 22:17:480873名無しさん@お腹いっぱい。
2008/02/04(月) 22:18:56だったら #!/bin/ksh って書けばいいだけだよ。
あと、grep -q $key は grep -q "^$key" の方がいいかな。
0874名無しさん@お腹いっぱい。
2008/02/04(月) 22:19:520876名無しさん@お腹いっぱい。
2008/02/04(月) 22:24:19こいつ、ネタか?
この場合、kshで書いても shと全く同じものになるんだよ。
それとも、何か最低限 ksh専用の文法を使わなけりゃいかんのかよ?
0877869
2008/02/04(月) 22:32:56丁寧に答えてくださり、まことに感謝しております。
>>876様
何分Kshの事を全然知らなくて…
Goto文が書けないやら、色々戸惑っている最中です。
もし何かまたわからない事がありましたら、ご質問させていただきます。
今回は本当にありがとうございました。
0878名無しさん@お腹いっぱい。
2008/02/04(月) 22:41:33偶然ですが、>>870 と同じようなスクリプトを書くために悪銭苦闘しています。
とりあえず /bin/shでではできたんですが、
今後はbashシェルで書けとの命令が上から下りまして…
>>870 をbashシェルで書くとどのようになりますでしょうか、ご教授ください。
なお、#!/bin/shを#!/bin/bashに変えただけでは却下され、
何か最低限bashシェル専用の文法を使わなければ上司が納得してくれません。
0879名無しさん@お腹いっぱい。
2008/02/04(月) 23:26:500880名無しさん@お腹いっぱい。
2008/02/04(月) 23:44:18なぜsh互換ではNGでbash専用でないとダメなのか
その上司を問いつめて、結果をこのスレに書き込んでみ?
0881名無しさん@お腹いっぱい。
2008/02/05(火) 00:49:390882名無しさん@お腹いっぱい。
2008/02/05(火) 02:11:40まず
ttp://search.luky.org/linux-users.9/msg06102.html
とか嫁
0883名無しさん@お腹いっぱい。
2008/02/05(火) 02:30:35test とか [ を [[ 記法にでも変えたら?
0884名無しさん@お腹いっぱい。
2008/02/05(火) 03:10:05うっう〜
0885名無しさん@お腹いっぱい。
2008/02/05(火) 07:15:24testも[もないんだが、>>870 には。
0886名無しさん@お腹いっぱい。
2008/02/05(火) 09:47:50こんなの趣味でも書かないけどな。w
#!/bin/bash
while read line
do
grep "${line:0:3}" file2 &> /dev/null
if $[ $? == 0 ] ; then
echo "$key は file2にある"
else
echo "$key は file2にない"
fi
done <<< "$( < file1 )"
0887名無しさん@お腹いっぱい。
2008/02/05(火) 09:49:48けど、こんなの使わないからいいか。w
0888名無しさん@お腹いっぱい。
2008/02/05(火) 10:19:410889名無しさん@お腹いっぱい。
2008/02/05(火) 10:33:290890名無しさん@お腹いっぱい。
2008/02/05(火) 10:56:19他の環境どころか、明日はもう動かなくていいやつとか。
0891名無しさん@お腹いっぱい。
2008/02/05(火) 12:31:070892名無しさん@お腹いっぱい。
2008/02/06(水) 13:18:18のようなものの-not -regex ".*#.*" -not -name "*~" -not -name "*svn*"の部分だけを再利用したいんですが
ignore_backup="-not -regex \".*#.*\" -not -name \"*~\" -not -name \"*svn*\""
のようにして
$ find $FOO $ignore_backup -name "*.el"
としてもうまくフィルタリングしてくれないようです
何が良い方法はありませんか?
0893名無しさん@お腹いっぱい。
2008/02/06(水) 13:33:030894名無しさん@お腹いっぱい。
2008/02/06(水) 14:01:270895名無しさん@お腹いっぱい。
2008/02/06(水) 14:10:12evalすると言う手でなんとかしました
zsh,bashでしか確認してませんがとりあえずこんな感じでいけました
この方針なら内部で他の変数を参照する予定の無い文字列はsingle quoteにした方がよさそうですね
# dot files
ignore_bkup='-type f -not -regex ".*#.*" -not -name "*~"'
eval "$find $HOME -maxdepth 1 $ignore_bkup -regex '.*\/\..*'"
0896名無しさん@お腹いっぱい。
2008/02/06(水) 14:19:360897名無しさん@お腹いっぱい。
2008/02/06(水) 19:47:26引数にlistという文字列がある場合には、lsコマンドを実行する
これを実行するにはどういう構文をつくればいいのでしょうか?
0898名無しさん@お腹いっぱい。
2008/02/06(水) 20:05:04for arg in "$@"
do
case $arg in
list)
ls;;
esac
done
0899名無しさん@お腹いっぱい。
2008/02/06(水) 20:22:09ありがとうございます
0900名無しさん@お腹いっぱい。
2008/02/06(水) 23:46:40$args → "$args"
0901名無しさん@お腹いっぱい。
2008/02/06(水) 23:47:18お前馬鹿だろ
0902名無しさん@お腹いっぱい。
2008/02/07(木) 00:30:09> 何か最低限bashシェル専用の文法を使わなければ上司が納得してくれません。
お前に必要なのは不要な文法ではなくて新しい職。
0903名無しさん@お腹いっぱい。
2008/02/07(木) 04:59:080904名無しさん@お腹いっぱい。
2008/02/07(木) 09:35:36$ echo .string | sed -e s/^\\\\.//
.string
(2)
$ AAA=.string
$ BBB=
$ BBB=`echo "$AAA" | sed -e s/^\\\\.//`
$ echo $BBB
string
(1)(2)で結果が違ってくるのですがこれはなぜでしょうか。
0905名無しさん@お腹いっぱい。
2008/02/07(木) 09:48:23を使っているから。
0906名無しさん@お腹いっぱい。
2008/02/07(木) 09:49:180907名無しさん@お腹いっぱい。
2008/02/07(木) 09:55:550908名無しさん@お腹いっぱい。
2008/02/09(土) 01:16:110909名無しさん@お腹いっぱい。
2008/02/11(月) 14:50:12unixのwc -lコマンドと同等のものを
perlやawkの一行野郎にしたいのですがうまくいきません
perl -ne 'while (<>) { print cnt}' file1
お願いします
0910名無しさん@お腹いっぱい。
2008/02/11(月) 14:55:300911名無しさん@お腹いっぱい。
2008/02/11(月) 14:58:34awk使いたいだけなら、
cat file1 | cat -n | tail -1 | awk '{print $1}'
でいいじゃん。
0912名無しさん@お腹いっぱい。
2008/02/11(月) 15:00:280913名無しさん@お腹いっぱい。
2008/02/11(月) 15:03:27cat file | cat -n
ってところかい?
それは最初のcatは、catじゃなくても他の部分から取れるようにしてるのだが。
0914名無しさん@お腹いっぱい。
2008/02/11(月) 15:03:40awk 'END{print NR}' file
0915名無しさん@お腹いっぱい。
2008/02/11(月) 15:04:54無駄ってのは、>>914 でできるのにわざと冗長な方法を書いていること。
0916名無しさん@お腹いっぱい。
2008/02/11(月) 15:05:560917名無しさん@お腹いっぱい。
2008/02/11(月) 15:08:23要求をはっきりしたまえ。
もっとも、↓これなら完璧だが。
perl -e 'exec "wc", "-l", @ARGV'
0918名無しさん@お腹いっぱい。
2008/02/11(月) 15:09:44みんなで考察してみようぜ。
まず、どこから急にcntが出て来たのか。
0919名無しさん@お腹いっぱい。
2008/02/11(月) 15:11:25>>911でいいじゃないか。
思い付いたようにシンプルに済ませるのがShellScriptでしょ。
0920名無しさん@お腹いっぱい。
2008/02/11(月) 15:12:23サーバ環境のコードに合わない文字コードのファイルだと
wcコマンド使えないので他に代用したいというのが背景です。
目的はファイルの行数を単にカウントするだけです。
0921名無しさん@お腹いっぱい。
2008/02/11(月) 15:18:320922名無しさん@お腹いっぱい。
2008/02/11(月) 15:28:57みなさんありがとうございました
0923名無しさん@お腹いっぱい。
2008/02/11(月) 16:58:29awkなら、>>914 が解として最善だが、wcの文字コードの問題なら、
LANG=C LC_ALL=C wc -l
としても解決できるはず。
0924名無しさん@お腹いっぱい。
2008/02/11(月) 17:11:58それは>>914もそうだが。
0925名無しさん@お腹いっぱい。
2008/02/11(月) 17:23:15そんな必要ない。最初の質問情報だけで最適解を出すのが良い。
それで求めているものと違っているなら質問者が再度質問してくるだけだから。
それより問題なのは、最適解を知らないくせに質問者に追加情報だけ出せという奴。
(で、たいてい追加情報が出てきても最適解を答えられないw)
0926名無しさん@お腹いっぱい。
2008/02/11(月) 17:41:27もし複数のファイルを対象にしたいとか>>914の解とは違ってたら、情報を小出
しにするなとか言い出すんだろうなw
まぁ、そんなことより追加情報が出る度に解を出して良くってのはものすごい
効率が悪いな。 最初に情報を聞き出してから普通は何かを作るだろ。
仕様が不十分なままにコード書き始めて、途中で仕様がひっくり返ったら全部
作り直しだろ。
0927名無しさん@お腹いっぱい。
2008/02/11(月) 17:41:00そのとおりだ
0928名無しさん@お腹いっぱい。
2008/02/11(月) 17:45:280929名無しさん@お腹いっぱい。
2008/02/11(月) 17:48:56適してるならまだしも、最適って。
別に>>911でも解としては間違ってないわけで、
なんでそんなに自分の解に自信を持ってるのかと。
0930名無しさん@お腹いっぱい。
2008/02/11(月) 17:54:51awkを使うなら、cat -nだけでなくtail -1の機能もawk側でできるから、
わざわざ多段パイプにするのが無駄。
逆に、cat -n|tail -1にするなら、最後までawkを使わずに処理するべき。(cutとかで)
0931911
2008/02/11(月) 17:55:43perl -e 'while(<>){} print "$.\n"' file1
行数数えるだけならこうかな。
最適っていうなら、「Perlやawk」でって言ってるんだから、Perlでの最適な答えも出して上げれば良いのに。
もちろん、上の解が最適だとは思わないけどね。
他にもやり方は色々あるし、毎行処理してる時点で最適ではないし。
(awk {END}もそうだけど。)
0932911
2008/02/11(月) 17:56:59awkを使って。 って書いてあるから、awkを使っただけなんだけど…。
awkはあんまり使わんから、とりあえずできればって思っただけなんだけど。
まぁ、自分はそんなに自信があって言ったわけじゃないからねスマンね。
0933名無しさん@お腹いっぱい。
2008/02/11(月) 18:04:11>>914 最適な解を望む。 最適な解だぞ。
0934名無しさん@お腹いっぱい。
2008/02/11(月) 18:07:05だから、awkを使ってっていってるのに、
なんで awk側でできる cat -n や tail -1 相当の処理を
awk側でやらないのかってこと。
>>930 の最後の行で言ってる、「最後までawkを使わずに処理するべき」ってのは、
「cat -n | tail -1」を使う以上は、ってこと。
で、それだと「awkを使う」という質問に適合しないから、
>>911 は解にならないと言いたいわけ。
0935名無しさん@お腹いっぱい。
2008/02/11(月) 18:08:05かな。
0936名無しさん@お腹いっぱい。
2008/02/11(月) 18:09:37それだとお前の最適って言う言葉も最適ではないから解ではないな。
0937名無しさん@お腹いっぱい。
2008/02/11(月) 18:14:55で、>>920 で言ってるように、本当は wc -l を使いたかったけど、
それだと日本語環境で文字コードが解釈されてエラーになるのが問題なんだから、
>>923 が言うように、
LANG=C LC_ALL=C wc -l
が最適解だね。
0938名無しさん@お腹いっぱい。
2008/02/11(月) 18:18:5589232
real 0m0.359s
user 0m0.327s
sys 0m0.011s
tmp]$ time perl -e 'while(<>){} print "$.\n"' tmp
89232
real 0m0.273s
user 0m0.236s
sys 0m0.010s
tmp]$ time awk 'END{print NR}' tmp
89232
real 0m0.150s
user 0m0.126s
sys 0m0.009s
tmp]$ perlcc -B tmp.pl; time ./a.out tmp
89232
real 0m0.286s
user 0m0.263s
sys 0m0.000s
やっぱりawkが早いな。
0939名無しさん@お腹いっぱい。
2008/02/11(月) 18:19:55awk, Perlを使っての解がしりたかったみたいだから、wcは最適じゃないな。
0940938
2008/02/11(月) 18:20:420941名無しさん@お腹いっぱい。
2008/02/11(月) 18:30:05>>920 欲嫁。質問者はwc使いたかったけど使えなかったから仕方なくawkまたはperlで
ということだから、>>923 のwcが最適だね。
0942名無しさん@お腹いっぱい。
2008/02/11(月) 18:35:26勝手に想像するのは良くないよ。
>>924欲嫁
0943名無しさん@お腹いっぱい。
2008/02/11(月) 18:37:51> コントロールコードが入ってたりしてwcが使えないのが原因だったらどうするの?
そんなのありえるの? 具体的には?
0944名無しさん@お腹いっぱい。
2008/02/11(月) 18:38:27コントロールコードが入っていても LANG=C なら wcは無問題。
実際に試してから言おうね。
0945名無しさん@お腹いっぱい。
2008/02/11(月) 18:41:01全てのコントロールコードで試したの?
そのファイルをくれないかな。
0946名無しさん@お腹いっぱい。
2008/02/11(月) 18:44:45墓穴ほってるよww
そんなの、たとえば
dd if=/dev/random bs=1024k count=1 | LANG=C wc -l
で検証できる。ファイル用意する必要なし。
0947名無しさん@お腹いっぱい。
2008/02/11(月) 18:47:290948945
2008/02/11(月) 18:47:55君が、
> 実際に試してから言おうね。
って言ったんじゃないの?
randomで出したところで、全てのコントロールコードは試してないよね。
実際に試してないのに言っちゃったの?
0950名無しさん@お腹いっぱい。
2008/02/11(月) 18:51:270951名無しさん@お腹いっぱい。
2008/02/11(月) 18:52:24コントロールコードって、全部で32個(DELも入れると33個か?)だけって知ってる?
0952945
2008/02/11(月) 18:52:59tmp]$ cat tmp_r | LANG=C wc -l
0
tmp]$ cat tmp_r | perl -e 'while(<>){} print "$.\n"'
1
tmp]$ cat tmp_r | awk 'END{print NR}'
1
tmp]$ cat tmp_r | perl -lne 'END{print$.}'
1
ものすごい影響されてるが…。
0953名無しさん@お腹いっぱい。
2008/02/11(月) 18:53:370954名無しさん@お腹いっぱい。
2008/02/11(月) 18:55:43ワロタwwwwww
>>951は自分の発言すら試してなかったのか?w
それともたまたまうまくいっただけか
0955名無しさん@お腹いっぱい。
2008/02/11(月) 19:00:40/dev/randomじゃなくて /dev/urandomでやるべき。
/dev/randomを ddで吸い出すと、十分なエントロピーがなくて
ほとんどがゼロで埋まってるものと思われ。
それとは別に、wc -lでは、最後の改行がない行を数えないが、
awk 'END{print NR}'では数えるから、行数が1ずれる。
その点は、>>945 が最初指摘していたコントロールコードの問題とは違うので、
勘違いしないように。
0956名無しさん@お腹いっぱい。
2008/02/11(月) 19:04:10だいたい、1MBも乱数で取ったのに '\n' が1つしかない時点で
その実験自体がおかしいことに気づけww 乱数になってない。
0957名無しさん@お腹いっぱい。
2008/02/11(月) 19:06:040958名無しさん@お腹いっぱい。
2008/02/11(月) 19:06:49しかもファイルがおかしいにしても、今回はwcが扱えないことはわかったでしょ。
0959名無しさん@お腹いっぱい。
2008/02/11(月) 19:06:53ということなら、この場合やはり LANG=C wc -l の計数表示が正しいということになる。
awk 'END{print NR}' では、最後の不完全な行までカウントしてしまう。
そういう意味で、やはり LANG=C wc -l が最適ということになるな。
0960名無しさん@お腹いっぱい。
2008/02/11(月) 19:09:54$ echo -n a > file
$ LANG=C wc -l < file
0
$ awk 'END{print NR}' < file
1
ということだ。LANG=C wc -l の方が正しいな。
0961名無しさん@お腹いっぱい。
2008/02/11(月) 19:10:33最適とか言ってたのに残念。
0962名無しさん@お腹いっぱい。
2008/02/11(月) 19:12:19違うだろ
改行がある限り2行
0963名無しさん@お腹いっぱい。
2008/02/11(月) 19:13:10>>914 は wcを使わないという時点では最適だろ。
で、あとでwcを使わなかった理由が質問者から示されたから、
それならLANG=Cでということで、wcが最適になっただけのこと。
0964名無しさん@お腹いっぱい。
2008/02/11(月) 19:13:51wcのmanではああなっているから
0965名無しさん@お腹いっぱい。
2008/02/11(月) 19:14:30次々に新しい解を出すのが>>914の言う最適な解なんだから。
0966名無しさん@お腹いっぱい。
2008/02/11(月) 19:15:260967名無しさん@お腹いっぱい。
2008/02/11(月) 19:15:500968名無しさん@お腹いっぱい。
2008/02/11(月) 19:16:200969名無しさん@お腹いっぱい。
2008/02/11(月) 19:18:130970名無しさん@お腹いっぱい。
2008/02/11(月) 19:19:330971名無しさん@お腹いっぱい。
2008/02/11(月) 19:25:06http://pc11.2ch.net/test/read.cgi/unix/1202725267/
0972名無しさん@お腹いっぱい。
2008/02/11(月) 20:25:210973名無しさん@お腹いっぱい。
2008/02/11(月) 21:55:140974名無しさん@お腹いっぱい。
2008/02/11(月) 22:31:36シェルならシェルだけでやれ。
0975名無しさん@お腹いっぱい。
2008/02/11(月) 22:52:08↓
n=0; while read dummy; do ((n++)); done < file ; echo $n
0976名無しさん@お腹いっぱい。
2008/02/11(月) 23:06:41bash依存。失格。
0977名無しさん@お腹いっぱい。
2008/02/11(月) 23:33:04シェルだけということで、exprすら使わないようにしたよ
set --; while read dummy; do set "$@" a; done < file ; echo $#
0978名無しさん@お腹いっぱい。
2008/02/11(月) 23:46:18set -- はシェル実装依存。shift $# の方が確実だな。
0979名無しさん@お腹いっぱい。
2008/02/12(火) 00:10:10だけでできるようにしてくれや。
0980名無しさん@お腹いっぱい。
2008/02/12(火) 01:22:430981名無しさん@お腹いっぱい。
2008/02/12(火) 07:24:15>>977 は /bin/shだけでできる。
0982名無しさん@お腹いっぱい。
2008/02/12(火) 07:46:070983名無しさん@お腹いっぱい。
2008/02/12(火) 21:26:24にaという文字を追加。
最後に位置パラメータの「個数」(=aを追加した回数=行数)を表示。
0984名無しさん@お腹いっぱい。
2008/02/12(火) 21:50:09行末に \ がある行があると計数ミスするなぁ
0985名無しさん@お腹いっぱい。
2008/02/13(水) 16:33:50wc -l とか wc -c だと、そもそも単語に分ける必要ないから文字コードも見ないし、
LANG=C にする必要ないぞ。
wc -l オプション付けてるのに LANG=C が必要なのって、どこの wcコマンド?
0986名無しさん@お腹いっぱい。
2008/02/14(木) 22:16:07それ、1万行とか10万行とかあってもちゃんと動作するんだろうか?
というか、$#の上限ってどこかで決まってるんだろうか?
0987名無しさん@お腹いっぱい。
2008/02/14(木) 22:25:480988名無しさん@お腹いっぱい。
2008/02/14(木) 22:32:480989名無しさん@お腹いっぱい。
2008/02/15(金) 02:42:560990名無しさん@お腹いっぱい。
2008/02/15(金) 07:27:00だからぁ、ボーンでは ${10} は使えないんだよ。
0991名無しさん@お腹いっぱい。
2008/02/15(金) 08:19:41$ /bin/sh
$ uname -sr
SunOS 5.10
$ echo ${10}
bad substitution
知らないくせに余計な突っ込みするなよw
0992名無しさん@お腹いっぱい。
2008/02/15(金) 08:31:150993名無しさん@お腹いっぱい。
2008/02/15(金) 08:44:590994名無しさん@お腹いっぱい。
2008/02/15(金) 22:14:21while :; do
set -- "${@}" a
echo $#
done
の出力が15000越えるところまでは見た。
これ以上元祖に近いシェルは手元にないので勘弁。
別に$10とかに直接アクセスできる必要はないんだよな。
0995名無しさん@お腹いっぱい。
2008/02/15(金) 22:39:28俺は極端には$1とshiftだけでもやっていけるな
0996名無しさん@お腹いっぱい。
2008/02/15(金) 23:04:11set を配列代わりに使う用法では、${10}以上の要素に直接アクセスできないとな。
でも、結局Bourneでは使えない方法だから用途は限られる。
0997名無しさん@お腹いっぱい。
2008/02/15(金) 23:15:510998名無しさん@お腹いっぱい。
2008/02/16(土) 01:42:35$ (IFS='
> '; IFS= set -- `cat foo`; echo $#)
どんな状況でも機能するのかはちょっとあれだが・・・
0999名無しさん@お腹いっぱい。
2008/02/16(土) 06:58:041000小倉優子 ◆YUKOH0W58Q
2008/02/16(土) 06:58:3810011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。