シェルスクリプト総合 その13
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001名無しさん@お腹いっぱい。
2008/10/16(木) 00:48:38スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。
前スレ
シェルスクリプト総合 その12
http://pc11.2ch.net/test/read.cgi/unix/1218277263/
0002名無しさん@お腹いっぱい。
2008/10/16(木) 00:54:18シェルスクリプト総合 その12
http://pc11.2ch.net/test/read.cgi/unix/1218277263/
シェルスクリプト総合 その11
http://pc11.2ch.net/test/read.cgi/unix/1211284684/
シェルスクリプト総合 その10
http://pc11.2ch.net/test/read.cgi/unix/1202725267/
シェルスクリプト総合 その9
http://pc11.2ch.net/test/read.cgi/unix/1187130302/
シェルスクリプト総合 その8
http://pc11.2ch.net/test/read.cgi/unix/1171517324/
シェルスクリプト総合 その7
http://pc11.2ch.net/test/read.cgi/unix/1157601611/
シェルスクリプト総合 その6
http://pc11.2ch.net/test/read.cgi/unix/1143302182/
シェルスクリプト総合 その5
http://pc11.2ch.net/test/read.cgi/unix/1137801629/
シェルスクリプト総合 その4
http://pc11.2ch.net/test/read.cgi/unix/1131026501/
シェルスクリプト総合 その3
http://pc11.2ch.net/test/read.cgi/unix/1124889646/
シェルスクリプト総合 その2
http://pc11.2ch.net/test/read.cgi/unix/1113664637/
シェルスクリプト総合 その1
http://pc11.2ch.net/test/read.cgi/unix/1101820646/
0003名無しさん@お腹いっぱい。
2008/10/16(木) 00:56:27sed
http://pc11.2ch.net/test/read.cgi/unix/1085730992/
正規表現
http://pc11.2ch.net/test/read.cgi/unix/1039165754/
おまえら! shell は何を使っているんですか?
http://pc11.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc11.2ch.net/test/read.cgi/unix/1102921590/
0004/bin/sh
2008/10/16(木) 00:58:360005名無しさん@お腹いっぱい。
2008/10/16(木) 01:01:30「誰にでも」シリーズ
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/
0006名無しさん@お腹いっぱい。
2008/10/16(木) 01:02:52UNIXの部屋 (沢山のコマンドの簡単な紹介など)
http://x68000.q-e-d.net/~68user/unix/
POSIX: Shell & Utilities (標準規格)
http://www.opengroup.org/onlinepubs/009695399/utilities/contents.html
□最近のシェルスクリプト本(1)
(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/
0007名無しさん@お腹いっぱい。
2008/10/16(木) 01:03:42(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/
(2007/9) ゲームで極める シェルスクリプトスーパーテクニック 山森 丈範
http://www.amazon.co.jp/o/ASIN/4774132020/
(2007/10) UNIX/Linuxシェルスクリプトマスタリングハンドブック 野川 准子
http://www.amazon.co.jp/o/ASIN/4798017957/
0008名無しさん@お腹いっぱい。
2008/10/16(木) 01:06:02FreeBSD 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/
0009名無しさん@お腹いっぱい。
2008/10/16(木) 01:06:58・このスレはシェルスクリプトについてのスレです。
シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
使い方の質問などはスレ違いなので無用に願います。
□シェルスクリプトでよく使うコマンド:
制御・条件判定系: [,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
0010名無しさん@お腹いっぱい。
2008/10/16(木) 04:18:200011名無しさん@お腹いっぱい。
2008/10/16(木) 07:06:51(スペースなどを含むファイル名を正しく処理するため、
findは -exec command {} + を推奨。
他に -print0、xargsは -0オプションという方法もあるがSolaris非対応)
0012名無しさん@お腹いっぱい。
2008/10/16(木) 09:35:20追加
FreeBSDユーザは/bin/shの正体がashなので注意。
v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/
http://heirloom.sourceforge.net/sh.html
0013名無しさん@お腹いっぱい。
2008/10/16(木) 10:49:58に改名したらどうだ。スレタイ。
0014名無しさん@お腹いっぱい。
2008/10/17(金) 00:29:51echo 乙 > /dev/null
0015名無しさん@お腹いっぱい。
2008/10/17(金) 00:44:250016名無しさん@お腹いっぱい。
2008/10/17(金) 00:49:170017名無しさん@お腹いっぱい。
2008/10/17(金) 00:52:090018名無しさん@お腹いっぱい。
2008/10/17(金) 10:20:48SCO OpenServer
0019名無しさん@お腹いっぱい。
2008/10/18(土) 01:55:15grep -v でも引数の文字列が存在すれば0、存在しなければ1に見えます。
でも
ps -ef | grep hoge | grep -v grep
のときプロセスhogeが存在すれば、0存在しなければ1を返すのはなぜでしょう?
そのリターンを返してるはずの最後の grep -v grep ではは毎回
文字列"grep"がひっかかってると思うんですけど・・・
0020名無しさん@お腹いっぱい。
2008/10/18(土) 02:11:441 # grep以外の行はないよ
$ (echo grep; echo foo) | grep -v grep; echo $?
foo
0 # grep以外の行があったよ
要するに-vの時に「ヒットする」のは"grep"にマッチ「しない」行。
0021名無しさん@お腹いっぱい。
2008/10/18(土) 08:58:28関係ない文字列にマッチする可能性とかがあるから。
pgrep使え。
0022名無しさん@お腹いっぱい。
2008/10/18(土) 10:01:59理解しました!
0023名無しさん@お腹いっぱい。
2008/10/18(土) 10:11:28>>21 は理解しないのかよw
0024名無しさん@お腹いっぱい。
2008/10/18(土) 10:29:35>>19の頭に「grep の戻り値で疑問なんすけど」と書いてある。
>>21は知識をひけらかしたくてしょうがない中二病。
0025名無しさん@お腹いっぱい。
2008/10/18(土) 10:33:36それは手段であって、目的ではないことはエスパーすればわかる。
前スレで、command1 | command2 とやった時、
command2の終了ステータスのみが反映されますよね? と聞いてた人と
同一人物だということも、エスパーすればわかる。
0026名無しさん@お腹いっぱい。
2008/10/18(土) 10:35:030027名無しさん@お腹いっぱい。
2008/10/18(土) 10:35:340028名無しさん@お腹いっぱい。
2008/10/18(土) 10:45:180029名無しさん@お腹いっぱい。
2008/10/18(土) 10:59:50ls -l とかもね。
0030名無しさん@お腹いっぱい。
2008/10/18(土) 11:08:580031名無しさん@お腹いっぱい。
2008/10/18(土) 11:11:490032名無しさん@お腹いっぱい。
2008/10/18(土) 11:59:18どっちかというと扱いやすい方。
0033名無しさん@お腹いっぱい。
2008/10/18(土) 13:17:070034名無しさん@お腹いっぱい。
2008/10/18(土) 13:25:53これはあたまいいっすね
0035名無しさん@お腹いっぱい。
2008/10/18(土) 13:27:47アフォか。vi hogeとかに引っかかる。
0036名無しさん@お腹いっぱい。
2008/10/19(日) 08:06:41pgrepが無い環境は私の周りにはほとんど無いから、pgrep使ってるよ。
0037名無しさん@お腹いっぱい。
2008/10/20(月) 21:13:59デリミタを : に変更して対処する方法がありますでしょうか。
sed ':/usr/local/hoge:d' hoge.txt のように処理したいのですが、
デリミタの変更は s や y の無い構文では変更できなくて苦悩中です。
sed 's:dummy:dummy:; :/home/hoge.txt:d' hoge とやれば処理可能です。
やりたい事は、sed 's:/usr/local/hoge::' で文字列を削除しても
改行が残ってしまうので、改行まで削除したいと思っています。
何か良案ありませんでしょうか。
0038名無しさん@お腹いっぱい。
2008/10/20(月) 21:21:37他なら知らん。
0039名無しさん@お腹いっぱい。
2008/10/20(月) 21:23:52POSIXにもある
0040名無しさん@お腹いっぱい。
2008/10/20(月) 21:29:44ファイルタイプ dとかfとかlとか出せないですかね?
0041名無しさん@お腹いっぱい。
2008/10/20(月) 21:34:170042名無しさん@お腹いっぱい。
2008/10/20(月) 21:49:26-type f -exec echo f {} \; -or \
(省略)
っていう糞みたいな案が思いついた
0043名無しさん@お腹いっぱい。
2008/10/20(月) 21:52:40名前,ユーザ,タイムスタンプ,権限,リンクならリンク先,ディレクトリとかファイルとかリンクとかの種類
みたいな感じのCSVを出力したいわけですよ
しかしファイルタイプの取り方が分からず
あとリンク切れだったら教えて欲しいですね
0044名無しさん@お腹いっぱい。
2008/10/20(月) 21:54:43GNU findなら、
find /dir -printf '%y %f?n'
0045名無しさん@お腹いっぱい。
2008/10/20(月) 22:26:05man に記載がありましたか。失礼しました...
>>39
ありがとうございます。
試してみます。
0046名無しさん@お腹いっぱい。
2008/10/20(月) 22:26:59/ /.; ; . | .; ヘ ;`i
/ .; ,; . .; | .; .; .; i
ヽ._/ . .; .; .; | .; ヾ_/ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
i´ . ; | .; .; `i |
`x ,. _ヽ | /----x'=-+ | 純正 find でヨロ
| 6〉,/ 。i._|_|/。 `ヽ,| #l) |
└-ヽ;ー‐'__└---===-┘ <
c==<< ̄ ̄ ̄ ̄>>.===o゛ \_________
/ ヾ二二//ゝ、 ___, ----―
 ̄i⌒/´ ヾ  ̄ ̄/ `i⌒ヽー、 ̄ ̄| | |
ヽ ゝー─---、_/---─ノ ノ | | | _ -‐
0047名無しさん@お腹いっぱい。
2008/10/20(月) 22:39:14あたりで、出力をsedかawkで加工。
0048名無しさん@お腹いっぱい。
2008/10/20(月) 22:48:43-exec ls -dl {} \; -exec ls -dlL {} \; して、
比較とか含めてawkあたりで加工するしかなさそうね
0049名無しさん@お腹いっぱい。
2008/10/20(月) 23:15:170050名無しさん@お腹いっぱい。
2008/10/20(月) 23:31:41今は手元のLinuxのGNU findでしか試せてないんですが、
>>44の%yでf,d,lとかが取れるのはありがたいですね
実際に動かしたいのはsolaris(詳細は忘れた)も混ざってるので、使えないのかもしれませんが。
使えなかったら>>42>>47>>48を参考に-exec ls加工でやりたいと思います。
ちなみにリンク切れというのはGNU findでも検知できないんでしょうか?
0051名無しさん@お腹いっぱい。
2008/10/21(火) 07:48:01あと「検知」した後どうしたいのか書いた方がいい。
0052名無しさん@お腹いっぱい。
2008/10/21(火) 10:20:21bbb.example.com
aaa.example.com
example.com
example.co.jp
↓
example.com
aaa.example.com
bbb.example.com
example.co.jp
のようなことは出来ますか?
ピリオドを区切り文字にして、右側のフィールドから順に評価してくれればイイのですが。
0053名無しさん@お腹いっぱい。
2008/10/21(火) 10:31:35Perl か何かで書いちゃえば?
http://d.hatena.ne.jp/peanutsjamjam/20080108
0054名無しさん@お腹いっぱい。
2008/10/21(火) 11:41:03> http://d.hatena.ne.jp/peanutsjamjam/20080108
ここの例だと、ハイフンがあると破綻するな。
0055名無しさん@お腹いっぱい。
2008/10/21(火) 21:43:35awk -F. '{ for (i=NF; i>0 ; i--) { printf("%s ", $i) }; print("") }' | sort | awk '{ for (i=NF; i>0 ; i--) { printf("%s.", $i) }; print("") }' | sed 's/\.$//'
0056名無しさん@お腹いっぱい。
2008/10/21(火) 22:04:400057名無しさん@お腹いっぱい。
2008/10/22(水) 11:02:44005852
2008/10/22(水) 11:13:00sortコマンドだけでは無理っぽいので、>>55さんの方法でやることにします。
"sort --sort=domainname"とか出来ればイイのですが。
>>56
> sort -i にした方がたぶん目的にはかなってるとおも
???GNUのsortだと -i は印刷不可能な文字を無視するだけのようです。
0059名無しさん@お腹いっぱい。
2008/10/22(水) 13:16:57006055
2008/10/23(木) 12:03:26> "sort --sort=domainname"とか出来ればイイのですが。
コマンドを組み合わせてやっつけるのがシェルスクリプトの妙味ですので。
特殊な処理をコマンドに埋め込み始めるときりがないので。
0061名無しさん@お腹いっぱい。
2008/10/23(木) 12:29:040062名無しさん@お腹いっぱい。
2008/10/23(木) 12:41:48スレタイ読めよ
0063名無しさん@お腹いっぱい。
2008/10/23(木) 13:22:170064名無しさん@お腹いっぱい。
2008/10/23(木) 13:38:55sortの行指向をうまく利用しているからかなり簡潔になってるよ。
0065名無しさん@お腹いっぱい。
2008/10/23(木) 14:45:30import sys
def sort_key(line):
L = line.split('.')
L.reverse()
return L
for line in sorted(sys.stdin, key=sort_key):
sys.stdout.write(line)
0066名無しさん@お腹いっぱい。
2008/10/23(木) 15:17:580067名無しさん@お腹いっぱい。
2008/10/23(木) 16:45:590068名無しさん@お腹いっぱい。
2008/10/23(木) 17:01:13> L = line.split('.')
< L = line.lower().split('.')
0069名無しさん@お腹いっぱい。
2008/10/23(木) 17:06:27> 〜 x.split(〜
< 〜 x.downcase.split(〜
以上スレ違い話終了
0070名無しさん@お腹いっぱい。
2008/10/24(金) 02:17:580071名無しさん@お腹いっぱい。
2008/10/24(金) 02:39:340072名無しさん@お腹いっぱい。
2008/10/24(金) 08:46:37比較時に数値化(rubyなら to_iとか)
0073名無しさん@お腹いっぱい。
2008/10/25(土) 01:06:59[e.gsub(/\d+/, '#'), e.scan(/\d+/).map {|e| e.to_i}]
}
メンドクサ
0074名無しさん@お腹いっぱい。
2008/10/25(土) 01:20:420075名無しさん@お腹いっぱい。
2008/10/25(土) 09:18:57pieces = re.split(r'(\d+)', s)
pieces[1::2] = map(int, pieces[1::2])
return pieces
ary.sort(key=embedded_numbers)
0076名無しさん@お腹いっぱい。
2008/10/25(土) 21:56:24最後の文字を変数 LAST_LETTER に,残りの文字列を FIRST_LETTERS に代入するように
してもらえるとありがたいです。
0077名無しさん@お腹いっぱい。
2008/10/25(土) 22:03:53expr "$s" : "\(.*\)."
expr "$s" : ".*\(.\)"
0078名無しさん@お腹いっぱい。
2008/10/25(土) 22:12:09方法は2つ
1。正規表現
2。文字列の長さを測って、1引いた長さと、その場所から1文字をとる
0079名無しさん@お腹いっぱい。
2008/10/25(土) 22:20:34惜しいね。そこまでわかってても、最後に LAST_LETTER FIRST_LETTERS に
代入するのができてないから、満点あげられないね。
>>78
77に具体的な答が(不完全だけど)出てるのに何言ってんだか。
具体的な答がないので点はあげられないね。
0080名無しさん@お腹いっぱい。
2008/10/25(土) 22:29:44FIRST_LETTERS=${S:0:${#S}-1}
LAST_LETTER=${S:${#S}-1}
0081名無しさん@お腹いっぱい。
2008/10/25(土) 22:34:53bash依存
0082名無しさん@お腹いっぱい。
2008/10/25(土) 22:38:38FIRST_LETTERS=${STRING%?}
LAST_LETTER=${STRING#"$FIRST_LETTERS"}
echo "$FIRST_LETTERS"
echo "$LAST_LETTER"
0083名無しさん@お腹いっぱい。
2008/10/25(土) 22:50:35>>82 は、正規表現も使っていないし、文字列の長さも測っていない。
よって、方法は3つ(以上)あることになる。
0084名無しさん@お腹いっぱい。
2008/10/25(土) 22:52:580086名無しさん@お腹いっぱい。
2008/10/26(日) 00:14:49正直、ここらの文字列操作はどれがbash拡張なのかどうか、
/bin/shがbashな環境にいると判別できないな。
0087名無しさん@お腹いっぱい。
2008/10/26(日) 00:56:43http://detail.chiebukuro.yahoo.co.jp/qa/question_detail.php?qid=1220150877
506 :目のつけ所が名無しさん:2008/10/26(日) 00:47:20
大手ECサイトで、ここまで派手なリリース失敗は初めて見た。
エンジニア向けIT情報誌や関連サイトは、ぜひ取材して原因を明かして欲し
いは。
0088名無しさん@お腹いっぱい。
2008/10/26(日) 08:36:19UNIXで/bin/shがbashな環境なんてあるの?
あ、opensolarisとか??
0089名無しさん@お腹いっぱい。
2008/10/26(日) 09:00:58MacOS X
0090名無しさん@お腹いっぱい。
2008/10/26(日) 11:02:55LinuxはUNIXじゃないという煽りなんですね お疲れ様です
0091名無しさん@お腹いっぱい。
2008/10/26(日) 12:57:35LinuxをUNIXにしたらLinuxが嫌なんじゃない?
UNIXじゃ無いのがアレの誇りなんじゃないの?
0092名無しさん@お腹いっぱい。
2008/10/26(日) 12:58:13linuxというくくりでは/bin/shが何なのかは明確じゃないからな。
0093名無しさん@お腹いっぱい。
2008/10/26(日) 13:45:380094名無しさん@お腹いっぱい。
2008/10/26(日) 14:30:56なぜ?
LinuxやFreeBSDと違って、れっきとしたUNIXだよ。
0095名無しさん@お腹いっぱい。
2008/10/26(日) 14:43:570096名無しさん@お腹いっぱい。
2008/10/26(日) 21:27:04あったと思うけど、
zshで、setopt shwordsplit してる環境だと、
${1+"$@"} ではスペースが不本意に解釈されてしまって、引数がそのまま引き継げない。
やはり、単純明快に "$@" と書いた方が良いという結論。
$ zsh
zsh$ setopt shwordsplit
zsh$ set 'hoge boke'
zsh$ for i in ${1+"$@"}; do echo "$i"; done
hoge ← 2つに分かれてしまう
boke ← 2つに分かれてしまう
zsh$ for i in "$@"; do echo "$i"; done
hoge boke ← 正常
0097名無しさん@お腹いっぱい。
2008/10/26(日) 21:35:29> zshで、setopt shwordsplit してる環境だと、
当たり前やんw
すげえピンぼけ
0098名無しさん@お腹いっぱい。
2008/10/26(日) 21:43:22なんで当たり前?
zsh以外では setopt shwordsplit状態がデフォだよ。
それで、${1+"$@"} は "$@"と同様に動作する。
で、${1+"$@"} が、word split されるのは zshのバグと言える。
0099名無しさん@お腹いっぱい。
2008/10/26(日) 22:50:20-name のかっこいい正規表現でいけないですか?
0100名無しさん@お腹いっぱい。
2008/10/26(日) 22:52:41findの -name は正規表現ではありません。はい次
0101名無しさん@お腹いっぱい。
2008/10/26(日) 22:54:30-regex '[^0-9]*'
0102名無しさん@お腹いっぱい。
2008/10/26(日) 22:59:07-regex '.*/[^0-9]*'
0103名無しさん@お腹いっぱい。
2008/10/26(日) 23:18:570104名無しさん@お腹いっぱい。
2008/10/26(日) 23:25:04-regex を使うなら、フルパスでしか指定できない。そういう仕様。
0105名無しさん@お腹いっぱい。
2008/10/26(日) 23:27:37-regex '.*/[^/0-9]*$'
0106名無しさん@お腹いっぱい。
2008/10/26(日) 23:28:22というか>>102でファイル名だけになってますね
ありがとうございました
0107名無しさん@お腹いっぱい。
2008/10/27(月) 10:30:47試したみたがそうはならんな。
まあzshスレの話題のような気もするが。
ちなみにv7 shもheirloom sh(OpenSolaris)も${1+"$@"}と書く必要がある。
(だから必ずそう書けといっているわけではない; 知っておいた方がいいというだけ)
0108名無しさん@お腹いっぱい。
2008/10/27(月) 10:34:17zshのバージョンは? 4.x または 5.x で症状が出る。
あと、ちゃんと setopt shwordsplit を設定したか?
0109名無しさん@お腹いっぱい。
2008/10/27(月) 11:20:10setopt shwordsplit
set 'hoge boke'
for i in ${1+"$@"}; do echo "$i"; done
for i in "$@"; do echo "$i"; done
$ zsh /tmp/foo
hoge boke
hoge boke
$ zsh --version
zsh 4.3.4 (i686-pc-linux-gnu)
zsh-newuser-installをquitしたので設定は何もない。
0110名無しさん@お腹いっぱい。
2008/10/27(月) 11:42:08zsh 4.2 だと >>96 の指摘通りになる。
zsh 4.3 だとバグフィックスされた?
0111109
2008/10/27(月) 11:55:03set 'hoge baka' ahoでも。
0112名無しさん@お腹いっぱい。
2008/10/27(月) 12:09:18だから、zsh-4.2 で試せと。
zsh-4.2 ならまだそう古いバージョンじゃないし、まだ使われてるし、
汎用性考えると "$@" と書くべきだな。
0113名無しさん@お腹いっぱい。
2008/10/28(火) 22:37:42ファイル名が、
年月日.種類.年日.場所.更新日時.拡張子
となっているファイルを扱っています。
年月日および年日(対応してます)は全部でおよそ400、場所は200〜300あり、
5種類分あるので、各種類約10万ファイル、全部で50万ファイルくらいあります。
この中から、年月日.種類.年日.場所.*.拡張子だけ同じで、
更新日時が違う複数のファイルを見つけ出し、古いファイルを消さねばなりません。
例を示すと
./2001.08.29/MOD15A2.A2001241.h15v03.005.2007052031007.hdf
./2001.09.06/MOD15A2.A2001249.h15v03.005.2007054111501.hdf
./2001.09.06/MOD15A2.A2001249.h15v03.005.2008278130254.hdf
./2001.09.14/MOD15A2.A2001257.h15v03.005.2007056161438.hdf
こんな感じです。この場合、2番目のファイルだけを消したいです。
ファイル名が完全一致の重複ではないだけに、どうしていいかわかりません。
できればお教えください。
ちなみにディレクトリ構造は、種類-年月日-ファイル、となっています。
0114名無しさん@お腹いっぱい。
2008/10/28(火) 23:01:29Perlあたりで書いた方がよくない?
0115名無しさん@お腹いっぱい。
2008/10/28(火) 23:09:18ヒントだけ。
全ファイルのリストをファイルに落す。(1行1ファイル名)
(ファイル作りたくなければパイプでも桶)
そのファイル(パイプ)を入力として、
対象フィールド限定で(更新日時フィールド以外で) uniq -d で重複行を出す。
その重複行それぞれについて、更新日時フィールドをワイルドカードにして
ファイル名リストをとる。この時、更新日時フィールドは結局辞書順に
並んでいるから、最後の行以外のファイルは古いファイルと判定できるから、
最後の行以外のファイルを rmする。
以上を、uniq -dが出力した各行について行なう。
0116名無しさん@お腹いっぱい。
2008/10/29(水) 01:48:52ありがとうございます!
考えてやってみます。
0117名無しさん@お腹いっぱい。
2008/10/29(水) 03:16:42readlink(1)がSUSv3に見当たらなくて驚いています
0118名無しさん@お腹いっぱい。
2008/10/29(水) 08:26:480119名無しさん@お腹いっぱい。
2008/10/29(水) 10:27:19ファイル名の桁が揃っていると仮定する。
sort -r d.txt | awk '{ k=substr($0, 0, 40); ++a[k]; print a[k], $0; }' | awk '$1 != 1 { print $2; }'
0120名無しさん@お腹いっぱい。
2008/10/29(水) 11:01:42perl -le 'print readlink($ARGV[0])' /hoge/file
0121名無しさん@お腹いっぱい。
2008/11/02(日) 19:35:13sh hoge.sh
と打ち込んでいるのですが、これを
hoge.sh
と、ファイル名だけで実行できるようにするにはどうすればよいでしょうか?
0122名無しさん@お腹いっぱい。
2008/11/02(日) 19:54:110123名無しさん@お腹いっぱい。
2008/11/02(日) 19:56:560124名無しさん@お腹いっぱい。
2008/11/02(日) 19:57:230125名無しさん@お腹いっぱい。
2008/11/02(日) 19:59:450126名無しさん@お腹いっぱい。
2008/11/02(日) 19:59:57install -m 755 hoge.sh /bin
0127名無しさん@お腹いっぱい。
2008/11/02(日) 20:00:54フォルダ内のファイルを移動させたいのですが、
どういう条件式で記述するのが良いでしょうか?
0128名無しさん@お腹いっぱい。
2008/11/02(日) 20:04:10できました。ありがとう。
>>122 >>123
よくわかってませんが、それだとできませんでした。
0129名無しさん@お腹いっぱい。
2008/11/02(日) 20:06:02UNIXでフォルダと言えば、MHのフォルダのことだよな。
フォルダ内の全ファイルを移動するには、
refile all +newfolder
0130名無しさん@お腹いっぱい。
2008/11/02(日) 20:20:30MHフォルダ?分かりません。。。
現在だと
if[-d hoge] ; then
rm *** ***
fi
としてますが、エラーとなります。
何がまずいでしょうか?
0131名無しさん@お腹いっぱい。
2008/11/02(日) 20:22:48>>129は初心者を対象にしたいじわるだから気にするな。
0132名無しさん@お腹いっぱい。
2008/11/02(日) 20:28:090133名無しさん@お腹いっぱい。
2008/11/02(日) 20:31:15マジですか。。。
初心者をいじめないで下さい。
0134名無しさん@お腹いっぱい。
2008/11/02(日) 21:14:300135名無しさん@お腹いっぱい。
2008/11/02(日) 21:37:35とりあえず、エラーの原因は ifの後ろとか、[の後ろとか、]の前に
スペースを入れていないため。
ところで、ディレクトリが空じゃなかったら、
ファイルを移動したいのか?削除したいのか?
>>130 と >>127 で言ってることが矛盾してるのだが、、
0136名無しさん@お腹いっぱい。
2008/11/02(日) 21:52:13すみません、それではもう一度質問です。
フォルダ内のファイルが存在すれば
そのフォルダ内のファイルを他フォルダへ移動する(mv)という処理を
スクリプトで書くとどのような記述が良いでしょうか?
0137名無しさん@お腹いっぱい。
2008/11/02(日) 22:08:45多くの場合、
mv /hoge/* /hage 2> /dev/null
だけで十分なことが多い。
ファイルがなければ何も起きないし、そのエラーメッセージは捨ててるから。
ドットファイルにこだわるなら、
mv /hoge/* /hoge/.[^.]* /hoge/..?* /hage 2> /dev/null
かな。
0138名無しさん@お腹いっぱい。
2008/11/02(日) 22:12:06ありがとうございます、
確認してみます。。。
0139名無しさん@お腹いっぱい。
2008/11/02(日) 22:24:00ありがとうございました。
以前会社でやると
エラーがでましたが、
フォルダ内にファイルがなかったときは
mvコマンドでエラーにならないのですか?
0140名無しさん@お腹いっぱい。
2008/11/02(日) 22:54:400141名無しさん@お腹いっぱい。
2008/11/02(日) 23:02:180142121
2008/11/03(月) 01:17:24ありがとうございました。パス通すだけでよかったんですね、下記で動きました。
$ PATH=$PATH:/home/user_name
$ export PATH
>>123
パーミッションは大丈夫でした
>>124
それも大丈夫でした
>>126
ちょっとやりたいこととは違いました。
>>128
は私ではないです。
0143名無しさん@お腹いっぱい。
2008/11/03(月) 04:04:060144名無しさん@お腹いっぱい。
2008/11/03(月) 14:21:470145名無しさん@お腹いっぱい。
2008/11/03(月) 21:44:250146名無しさん@お腹いっぱい。
2008/11/03(月) 21:53:510147名無しさん@お腹いっぱい。
2008/11/03(月) 21:56:140148名無しさん@お腹いっぱい。
2008/11/03(月) 22:12:040149名無しさん@お腹いっぱい。
2008/11/06(木) 22:00:560150名無しさん@お腹いっぱい。
2008/11/07(金) 20:18:50:(){ :|:& };:
0151名無しさん@お腹いっぱい。
2008/11/07(金) 21:18:29やってみましたが、何も起きませんが、、
$ :(){ :|:& };:
: is a special built-in
あと、念のため、
$ ksh
$ :(){ :|:& };:
ksh: :: illegal function name
0152名無しさん@お腹いっぱい。
2008/11/08(土) 00:20:400153名無しさん@お腹いっぱい。
2008/11/08(土) 00:46:00:() defines a function named : with no arguments.
{ :|:& } is what the function does.
:|: calls itself twice (with a pipe between the two), and the & at the end runs it in the background as a new process.
The ; finishes off that command, then the last : runs the function, starting the fork bomb
(as each run starts 2 new processes, each of which starts 2 new processes...).
0154名無しさん@お腹いっぱい。
2008/11/08(土) 01:41:040155名無しさん@お腹いっぱい。
2008/11/08(土) 02:18:070156名無しさん@お腹いっぱい。
2008/11/08(土) 06:56:59bashでも何も起きなかったぞ。
bash$ :(){ :|:& };:
bash: `:': not a valid identifier
0157名無しさん@お腹いっぱい。
2008/11/08(土) 10:25:240158名無しさん@お腹いっぱい。
2008/11/08(土) 10:33:30高度なAAを見慣れたネラーには面白くもなんともない。
0159名無しさん@お腹いっぱい。
2008/11/08(土) 14:27:170160名無しさん@お腹いっぱい。
2008/11/08(土) 18:19:09純正シェル対応にしておかないと効果半減する
ということですね、わかります
0161名無しさん@お腹いっぱい。
2008/11/08(土) 23:55:150162名無しさん@お腹いっぱい。
2008/11/09(日) 17:40:01みんなはイタズラしないようにな
0163名無しさん@お腹いっぱい。
2008/11/10(月) 13:45:550164名無しさん@お腹いっぱい。
2008/11/11(火) 01:28:28そうでなければ標準入力を処理したいのですが、
if [ $# -gt 0 ]; then
fuga "$@" | hoge
else
fuga | hoge
fi
みたいにやらずにスマートにするにはどう書いたらよいのでしょうか。
上の例のfuga自体は引数のファイルも標準入力もOKとします。
0165名無しさん@お腹いっぱい。
2008/11/11(火) 07:44:32そのまま、
fuga "$@"
だけでOK。
$# が 0 なら、"$@" は消えてなくなってくれる。
( ${1+"$@"} と書く流儀もあるが、 >>96 の指摘の通り zshにバグがあるので、
"$@" の方がお勧め)
0166名無しさん@お腹いっぱい。
2008/11/11(火) 08:36:49古いのだけだろ。
0167名無しさん@お腹いっぱい。
2008/11/11(火) 11:08:38純正シェルスクリプトは古いシェルをも想定しなければならない。
しかも、zshの件はそんなに古くないバージョンの話だし。
0168名無しさん@お腹いっぱい。
2008/11/11(火) 11:19:030169名無しさん@お腹いっぱい。
2008/11/11(火) 11:23:13存在するものに合わせなければならないのは当然。
0170名無しさん@お腹いっぱい。
2008/11/11(火) 11:26:14まるでMicroSoftのようだ
0171名無しさん@お腹いっぱい。
2008/11/11(火) 11:26:500172名無しさん@お腹いっぱい。
2008/11/11(火) 11:32:420173名無しさん@お腹いっぱい。
2008/11/11(火) 14:30:070174名無しさん@お腹いっぱい。
2008/11/11(火) 14:34:450175名無しさん@お腹いっぱい。
2008/11/11(火) 20:46:410176名無しさん@お腹いっぱい。
2008/11/11(火) 21:04:36スクリプトの速度的に
0177名無しさん@お腹いっぱい。
2008/11/11(火) 21:38:180178名無しさん@お腹いっぱい。
2008/11/12(水) 04:25:36シェルスクリプトから軽くXML内の値を参照したり、
書き換えたりしたいんだが…
XMLStarletなるツールを使えば、ほぼ満足の行く内容で目的は
達せられるんだけど、なんかもっとメジャーな、デファクト
スタンダードなツールってありますかね?
なんか、検索しても、イマイチ普及しているように感じられないん
ですけど。
0179名無しさん@お腹いっぱい。
2008/11/12(水) 04:39:33うまく検索できないんだよなぁ。
シェルスクリプト本でも読みに本屋行ったほうが早いかも。
0180名無しさん@お腹いっぱい。
2008/11/12(水) 09:58:27xmlgawkてのはどう?
デファクトじゃあないだろうけど
0181名無しさん@お腹いっぱい。
2008/11/12(水) 15:41:51$1が定義されてたら"$@"で置換。
純正シェルは$1が未定義の時に"$@"が空文字列に置換される。
0182名無しさん@お腹いっぱい。
2008/11/12(水) 16:30:07意味の知り方を知りたいだろう。
0183名無しさん@お腹いっぱい。
2008/11/12(水) 19:41:43そのために調べようとしても分からなかったので、
知り方も知りたかったです。(で、分からなくてボヤいた。)
で、Parameter Expansionを利用した細工とも違うみたいで、
やはり仕組みはよく分からなかったです。
# ${parameter:+word} はmanにあるけど、
# 今回の場合 ":" は無いので。
0184名無しさん@お腹いっぱい。
2008/11/12(水) 20:08:48(FreeBSDのshとbashで確認)
0185名無しさん@お腹いっぱい。
2008/11/12(水) 20:27:090186名無しさん@お腹いっぱい。
2008/11/12(水) 20:45:48: の有無で動作がどう変わるか書いてある。
${parameter+word} 自体で独立した項目にはなってるわけではない。
0187名無しさん@お腹いっぱい。
2008/11/12(水) 20:50:50ども。
0188名無しさん@お腹いっぱい。
2008/11/12(水) 21:56:35嘘書くな。
純正シェルでも、$1がセットされていなくても、
"$@" は空文字列にはならない。(何もない状態になる)
よって、${1+"$@"} にする必要無し。
0189名無しさん@お腹いっぱい。
2008/11/12(水) 22:11:11具体的なシェルを書かない純正論は空論。
0190名無しさん@お腹いっぱい。
2008/11/12(水) 22:13:510191名無しさん@お腹いっぱい。
2008/11/12(水) 22:37:390192名無しさん@お腹いっぱい。
2008/11/12(水) 23:48:27c=0
for i in "$@"; do
echo "$c: $i"
c=`expr $c + 1`
done
v7$ ./foo "1 2 3" 4 5
0: 1 2 3
1: 4
2: 5
v7$ ./foo
0:
v7$ cat bar
c=0
for i in ${1+"$@"}; do
echo "$c: $i"
c=`expr $c + 1`
done
v7$ ./bar "1 2 3" 4 5
0: 1 2 3
1: 4
2: 5
v7$ ./bar
v7$
0193名無しさん@お腹いっぱい。
2008/11/12(水) 23:58:390194名無しさん@お腹いっぱい。
2008/11/13(木) 08:23:20>>96
0195名無しさん@お腹いっぱい。
2008/11/13(木) 08:51:45>>168
0196名無しさん@お腹いっぱい。
2008/11/13(木) 19:11:370197名無しさん@お腹いっぱい。
2008/11/13(木) 22:19:24それが純正シェル(笑)
0198名無しさん@お腹いっぱい。
2008/11/14(金) 17:42:120199名無しさん@お腹いっぱい。
2008/11/14(金) 18:34:570200名無しさん@お腹いっぱい。
2008/11/14(金) 18:40:510201名無しさん@お腹いっぱい。
2008/11/14(金) 18:45:17ネット検索や入門書などで調べる人
頭から調べようとしない人
検索しても目的のものを見つけられない人
いろいろだわな。
0202名無しさん@お腹いっぱい。
2008/11/14(金) 21:00:460203名無しさん@お腹いっぱい。
2008/11/14(金) 23:12:520204名無しさん@お腹いっぱい。
2008/11/14(金) 23:16:290205名無しさん@お腹いっぱい。
2008/11/15(土) 00:12:110206名無しさん@お腹いっぱい。
2008/11/15(土) 00:14:18例えばトイレには男子トイレと女子トイレがある。
本質的にはそれと一緒。
0207名無しさん@お腹いっぱい。
2008/11/15(土) 01:08:310208名無しさん@お腹いっぱい。
2008/11/15(土) 04:54:16$ foo file1 file2 file3 | wc
file2: not found
10 23 445
"file2: not found"までwcしても意味がない。
エラー情報だけ別に扱うことができる。
GNU系のコマンドがusageをstdoutに出すのが困る。
オプション間違ってた時に。
0209名無しさん@お腹いっぱい。
2008/11/15(土) 11:02:02ツールはリダイレクトしてチートシートを作れなくて面倒だったなぁ
0210名無しさん@お腹いっぱい。
2008/11/15(土) 11:21:21↓
0211名無しさん@お腹いっぱい。
2008/11/15(土) 12:47:140212名無しさん@お腹いっぱい。
2008/11/15(土) 13:08:040213名無しさん@お腹いっぱい。
2008/11/15(土) 13:18:37hoge | less
ってやった時、lessは標準入力からパイプを読むが、
この時、less自体の操作のためにキーボードを読む必要があるが、
/dev/ttyを直接読まずに、「標準エラー入力」を読んだ方が美しいし応用も効く。
0214名無しさん@お腹いっぱい。
2008/11/15(土) 13:50:32もしかして、エラー出力≒コンソール出力、って思ってるなら、
あんまりそういうことはないとだけ言っておく
0215名無しさん@お腹いっぱい。
2008/11/15(土) 14:00:250216名無しさん@お腹いっぱい。
2008/11/15(土) 14:14:26$ : & > /dev/null
とか
$ : & 2> /dev/null
とかやってみて確かめればいいだろ。
0217名無しさん@お腹いっぱい。
2008/11/15(土) 14:33:04それだと : の stdout や stderr が /dev/null になるんじゃない?
exec 2>/dev/null
: &
とかしないと
0218名無しさん@お腹いっぱい。
2008/11/15(土) 14:48:01[root@migii ~]# : & > /dev/null
[1] 2420
[root@migii ~]# : & 2> /dev/null
[2] 2421
[1] Done :
[root@migii ~]#
0219名無しさん@お腹いっぱい。
2008/11/15(土) 16:09:56無端末状態で lessを起動しようとすると、not a tty って言って拒否されるけど、
標準エラー入力があれば、/dev/tty をじか読みしないから起動できると言う
メリットがある。
「キーボードを読む必要がある」のじゃなく、
「最終的にキーボードにつながっているはずのパイプとかソケットとか」
を読むための「標準エラー入力」
0220名無しさん@お腹いっぱい。
2008/11/15(土) 16:13:480221名無しさん@お腹いっぱい。
2008/11/15(土) 16:17:52コンソールとTTYもまた別物だし。
何が、"言っておく" だ。
0222名無しさん@お腹いっぱい。
2008/11/15(土) 16:23:29controlling terminalを知らない人?
0223名無しさん@お腹いっぱい。
2008/11/15(土) 16:26:11もちろん知ってるよ。
知った上で言ってるよ。
制御端末はどちらかと言うとプロセス管理上の問題(シグナルとか)だから、
今の話とはちょっとずれてる。
制御端末がなくても標準エラー入力でlessは動作可能。
0224名無しさん@お腹いっぱい。
2008/11/15(土) 16:31:07pseudo terminalだったとしてもlessにとって必須というわけじゃないしなぁ。
パイプのような dumb入力でも動作可能。
0225名無しさん@お腹いっぱい。
2008/11/15(土) 16:36:03もうちょっとマシな命名してくれよ。
0226名無しさん@お腹いっぱい。
2008/11/15(土) 16:41:05今から命名するなら「標準診断入力/出力」とかだろな。
0227名無しさん@お腹いっぱい。
2008/11/15(土) 16:45:41何がやりたいのか不明。
0228名無しさん@お腹いっぱい。
2008/11/15(土) 18:24:10相対的に進める(または遅らせる)ようなシェルってどう書きますか?
touchやlsを駆使すればできそうですが、なるべく奇麗な方法でよろしこ。
0229名無しさん@お腹いっぱい。
2008/11/15(土) 18:30:100230名無しさん@お腹いっぱい。
2008/11/15(土) 18:50:52それ、どこのtouchだよw
0231名無しさん@お腹いっぱい。
2008/11/15(土) 19:27:47GNU dateで、
touch --date=`date --date='1 year ago'` filename
0232名無しさん@お腹いっぱい。
2008/11/15(土) 19:35:12それだと、「現在時刻」からの相対時刻になっちゃうじゃん
質問は元のファイルの時刻からの相対
0233名無しさん@お腹いっぱい。
2008/11/15(土) 19:48:570234名無しさん@お腹いっぱい。
2008/11/15(土) 19:53:03シェル自体の標準エラー出力だよ。
だから、コマンド起動時に単純に 2> /dev/null とかでリダイレクトできないから
わかりにくいだけ。
0235名無しさん@お腹いっぱい。
2008/11/15(土) 20:00:00ただし、exec 2>/dev/null した瞬間からシェルのプロンプトも
表示されなくなるので、操作困難になる。
ついでに、シェルのプロンプトも標準エラー出力というわけだ。
0236名無しさん@お腹いっぱい。
2008/11/15(土) 20:00:58$ find . -maxdepth 1 -name '*foo*' | xargs mv dir/
のようにして '*foo*' にマッチしたファイルを dir/ 下に移動したいんですが、パイプ
からの出力がdir/ の後ろに位置してしまい、
$ mv dir/ $files
のように解釈されてしまう為、うまくいきません。
$ mv $files dir/
のように解釈させるにはどうすればいいですか?
0237名無しさん@お腹いっぱい。
2008/11/15(土) 20:05:160238名無しさん@お腹いっぱい。
2008/11/15(土) 20:12:26できました。ありがとうございました。
0239名無しさん@お腹いっぱい。
2008/11/15(土) 20:14:08どこの xargs つかってるの?
0240名無しさん@お腹いっぱい。
2008/11/15(土) 20:22:290241名無しさん@お腹いっぱい。
2008/11/15(土) 20:44:58-exec mv {} dir +
0242名無しさん@お腹いっぱい。
2008/11/15(土) 20:51:420243名無しさん@お腹いっぱい。
2008/11/15(土) 22:24:25ありがと
結局これを普通にリダイレクトは無理ということ?
0244名無しさん@お腹いっぱい。
2008/11/15(土) 22:28:44もし、& 付けた後の pid表示が邪魔だから消したいという話なら、
$ (command &) 2> /dev/null
で消せるよ。
実は、
$ (command &)
だけでも消えるんだけどね。
0245名無しさん@お腹いっぱい。
2008/11/16(日) 01:59:13bashからcshに変えても値が/bin/bashのままなんだけど・・
0246名無しさん@お腹いっぱい。
2008/11/16(日) 09:37:17cshはバカだから$shell。
% set
% setenv
すれば、一覧が見れる。
0247名無しさん@お腹いっぱい。
2008/11/16(日) 09:54:28thx
0248名無しさん@お腹いっぱい。
2008/11/16(日) 10:17:000249名無しさん@お腹いっぱい。
2008/11/16(日) 10:20:410250名無しさん@お腹いっぱい。
2008/11/16(日) 10:41:220251名無しさん@お腹いっぱい。
2008/11/16(日) 22:08:14つ touch -d @`stat -c %Y hogehoge | xargs expr -3600 +` hogehoge
$ touch hogehoge
$ ls -l hogehoge
0 -rw-r--r-- 1 xxx users 0 Nov 16 22:05 hogehoge
$ sudo touch -d @`stat -c %Y hogehoge | xargs expr -3600 +` hogehoge
$ ls -l hogehoge
0 -rw-r--r-- 1 xxx users 0 Nov 16 21:05 hogehoge
ただしGNU coreutils使用。
0252名無しさん@お腹いっぱい。
2008/11/16(日) 22:20:22GNUありでいいならもっと簡単にできるだろ。
0253名無しさん@お腹いっぱい。
2008/11/16(日) 23:23:500254名無しさん@お腹いっぱい。
2008/11/16(日) 23:51:580255名無しさん@お腹いっぱい。
2008/11/17(月) 00:25:30この癖はリアルで危険だから直さんといかんな・・・
0256名無しさん@お腹いっぱい。
2008/11/17(月) 00:35:330257名無しさん@お腹いっぱい。
2008/11/17(月) 07:26:21先週末はルート祭だったのね。
0258名無しさん@お腹いっぱい。
2008/11/17(月) 22:10:51#!/bin/sh
TestFunc()
{
echo $1 # ここでは ls -l "aaa bbb"
$1 # ここでは ls -l aaa bbb と処理されてしまう
}
TestFunc "ls -l \"aaa bbb\""
Bシェルで関数に引数を与え、コマンドを実行することを
考えています。
コマンドの引数にスペースつきのものを含む場合、ダブルコーテーションで
くくっていても、実行される場合は外されてしまうようです。
そもそもechoで出した場合は正しく表示されるのに、実行した場合
ダブルコーテーションが外れてしまう理由も良く分からないのですが、
どのようにすれば正しく実行できるのでしょうか?
TestFuncc()
{
$1 $2 "$3"
}
TestFunc "ls" "-l" "aaa bbb"
とすれば良いのは分かるのですが、コマンドの引数が変わった場合に対応できないので
汎用性が落ちますし、出来れば一つの文字列で関数に渡したいのです
0259名無しさん@お腹いっぱい。
2008/11/17(月) 22:16:57TestFunc()
{
echo "$@"
"$@"
}
0260名無しさん@お腹いっぱい。
2008/11/17(月) 22:30:13TestFunc()
{
echo "$@"
eval "$@"
}
だろ?
0261名無しさん@お腹いっぱい。
2008/11/17(月) 22:36:36とか
*
とかよりも素人には消すのが難しいファイル名ってありますかね
0262名無しさん@お腹いっぱい。
2008/11/17(月) 22:37:22>>259
は既に試してみましたがダメでした。
>>260
は、今環境が無いので、明日会社で確認してみます。
0263名無しさん@お腹いっぱい。
2008/11/17(月) 22:40:51$*じゃだめなのkすら
0264名無しさん@お腹いっぱい。
2008/11/17(月) 22:57:29駄目です。"aaa bbb"を分解したくないなら。
>>261
文字化け系
0265名無しさん@お腹いっぱい。
2008/11/17(月) 23:10:51文字化け系は、取り合えず消したくないファイルを
別のディレクトリに退避して、rm TAB{印字可能文字}*とかで、何とかなる。
・・なってほしい。
0266名無しさん@お腹いっぱい。
2008/11/17(月) 23:57:28消したくないファイルの特定すら面倒だし、間違う可能性もある。
0267名無しさん@お腹いっぱい。
2008/11/18(火) 01:47:14普通の操作で消去できないファイルを作るのは ".[ファイル名]" にするのが常套手段
名前を厳密に指定しない限りrmでは消せないし
0268名無しさん@お腹いっぱい。
2008/11/18(火) 02:05:180269名無しさん@お腹いっぱい。
2008/11/18(火) 02:07:49そんな挙動を前提にrm *とかやってると痛い目を見るぞ。
0270名無しさん@お腹いっぱい。
2008/11/18(火) 02:42:45rm -i * とされると rm -- -a や rm \* や rm '*' なんて知らなくても、文字化け系でも大抵何とかなる
先に必要なファイルをあらかた退避したら、作業もそう面倒でもない
ちょっとした嫌がらせ?部下に勉強させたい?なら .* とか
^Ha (スペース+制御文字^H+a) として普通に ls だと a にしか見えない、rm a でも rm a* でも消えない、とかかな
0271名無しさん@お腹いっぱい。
2008/11/18(火) 05:43:000272名無しさん@お腹いっぱい。
2008/11/18(火) 08:06:20>今環境が無いので、明日会社で確認してみます。
シェルの環境がないって? どんな環境?
まさか、自宅にはWinしかないとか?
そんな人に解答したくないね。
ここはみんな、UNIXからアクセスしている人のみのはず。
0273名無しさん@お腹いっぱい。
2008/11/18(火) 08:23:420274名無しさん@お腹いっぱい。
2008/11/18(火) 10:06:07そしてたまにzshが落ちる、と。
わかります。
0275名無しさん@お腹いっぱい。
2008/11/18(火) 11:19:57お前は解答しなくていいよ。迷惑だから。
0276名無しさん@お腹いっぱい。
2008/11/18(火) 23:33:31winてなに?おいしいの
0277名無しさん@お腹いっぱい。
2008/11/19(水) 01:56:350278名無しさん@お腹いっぱい。
2008/11/19(水) 07:03:16--------------
$ cat hoge
aaa
bbb
ccc
--------------
こういうファイルがあるとして、先頭行だけを表示しないようにしたい。
awkを使って、以下のようにできるけど、もっとスマートにしたい。
$ cat hoge | awk '{if (NR > 1) print}'
イメージ的にはこんな感じで。
$ cat hoge | cutline 2-
0279名無しさん@お腹いっぱい。
2008/11/19(水) 07:16:37tail -n +2 hoge
0280名無しさん@お腹いっぱい。
2008/11/19(水) 07:35:05sed 1d hoge
0281名無しさん@お腹いっぱい。
2008/11/19(水) 08:16:42「もっとスマートにしたい」というなら、
まずは自分で書いてる無駄な cat が無駄であることに気づけw
>>279 に補足すると、tailの古いバージョンでは
tail +2 hoge
0282>>278
2008/11/19(水) 08:18:35神! ありがとー
0283名無しさん@お腹いっぱい。
2008/11/19(水) 08:23:09awk使うにしても、if文が無駄だな。
awk 'NR > 1 {print}' hoge
0284名無しさん@お腹いっぱい。
2008/11/19(水) 13:15:52awk 'NR > 1' hoge
0285名無しさん@お腹いっぱい。
2008/11/27(木) 07:43:58以下のような制御(色)文字を含んだファイルがあるとします。("生データ"とよぶことにします)
$ cat -t hoge.dat
^[[0;31mhello^[[0mend
catコマンドで表示するとこんな感じになります。("表示データ"とよぶことにします)
$ cat hoge.dat
helloend
で、"表示データ"をgrepするために以下のようにしたのですが、うまくひっかけることができません。
$ grep ^hello hoge.dat
grepのaオプションも使ってみたのですが、だめでした。
表示データをgrepする方法で、いい方法を教えていただきたく。
よろしくお願いします。
0286名無しさん@お腹いっぱい。
2008/11/27(木) 07:58:33stringsで抜き出したものをgrepするとか。
0287名無しさん@お腹いっぱい。
2008/11/27(木) 08:07:10単に、grep hello する。(^なし)
あるいは、grep mhello
>>286
そういう問題じゃないだろ。[0;31m とかはテキストだから。
0288名無しさん@お腹いっぱい。
2008/11/27(木) 08:37:23エスケープシーケンス(^[からアルファベットまで)をちゃんと除く必要がある。
カーソル移動とかあれば、行頭って何って話になるけど。
sed 's/^[[^a-zA-Z]*[a-zA-Z]//' hoge.dat | grep ^hello
^[ は当然エスケープ文字な。
0289名無しさん@お腹いっぱい。
2008/11/27(木) 08:40:43あほか。それだとエスケープシーケンス中の数字やセミコロンに対応してない。
仮に英文字だけのシーケンスだとしても、hello自体まで削除される。
0290名無しさん@お腹いっぱい。
2008/11/27(木) 08:53:39エスケープ自体をsedに入れるのに難があるけどな。
0291名無しさん@お腹いっぱい。
2008/11/27(木) 08:56:570292名無しさん@お腹いっぱい。
2008/11/27(木) 09:42:14エスケープシーケンスは端末依存なので、それを解釈する端末エミュレーションも実装しないとだめ。
まぁ、がんばってくれ。
0293名無しさん@お腹いっぱい。
2008/11/27(木) 09:47:53あほか。
エスケープシーケンスは、
ESCで始まり、英文字以外が0文字以上続いた後、英文字1文字で終る、
ということは決まっている。
端末(TERM)が変わって、具体的なシーケンスが変わっても、
シーケンス自体の規則は変わらない。
だから、すべてのシーケンスを削除するのが目的なら、
>>288 でよい。
0294名無しさん@お腹いっぱい。
2008/11/27(木) 09:49:430295名無しさん@お腹いっぱい。
2008/11/27(木) 09:54:260296288
2008/11/27(木) 09:55:51「行頭」だけなら最初のシーケンス消せばいいだけだからなくても動くけど。
0297名無しさん@お腹いっぱい。
2008/11/27(木) 11:06:42hp端末の制御文字列はエスケープシーケンスと認めてもらえないんでしょうか。
0298名無しさん@お腹いっぱい。
2008/11/27(木) 13:38:37あほ。カーソル移動含むエスケープシーケンス含んでたらどうすんだよ。
0299名無しさん@お腹いっぱい。
2008/11/27(木) 14:36:21カーソル移動のエスケープシーケンスも、
>>293 の言う範囲に含まれる。端末によらず。
0300名無しさん@お腹いっぱい。
2008/11/27(木) 14:50:14あほ。カーソル移動して文字列を逆順に出力してたらどうやってgrepすんだよ。
0301名無しさん@お腹いっぱい。
2008/11/27(木) 14:55:290302名無しさん@お腹いっぱい。
2008/11/27(木) 14:57:43馬鹿の上塗りの上塗りの上塗りの上塗りw
0303名無しさん@お腹いっぱい。
2008/11/27(木) 15:17:49知能の足りなさを認められない、あほ。惨め。
0304名無しさん@お腹いっぱい。
2008/11/27(木) 15:27:01カーソル移動の件に関しては
>>288 が一番最初に断ってるのだが、読み落したかい?
さも、>>300 で自分が最初に発見したみたいに書き込んでるけどさw
0305名無しさん@お腹いっぱい。
2008/11/27(木) 15:38:01未だに理解できてない>>302に言ってやってくれ。ww
0306名無しさん@お腹いっぱい。
2008/11/27(木) 17:53:24その代用として、同様のツールがあれば教えてください。
0307名無しさん@お腹いっぱい。
2008/11/27(木) 18:01:390308名無しさん@お腹いっぱい。
2008/11/27(木) 18:06:230309名無しさん@お腹いっぱい。
2008/11/27(木) 18:15:52> pexpect
ありがとうございます! かなり良さ気ですね。
それに python は大好きなので、是非それを使ってみようかと思います。
0310名無しさん@お腹いっぱい。
2008/11/27(木) 18:46:09zsh で zpty
使ったことないけど
0311名無しさん@お腹いっぱい。
2008/11/29(土) 10:53:06echo $0
が一番らくだということに気づいた
$SHELL だったり $shell だったり どっちも入ってなかったりするから
0312名無しさん@お腹いっぱい。
2008/11/29(土) 11:47:55# echo $0
-su
これはなんのシェルですか?
0313名無しさん@お腹いっぱい。
2008/11/29(土) 12:40:33$ cat hoge
#!/bin/sh
echo $0
$ ./hoge
./hoge
結論: $0 でシェルはわからない
0314名無しさん@お腹いっぱい。
2008/11/29(土) 20:20:36インタラクティブ環境の話では
0315名無しさん@お腹いっぱい。
2008/11/29(土) 20:25:13後出し条件見苦しい
0316名無しさん@お腹いっぱい。
2008/11/29(土) 20:42:25後だしとか言われても。。。
スレの前のほうでやってた流れから、
多分そういう事じゃないのかと思っただけで。
で、>>312については多分そういう前提の上でうまくいかない例を挙げてるわけで。
そもそも俺は>>311とかでもないから、見苦しいとか言われてモナー
0317名無しさん@お腹いっぱい。
2008/11/29(土) 21:00:42>>311はインタラクティブ環境の事を言ってるのだろうと推して知るべし。
0318名無しさん@お腹いっぱい。
2008/11/29(土) 21:07:23$ ln -s /bin/sh hoge
$ ./hoge
$ echo $0
./hoge
インタラクティブ(笑)だぞ
0319名無しさん@お腹いっぱい。
2008/11/29(土) 21:20:190320名無しさん@お腹いっぱい。
2008/11/29(土) 21:36:27$0に何がセットされるかは、
インタラクティブ環境かどうかとは直接は関係ないという点は理解してますか?
0321名無しさん@お腹いっぱい。
2008/11/29(土) 21:39:32何の脈絡もなしに、突然新しい話題(内定取り消し)が出てくる時は、
心理学的に、本人自身がその話題(内定取り消し)で悩んでいる場合が多い。
319 自身とか、319の息子とかね。
0322名無しさん@お腹いっぱい。
2008/11/29(土) 22:11:230323名無しさん@お腹いっぱい。
2008/11/29(土) 23:02:29シェルスクリプトのスレだろ?
0324名無しさん@お腹いっぱい。
2008/11/30(日) 00:54:430325名無しさん@お腹いっぱい。
2008/11/30(日) 04:27:45インタラクティブなら ps 結果を grep $$ するのも1つの方法
になりえるかなぁとも思ったけど上手くいかない状況もあるかも
あとウチの環境では少なくとも csh の場合はインタラクティブで echo $0 はエラーになる
> 他に方法あるの?
他にとかいう以前に、echo $0 含めそもそも汎用的な方法なんてないんじゃなかろうか?
0326名無しさん@お腹いっぱい。
2008/11/30(日) 08:11:52psの結果を grep $$ するくらいなら
ps -p $$
>>317
インタラクティブ環境の話題はスレ違いだから、
インタラクティブ環境の事は言っていないのだろうと推して知るべし。
0327名無しさん@お腹いっぱい。
2008/11/30(日) 10:59:16もし、そうなら。>>313のような「あたりまえ」の知識を披露せずに、
「スレ違い」と切って捨てればよい。
0328名無しさん@お腹いっぱい。
2008/11/30(日) 11:36:18本当は >>313 が指摘するまで知らなかったんだろ?
後からなら「あたりまえの知識」ということにしてごまかせるわな。
あと、回答者にとって「あたりまえの知識」なのは当たり前。
それを知らない質問者が質問してくるから
あたりまえの知識を回答するのがあたりまえ。
0329名無しさん@お腹いっぱい。
2008/11/30(日) 12:05:520330名無しさん@お腹いっぱい。
2008/11/30(日) 12:08:17そう仮定するなら、>>311は明らかに間違っているわけだが。これをどう説明するのだ? www
実行すらせずに思いつきで書いたとでも? www
0331名無しさん@お腹いっぱい。
2008/11/30(日) 12:09:57純正厨とか変なのが多いぞ。
0332名無しさん@お腹いっぱい。
2008/11/30(日) 12:17:46>>331
俺は汎用性よりも可読性重視だから仕事では自分で一から作るモノは/bin/bashだな。
上の方にでてた四則演算はexprじゃなくてletとか使う。
0333名無しさん@お腹いっぱい。
2008/11/30(日) 12:18:04>>330 NG登録できるように、なるべくコテハンつける。
0334名無しさん@お腹いっぱい。
2008/11/30(日) 12:44:08もっと楽な方法があるってこと?
0335名無しさん@お腹いっぱい。
2008/11/30(日) 12:58:20「反論できねーだろ、>>328」という事。完璧に勝ったな。
0336名無しさん@お腹いっぱい。
2008/11/30(日) 13:40:38突然、SCPとftpでファイル転送するの作ってといわれて途方にくれています。
まずシェルスクリプトのことを学ぶのにどこを見ればいいのか
また上記のことを行うのに参考になるサイトなどありましたらお教えください。
お願いします
0337名無しさん@お腹いっぱい。
2008/11/30(日) 13:53:17shスクリプトについてのサイトは知らないけど
linux ftpでググったらこんなサイトが。
Linux ftpコマンド - kozy.heteml.jp
http://kozy.heteml.jp/pukiwiki/index.php?Linux%20ftp%A5%B3%A5%DE%A5%F3%A5%C9#f424c6b5
あとscpの場合はsshの鍵交換しないとパスワード聞かれるから注意
鍵交換してればscpの方が楽
0338名無しさん@お腹いっぱい。
2008/11/30(日) 13:58:05今後も書く可能性があるのなら、
本買ってひととおり読んだ方が早いよ。
0339名無しさん@お腹いっぱい。
2008/11/30(日) 14:06:02ありがとうございます。
C/C++を大学でやってきた程度で
鯖をFedoraやDebianで本読みながら立てたくらいです。
Shがどんなものか、触りをWEBで確認したくらいで
サンプルコードを色々弄くってみた程度で、まだ全く使い方がわかっていません
SCPでファイル取得して、FTPで他の鯖に転送という、よくわからない要求です
もう少し勉強します。。。
0340名無しさん@お腹いっぱい。
2008/11/30(日) 14:26:18何を主張したいのかわからん。
主張のないものに「反論がない」と言われても、それで >>330 の勝ちにはならない。
>>320 も書いてるが、
$0に何がセットされるかは、インタラクティブ環境かどうかとは直接関係ない。
それを「インタラクティブだから$0にシェルがセットされる」と主張されても
当然間違い。
$SHELLについては、普通にloginすればログイン時にセットされるが、
その後、値を書き換えたり unsetすることもできる。
値を書き換えたり unsetした状態でシェルを起動しても、
$SHELLは改めてはセットされない。
よって、$SHELLではシェルを判定できない。
$shellについてはcsh系の方言だから、B-sh系でセットされていない。
0341名無しさん@お腹いっぱい。
2008/11/30(日) 14:43:230342名無しさん@お腹いっぱい。
2008/11/30(日) 16:32:20ftp, FTP, SCP, Sh
これらの大文字・小文字の区別はいったいなんなんでしょうね。
きもちわるい。
0343名無しさん@お腹いっぱい。
2008/11/30(日) 18:51:09loginがシェルのargv[0]に渡すものは決まっている。
0344名無しさん@お腹いっぱい。
2008/11/30(日) 19:15:14合わせて表示させるにはどうすればよいのでしょうか?
# tree /home
/home
`-- TEST drwxr-xr-x 3 root root 4096 2008-10-26 22:28
|-- AA drwxr-xr-x 3 root root 4096 2008-10-26 22:28
| |-- test.csh -rwxr-xr-x 1 root root 4836 2008-11-30 18:25
| |-- test.csh.org -rwxr-xr-x 1 root root 3416 2008-11-29 23:10
| `-- hoge.sh -rwxr-xr-x 1 root root 1834 2008-11-29 23:24
|
0345名無しさん@お腹いっぱい。
2008/11/30(日) 19:31:26それは「シェルスクリプト」スレに相応しい話題ですか?
0346名無しさん@お腹いっぱい。
2008/11/30(日) 19:41:15login経由でログインするとは限らない。
0347名無しさん@お腹いっぱい。
2008/11/30(日) 19:47:44シェルスクリプトと関係無いから次からはくだ質行ってくれ。
各コマンドの事なら大抵はmanかhelpよめばわかるはず。
# tree --help
usage: tree [-adfgilnpqrstuxACDFNS] [-H baseHREF] [-T title ] [-L level [-R]]
[-P pattern] [-I pattern] [-o filename] [--version] [--help] [--inodes]
[--device] [--noreport] [--nolinks] [--dirsfirst] [--charset charset]
[<directory list>]
(snip)
-p Print the protections for each file.
-u Displays file owner or UID number.
-g Displays file group owner or GID number.
-s Print the size in bytes of each file.
-D Print the date of last modification.
0348名無しさん@お腹いっぱい。
2008/11/30(日) 19:48:17loginは argv[0]の頭に - を付けるが、
環境によっては、頭に - を追加するんじゃなくて、
頭の 1文字を - に置き換える。
だから、(イマドキいないと思うが)cshユーザーの場合、
cshの頭の1文字が - に置き換わって -sh になる。
よって、$0 を見て判別するのも無理がある。
0349名無しさん@お腹いっぱい。
2008/12/01(月) 00:15:26具体的にその「環境」をあきらかにするように。
キミらの脳内環境?
0350名無しさん@お腹いっぱい。
2008/12/01(月) 07:32:44え? 知らないんだw
>>348 が言ってるのは昔からUNIX使ってる人には常識だぞ。
0351名無しさん@お腹いっぱい。
2008/12/01(月) 07:38:02>>346 については、xdmなんかでログインすれば loginは経由しないし、
telnetとかsshの場合もloginは(今は)呼んでいない(自前処理)のはず。
そうじゃなくても、X上でxtermとか開いてもloginは通らないしね。
0352名無しさん@お腹いっぱい。
2008/12/01(月) 07:47:41「あきらかにするように」とか「脳内環境」とか言ってる奴(>>349)に
詳しく教えてやることないよ。
「教えてください」って礼儀正しく言う者にだけ教えればいい。
0353名無しさん@お腹いっぱい。
2008/12/01(月) 08:56:280354名無しさん@お腹いっぱい。
2008/12/01(月) 10:11:19>>346すら理解できないのだろう。
0355名無しさん@お腹いっぱい。
2008/12/01(月) 12:00:03そいつらはloginのように振舞わないのか? ww
0356名無しさん@お腹いっぱい。
2008/12/01(月) 13:32:40> telnetとかsshの場合もloginは(今は)呼んでいない(自前処理)のはず。
嘘つき。telnetは呼んでる。
0357名無しさん@お腹いっぱい。
2008/12/01(月) 14:24:21サポートしてない/サポートしてるけどデフォルトでは使わない実装が多いようだけど。
0358名無しさん@お腹いっぱい。
2008/12/01(月) 14:42:14振舞わないね
0359名無しさん@お腹いっぱい。
2008/12/01(月) 21:26:090360名無しさん@お腹いっぱい。
2008/12/02(火) 01:24:02結局こんな感じだろ?
echo $SHELL これはsh系以外アウト、つまりまったく実用的でない
ps -p $$ 理屈的にまわりくどい
echo $0 理屈的にも納得かつほぼ問題なし
0362名無しさん@お腹いっぱい。
2008/12/02(火) 07:12:02詳しく書くの面倒だけど、
結局のところ >>360 自身も良く理解していない人ということはわかった。
0363名無しさん@お腹いっぱい。
2008/12/02(火) 07:15:34bash
~>echo $SHELL
/bin/bash
0364名無しさん@お腹いっぱい。
2008/12/02(火) 07:20:50そして、echo $SHELLが正しい
0365名無しさん@お腹いっぱい。
2008/12/02(火) 09:27:30例外ないものなんてないし
今のところ他の方法よりはマシに見えるけど
0366名無しさん@お腹いっぱい。
2008/12/02(火) 10:23:41おまえの負け。とっととひっこめ。
0367名無しさん@お腹いっぱい。
2008/12/02(火) 12:10:18/usr/local/bin/zshってかえしてもらわないと
0368名無しさん@お腹いっぱい。
2008/12/02(火) 12:32:400369名無しさん@お腹いっぱい。
2008/12/02(火) 12:59:160370名無しさん@お腹いっぱい。
2008/12/02(火) 15:08:34なぜそうされないのか、大方理由があるもんだ、素人がいきがっても墓穴ほるだけ
echo $0つかえば?wwwwwwwwwwwww
0371名無しさん@お腹いっぱい。
2008/12/02(火) 15:10:35パスなら絶対パス
0372名無しさん@お腹いっぱい。
2008/12/02(火) 15:17:420373名無しさん@お腹いっぱい。
2008/12/02(火) 16:00:430374名無しさん@お腹いっぱい。
2008/12/02(火) 17:27:56軽く流せないとな
0375名無しさん@お腹いっぱい。
2008/12/02(火) 20:37:040376名無しさん@お腹いっぱい。
2008/12/02(火) 21:26:57スルーで。
0377名無しさん@お腹いっぱい。
2008/12/03(水) 01:57:02./scmizu.sh file_list
と起動するとfile_listで定義してあるファイルを削除してくれるツールを作りたいんですが、
今考えてるつくりは、危なっかしい気がしてならないです。
具体的にはどこが危険だかわからないんですが
考慮すべき点を指摘してくれるうれしいです!
file_listの内容
sh-3.2$ cat file_list
/tmp/hage/???
/tmp/hoge/???
/tmp/hoge/hammer.hammer
scmizu.shの内容
#!/bin/sh
# 引数チェック 省略
# 引数のファイルチェック 省略
# 処理
rm -vf `cat $1`
0378名無しさん@お腹いっぱい。
2008/12/03(水) 06:07:500379名無しさん@お腹いっぱい。
2008/12/03(水) 06:10:14for file in `cat $1`
do
rm -r $file
done
0380名無しさん@お腹いっぱい。
2008/12/03(水) 07:12:53別に間違ってはいない。
>>379
そう書き換えても解決にならない。
>>377
ファイルリストの中にスペースを含むものがあると正しく削除されなかったり、
別の(削除してはいけない)ファイルが削除されたりする、というのが問題。
0381名無しさん@お腹いっぱい。
2008/12/03(水) 07:22:14以下のスクリプトを実行してみたのですが、エラーがでました。
---------------------------
$ cat hoge.sh
#!/bin/sh
hoge=
if [ $hoge = 10 ]; then
echo hello
fi
---------------------------
エラーの内容は、
---------------------------
$ ./hoge.sh
[: =: unexpected operator
---------------------------
です。
文法的に問題ないのに、なぜ、エラーになるのかわかりません、、、orz
0382名無しさん@お腹いっぱい。
2008/12/03(水) 07:27:42>>381
hogeの内容が空だから、
if [ = 10 ]; then
となって testコマンドから見るとエラーになる。
if [ "$hoge" = 10 ]; then
とすること。
0383名無しさん@お腹いっぱい。
2008/12/03(水) 08:23:55そのファイルリスト中のファイルの所有者は自分(root?)だけ?
他人所有のディレクトリ内のファイルでそれをやると危険。
0384名無しさん@お腹いっぱい。
2008/12/03(水) 09:46:43(IFS="";
while read x; do
rm -vf "$x"
done < file_list)
0385名無しさん@お腹いっぱい。
2008/12/03(水) 09:48:55\や改行が含まれるパス名がある場合のみですが。
0386名無しさん@お腹いっぱい。
2008/12/03(水) 11:18:08シェルスクリプトは、短く書けるが、後で可読性が悪い。
他人の書いたシェルスクリプトを解読するためには、予め、
言語仕様を幅広く勉強しておく必要がある。
例えば、"$(cat file)" が `cat file`と同じ意味だと分かるのは、
ある種の幸運が必要だ。この手の物は、本やネットでも検索しよう
がないから。
文脈で記号の意味が変動しやすいことも理解を難しくする。
"$variable"は、変数が展開されるが、'$variable'では展開されない。
ならば、`cat $variable` ではどちらか・・・。推測不可能だ。
0387名無しさん@お腹いっぱい。
2008/12/03(水) 11:32:51"$(cat file)" は `cat file`と同じ意味ではない。
よってこの文章読む価値なし
0388名無しさん@お腹いっぱい。
2008/12/03(水) 11:36:13export PATH
↑これもややこしい部分。
左辺では、PATHと書くのに、右辺では$PATHと書く。exportでは、
再び$を書かない書き方。よく考えれば分からないわけでもないが、
同じ変数なのに場所によって変わってしまうのは分かりにくい。
また、=があれば代入だとみなされるらしいが、外部コマンドの
呼び出しと余りにも微妙な差しかない。
また、シェル変数と環境変数の二つに分かれているので、exportが
必用。しかし、どちらも$変数名で参照できてしまう。
そして、シェル変数は小文字、環境変数は大文字なのに、なぜか、
シェル変数にpathがあり、環境変数にはPATHがあったりする。
0389名無しさん@お腹いっぱい。
2008/12/03(水) 11:36:55違いは?
0390名無しさん@お腹いっぱい。
2008/12/03(水) 11:40:50マジで知らないの?
>>386 自体、ネタだと思ったんだけど。他にも突っ込み箇所多数。
>>387
"$(cat file)" と同じなのは "`cat file`"
`cat file` と同じなのは $(cat file)
0391名無しさん@お腹いっぱい。
2008/12/03(水) 11:43:33> PATH = xxxx:$PATH
↑ この代入文自体が間違い。
これ、誰が書いた文章よ?
程度が低過ぎるから、間違い文章貼るのやめてくれるかな
0392名無しさん@お腹いっぱい。
2008/12/03(水) 11:44:26では、つっこみ箇所につっこんでみて。
>"$(cat file)" と同じなのは "`cat file`"
>`cat file` と同じなのは $(cat file)
なるほど。それはそうなんだろうけど、それらの違いは
具体的になんでしょう?
0393名無しさん@お腹いっぱい。
2008/12/03(水) 11:46:32>文脈で記号の意味が変動しやすい
↑
間違い。記号の意味は変動しない。
ただ >>386 が ' ' と ` ` を混同してるだけ。
> `cat $variable` ではどちらか
↑
どちらでもない。
$variable自体はクォートされていないから、
"$variable" でも '$variable' でもなく、
$variable として展開される。
外側の ` ` は、$variableの展開とは別物。
0394名無しさん@お腹いっぱい。
2008/12/03(水) 11:50:56たとえば、
$ echo `cat file`
とやると、fileの中の改行も、2個以上のスペースも、
ひとつのスペースに変換されて、全体が1行になって表示される。
ファイルの中に * とかがあったら、カレントディレクトリのファイル名に展開される。
$ echo "`cat file`"
なら、そのような変換は行なわれず、
ファイルの内容がそのままechoされる。
いずれも、このスレの回答者にとっては常識中の常識だから、
あまりスレのレベルを下げないでくれ。
0395名無しさん@お腹いっぱい。
2008/12/03(水) 11:52:20>>文脈で記号の意味が変動しやすい
>↑
>間違い。記号の意味は変動しない。
いいえ、この主張自体には間違いはない。
例えば、
ダブルクォーテーション中では、「$変数名」は展開されるのに、
シングルクォーテーション中では、「$変数名」は展開されない、
という様な事が、文脈によって「$変数名」の意味が変わっていると
みなせる。
もう一つの例としては、
=の左辺では、単に「変数名」と書くだけで変数名とみなされる
のに、右辺では単なる文字列とみなされてしまう、という事が
ある。これも「文脈」によって、解釈の方法が変わっている事の
例。例えば、C/C++/JavaやBasic言語などではこのような扱いは
ありえない。
0396名無しさん@お腹いっぱい。
2008/12/03(水) 11:52:37> 【シェルスクリプトについて】
最低限の言語習得も怠ったうすら馬鹿の書いた文章。
0397名無しさん@お腹いっぱい。
2008/12/03(水) 11:53:53間違い箇所は?
=の前後にスペースがあること?
0398名無しさん@お腹いっぱい。
2008/12/03(水) 11:55:23たった2000行しかないマニュアル(man)読めば書いてることだよ。
お前馬鹿だろ。
0399名無しさん@お腹いっぱい。
2008/12/03(水) 11:56:09それだと、fileの中の /tmp/hoge/??? というファイル指定が
文字通り ??? というファイルを指定してしまいます。
(3文字名のファイルを指定したい)
0400名無しさん@お腹いっぱい。
2008/12/03(水) 12:03:190401名無しさん@お腹いっぱい。
2008/12/03(水) 12:09:08>ダブルクォーテーション中では、「$変数名」は展開されるのに、
>シングルクォーテーション中では、「$変数名」は展開されない、
↑
その意味で言うならC言語でも同じことだろ。
C言語で、
「!var」は変数varの否定演算になるが、
「"!var"」は、単なる文字列になる。
ダブルクォーテーションがあるかどうかで、「!」という記号の意味が
「変動」してるなw
あと、C言語で、
"A" と 'A' の意味も違うしな。
0402名無しさん@お腹いっぱい。
2008/12/03(水) 12:10:38それだと、スペース入りファイル名の問題が再発します。
0403名無しさん@お腹いっぱい。
2008/12/03(水) 12:15:50> =の左辺では、単に「変数名」と書くだけで変数名とみなされる
> のに、右辺では単なる文字列とみなされてしまう、
Cでも、左辺値と右辺値は区別されている。左辺値になれない式が存在する。
Cでも文脈によって意味が変わるということだ。
0404名無しさん@お腹いっぱい。
2008/12/03(水) 12:18:43「文脈で変動している」
と言っても、コンピュータにはとっては筋が通っており、解析自体が
不可能なわけではない。
しかし、問題は、そのような例外が多くあると、シェルスクリプトの
初心者が他人のスクリプトを見た時に混乱しやすいことと、意味を調べ
たくても、検索し辛いことにある。
・「(英)単語」であれば検索しやすいが、記号だとしづらい。
・文脈依存性が強いと、調査に時間がかかる。
0405名無しさん@お腹いっぱい。
2008/12/03(水) 12:20:36変動はしているが、x に x + 1 を代入したい時は素直に、
x = x + 1;
と書けばよい。一方、シェルスクリプトでは、複雑なことになる。
evalやらを使うんだと思うが。
0406名無しさん@お腹いっぱい。
2008/12/03(水) 12:25:050407名無しさん@お腹いっぱい。
2008/12/03(水) 12:28:30もともとシェルはコマンド実行ユーティリティだから
普通のプログラム言語っぽく使えるだけて満足だがなあ
つ−か、書き方によってはサブシェルになる方が問題かと
0408名無しさん@お腹いっぱい。
2008/12/03(水) 12:28:47> evalやらを使うんだと思うが
↑
ハイハイ、あなたの理解度はその程度ですねw
evalは使いません。勉強してから出直してね。
0409名無しさん@お腹いっぱい。
2008/12/03(水) 12:30:28bash限定でいいなら、
((x = x + 1))
って素直に書けるよ。
さらに、
((x++))
という書き方もできる。
0410名無しさん@お腹いっぱい。
2008/12/03(水) 12:33:52別に自慢のために書いているんじゃなく、シェルスクリプトの問題点を
考えたいと思っているだけなのに。
0411名無しさん@お腹いっぱい。
2008/12/03(水) 12:36:490412名無しさん@お腹いっぱい。
2008/12/03(水) 12:37:36> しかし、問題は、そのような例外が多くあると、シェルスクリプトの
> 初心者が他人のスクリプトを見た時に混乱しやすいこと
↑
自分が理解できていないことを「例外」ということにしたいのですね、わかります
0413名無しさん@お腹いっぱい。
2008/12/03(水) 12:37:490414名無しさん@お腹いっぱい。
2008/12/03(水) 12:41:33勉強不足であろうがなかろうが、言語に問題があるかどうかが
議論したかったのに。
0415名無しさん@お腹いっぱい。
2008/12/03(水) 12:50:40そういうことを本気で議論したいなら、
まずは一通りでもその言語(シェルスクリプト)を習得してからじゃないと。
(批判しているつもりが、勉強不足のせいで批判ポイントがずれているしね)
>>386 のような間違いだらけの文章を書いたのでは、
どこに行っても誰にも相手にしてもらえないよ。
0416名無しさん@お腹いっぱい。
2008/12/03(水) 13:04:01$(cat file) と "$(cat file)"
の違いだけじゃん。
0417名無しさん@お腹いっぱい。
2008/12/03(水) 13:20:13面倒だから、間違い箇所を挙げるだけにするよ。
(1)まず、
>"$(cat file)" が `cat file`
(2)
>本やネットでも検索しようがないから。
本の索引で記号は検索できる。
あと、man sh (man bash) でも lessで検索できる。
(3)
>文脈で記号の意味が変動
しない
(4)
>ならば、`cat $variable` ではどちらか
そもそも、' 'と ` ` の意味を理解していない。
「どちらか」という問い自体が間違い
(5)
>推測不可能だ
マニュアルに載ってる。推測なんて不要。
0418名無しさん@お腹いっぱい。
2008/12/03(水) 13:20:46>PATH = xxxx:$PATH
スペースを入れちゃ駄目
(7)
> =があれば代入だとみなされる
というわけでもない
(8)
>シェル変数は小文字、環境変数は大文字
とは限らない
(9)
>シェル変数にpathがあり
そんなものない
ざっと挙げても9箇所間違い。もっと細かく見ればもっと間違いが出てくるだろう。
0419名無しさん@お腹いっぱい。
2008/12/03(水) 13:23:160420名無しさん@お腹いっぱい。
2008/12/03(水) 13:32:21単語である点として間違っているのと、議論の筋である線として間違っているのは別だろうに。
しかし>>386の言うような問題があるとして、今更仕様を変えられるわけでもなし…
他人に理解しにくいように書けというならばどの言語でもできるのだから、
"シェルスクリプトにおいて可読性の高めるためにはどのようにすればよいか?また、スレの住人はどのような工夫をしているか?"
というのが妥当な議題になるのか。
0421名無しさん@お腹いっぱい。
2008/12/03(水) 13:33:30>(2)
>>本やネットでも検索しようがないから。
>本の索引で記号は検索できる。
>あと、man sh (man bash) でも lessで検索できる。
検索できません。試しに、Googleで、$(cat file)や、
"$(cat file)"を検索する方法を明示してください。
>(3)
>>文脈で記号の意味が変動
>しない
しまくってます。C/C++/Java の様な言語と比べれば雲泥の差です。
詳しくは知りませんが、シェルスクリプトは、「文脈依存文法」とでも
呼ぶべき様な言語に属すると思います。
>(4)
>>ならば、`cat $variable` ではどちらか
>そもそも、' 'と ` ` の意味を理解していない。
>「どちらか」という問い自体が間違い
理解してます。その上で、バッククォーテーションの中で、$varが展開さ
れるかどうかは、マニュアルを読まないことには推測できないと言っている
わけです。
0422名無しさん@お腹いっぱい。
2008/12/03(水) 13:35:13>>推測不可能だ
>マニュアルに載ってる。推測なんて不要。
マニュアルに載っていたとしても、推測できる言語と出来ない言語では、
分かりやすさが全く違ってきます。Makefile なども非常に頭の良い人でも
マニュアルを読まずして推測するのが難しい構文が多いのです。
マニュアルを読まずして推定できる、と言う言語仕様を開発するのは、
ある種の力量が必要なのです。
>(7)
>> =があれば代入だとみなされる
>というわけでもない
シンボル名=
で、代入と見なされるはずです。違うというなら、それはそれで
文脈依存性が強い言語と言うことになりますが。
>(8)
>>シェル変数は小文字、環境変数は大文字
>とは限らない
>(9)
>>シェル変数にpathがあり
>そんなものない
これについては、シェルの種類に依存するようです。
0423名無しさん@お腹いっぱい。
2008/12/03(水) 13:40:33文章の間違いって、許容できるのは漢字の間違いとか、そういうレベルのことだろ。
議論の筋の根幹にかかわる部分で理解不足による間違いがあれば、
議論をしてもポイントずれまくりで話にならない。
シェルスクリプトについて教えて欲しいなら、
素直に「教えてください」って言えよ。
議論ふっかけを装って、実は自分の理解不足なところを質問したいだけだろ?
0424名無しさん@お腹いっぱい。
2008/12/03(水) 13:43:38> 理解してます。その上で、バッククォーテーションの中で、$varが展開さ
> れるかどうかは、マニュアルを読まないことには推測できない
↑
それは「バッククォーテーションを理解していない」という。
そもそも ` ` と $var の展開は別物なんだから。
0425386
2008/12/03(水) 13:46:49>素直に「教えてください」って言えよ。
>議論ふっかけを装って、実は自分の理解不足なところを質問したいだけだろ?
違います。シェルスクリプトの問題点を整理し、新しい言語仕様の策定に
役立てたいと思っているだけです。確かに、現状のシェルスクリプトにつ
いての理解も不十分ではありましたが。その点については反省します
「文脈依存性」について、考えてみましょう。
`xxx`は、コマンドxxxを実行し、その標準出力の結果をそこに展開する、
という意味です。しかし、これも、もし、
expand_stdout("command aaa${var}bbb")
expand_stdout('command aaa${var}bbb')
と書くのであったならば、マニュアルを読むことなく、${var}が展開
されるかどうかが一目瞭然であったんです。
これを、バッククォーテーション一つで実現しようとしたこと自体に
問題があるのではないでしょうか?
0426386
2008/12/03(水) 13:49:03仕様を知りませんが、
`"command ${var}"`
で${var}を展開できるんですか?すか。
だとすると、今度は、double quotation が back quatationの中で
「展開される」
という事実がマニュアルなしでは推定できません。
0427386
2008/12/03(水) 13:54:37--->expand_param("文字列")
「文字列をコマンドとして実行し標準出力を展開する」
--->expand_stdout("文字列")
もし、こういう仕様であったなら、
"$(cat file)" は、丁度、
expand_param(expand_stdout("cat file"))
というように書け、なんの推定の余地もないはずだったのです。
もしこうであったなら、マニュアルを読まなくても、色々な展開パターン
を好きなように書けます。展開の順序も推定の余地がありませんし。
0428386
2008/12/03(水) 13:55:32「文字列中のパラメータ・ラインとして展開する」
--->
「文字列をパラメータ・ラインとして展開する」
0429386
2008/12/03(水) 13:58:41を実行したい、という場合ならば、
expand_stdout(expand_param("command $var"));
で書けるわけです。この場合、""や``の中で色々な記号が「展開」される
かどうかを憶えている必要もないし、マニュアルを読み込む必要もありま
せん。
0430名無しさん@お腹いっぱい。
2008/12/03(水) 13:58:46記述量を多くして読みやすくするための言語じゃない。
前提知識なしに読みやすくしたいなら、外部コマンドを呼ぶにも、
execute_external_command("ls", "-l");
と書くような言語を作らないといけない。
他の適当なスクリプト言語使っとけと。
0431名無しさん@お腹いっぱい。
2008/12/03(水) 13:58:57Google で検索可能だなんて >>417 は言ってないよ。
0432386
2008/12/03(水) 14:01:35「本やネット」で検索できるかどうかを論じているわけです。
ネットで検索する場合、Googleで検索可能でないと、いったい何で
検索可能なんでしょうか?
記号単独の検索でも難しいのに、文脈依存性が高い言語仕様の場合、
探し出すのに非常に時間がかかります。
0434名無しさん@お腹いっぱい。
2008/12/03(水) 14:04:480435386
2008/12/03(水) 14:05:180436名無しさん@お腹いっぱい。
2008/12/03(水) 14:05:46100歩ゆずって、plan9 の rc だ。
もっと勉強しろ。
0438名無しさん@お腹いっぱい。
2008/12/03(水) 14:26:00お前の頭の悪さには負けるよ。
仕様も理解せずに批判しようと言うのだから。
レベルが低すぎて話にならない。
0439名無しさん@お腹いっぱい。
2008/12/03(水) 14:28:0330分で読めるsh(1)さえ読まずに、
批判しようと言うのが間違ってる。
0440名無しさん@お腹いっぱい。
2008/12/03(水) 14:34:08一般人は30分では読めん。
0441名無しさん@お腹いっぱい。
2008/12/03(水) 14:36:18閉鎖的であっただからか。
0442名無しさん@お腹いっぱい。
2008/12/03(水) 14:54:18無理に延命させるスレということでいいよ。
まったく別の言語仕様のシェルがほしいって話なら
perl でも emacs でも好きなものを chsh で設定すればいいじゃないか。
このスレでやることじゃない。
0443名無しさん@お腹いっぱい。
2008/12/03(水) 14:55:45素人でも頑張ればなんとかかんとか使える敷居の低さが普及の最大の要因だと思う。
ところでシェルスクリプトとは全く別のスクリプトの策定に協力しろなどというのはこのスレの趣旨とは違うだろ。
シェルスクリプトで可読性が低いな、とか不便だな、とか思ったことはありませんか?と情報を集めるならばまだしも、議論を求めるのはお門違いだ。
0444名無しさん@お腹いっぱい。
2008/12/03(水) 15:34:04シェル作ろうスレ立てて、
絶対投げ出さずみんなをひっぱっていくくらいの気概があるなら、
ついていくやつもいるんじゃなかろうか。
ここはそういう場ではないということだ。
0445名無しさん@お腹いっぱい。
2008/12/03(水) 19:17:17劣悪な状態だなんて思ってる人いる?
がっちり書きたいならperlなりなんなり使えばいいだけだし
0446名無しさん@お腹いっぱい。
2008/12/03(水) 19:54:280447名無しさん@お腹いっぱい。
2008/12/03(水) 22:19:35Windowsとの親和性が高いことの他にだが。
0448名無しさん@お腹いっぱい。
2008/12/03(水) 22:29:27コマンドインタプリタ/スクリプティング用途には起動が致命的に重くて
俺には使い道が無い
.NETやJava系は、そのプロセス起動の重さのお陰で
Unix流のツールボックスアプローチ的使い方には
全く不向きなプラットフォームだと思っている
計算性能においてははるかに劣るLLの方が、マシ
0449名無しさん@お腹いっぱい。
2008/12/03(水) 22:55:000450>>381
2008/12/03(水) 23:37:48ありがとうございます。
ふと思ったのですが、数値比較の場合、どのようになりますか?
----- コーテーションなし------------------------------------
$ cat hoge.sh
#!/bin/sh
hoge=
if [ $hoge -eq 10 ]; then
echo hello
fi
$ ./hoge.sh
[: -eq: unexpected operator
----- コーテーションあり--------------------------------------
$ cat hoge.sh
#!/bin/sh
hoge=
if [ "$hoge" -eq 10 ]; then
echo hello
fi
$ ./hoge.sh
[: : bad number
どっちにしても、エラーがでる、、、、orz
0451名無しさん@お腹いっぱい。
2008/12/04(木) 00:09:08おそるべきはニートだなと改めておもった
0452名無しさん@お腹いっぱい。
2008/12/04(木) 00:45:33一体何をしたいんだ?
純正シェルでも使えるのか知らんが、適当にデフォルトの値(ここでは0)を決めておいて
${hoge:-0}
と書けば、hoge が宣言されていないか、宣言されているが値が無いときに 0 に評価される
0453名無しさん@お腹いっぱい。
2008/12/04(木) 01:03:380454>>450
2008/12/04(木) 07:03:48おぉ、ありがっとん。
0455名無しさん@お腹いっぱい。
2008/12/04(木) 08:35:29sedの置き換え文字列に改行を含む場合、以下のようになります。
hoge() {
echo "start"
sed 's/hoge/foo \
bar/'
echo "end"
}
しかし、これですと、インデントがそろわず、不恰好になります。
インデントをずらす方法はないでしょうか?
0456名無しさん@お腹いっぱい。
2008/12/04(木) 10:33:510457名無しさん@お腹いっぱい。
2008/12/04(木) 10:37:11sedの内容を、シェル関数外でシェル変数(regex)とかに代入しておいて、
シェル関数内では sed "$regex" と書けば良い。
>>456
気にしろ
0458名無しさん@お腹いっぱい。
2008/12/04(木) 13:03:26あと最近は、OSXのやつらの台頭でスペース文字含みのファイルとか
余裕で出てくるようになったからその辺を気にしないといけなくなった
0459名無しさん@お腹いっぱい。
2008/12/04(木) 13:18:18regewxを定義するところが不恰好になるだけじゃ…
>>455
きにすんな
0460名無しさん@お腹いっぱい。
2008/12/04(木) 13:28:40bar/' | sed -e 's/ //g'`
二行目はhtab使ってるから注意しな。
0461名無しさん@お腹いっぱい。
2008/12/04(木) 13:39:41マニュアルを読まないと推定できないような言語じゃなくて。
0462名無しさん@お腹いっぱい。
2008/12/04(木) 13:47:47だから、インデントのいらない階層であるところの「シェル関数外」で
regexに代入するんだろ。
もともとインデントゼロのスコープに書くんだから、
不恰好にならない。
頭使え。
0463名無しさん@お腹いっぱい。
2008/12/04(木) 14:01:24N='
'
hoge() {
sed "s/hoge/foo ${N}bar/"
}
>>456
気にしろw
0464名無しさん@お腹いっぱい。
2008/12/04(木) 14:06:14なぜかこの環境から書き込むとバックスラッシュが化けるので、、
ダブルクォートの中だからバックスラッシュは2つね。
0465名無しさん@お腹いっぱい。
2008/12/04(木) 23:01:38ってほどでもないかw
0466名無しさん@お腹いっぱい。
2008/12/06(土) 10:43:43気にすんな
0467名無しさん@お腹いっぱい。
2008/12/06(土) 11:20:20>マニュアルを読まないと推定できないような言語じゃなくて。
シェルスクリプトすら書けないんなら、この業界から足をあらってカタギになれ!
0468名無しさん@お腹いっぱい。
2008/12/06(土) 11:29:540469名無しさん@お腹いっぱい。
2008/12/06(土) 11:43:31マニュアルを読んでも推定しかできないんなら、カタギになれ!
0470名無しさん@お腹いっぱい。
2008/12/06(土) 12:07:180471名無しさん@お腹いっぱい。
2008/12/06(土) 13:06:54何言ってんだおまえ
0472名無しさん@お腹いっぱい。
2008/12/06(土) 21:49:180473名無しさん@お腹いっぱい。
2008/12/06(土) 22:13:05FOUND=false
netstat -lnx | grep /tmp/ssh | while read i; do
set -- $i
if [ -O "$9" ]; then
SSH_AUTH_SOCK=$9; export SSH_AUTH_SOCK
SSH_AGENT_PID=`echo $9 | cut -d. -f2`; export SSH_AGENT_PID
FOUND=true
fi
done
$FOUND || eval `ssh-agent -s`
シェルスクリプトでwhileはサブシェルなのだと何回やれば判るのかと・・・
0474名無しさん@お腹いっぱい。
2008/12/06(土) 22:27:370475名無しさん@お腹いっぱい。
2008/12/07(日) 00:28:050476名無しさん@お腹いっぱい。
2008/12/07(日) 00:37:510477名無しさん@お腹いっぱい。
2008/12/07(日) 01:58:210478名無しさん@お腹いっぱい。
2008/12/07(日) 03:53:340479名無しさん@お腹いっぱい。
2008/12/07(日) 15:29:090480名無しさん@お腹いっぱい。
2008/12/07(日) 17:40:520481名無しさん@お腹いっぱい。
2008/12/07(日) 19:13:550482名無しさん@お腹いっぱい。
2008/12/07(日) 20:46:490483名無しさん@お腹いっぱい。
2008/12/07(日) 20:50:130484名無しさん@お腹いっぱい。
2008/12/08(月) 03:56:00もう質問者いなそうだけどOSによっては改行として"^J"を使う手も
vi だと挿入モードの時、ctrl + v してから ctrl + j で入力
sed 's/hoge/foo \
bar/'
を
sed 's/hoge/foo ^Jbar/'
OSを選ぶので汎用性もないしオプションなしのcatやmoreだと"^J"の部分が
改行になるかもと色々問題ありまくりだけど場合によってはこんな方法もってことで
あと"^J"使える場合はヒアドキュメントも cat - <<END^JOK^JEND と1行で書ける
意味あるかどうか人それぞれだろうけど
0485名無しさん@お腹いっぱい。
2008/12/08(月) 11:22:53改行扱えないsedは存在しないんじゃないかな。
0486名無しさん@お腹いっぱい。
2008/12/08(月) 11:45:11そういう問題じゃないんだよ。
もとの質問の >>455 よくよめ
UNIX環境では ^J は改行そのものなので、
>>484 の方法では全く解決にならない。
0487名無しさん@お腹いっぱい。
2008/12/08(月) 12:06:41ぶっちゃけPerl使えばいいんじゃね?
0488名無しさん@お腹いっぱい。
2008/12/08(月) 21:51:54だからちゃんと見てやれよw
0489487
2008/12/08(月) 22:49:22あ、ごめん、俺のは横レスだから>>485あたりの人とは別人
>>455見る限りでは、GNUではないsedだから置換文字列に\nが
使えなくてああいう書き方をしてて、それがいやだってんでしょ?
そう読めたけど
0490名無しさん@お腹いっぱい。
2008/12/08(月) 22:53:55俺には^Jをどう表示するかというエディタの問題に思えるが…
>>456>>459>>466>>487
禿同
0491名無しさん@お腹いっぱい。
2008/12/09(火) 04:04:02分かる方が居たらお願いします。
http://pc11.2ch.net/test/read.cgi/linux/1210999497/611
0492名無しさん@お腹いっぱい。
2008/12/09(火) 10:23:370493名無しさん@お腹いっぱい。
2008/12/09(火) 10:29:170494名無しさん@お腹いっぱい。
2008/12/10(水) 22:03:11if [ 変数 != 文字列A ] | [ 変数 != 文字列B ];then
ERROR処理
fi
ネスト無しでやる場合これって有りかな?
数値じゃないから-oは使えないんでこれしかやりようがなかったんすけど
有識者の方頼みます
0495名無しさん@お腹いっぱい。
2008/12/10(水) 22:08:05| じゃなくて || な。
↓
if [ 変数 != 文字列A ] || [ 変数 != 文字列B ]; then
あと、数式じゃなくても -o 使えるよ。
↓
if [ 変数 != 文字列A -o 変数 != 文字列B ]; then
-o が使えないのは [[ ]] の場合。その場合は、
↓
if [[ 変数 != 文字列A || 変数 != 文字列B ]]; then
0496名無しさん@お腹いっぱい。
2008/12/10(水) 22:12:30意味的には、やりたいことは -o (||) じゃなくて、-a (&&) のような気がする。
0497名無しさん@お腹いっぱい。
2008/12/10(水) 22:14:20この場合、if [ ] よりも case を使った方が簡単に書けるよ。
0498名無しさん@お腹いっぱい。
2008/12/10(水) 22:17:11実は|でいけたんっすよ
テストケース作って試したんですけど、一応正常系も異常系も通りました。。。
-oについては明日また試してみます
ありがとうございます
0499名無しさん@お腹いっぱい。
2008/12/10(水) 22:20:22ミドルのステータスチェックを増やしたんすよ
元が共通シェルだから余り大幅な変更は出来ないんです
caseの方が良いのはその通りなんですが・・
0500名無しさん@お腹いっぱい。
2008/12/10(水) 22:21:10行けたように勘違いしただけで正常に変数チェックされていない。
| は パイプ。パイプでは、A | B の場合、Bが真か偽かしかチェックされない。
(Aは無関係になる)
具体的には、
if [ 変数 != 文字列A ] | [ 変数 != 文字列B ];then
だと、
[ 変数 != 文字列B ] だけがチェックされて、
[ 変数 != 文字列A ] の結果は無視される。
それをたまたま「行けた」と勘違いしただけ。
全然行けてないので勘違いしないように。
0501名無しさん@お腹いっぱい。
2008/12/10(水) 22:25:43確かに文字列Bの追加したステータスチェックは通ったけど、文字列Aは怪しいですね。
了解しました
参考にさせていただきます。
>>495
>>496
>>497
>>500
有難うございました。
0502名無しさん@お腹いっぱい。
2008/12/10(水) 23:16:010503名無しさん@お腹いっぱい。
2008/12/11(木) 01:28:58下の1から3に画面を変えるときは
clearして全部表示しなおすしかないですかね?
表示しなおしたい部分だけ変えるってできないのかな?
1.
□■□
□□□
□□□
2.
□□□
□■□
□□□
3.
□□□
□□□
□■□
0504名無しさん@お腹いっぱい。
2008/12/11(木) 01:57:32エスケープシーケンス出力してカーソル動かせばいい。
zshならcursesモジュールがあるから端末独立なスクリプトも書けるだろうけど。
0505名無しさん@お腹いっぱい。
2008/12/11(木) 08:43:50tput使え。
例えばtput cuu1がカーソルを一行上げる。
tput homeで左上へ移動。
0506名無しさん@お腹いっぱい。
2008/12/11(木) 21:06:49シェルでは無理。
強いてやるなら、echo;echo;echo;echo;.... で画面を全部流してから、
新しい画面の文字を全部 echoし直すしかないかな。
0507名無しさん@お腹いっぱい。
2008/12/11(木) 21:19:520508名無しさん@お腹いっぱい。
2008/12/11(木) 21:25:150509名無しさん@お腹いっぱい。
2008/12/11(木) 21:27:42FreeBSDならcm。
0510名無しさん@お腹いっぱい。
2008/12/11(木) 23:25:310511名無しさん@お腹いっぱい。
2008/12/11(木) 23:37:36tputって OS間の互換性ないんだな。
0512名無しさん@お腹いっぱい。
2008/12/15(月) 22:27:41HP-UX11iv2orv3でファイルをある一定の法則に従う複数のディレクトリにコピーするコマンドについて
お知恵をお貸しください。
たとえば、下記のようなディレクトリに同一のファイルを配置したいのですが
論理ホスト名が異なるサーバでも同じコマンドで実行できるようできませんか。
/etc/opt/論理ホスト名1/sh/
/etc/opt/論理ホスト名2/sh/
/etc/opt/論理ホスト名3/sh/
RHELの場合、下記コマンドで実行できたのですが
HP-UXでは、{}を単独で使わないと、検索したパスに置き換えてくれないようです。
(下記記述だと{}を{}そのもので認識されてしまいました。)
find /etc/opt/ -type d -path */sh -exec cp 配布元ファイル {}/配布先ファイル \;
配布元ファイル名と配布先ファイル名は、異なる場合でも対応できるようにしたいです。
よろしくお願いします。
0513名無しさん@お腹いっぱい。
2008/12/15(月) 22:31:32for dir in /etc/opt/*/sh
do
cp 配布元ファイル $dir/配布先ファイル
done
0515名無しさん@お腹いっぱい。
2008/12/21(日) 16:32:11http://ash.jp/ash/src/csh/tree.txt
どうせならファイルの詳細情報も表示させたいと思っています。
今のままだと以下の表示なのですが、
+---bin/
+---boot/
| +---efi/
| | +---EFI/
以下のように表示させたい。どうすればよいですか?
+---bin/ drwxr-xr-x 2 root root 4096 2008-12-21 16:11
+---boot/ drwxr-xr-x 5 root root 1024 2008-10-26 05:21
| +---efi/ drwxr-xr-x 13 root root 4200 2008-12-21 16:03
| | +---EFI/ drwxr-xr-x 115 root root 12288 2008-12-21 16:11
0516名無しさん@お腹いっぱい。
2008/12/21(日) 17:03:18「以下のawkで代用しているのですが」みたいに書くのか?
0517名無しさん@お腹いっぱい。
2008/12/21(日) 17:20:45すみませんが、質問だけに答えてください。
0518名無しさん@お腹いっぱい。
2008/12/21(日) 17:31:31\/┏┷┓\/
。┃お┃。
゙ # ゚┃断┃; 。
; 。 ・┃り.┃・ #
。 ;゙ #┃し.┃# 。
゙・# : ┃ま┃。 ; 。
.;:# ゙。゚┃す┃゚ 。 #
; 。;; ゙.:。┗┯┛。 # : #
. ハ,,ハ |
. ( ゚ω゚ ) |
:/ つΦ
0519名無しさん@お腹いっぱい。
2008/12/21(日) 21:35:57シェルで代用とはどういう事ですか?
0520名無しさん@お腹いっぱい。
2008/12/21(日) 22:53:31シェルで代用もご存知ない方には聞いていません。
ハイ、次のもっと優秀な回答者
↓
0521名無しさん@お腹いっぱい。
2008/12/21(日) 23:17:51Emacsスレか?
0522名無しさん@お腹いっぱい。
2008/12/22(月) 01:26:400523名無しさん@お腹いっぱい。
2008/12/22(月) 10:13:410524名無しさん@お腹いっぱい。
2008/12/22(月) 10:23:110525名無しさん@お腹いっぱい。
2008/12/22(月) 15:25:41不便なのでシェルを作ろうと思うのですが、
具体的にはどう作ればいいですか?
0526名無しさん@お腹いっぱい。
2008/12/22(月) 15:32:500527名無しさん@お腹いっぱい。
2008/12/24(水) 22:22:39うまいこといきますか
ちなみにディレクトリ名は日本語だったりスペースありだったり()あったりです。
0528名無しさん@お腹いっぱい。
2008/12/24(水) 22:38:09改行がないなら、findして、/の個数を数えて、最大値でも出せばどうかね?
0529名無しさん@お腹いっぱい。
2008/12/24(水) 22:57:34find ./ -type d だと再帰的になってしまうので
ls -l | egrep '^d' | awk ' { print $8 } '
みたいにしたら、スペース込みのディレクトリ名の場合8カラム目以降消えてしまうし
0530名無しさん@お腹いっぱい。
2008/12/24(水) 23:00:070531名無しさん@お腹いっぱい。
2008/12/24(水) 23:18:57ちっと出直してきます
0532名無しさん@お腹いっぱい。
2008/12/25(木) 06:51:30(-depthはあっても-maxdepthがないfindは存在する)
0533名無しさん@お腹いっぱい。
2008/12/25(木) 07:54:35-depth 1 -type d で要求は満たす。
-maxdepth 1 を指定すれば効率はよくなるだろうけど、
ないと無理という根拠が不明。
0534名無しさん@お腹いっぱい。
2008/12/25(木) 07:56:58おいおい、何か勘違いしてないか?
-depth に引数は付かない。
全く要求を満たさない。
試してから書けよな。
0535名無しさん@お腹いっぱい。
2008/12/25(木) 08:02:07一般のfindの-depthじゃ、>>534 の言う通り、無理なんだよ。(例:Solaris)
0536名無しさん@お腹いっぱい。
2008/12/25(木) 08:13:340537名無しさん@お腹いっぱい。
2008/12/25(木) 08:49:500538名無しさん@お腹いっぱい。
2008/12/25(木) 12:01:090539名無しさん@お腹いっぱい。
2008/12/25(木) 13:53:10はいって何?
出来るの?
さっきから何度も。
はいって言葉の重みわかってる?
いま出来ますって断言したんだよ君。
その責任の重さわかってんの?
社会に出たらもっと自分の言葉に責任持てよ。
ん?
社会人の一言一言に掛かる責任の重さが分かってないだろ全然。
学生気分でやってんだったら帰ってもらうよ。
とにかく明日はもう来なくていいから。
0540名無しさん@お腹いっぱい。
2008/12/25(木) 16:31:480541名無しさん@お腹いっぱい。
2008/12/25(木) 22:30:580542名無しさん@お腹いっぱい。
2008/12/25(木) 22:31:230543名無しさん@お腹いっぱい。
2008/12/25(木) 22:34:56.で始まったりすると面倒じゃね
0544名無しさん@お腹いっぱい。
2008/12/25(木) 22:50:31標準bourne shellにこだわらなければ、
.で始まるファイルをファイル展開に含める方法があるシェルが最近は多い。
0545名無しさん@お腹いっぱい。
2008/12/25(木) 22:59:070546名無しさん@お腹いっぱい。
2008/12/25(木) 23:06:48..aaが含まれない。
.* *で.と..を省いた方がまだいい。
0547名無しさん@お腹いっぱい。
2008/12/26(金) 06:44:520548名無しさん@お腹いっぱい。
2008/12/26(金) 22:53:28find hogedir -type f | wc -l
とかしか無いの?
かっこいいのないのかね
0549名無しさん@お腹いっぱい。
2008/12/26(金) 23:10:570550名無しさん@お腹いっぱい。
2008/12/27(土) 03:40:29hogedir 以下にディレクトリがあっても空とみなすの?
0551名無しさん@お腹いっぱい。
2008/12/27(土) 04:20:31$ cat a.dat
111
AAA
BBB
CCC
222
$ cat b.dat
AAA
BBB
CCC
$ cat c.dat
DDD
EEE
FFF
で、以下のように実行(hogeコマンドはあくまでイメージです)すると、
-------------------------
$ hoge -t a.dat -s b.dat -d c.dat
111
DDD
EEE
FFF
222
-------------------------
上のようになるコマンドはありますでしょうか?
そのようなコマンドがない場合、みなさんだったらどのようにこの置換えを行いますか?
0552名無しさん@お腹いっぱい。
2008/12/27(土) 09:37:21-sにあるものを
対応する-dの行で置き換えるってこと?
$ cat b.dat
BBB
AAA
なら、
111
EEE
DDD
CCC
222
ってこと?
0553名無しさん@お腹いっぱい。
2008/12/27(土) 10:20:010554名無しさん@お腹いっぱい。
2008/12/27(土) 12:05:09case `ls -A hogedir` in '') 空の場合の処理;; esac
の方が、wcがいらない分まし。
0555名無しさん@お腹いっぱい。
2008/12/27(土) 14:40:01違います。すいません説明がたりませんでした。
ある領域に一致するものを、別の領域に置き換えるという意味です。
>>552の場合は、一致しないので置き換えないようになります。
0556名無しさん@お腹いっぱい。
2008/12/27(土) 14:41:290557名無しさん@お腹いっぱい。
2008/12/27(土) 16:36:16b.datの内容(3行全部)に完全に一致する部分を、
c.datの内容で置き換えるってことか。
0558名無しさん@お腹いっぱい。
2008/12/27(土) 16:45:17妥当だろうか。
ディレクトリのハードリンクについては考えないことにする。
0559名無しさん@お腹いっぱい。
2008/12/27(土) 16:45:550560名無しさん@お腹いっぱい。
2008/12/27(土) 16:50:31→ ディレクトリを含まないディレクトリ (通常ファイルはたくさんあっていい)
0561名無しさん@お腹いっぱい。
2008/12/27(土) 17:37:58だから、全然妥当じゃないねw
0562名無しさん@お腹いっぱい。
2008/12/27(土) 20:47:01MacOS XのHFS+→ファイルを作ると . へのンク数+1
Linuxのext3→ファイルを作ってもリンク数は増えない
となった。
0563名無しさん@お腹いっぱい。
2008/12/27(土) 20:57:40そのとおりです!
0564名無しさん@お腹いっぱい。
2008/12/27(土) 22:35:22おおむね妥当というか、定番の方法。
ただし、ダメなことがあるので、そのショートカットは省略できるように
色々なツールがオプション持ってるけどね。
0565名無しさん@お腹いっぱい。
2008/12/27(土) 22:45:04なんでやねん。
それは、ディレクトリが「leaf」かどうかを判断する方法であって、
「空」かどうかの判断にはなっていない。
ディレクトリ中に普通のファイルが存在しても、リンクカウントは2のままなんだから。
0566名無しさん@お腹いっぱい。
2008/12/28(日) 09:20:08それだとrmdirしてみるくらいしか思いつかないなぁ。
0567名無しさん@お腹いっぱい。
2008/12/28(日) 12:50:040568名無しさん@お腹いっぱい。
2008/12/28(日) 13:14:220569名無しさん@お腹いっぱい。
2008/12/28(日) 14:45:240570名無しさん@お腹いっぱい。
2008/12/28(日) 17:03:01awk駆使するしかないかなー。
何気にあってもいいような気がするんだけど、そんなコマンドないんだよねー。
0571名無しさん@お腹いっぱい。
2009/01/05(月) 01:38:25/home/hoge
ディレクトリにある全てのファイルの改行コードを全部LF変更して上書きするシェルスクリプトを書きたいのですが、どう書けばよいでしょうか??
nkf -w -Lu samble.txt > sample.text
のようにやればよいのは知っているのですが、全ファイル一気に処理したい場合どうすればよいか分かりません。
ご教示いただけると幸いです。
0572名無しさん@お腹いっぱい。
2009/01/05(月) 01:39:17↓
LFに変更
です。。
0573名無しさん@お腹いっぱい。
2009/01/05(月) 02:19:31> nkf -w -Lu samble.txt > sample.text
> のようにやればよいのは知っているのですが
あかんで!
perl -iでも使えば。Encode/jcodeで変換して。
シェルスクリプトなら、
for i in *.txt; do
nkf -w -Lu $i > $i.--$$--
# 必要ならば yes no | mv -i $i $i.org
mv $i.--$$-- $i
done
0574名無しさん@お腹いっぱい。
2009/01/05(月) 07:44:10以下で桶。
↓
#!/bin/sh
cd /home/hoge
for file in *.txt
do
out_file=`basename "$file" .txt`.text
nkf -w -Lu "$file" > "$out_file"
done
>>573
> あかんで!
↑
なんであかんの?w
.txtと.textを読み落したか?w
上書きはしないよw
0575名無しさん@お腹いっぱい。
2009/01/05(月) 08:08:460576名無しさん@お腹いっぱい。
2009/01/05(月) 08:54:26% nkf -w -Lu --in-place=.bak *.txt
じゃね
0577名無しさん@お腹いっぱい。
2009/01/05(月) 09:53:01それはへ理屈。
>>573 の回答を見れば、.txtを.txtに変換しようとしてるので、
質問を読み間違えてるのは明らか。
しかも、スペース入りファイル名があると正常動作しないし。
知ったか回答者の典型。
0578名無しさん@お腹いっぱい。
2009/01/05(月) 12:43:33tr -d "\r" < input.txt > output.txt
で改行コードが変換できる。
0579名無しさん@お腹いっぱい。
2009/01/05(月) 18:58:46という命題は真ですか?
0580名無しさん@お腹いっぱい。
2009/01/05(月) 19:44:540581名無しさん@お腹いっぱい。
2009/01/05(月) 19:50:14ハイ、次の回答者。
0582名無しさん@お腹いっぱい。
2009/01/05(月) 20:03:210583名無しさん@お腹いっぱい。
2009/01/05(月) 20:39:020584名無しさん@お腹いっぱい。
2009/01/05(月) 21:00:140585名無しさん@お腹いっぱい。
2009/01/05(月) 21:15:470586名無しさん@お腹いっぱい。
2009/01/06(火) 12:55:50似たようなもんだな。
0587名無しさん@お腹いっぱい。
2009/01/06(火) 13:48:060588名無しさん@お腹いっぱい。
2009/01/06(火) 14:13:16perlがあってもsedやawkは使うしもちろんシェルスクリプトも使う
オナニー万歳
0589名無しさん@お腹いっぱい。
2009/01/06(火) 14:29:480590名無しさん@お腹いっぱい。
2009/01/06(火) 14:31:13perlぐらいフツーっすよ
0591名無しさん@お腹いっぱい。
2009/01/06(火) 14:32:560592名無しさん@お腹いっぱい。
2009/01/06(火) 14:39:18awkがメイン
0593名無しさん@お腹いっぱい。
2009/01/06(火) 14:43:020594名無しさん@お腹いっぱい。
2009/01/07(水) 00:45:440595名無しさん@お腹いっぱい。
2009/01/07(水) 00:54:34どうもうまくいかない。
>telnet POP3.net 110 > mail
user MYID
pass MYPASS
retr 1
quit
Connection closed by foreign host.
>
となりうまくいくんだけど、
telnet POP3.net 110 << EOF
user MYID
pass MYPASS
retr 1
quit
EOF
というのをリダイレクトすると
Connected to POP3.net
Escape character is '^]'.
Connection closed by foreign host.
となり全然駄目。
ものすごい致命的な間違い、勘違いがありそう。
とりあえずこれから
man telnet
www.ietf.org/rfc/rfc1939.txt
を一通り読むんですが、その前に間違いを指摘して下さいな。
0596名無しさん@お腹いっぱい。
2009/01/07(水) 01:07:340597名無しさん@お腹いっぱい。
2009/01/07(水) 01:13:230598名無しさん@お腹いっぱい。
2009/01/07(水) 01:27:44netcat,nc初めて聞きます。調べておこう。
>>597
どうも助かります。
>telnetは標準入力じゃなくてttyを入出力とするからリダイレクト出来ない
となると、
>telnet hoge.net < `tty` という具合ですね。
別の端末から
>echo "user MYID" > /dev/あっち とか。
telnetをやるスクリプトを動かすスクリプトを書いて
上位からttyへ流し込むとか。
いろいろやってみますね。
どうもサンクスです。
0600名無しさん@お腹いっぱい。
2009/01/07(水) 08:36:31UNIX FAQにあるように echo と sleep で
間隔開けて1行ずつ出せばいけたかも
0601名無しさん@お腹いっぱい。
2009/01/07(水) 09:58:530602名無しさん@お腹いっぱい。
2009/01/07(水) 10:01:37>>599
0603名無しさん@お腹いっぱい。
2009/01/07(水) 11:04:240604595
2009/01/08(木) 22:29:27セキュリティ絡みでひっかかって駄目みたい。
ok
ok
ok
とくるからpassまではいけてるから、そっから先に
いろいろあるんだろうなあ。
ぐぐったらperlのスクリプトが沢山あったから、
参考にしてみます。
0605571
2009/01/09(金) 02:21:36御礼遅れてすいません。ありがとうございました!
--overwrite なんてオプションあったんですね。知りませんでした。
あとすいません、573の方が書いてくださったシェルスクリプトの--&&-- ってのはどういう意味でなのでしょう?
ご教示いただきたくm(_ _)m
0606名無しさん@お腹いっぱい。
2009/01/09(金) 07:14:00こりゃ便利です。移行もスムーズです!!!
0607名無しさん@お腹いっぱい。
2009/01/09(金) 07:16:59--&&-- じゃなく --$$-- な。
echo --$$--
ってやってみ。
別に .aho でも .baka でも .tmp でもいいんだろうが、
.bak だと同名のファイルが既に存在していて壊してしまうおそれが高いし、
.--$$-- ならその可能性は低いだろうと、それだけのこと。
0608名無しさん@お腹いっぱい。
2009/01/09(金) 10:07:01シェルってゆうな。クズ。
0609571
2009/01/09(金) 11:29:11すいません、あとひとつお聞きしたいのですが
outfile=`basename "$file" .txt` .text
で、
""は必要ですか??
試してみると
outfile=`basename $file .txt` .text
でもできました。
0610名無しさん@お腹いっぱい。
2009/01/09(金) 11:39:040611名無しさん@お腹いっぱい。
2009/01/09(金) 11:39:54" " は必要。
" "がないと、スペースとか、特殊記号を含んだファイル名で正常動作しない。
0612名無しさん@お腹いっぱい。
2009/01/09(金) 11:45:58思った方がいいので当面必要無くても常にダブルクォートを付けるルールを守ること
その意味で >>573 は失格
0613名無しさん@お腹いっぱい。
2009/01/09(金) 11:47:57> 特殊記号を含んだファイル名
問題になるな特殊記号って?
0614名無しさん@お腹いっぱい。
2009/01/09(金) 11:48:530615名無しさん@お腹いっぱい。
2009/01/09(金) 11:51:310616名無しさん@お腹いっぱい。
2009/01/09(金) 11:58:140617名無しさん@お腹いっぱい。
2009/01/09(金) 12:14:32てくるなら)普通にメタキャラクタのチェックしないと危険だろ。
0618sage
2009/01/10(土) 14:55:140619名無しさん@お腹いっぱい。
2009/01/10(土) 15:11:30そんなコマンドは見たことないな。
置き換え対象のファイルがあまり大きくないならperlかなにかで
一つの文字列にまるごと読み込んで置換するのが楽だと思う。
メモリにおけないぐらいでかいファイルなら工夫が必要だけど
0620名無しさん@お腹いっぱい。
2009/01/10(土) 21:49:06今一何をしたいのかよく分からないんだけど、
a.datとb.datを評価して違っていればc.datに置き換えると解釈して書いてみた。
#!/bin/sh
File_line_digit(){
FLINE=`cat "$1" | wc -l | sed 's/[[:blank:]]*//'`
echo "$FLINE"
}
Use_line_strings(){
STRINGS=`head -n "$1" "$2" | tail -n 1`
echo "$STRINGS"
}
続く
0621名無しさん@お腹いっぱい。
2009/01/10(土) 21:49:26TWONUM=1
THREENUM=1
ONEEND=`File_line_digit "$1"`
TWEEND=`File_line_digit "$2"`
THREEEND=`File_line_digit "$3"`
while [ "$ONENUM" -ne `expr "$ONEEND" + 1` ]
do
ONESTR=`Use_line_strings "$ONENUM" "$1"`
TWOSTR=`Use_line_strings "$TWONUM" "$2"`
THREESTR=`Use_line_strings "$THREENUM" "$3"`
if [ "$ONESTR" = "$TWOSTR" ]
then
echo "$THREESTR"
ONENUM=`expr "$ONENUM" + 1`
TWONUM=`expr "$TWONUM" + 1`
THREENUM=`expr "$THREENUM" + 1`
else
echo "$ONESTR"
ONENUM=`expr "$ONENUM" + 1`
fi
done
0622名無しさん@お腹いっぱい。
2009/01/11(日) 01:00:39それ以前にブログラミングのセンスなさすぎだろ
関数名も変数名も処理内容もださすぎ
0623名無しさん@お腹いっぱい。
2009/01/11(日) 01:39:260624名無しさん@お腹いっぱい。
2009/01/11(日) 03:29:310625名無しさん@お腹いっぱい。
2009/01/11(日) 09:06:20とりあえず、頭の関数ひとつだけ添削してやるよw
File_line_digit(){
FLINE=`wc -l < "$1"`
echo $FLINE # ここは、わざとダブルクォートを付けない
}
↑のようにすれば、wc -l の出力のスペースをカットするために
わざわざsedを使う必要がない。あと、もちろんcatは不要。
wc -l の出力にファイル名が付かないように、
標準入力からリダイレクトする。
0626名無しさん@お腹いっぱい。
2009/01/11(日) 11:42:35自分で見直しても読みにくいの書いてすいません(藁
出直してきます。
>>625
目から鱗です。
0627571
2009/01/12(月) 13:28:520628名無しさん@お腹いっぱい。
2009/01/12(月) 14:18:39何故か思うように動かない。
考え方としては有っていると思うのだが、
最後のif文の比較がどうしても真にならない。
set -x して、トレースしたら同じ文字列のはずだし、
空白が混入しているようにも思えないのだが・・
0629628
2009/01/12(月) 14:22:44searchLine=`head -n 1 "$2"`
fullLines=`echo \`wc -l < "$1"\` `
matchLines=`echo \`wc -l < "$2"\` `
matchPat=`tr '\012' ' ' < "$2"`
while [ $fullLines -ge $matchLines ]
do
cmpPat=`tail -n $fullLines "$1" | \
awk '
$0 !~ /^'"$searchLine"'$/ {
print > "/dev/tty"
}
/'"$searchLine"'/{
cmpPat = $0
for ( i = 1 ; i < '"$matchLines"' ; ++i ) {
getline addLine
cmpPat = cmpPat " " addLine
}
print cmpPat
nextfile
}'`
if [ "$cmpPat" = "$matchPat" ]
then
cat "$3"
$fullLines=`expr $fullLines - $matchLines`
else
fullLines=`expr $fullLines - 1`
fi
done
tail -n $fullLines "$1"
0630628
2009/01/12(月) 14:37:35そもそも、そこに処理が行かないわけで・・
0631628
2009/01/12(月) 14:57:09trが最後に改行が無くても空白を追加していました。
しかし、どうも上記はまだまだ使い物になりません。
もう少し精進します。
てか、これ、結構ムズい。
0632628
2009/01/12(月) 15:29:55#!/bin/sh -
searchLine=`head -n 1 "$2"`
fullLines=`echo \`wc -l < "$1"\` `
matchLines=`echo \`wc -l < "$2"\` `
matchPat=`tr '\012' ' ' < "$2"`
while [ $fullLines -ge $matchLines ] ; do
cmpPat=`tail -n $fullLines "$1" | \
awk '
$0 !~ /^'"$searchLine"'$/ {
print > "/dev/tty"
nextfile
}
$0 ~ /^'"$searchLine"'$/{
cmpPat = $0
for ( i = 1 ; i < '"$matchLines"' ; ++i ) {
getline addLine
cmpPat = cmpPat " " addLine
}
cmpPat = cmpPat " "
print cmpPat
nextfile
}'`
if [ "$cmpPat" = "$matchPat" ]
then
cat "$3"
fullLines=`expr $fullLines - $matchLines`
fi
fullLines=`expr $fullLines - 1`
done
tail -n $fullLines "$1"
0633名無しさん@お腹いっぱい。
2009/01/12(月) 18:48:110634名無しさん@お腹いっぱい。
2009/01/12(月) 22:40:43そうは言うけど、>>551の設問を
>>557の要件で満たすのは大変だぞ。
現に誰もまともな解答例が無いだろう。
仮に三つのファイルを
1・対象ファイル
2・参照ファイル
3・置換ファイル
として、1の行数が不定の上、
2が何回マッチするかも不定で、
シェルスクリプト流に一行づつ処理するならば
途中でマッチしないことが判明したら、仕切り直さないといけない。
(でも、マッチしたらその分行を進めないといけない)
いっそC言語とかで書いて、2のファイルを読み出して保持しておき、
同じサイズのバッファをmallocとかで確保し、順次改行迄ごとに1のファイルを読んで、
strcmpとかする方が楽に思える。
無駄な処理が実に多いのは承知の上で、
tail と awk の合わせ技で料理したのに、
実に君は無礼だな。
0635名無しさん@お腹いっぱい。
2009/01/13(火) 02:34:49富豪的にrubyとかperlでやった方がマシでしょ
#!/usr/bin/env ruby
# -*- coding: utf-8; -*-
abort unless ARGV.size == 3
open(ARGV.shift).read.\
gsub(/#{Regexp.escape(open(ARGV.shift).read)}/m,open(ARGV.shift).read).\
display
まあワンライナーだよな
0636名無しさん@お腹いっぱい。
2009/01/13(火) 07:55:53cat a.dat b.dat c.dat | uniq
おまいら大丈夫か?
0637名無しさん@お腹いっぱい。
2009/01/13(火) 07:57:11>まあワンライナーだよな
ぷぷぷ
0638名無しさん@お腹いっぱい。
2009/01/13(火) 08:00:14>>557 を欲詠め
あなたの回答は全くの見当違い
0639名無しさん@お腹いっぱい。
2009/01/13(火) 12:20:07多大なるヒントを有難う。
やっぱりawkだけで書けるわ。
#!/bin/sh -
searchLine=`head -n 1 "$2"`
matchLines=`echo \`wc -l < "$2"\` `
cmpList=`tr '\012' ' ' < "$2"`
awk '
$0 !~ /^'"$searchLine"'$/ {
print $0
next
}
$0 ~ /^'"$searchLine"'$/ {
matchList = $0
for ( i = 1; i < '"$matchLines"'; ++i ) {
getline
matchList = matchList " " $0
}
matchList = matchList " "
if ( matchList ~ /^'"$cmpList"'$/ ) system("cat '"$3"'")
else {
sizeOfArray = split(matchList, pArray, " ")
for ( i = 1; i <= sizeOfArray; ++i)
print pArray[i]
}
}' "$1"
0640名無しさん@お腹いっぱい。
2009/01/13(火) 12:26:52BEGINで$1, $2のファイル読み込むといいと思うよ。
awkは(初期のを除いて)リダイレクト使えるから。
# すれ違いっぽいからコードは書かないけど
0641名無しさん@お腹いっぱい。
2009/01/13(火) 15:30:14有難う御座います。
awkでの正規表現中での変数展開のやり方が分からず、
先にシェルに展開してもらう方法をとっていましたが、
今調べたり、それを元にゴソゴソやって。
$0 ~ "^"var"$" { とか
if ( var1 ~ "^"var2"$" ) で、
どうやら完全一致を取り出せそうなことが分かりました。
0642名無しさん@お腹いっぱい。
2009/01/13(火) 16:42:25右辺が文字列型の値の場合は正規表現パターンを表すとみなす。
だからawk -v arg1="XXX"{ BEGIN { searchLine=arg1 } $1 ~ searchLine { ...って出来る。
awk本のオリジナルawkは、"-v"なしで代入式だけを書かないといけないんだけど。
"-v"はnawk移行かな? 今はほとんど全部"-v"が必要なはずと思う。
0643名無しさん@お腹いっぱい。
2009/01/13(火) 16:43:35と書いたつもりでした。
0644名無しさん@お腹いっぱい。
2009/01/13(火) 21:12:10正規表現中の「'」がうまく認識されるのですか?
awk '
$0 !~ /^'
ここでぶったぎられそうな気がするのですが。
0645名無しさん@お腹いっぱい。
2009/01/13(火) 21:23:35ぶったぎられる、というのはその通り。
ところが、その直後にスペースを入れずに "$searchLine" と続けているから、
結局これら全体がシェル上で「1つの引数」になって awkに渡される。
0646名無しさん@お腹いっぱい。
2009/01/13(火) 22:38:22単にシェルが「'」を食べるだけ。
#!/usr/bin/awk -f というスクリプトを考えたら良い。
そう言う場合は「'」は不要でしょう?。
要するに、「'」と「'」に挟まれたところをシェルがそのまま awk に渡し、
その外側の部分を、シェルが先に解釈(展開)すると言うだけの事。
最終的には全部 awk に渡される。
0647名無しさん@お腹いっぱい。
2009/01/13(火) 22:44:06違うよ。
>>645
が正解。
0648名無しさん@お腹いっぱい。
2009/01/13(火) 23:13:01$set 'Path'" $HOME "' is my home.'
$ echo $1
Path /home/foo is my home.
##
$ set 'Path' "$HOME" ' is my home.'
$ echo $1
Path
$ echo $2
/home/foo
$ echo $3
is my home.
こういうことだけど。
文字列の間に空白がないから一つになってる。
0649名無しさん@お腹いっぱい。
2009/01/13(火) 23:14:10むむ。
>>645 は、何も言っていないに等しいとしか読めない。
スペースの有る無しは変数名が変わると言うことだし、
awk への引数ではなく、その文脈上の展開した値として単純に awk に渡されると
認識している。
念を押すが、awk (にしろ他のコマンドにしろ)「'」の存在は知らない。
0650名無しさん@お腹いっぱい。
2009/01/13(火) 23:17:03??
0651名無しさん@お腹いっぱい。
2009/01/13(火) 23:28:32なるほど。ありがと。
0652名無しさん@お腹いっぱい。
2009/01/14(水) 03:13:11ペタってコード書ける言語って、
他になにがありますかね。
0653名無しさん@お腹いっぱい。
2009/01/14(水) 03:55:52引数にコード渡せればいいだけだから。
0654名無しさん@お腹いっぱい。
2009/01/14(水) 06:50:56あなた、微妙に理解がズレてますよ。
>スペースの有る無しは変数名が変わると言うことだし、
↑
じゃなくて、awkは1番目の引数の文字列内容を「プログラム」と認識するので、
シェル上ではスペースを入れないで繋げるということが重要。
>念を押すが、awk (にしろ他のコマンドにしろ)「'」の存在は知らない。
↑
そんなことは当たり前。その点が問題になってるんじゃないの。
>>648 が説明しようとしてるとおり、
awk 'awkのプログラムの前半'"$シェル変数"'awkのプログラムの後半'
と、(クォートの中を除いて)スペースを入れずに書くことが重要で、
これが awkには、
「awkのプログラムの前半」と「$シェル変数の中身」と「awkのプログラムの後半」
が連結されて「1つの引数」として渡される。「1つの引数」が重要。
元の >>644 の質問では、1つの引数の引数になるべきところの途中で
つまり、「awkのプログラムの前半」の最後で一旦シングルクォートが閉じているのに、
なぜそこで引数が分断されないのか? という質問。
それに対して >>646 の回答はズレている。
最初の >>645 の回答が的確。
0655名無しさん@お腹いっぱい。
2009/01/14(水) 08:34:47間違ってないと思うょ
真っ赤になって相手を否定するのこそ間違ってる
0656名無しさん@お腹いっぱい。
2009/01/14(水) 09:21:08「>>645 は、何も言っていないに等しいとしか読めない。」
なんて発言しちゃってるから、
>>645 の意味が理解できてないみたいだね。
>>645 の解答が出た後で、
なんでピンボケな >>646 のカキコがあるのか不思議に思ってた。
あと、>>649 氏の発言をもうひとつ指摘、
「スペースの有る無しは変数名が変わると言うことだし」
もしかして、『変数』と『引数』の用語を混同してますか?
もしスペースがあって、awkプログラム部分が複数の『引数』に分かれてしまうと、
そもそもawkは正常動作しませんよ。変数名が変わるだけの問題では済みません。
0657名無しさん@お腹いっぱい。
2009/01/14(水) 13:33:15>>>>645 は、何も言っていないに等しいとしか読めない。
のはそのとおりで、実際に質問の答えになっていない。
空白が無いかどうかではなく何でぶった切られないかと言うのが質問。
だから「,」の外側はシェルが解釈出来る内容であれば良いが、
空白があればシェルによって別の引数として扱われるのは別の問題だし、
要するに
awk 'N''R == '`expr 1 + 1`' { pr''in''t'' }' file
がちゃんと動くことの説明としては、不足がある。
0658名無しさん@お腹いっぱい。
2009/01/14(水) 13:50:450659名無しさん@お腹いっぱい。
2009/01/14(水) 13:56:28空白が有っても動く例
echo 'wa' `echo r\`echo o\`` 'ta'
cシェルじゃ動かないが
0660名無しさん@お腹いっぱい。
2009/01/14(水) 14:03:49それ、3つの引数に分断されるよ。echoだから結局問題にならないだけで、
awkだと動かない。
0661名無しさん@お腹いっぱい。
2009/01/14(水) 14:05:40> awk 'N''R == '`expr 1 + 1`' { pr''in''t'' }' file
↑は、awkのプログラム部分には空白がないじゃん。
だから「1つの引数になる」という説明(>>645)のとおり。
`expr...`の部分はバッククォートだから、
「クォートされていない空白」はない。
>>646 は、要約すると、「シングルクォートがシェルによって除去されること」
だけしか言ってなくて、それは当たり前だし、それだと、
途中のシングルクォートのところで「なぜ引数が分断しないのか」の
説明になっていない。
本質問者と思われる、>>651 さんが、
>>648 の解答を「なるほど」と言っているので、
質問したかったことは「引数がなぜ1つになるのか」と言うことであることは明らか。
結論: 早期解答の >>645 が正解。
0662名無しさん@お腹いっぱい。
2009/01/14(水) 14:16:13>>質問したかったことは「引数がなぜ1つになるのか」と言うことであることは明らか。
君はエスパーか?
もし仮にそう言う意図で質問していたとしたら
>>644では言葉が足りなさすぎる。
>>659のようなものに対しても当てはまる質問と読むのが妥当。
従って、>>645は何の説明にもなっていない。
まあ、エスパー相手じゃこっちに勝ち目は無いが。
0663名無しさん@お腹いっぱい。
2009/01/14(水) 14:24:31× >>645 は何の説明にもなっていない
○ >>662 の頭脳では、せっかくの >>645 の説明が理解できない。
エスパーしなくても、
もう一度 >>648 の書き込みを見てみろ。
複数のクォート同士を、「空白」を入れた場合と入れない場合で説明してるだろ。
それに対して、質問者が「なるほど」と言って理解したんだから。
ポイントは、シェルの単語分割(引数分割)の際の「空白」について。
0664名無しさん@お腹いっぱい。
2009/01/14(水) 14:31:19>>644 と >>651 が、同一人物だと見抜けてるし。
>>644 の質問から「引数がなぜ1つになるのか」という意図を見抜いたし。
常人には真似のできないことをするからエスパー。
ちなみに >>648 を何度読んでも
「それはそうですが、何か?」
と言う感想しか抱けない。
0665名無しさん@お腹いっぱい。
2009/01/14(水) 14:42:10なんだ、>>664 は >>648 が的を得た解答であることすら理解できてなかったのかw
awkにおいては、awkプログラムを、シェルから見て第1引数(argv[1])に与えることが
重要。
シェルスクリプトの中からawkを呼ぶ場合、awkプログラムの文字列が
シェルに解釈されるのを防ぐため、通常、全体をシングルクォートで囲むが、
そのシングルクォートの中の一部だけ、シェル変数で置き換えたい場合がある。
そんな時は、awkプログラムの途中で一旦シングルクォートを閉じて終了する。
(これが、>>644 が言う「ぶった切れる」)
その直後に、「空白を入れずに」ダブルクォート付きでシェル変数を記述する。
その直後、再び「空白を入れずに」シングルクォートでawkプログラムの続きを書く。
この、複数のシングルクォートやダブルクォート同士の間に空白を入れないこと、
空白を入れるとシェル上で別の引数に分断されること、
awkでは「1つの引数としてプログラムを書く」必要があること、
と言うのが問題の本質。
>>645 はその答を簡潔に先に言っている。
0666名無しさん@お腹いっぱい。
2009/01/14(水) 14:53:49妹が泣いてるぞ
0667名無しさん@お腹いっぱい。
2009/01/14(水) 14:56:51>>644は明らかにシェル変数もクォートされていると誤解した書き方だろう。
さらに一個目の「,」と二個目の「,」の間だけがコマンドに渡るはずと言う誤解。
その部分に対して一切>>645は示唆を与えていない。
別にawkだって適正に記述して複数引数として処理出来るようにすれば
クォートの外に意図的に空白を入れることも可能だ。
引数の数云々なんて、>>644からは一切読み取れない。
0668名無しさん@お腹いっぱい。
2009/01/14(水) 15:04:36シングルクォートとカンマを間違えるな。しかも3回も。
アンタ、もしかしてawkプログラムが複数の引数に分かれて渡されても、
awk側で(例えば BEGIN { と } の対応とかで)適切に連結されて
うまく処理されると誤解してたんじゃない?
だから、>>649 で、
「スペースの有る無しは変数名が変わると言うことだし」
みたいなトンチンカンなことを言ったんでしょ。
0669名無しさん@お腹いっぱい。
2009/01/14(水) 15:16:08typo位スルーしろ。
そもそも、そんなこと考えようともしないだろ普通。
第一>>645が何も言っていないと言うのと無関係。
そんな変態的な事を考えていたら、>>645が間違いだと突っ込むだろう。
スペースの有る無しは単に変数の内部、つまり$の後ろと勘違いしただけだろう。
で?
0671名無しさん@お腹いっぱい。
2009/01/14(水) 15:24:10>スペースの有る無しは単に変数の内部、つまり$の後ろと勘違いしただけ
ふつー、そんな勘違いあり得ないよ。
そういう勘違いが起きること自体、
この問題の場合は「空白の有無」が重要、ということに
>>669 が気づいていなかった証拠。
だから >>645 を見ても、その意味が >>669 にはわからなかったのだろう。
>>645 は、
「シングルクォートは終了(ぶった切れ)しても、シェルの引数としては続いている」
と言うことを言ってるんだよ。それが的確な答え。
0672名無しさん@お腹いっぱい。
2009/01/14(水) 15:26:58そんなこと書いて知らない人が鵜呑みにしたらどうするんだ?
0と1は、まあtypoと大目に見ても、
オプションとか全く考慮していないのはどうか?
0673名無しさん@お腹いっぱい。
2009/01/14(水) 15:27:290674名無しさん@お腹いっぱい。
2009/01/14(水) 15:29:18typeじゃないよ。argv[1] で合ってる。
argv[0] は awk の文字列。
0675名無しさん@お腹いっぱい。
2009/01/14(水) 15:32:18>>正規表現中の「'」
内部に無い以上前後を一括りにしてしまっていると読むのは妥当。
>>671
だから>>644の質問に「空白の有無」なんて重要じゃないと何度言ったら・・
分からなくて当然で、明後日の回答内容なんて気にするわけないだろ。
斜め読みにきまってる。
>>シェルの引数としては続いている
こう言う常人には見えない文字が見えるのがエスパー
0676名無しさん@お腹いっぱい。
2009/01/14(水) 15:35:08>>665 がサマリとしてもよくまとまってると思う。
>>674 の言うとおり、typoじゃないね。
(674自身はtypeがtypoだがw)
0677名無しさん@お腹いっぱい。
2009/01/14(水) 15:35:18誰が、処理内容がargv[0]だと言った?
自分で第一引数って書いただろ。
まあ第一と第二のtypoということにしておいてもいいが、
そんなことより根本的におかしいだろ「重要」だなんて。
0678名無しさん@お腹いっぱい。
2009/01/14(水) 15:38:27そりゃ最悪だ。
嘘を重要といい、
明後日の事をくどくど書いて「問題の本質」だと?
0679名無しさん@お腹いっぱい。
2009/01/14(水) 15:41:40だからtypoじゃないって。
awk = argv[0] = 第0引数
awkプログラム = argv[1] = 第1引数
awkプログラム部分を「1つの引数にする」「2つ以上に引数に分けてはいけない」
ことは重要。
確かに、-F とか、その他awkのオプション引数が入る場合は
awkプログラム部分は argv[1]より後ろにずれるが、
そういうことを言ってるんじゃない。
0680名無しさん@お腹いっぱい。
2009/01/14(水) 15:42:37自分が理解できないということすなわち自分が無能であることを、
力説しているキミには同情を禁じ得ない。ww
0681名無しさん@お腹いっぱい。
2009/01/14(水) 15:43:20自分が理解できないということすなわち自分が無能であることを、
力説しているキミには同情を禁じ得ない。ww
0682名無しさん@お腹いっぱい。
2009/01/14(水) 15:46:30苦し紛れに漢数字をアラビア数字に書き換えか。
0683名無しさん@お腹いっぱい。
2009/01/14(水) 15:50:34>>665 で決まり。
>>682
>>665 のどこにも漢数字なんてないよ。
苦し紛れに漢数字を勝手に使い出したのは >>677 だろ。
0684名無しさん@お腹いっぱい。
2009/01/14(水) 15:51:44理解できないんじゃなく価値が低いと看做したから
斜め読みしたと書いたつもりだが?
で、変数のところに空白がはいりゃそりゃ意味が変わるから
動かなくて当然だと早とちりしただけであり、
>>645が>>644に対して何も言っていないと言う主張と全く矛盾しない
というか、極めて整合性が有る。
0685名無しさん@お腹いっぱい。
2009/01/14(水) 15:54:17www
なんだ、>>646 の解答はやっぱり「早とちり」だったのか。
それがすべてだな。
0686名無しさん@お腹いっぱい。
2009/01/14(水) 16:00:07シェルから見て第0引数という表現は
実に気持ち悪いが、まあ無いわけではないから許してやる。
しかしオプションを無視した上に、
別に何の変哲もないことを力説して、
重要だの本質だのというのは頂けない。
しかもawk特有の様に語るところがミスリードを意図しているようで気持ち悪い。
空白をセパレータとして認識するのはシェルだし、
パラメータを複数受け取っても、
それがコマンドにとって適正であれば動くし、
不適であれば動かないという一般的な話なだけであって、
敢えてawkを例に出して力説するような物じゃあ無い。
0687名無しさん@お腹いっぱい。
2009/01/14(水) 16:03:59恣意的な誘導だな。
>>646ではなく
>>649が早とちり(しかもどうでもよい)
だろ。
0688名無しさん@お腹いっぱい。
2009/01/14(水) 16:04:47>敢えてawkを例に出して力説するような物じゃあ無い。
あのー、もともとシェルスクリプト(#!/bin/sh)の中から
awkを呼び出す場合の話なんですけどー
敢えてawkを例に出したんじゃなく、
元々がawkを呼ぶ場合の質問。
その場合には「引数を1つにまとめる」ことが重要。
0689名無しさん@お腹いっぱい。
2009/01/14(水) 16:11:08>しかしオプションを無視した上に、
awkをワンライナー的に使う場合(シェルスクリプトの中のワンライナーも含む)は、
awkに各種オプションを付けることがあるが、
複数行に渡るawkプログラムを記述する場合は、
混乱を避け、書式を統一するためにも
awkのオプションは付けない方が言いよ。
例えば、-fオプションなら、プログラム中でawk変数のFSでセットできるわけだし、
FSの方を使った方が言い。
そういう意味で、awkのプログラムは argv[1]の位置に来る。
0690名無しさん@お腹いっぱい。
2009/01/14(水) 16:13:23typo発見。
× -fオプションなら、プログラム中でawk変数のFSでセットできる
○ -Fオプションなら、プログラム中でawk変数のFSでセットできる
でも言ってることは合ってるよ。
0691名無しさん@お腹いっぱい。
2009/01/14(水) 16:15:18#!/bin/sh
A=file1
B=fil2
awk '{
}' ''"$A"'' "$B"''
状況次第で引数を分断する事も重要。
0692名無しさん@お腹いっぱい。
2009/01/14(水) 16:19:10アフォか。
それ、「awkプログラム部分」はどこも分断されてないだろ。
awk自身の引数のファイル名のところの話じゃないんだよ。
主張しているのは「awkプログラム部分を分断せずにひとつの引数にまとめること」
0693名無しさん@お腹いっぱい。
2009/01/14(水) 16:22:31>>600が、
書いた本人は勿論そう言うつもりは無いだろうが、
後半の文章だけを取り出すと大間違いなのに
>>665のようなスタンスだと、そのことに気づきにくいのが
問題なんだよ。
動くような引数を渡せば、echoもawkも動くし
そうでなければ、どれも動かない。
単純に引数を一つにまとめるのが重要と
決め打ちするのは良くない。
0694名無しさん@お腹いっぱい。
2009/01/14(水) 16:24:27>>660
の、間違いね。
0695名無しさん@お腹いっぱい。
2009/01/14(水) 16:27:08↓ 以下、タイプミスした方が論旨関係なく即刻負けね
0696名無しさん@お腹いっぱい。
2009/01/14(水) 16:27:18awkで、「awkプログラム部分」を、2つ以上の引数に分けて動くような例は
ありえない。
だから、「awkプログラム部分は1つの引数にする」と
決め打ちして何も間違いはないし、より論旨がはっきりする。
0697名無しさん@お腹いっぱい。
2009/01/14(水) 16:32:59君がそう言いたい事は分かっている。
しかし、君の書き方だと知らない人は確実に誤解する。
そう言う意味で、
>>644が「シングルクォートの後ろで空白が入るとどうなるんですか?」
というような質問でもないのに、>>645を書いたのが
何の説明にもなっていなく、誤解の元だというのが私の唯一の主張。
0698名無しさん@お腹いっぱい。
2009/01/14(水) 16:36:250699名無しさん@お腹いっぱい。
2009/01/14(水) 18:54:230700名無しさん@お腹いっぱい。
2009/01/14(水) 19:01:48知識レベルは同程度だろう
仲良くしろ
0701名無しさん@お腹いっぱい。
2009/01/14(水) 19:23:54それを理解できない馬鹿が己の馬鹿っぷりを力説しているだけ。
0702名無しさん@お腹いっぱい。
2009/01/14(水) 22:21:05別に知識レベルを争っている訳じゃないだろ。
まあ君のような高尚な知識は、現実世界には不要だろうがね。
>>701
まだ言ってるよ。
馬鹿じゃねーの。
的外れと言う指摘を脳内変換して
間違いだと言われたと勘違いして
相手の論を勝手にでっち上げ、攻撃する屑よ。
0703名無しさん@お腹いっぱい。
2009/01/14(水) 22:42:510704名無しさん@お腹いっぱい。
2009/01/14(水) 22:55:49良かったね。
君のところではまともに動く物が、
ウチでは理解出来ないで、空白が混入して動かない訳だ。
君のところが儲かって結構な事じゃないか。
そう解釈してくれるなら、実際ウチも嬉しいから、
がんがれ。
0705名無しさん@お腹いっぱい。
2009/01/14(水) 23:02:57は何の実例も提示せず、後付の言い訳に終始する。
>>646は、豊富な実例を実際に表記している。
この一事をもってして、軍配がどちらに上がるか
自明の事であろう。
0706名無しさん@お腹いっぱい。
2009/01/14(水) 23:09:340707名無しさん@お腹いっぱい。
2009/01/14(水) 23:14:12そもそも重要なのは>>689の言う
-f オプションは、関数などをライブラリ化したファイルを読むのに
必須であり、決してシェルスクリプト中にオプションを記述するのが
忌避されている訳ではない証左ということ。
ちなみに-vオプションだって頻繁に使う。
-Fだってケースバイケースなのに無理やり自己の論に
押し込めようとするから破綻する。
とにかく、自分の枠で決めつけるのはよせ。
0708名無しさん@お腹いっぱい。
2009/01/14(水) 23:14:48お前ほんとに >>646 本人か?
>>646 の発言として
>>697 より引用するが、
> >>644が「シングルクォートの後ろで空白が入るとどうなるんですか?」
> というような質問でもないのに、>>645を書いたのが
> 何の説明にもなっていなく、誤解の元だというのが私の唯一の主張。
「唯一の主張」って言ってるね。
つまり、>>646 は、>>644 の解答は的はずれだったことは暗に認めているわけだ。
そして、残った「唯一の主張」として、>>645 の解答でも「誤解の元だ」
と言ってるに過ぎない。
実際には誤解の元とは思わないが、少なくとも >>645 の解答で正解なのは事実。
よって、軍配はすでに >>645 に上がっていることを >>646 も認めている。
0709名無しさん@お腹いっぱい。
2009/01/14(水) 23:19:460710名無しさん@お腹いっぱい。
2009/01/14(水) 23:21:29それは awkプログラム文字列が argv[1]の位置に来ることが多いから
わかりやすくそう言っているだけで、
論点は「ひとつの引数にプログラムをまとめる」ことだから、
今の議論と関係ない -v とか-F オプションを持ち出すのは論点をぼかすだけだよ。
だからあえてオプションのことは言わずに argv[1]と言っただけのことと思われる。
0711名無しさん@お腹いっぱい。
2009/01/14(水) 23:24:340712名無しさん@お腹いっぱい。
2009/01/14(水) 23:25:57どうでもいいが、ワンライナーでもないのに awk の -v オプションを使うのは
非常にお勧めしない。
きちんと BEGIN { } の中で変数に代入すること。
あと、-f は #!/usr/bin/awk -f なスクリプトの場合に使うべきもので、
シェルスクリプト中にawkプログラムを各場合は、-f オプションとは両立しない。
(-f を付けたら引数からはプログラムを読まなくなるので)
0713名無しさん@お腹いっぱい。
2009/01/14(水) 23:32:52パラドックスを書くな。
-f も、-v も何度でも使える。
0714名無しさん@お腹いっぱい。
2009/01/14(水) 23:35:36「何度でも使える」かどうかを言ってるんじゃないよ。
じゃあ聞くが、
awk -f prog-file
って書く場合に、どうやってawkの引数にプログラムを記述するんだ?
別ファイルじゃなくて、引数に直接プログラムを記述したい場合、
-fオプションは使えないだろw
0715名無しさん@お腹いっぱい。
2009/01/14(水) 23:40:30この一時を以ってしても、
第○引数がどうでも良いことがわかるね。
0716名無しさん@お腹いっぱい。
2009/01/14(水) 23:46:59試してから書け。
awk -f prog 'BEGIN { ... }'
なんて書いても動かないぞ。
awk -f progfile
と
awk progstring
とは
エクスクルーシブ。
同時に使えない。
0717名無しさん@お腹いっぱい。
2009/01/15(木) 00:05:350718名無しさん@お腹いっぱい。
2009/01/15(木) 00:05:56それって言っていることは>>714と同じだよね。
普通に書けば?
0719名無しさん@お腹いっぱい。
2009/01/15(木) 00:09:48だから、>>715 が「書ける」って言ってるから「書けない」と反論してるんだよ。
>>715 は、
awk -f prog-file
と
awk prog-string
を両立した例を示すこと。(不可能だけど)
言っとくけど、
awk -f prog1 -f prog2
じゃ駄目だよ。
あくまで「引数に直接」awkのプログラムを書くこと。
0720名無しさん@お腹いっぱい。
2009/01/15(木) 00:12:090721名無しさん@お腹いっぱい。
2009/01/15(木) 00:16:19>>714 = >>715 = >>716
「awkの -f オプションと、引数直接プログラム記述は両立しない」
と言う主張と、
>>713 = >>715 = >>718
「awkの -f オプションと、引数直接プログラム記述は、『普通に書ける』」
と言う主張と言うことで。
0722名無しさん@お腹いっぱい。
2009/01/15(木) 00:21:400723名無しさん@お腹いっぱい。
2009/01/15(木) 00:25:39頼むからおまえら「シェルスクリプトを書いてます」
なんて、公言しないでくれな。
俺まで同類だと思われると困るから。
0724名無しさん@お腹いっぱい。
2009/01/15(木) 00:40:54これらはある親シェルを起動すると実行されます。
ただ、子シェルでなくて、孫、曾孫シェルの可能性もあります。
この特定ディレクトリにあるスクリプトのうちどれが実際に起動されたかを調べる方法ないでしょうか?
すべてに起動ログをはかせるのはちょっと厳しいです。
0725名無しさん@お腹いっぱい。
2009/01/15(木) 01:09:44B. /bin/shに読まれて、access timeが変るので、ls -ltu してタイムスタンプ確認。
C. ptrace系のコマンド使う
D. /etc/profileでログを取る
0726名無しさん@お腹いっぱい。
2009/01/15(木) 06:39:29もしかして、>>718 の言う「普通に書けば」って、
「普通に -f を使わずに書けば」って意味じゃないの?
でもそれだと、
「シェルスクリプト中から、awkプログラムを直接引数に書いてawkを呼び出す場合、
-fオプションは使わない(使えない)」
という、>>716 = >>714 の主張を認めたことになる。
よって、セカンドステージは >>716 = >>714 = >>719 の勝ちということで終了。
0727名無しさん@お腹いっぱい。
2009/01/15(木) 21:49:07シェルスクリプトスレなんでawkのオプションとかスレ違いなのにこんな話題しかないのかな
0728名無しさん@お腹いっぱい。
2009/01/15(木) 21:56:44-f を何度使ってもいいから、
awk -f プログラムファイル 'プログラム文字列'
が両立できる方法を示せ。
君はそれが「普通に書ける」って言ったんだぞ。
間違いを広めると迷惑だから、
書けないなら「書けない」と訂正したらどうだ。
0729名無しさん@お腹いっぱい。
2009/01/15(木) 22:00:180730名無しさん@お腹いっぱい。
2009/01/15(木) 22:08:26> -f オプションは、関数などをライブラリ化したファイルを読むのに
> 必須であり、
↑って言ってるが、
この発言から、-f オプションで別ファイルに入った関数ライブラリを
読み込んだ上で、さらに awk引数でプログラムを書けると誤解しているようだ。
awk -f 関数ライブラリファイル
って記述したら、
awk引数にプログラムは書けない。
敢えて書くなら、
awk -f 関数ライブラリファイル -f プログラム本体ファイル
ってやるしかない。これではプログラム本体が別ファイルになるから
シェルスクリプトでこんなことはしない。
0731名無しさん@お腹いっぱい。
2009/01/15(木) 22:13:340732名無しさん@お腹いっぱい。
2009/01/15(木) 22:17:44-f も -v も -F も使ってなくて、
argv[1] にプログラムを直接記述する方式だろ。
これが元になって始まった議論だから、
>>665 が、
「awkプログラムを、シェルから見て第1引数(argv[1])に与えることが重要」
って言ったんだよ。
argv[1]の[1]の数字はあまり重要じゃなくて、
argv[2]以降の別引数に分割せずに、ひとつのargv[*]だけにまとめること、
というところが主眼ね。
それを、>>639 にありもしない -f や -v や -Fオプションの話を勝手に持ち出して
>>672 が論旨と違うところに突っ込みを入れたのが間違い。
おそらく、話の流れを全然読んでなくて、途中から一部だけ読んで
突っ込んじゃったんだろうな。
0733名無しさん@お腹いっぱい。
2009/01/16(金) 01:00:47b='cat b.dat'
c='cat c.dat'
改行を*nで表現すれば
sedだけでしょ?
awk使いはきもいよ
0734名無しさん@お腹いっぱい。
2009/01/16(金) 01:02:00賢いな
0735名無しさん@お腹いっぱい。
2009/01/16(金) 01:20:190736名無しさん@お腹いっぱい。
2009/01/16(金) 01:36:34ありがとございます
この中だとaccess timeで確認がいけそうなんで使わせてもらいます
0737名無しさん@お腹いっぱい。
2009/01/16(金) 06:43:02何いってんの?
>>636 は典型的な早とちりの間違い回答
そのことを >>638 がすでに指摘してる
0738名無しさん@お腹いっぱい。
2009/01/16(金) 10:19:150739名無しさん@お腹いっぱい。
2009/01/16(金) 13:45:16のだけど、どのようにすれば可能でしょうか?
bash限定でも構いません。
0740名無しさん@お腹いっぱい。
2009/01/16(金) 13:59:18localhost% bash
の「localhost%」がほしいのか?
ログインシェルなら、そもそも起動したときのプロンプトなんて存在しないし。
0741名無しさん@お腹いっぱい。
2009/01/16(金) 14:23:30bashが起動して、PS1が展開された結果です。
0742名無しさん@お腹いっぱい。
2009/01/16(金) 14:37:300743名無しさん@お腹いっぱい。
2009/01/16(金) 14:54:56stderrをリダイレクトするとJob Controlできないというメッセージがでてじゃまくさい。
bash: no job control in this shell
[user@host ~]$ exit
0744名無しさん@お腹いっぱい。
2009/01/16(金) 14:57:010745名無しさん@お腹いっぱい。
2009/01/16(金) 14:58:05PROMPT=`echo exit | bash -i 2>&1 | sed -e 1d -e s/exit$//`
0746名無しさん@お腹いっぱい。
2009/01/16(金) 15:00:40ナイス!
0747名無しさん@お腹いっぱい。
2009/01/16(金) 15:02:44$ echo exit | zsh -i
すると、zshのプロンプトを出したままになり、exitしてくれない。
0748名無しさん@お腹いっぱい。
2009/01/16(金) 23:44:37b="is a pen"
というふたつの変数があったとします。これらを結合してoptsに代入して
command ${opts}
としたときに、[this] [is a pen] というふたつの引数が渡された、と解釈させるようにしたいのですが
どういう風に連結すればいいんでしょうか。
opts="${a} ${b}" だと [this] [is] [a] [pen]、
opts="\"${a}\" \"${b}\"" だと ["this"] ["is] [a] [pen"]
という風に解釈されてしまします。
0749名無しさん@お腹いっぱい。
2009/01/16(金) 23:56:51もしもperl shellにしておくとperlの起動コストが無くなるとか言うならば
使いたい所だけれど
0750名無しさん@お腹いっぱい。
2009/01/17(土) 00:11:08$ a="this"
$ b="is a pen"
$ set "$a" "$b"
$ python -c 'import sys; print sys.argv[1]; print sys.argv[2];' "$@"
this
is a pen
$
0751748
2009/01/17(土) 00:30:47変数に代入したいんですが、それはできないんでしょうか。
いろんな条件によって順にオプションを追加していく・・って感じのことがしたいんですが。
0752名無しさん@お腹いっぱい。
2009/01/17(土) 00:58:04パラメタにスペースが入らないルールにするのがベスト
それが出来ない場合、かつ、パラメタにダブルクォートが入らない
としてよければ、 >>748 にあるようにダブルクォートで括るのも
手かもしれない。その場合、eval するのが簡単でよいかと。
a="this"
b="is a pen"
opts=\"$a\" \"$b\""
eval command $opts
0753名無しさん@お腹いっぱい。
2009/01/17(土) 01:00:35opts="\"$a\" \"$b\""
0755名無しさん@お腹いっぱい。
2009/01/17(土) 01:37:12set --
set -- "$@" "$a"
set -- "$@" "$b"
って感じで。
0756名無しさん@お腹いっぱい。
2009/01/17(土) 07:16:40要するに、"$@" と同様のことを、一般のシェル変数でやりたいんだろ。
bash限定なら配列使っちゃえ。スペースもダブルクォートもOKだよ。
opts[1]="This"
opts[2]="is a pen"
command "${opts[@]}"
0757名無しさん@お腹いっぱい。
2009/01/17(土) 07:57:50純正シェルでは、set -- では引数が削除されないので注意。
必ず、
set dummy; shift
ってやること。
0759748
2009/01/17(土) 11:58:00失礼しました。
0760名無しさん@お腹いっぱい。
2009/01/17(土) 22:18:35なんで運動靴履くの?
0761名無しさん@お腹いっぱい。
2009/01/18(日) 00:45:06gccのプログラムがエラーを返すまで自動で何度も実行するシェルを書きたいのですが上手くいきません。
下記のような書き方でやってみました。
gccのプログラムはリターン値が-1のときにエラーと仮定しています。
while [ gccのプログラム = 0 ]
do
…
done
レベルの低い質問で申し訳ないのですが、よろしくお願い致します。
0762名無しさん@お腹いっぱい。
2009/01/18(日) 02:13:100763名無しさん@お腹いっぱい。
2009/01/18(日) 07:13:33while true; do command && break; done
0764名無しさん@お腹いっぱい。
2009/01/18(日) 07:26:10while command; do
:
done
ただこれだと>>763と同じで、exit値0以外がエラー。
while ture: do
command
if [ $? = -1 ]; then
break
fi
done
これで-1の時だけエラーと見做す。
0765名無しさん@お腹いっぱい。
2009/01/18(日) 08:02:20もしそうなら、
while [ gccのプログラム = 255 ] ; do hogehoge
とすればよいと思う。でも終了コードを1とかの正数に変えたほうがいいよ
0766名無しさん@お腹いっぱい。
2009/01/18(日) 08:07:21>>761 がつまづいたのは、$? を使ってないことなのか。
でも >>764 の $? の比較は、255と比較すべきじゃないの?
0767名無しさん@お腹いっぱい。
2009/01/18(日) 09:13:30文字列の比較じゃないのに test [ ] を使ってるのが間違い。
while gccのプログラム
do
...
done
でよい。
whileはもともと終了コードをチェックする文法。
通常、testコマンドである [ ] と組み合わされるが、
この場合は gccの終了コードを直接チェックするから、[ ] を書いてはいけない。
(ほかに、$?を使う方法もあるが、while gcc ... って書けば $? も使わなくていい)
0768名無しさん@お腹いっぱい。
2009/01/18(日) 09:16:57すげー、回答者全滅。
>>763->>767 すべて間違い。
以下が正解。
until gccのプログラム
do
...
done
whileとは終了判定が逆の until文を使う。
0769名無しさん@お腹いっぱい。
2009/01/18(日) 10:06:500770名無しさん@お腹いっぱい。
2009/01/18(日) 10:52:25while [ command -ne -1 ]
do
...
done
だろ。
0771名無しさん@お腹いっぱい。
2009/01/18(日) 11:00:06[ $? -ne 255 ]
do
...
done
だろ。
0772名無しさん@お腹いっぱい。
2009/01/18(日) 12:06:06>>763-764が正答なのに。
0773771
2009/01/18(日) 12:27:13実験したら、>>771では駄目だと判明。
もちろん>>763-764も駄目。
>>765-767あたりも参考にすべき。
どうもtestは数値を1バイトの符号なし整数とみなすようだ。
これはunixコマンドの終了ステータスが0-255の範囲であると
定められていることと関係するのだろう。
smpl.c
#include<stdlib.h>
int
main(int argc, char *argv[])
{
int i = atoi( argv[1]);
return (i);
}
jikken.sh
#!/bin/sh
set -x
i=1
while true; do
./a.out $i
if [ $? -ne 255 ]; then
echo "OK"
else
echo "error" && break
fi
i=`expr $i - 1`
done
0774771
2009/01/18(日) 12:32:57終了ステータスを出す側が符号なし整数でだしてた、
いずれにしても。
実行結果
+ i=1
+ true
+ ./a.out 1
+ [ 1 -ne 255 ]
+ echo OK
OK
+ expr 1 - 1
+ i=0
+ true
+ ./a.out 0
+ [ 0 -ne 255 ]
+ echo OK
OK
+ expr 0 - 1
+ i=-1
+ true
+ ./a.out -1
+ [ 255 -ne 255 ]
+ echo error
error
+ break
0775名無しさん@お腹いっぱい。
2009/01/18(日) 13:23:58「gccのプログラム」、「リターン値が-1のときにエラー」、「シェルを書きたい」
0776名無しさん@お腹いっぱい。
2009/01/18(日) 13:54:20揚げ足取ってないで早く教えろよ
0777名無しさん@お腹いっぱい。
2009/01/18(日) 14:06:42だから、>>767 が正解。
255とかにこだわらず、0か0以外で判断すれば良い。
0778名無しさん@お腹いっぱい。
2009/01/18(日) 14:19:59終了ステータスが0-255まで有ると言うことは、
非ゼロで有っても何らかの理由でその数値を利用するため。
ゼロ以外は何らかのエラーで有るという考え方はOKだが、
何でもかんでも処理を中断して良い訳じゃない。
そこは、プログラムの仕様で判断するべきだし、
今回の仕様は>>761
0779名無しさん@お腹いっぱい。
2009/01/18(日) 14:56:19だったら、以下のとおり。
これくらい応用して考えろよw
↓
while gccのプログラム; [ $? != 255 ]
do
...
done
0780名無しさん@お腹いっぱい。
2009/01/18(日) 15:02:04終了ステータス判定に文字列比較演算子を使うな。
要するに、>>761への回答は、
「gccプログラムの終了ステータスは-1には出来ません」
gdb で return(-1); なプログラムを動かしたら、
Program exited with code 0377.
だと。
0781名無しさん@お腹いっぱい。
2009/01/18(日) 15:02:45いや、今回の質問は、そもそもエラーコードの受け取り方を
>>761 が勘違いしていたのが原因なのだから、
その原因に対する的確な答えは、
>>767 が正解。
>>761 で、「リターン値が-1のときにエラー」とは言っているが、
これはその「gccのプログラム」が 「return -1;」と記述されていることを
言っているに過ぎず、質問のポイントとなっているのはエラーコードの値ではない。
実際、-1 とか 255とか、数値の問題でうまく動かなかったのじゃなく、
while [ gccのプログラム = 0 ] みたいな間違った書き方をして動かなかったのだから、
それに対する指摘が正しい回答と言えよう。
その意味でも >>767 が正解。
エラーコード=255を杓子定規に解釈すれば >>779 だが、
これが本当に意図していた回答かどうかは疑問。
0782名無しさん@お腹いっぱい。
2009/01/18(日) 15:18:18そこまで深読みして考えるなら、
もう少し突っ込んで>>775にたどり着くべきだな。
0783名無しさん@お腹いっぱい。
2009/01/18(日) 15:23:28深読みじゃないよ。質問で [ gccのプログラム = 0 ] って書いてるんだから、
エラーコードが 0 かどうかチェックしたいと言う意図だろ。
それが質問の「仕様」。
0784名無しさん@お腹いっぱい。
2009/01/18(日) 15:32:41黙れ。
0785名無しさん@お腹いっぱい。
2009/01/18(日) 15:37:06顔真っ赤にして大変ですねw
0786名無しさん@お腹いっぱい。
2009/01/18(日) 15:56:51while [ `gccのプログラム` = 0 ] だよな。
0787名無しさん@お腹いっぱい。
2009/01/18(日) 15:59:18黙れ。
0788名無しさん@お腹いっぱい。
2009/01/18(日) 16:02:41$?を参照する方法なら文字列比較で構わないよ。
変数の値は文字列だから
0789名無しさん@お腹いっぱい。
2009/01/18(日) 16:37:43だな。
>>780
-eq -ne 等を使う必要があるのは、たとえば、
3 03 003 0003 ... などを同一の値とみなす必要がある時。
[ 003 -eq 3 ] && echo 同じ
とか。
$? の場合は、0〜255の普通の値しか入らない(00とか000とかにはならない)から、
[ $? != 0 ] で判定して良い。
0790名無しさん@お腹いっぱい。
2009/01/18(日) 16:43:52無様なコードでも動けばそれでいいというわけだ。
0791名無しさん@お腹いっぱい。
2009/01/18(日) 16:44:41プログラム終了コードを -1 にしたことが
問題だったのなら、的確な答えは、
>>766 + >>764 が正解
>>767 ではプログラムの終了コードが0か否かしか
判定できない手法なので、残念ながら完全に間違い。
>>761 の要求は満たしてない。
0792名無しさん@お腹いっぱい。
2009/01/18(日) 16:47:05case $? in
0) hoge;;
1) hoge;;
255) hoge;;
*) hoge;;
esac
みたいに書くこともある。
case文は文字列としての比較しかできない。
「$?を文字列として扱ってはいけない」というルールなら、
caseで効率良く書くことも否定することになる。
↓
それは明らかにおかしい。
0793名無しさん@お腹いっぱい。
2009/01/18(日) 16:48:03多分 >>767 と同一人物だと思うんだけど
なんか自分の答えが正解と言い張って、他人の答えを間違いと
断言する性癖があるね
もう少し余裕もった方がいいと思うよ
0794名無しさん@お腹いっぱい。
2009/01/18(日) 16:52:19違う。
質問者が本当に「エラーコードが-1かどうか」を判断したかったのなら、
質問でも、(間違った文法だけど)
while [ gccのプログラム != -1 ]
と書いていたはず。
実際には
while [ gccのプログラム = 0 ]
と書いて質問したのだから、
質問の「仕様」は、エラーコード0かどうかで判断するということで正解。
0795名無しさん@お腹いっぱい。
2009/01/18(日) 17:06:08そもそも、(もし釣り質問で無いなら)
質問者が、どうしていいか訳が分からなくなってる質問内容の
一分だけが、正確に質問者の意図を反映しているというのは強弁。
0796名無しさん@お腹いっぱい。
2009/01/18(日) 17:27:44もう少し前後のレスをよく読むこと。
>>764だと無限ループになる。
0797名無しさん@お腹いっぱい。
2009/01/18(日) 18:32:56>>764
× ture: 綴りも違うし、区切りがコロンになってる
○ true;
>>779
× while gccのプログラム; [ $? != 255 ] 条件部分は1つのコマンド/パイプライン(相当)しか書けない
○ while ( gccのプログラム; [ $? != 255 ] )
雑はやめてくれ
0798797
2009/01/18(日) 18:35:48× 条件部分は〜
○ while の条件部分は〜
0799名無しさん@お腹いっぱい。
2009/01/18(日) 18:40:130800名無しさん@お腹いっぱい。
2009/01/18(日) 19:01:16嘘を書いてるのはお前。
whileの条件部分に書けるのは「パイプライン」じゃなくて「リスト」
リストというのは複数のパイプライン。
while gccのプログラム; [ $? != 255 ]
↑は正しい。
× while ( gccのプログラム; [ $? != 255 ] )
↑
サブシェルが無駄。
0801名無しさん@お腹いっぱい。
2009/01/18(日) 19:08:06whileの条件部分には、( ) なしで2個以上のコマンドが書ける。
>>797
試しに、↓みたいなの実行してみろ。
i=1; while echo $i; i=`expr $i + 1`; [ $i -le 10 ]; do :; done
0802名無しさん@お腹いっぱい。
2009/01/18(日) 19:09:52失礼雑だった
>>800
リストまではOK
> while gccのプログラム; [ $? != 255 ]
>↑は正しい。
は?
0803名無しさん@お腹いっぱい。
2009/01/18(日) 19:14:32おまえ、「リスト」知らんのか。
コマンド; コマンド;
みたいにセミコロンで区切ったのがリスト。(改行でもいいが)
リストが桶ということは、2個以上のコマンドが桶。
while gccのプログラム; [ $? != 255 ]
の代わりに、
while echo hoge; [ $? != 255 ]
とでもやってテストしてみろ。ちゃんと動くから。
あと、>>801 が書いてくれたテストプログラムも、
while の条件文に複数のコマンドを書いた例だな。
0804名無しさん@お腹いっぱい。
2009/01/18(日) 19:16:46>>802 は。「リスト」が、&& や || を使ったのしか駄目だと
勘違いしてるんじゃないかww
セミコロンでも改行でもOK。
0805名無しさん@お腹いっぱい。
2009/01/18(日) 19:19:18よくまあ他人同士のふりができるな。
タイミングと言い、やりとりといい、
よくまあ毎回毎回同じパターンで
飽きないか?
0806名無しさん@お腹いっぱい。
2009/01/18(日) 19:22:45>>797 の後半と、
>>802 の後半は大間違いなので、
>>797 = >>802 に釈明カキコを要求しとく。
0807名無しさん@お腹いっぱい。
2009/01/18(日) 19:27:59> リストまではOK
リストまではOKってことは、
>>797 の主張が間違ってたってことだよ。
hoge && hage && boke
hoge || hage || boke
hoge; hage; boke
上の3つは全部「リスト」。
ちなみに、
hoge
hage
boke
みたいに3行に書いても全体で1個の「リスト」。
while
hoge
hage
boke
[ $x -ne 0 ]
do
.....
done
みたいな変わった書き方もある。
0808名無しさん@お腹いっぱい。
2009/01/18(日) 19:36:33ああ、見られないと出来ないのか。
0809名無しさん@お腹いっぱい。
2009/01/18(日) 21:35:35普通、人の間違いは指摘する事は有っても、
わざわざ、釈明せよ等とは言わないものだ。
お前、もう良いから、このスレから出て行ってくれ。
邪魔だ。
0810名無しさん@お腹いっぱい。
2009/01/18(日) 21:48:36-fはよく見るけど何もないのもよくみるけど
0811名無しさん@お腹いっぱい。
2009/01/18(日) 21:58:290812名無しさん@お腹いっぱい。
2009/01/18(日) 22:43:58恥晒しとくね
>whileの条件部分は1つのコマンド/パイプライン(相当)しか書けない
>whileの条件部分は1つのコマンド/パイプライン(相当)しか書けない
>whileの条件部分は1つのコマンド/パイプライン(相当)しか書けない
>whileの条件部分は1つのコマンド/パイプライン(相当)しか書けない
0813名無しさん@お腹いっぱい。
2009/01/18(日) 22:49:02「人の間違いを指摘した」のではなく、
「もともと正しかった人を『間違ってる』と指摘した」(>>797)のだから、
話が違うだろ。
0814名無しさん@お腹いっぱい。
2009/01/18(日) 23:03:03お前がいつもやってることだろ。
誰か他の人間は釈明要求とかしたか?
早く消えろ。
お前がいるとシェルスクリプトその物の評価が下がる。
結果、クソOSが跋扈する。
あ・・さてはお前、windozeの回し者か?
このスレが荒れて流れりゃボーナス倍増か?
・・・ってそんな感じ。
0815名無しさん@お腹いっぱい。
2009/01/19(月) 00:54:06while
hoge
hage
kasu
[ $x -ne 0 ]
do
頭固いからよくわからん、なにがどうなってるのやら。
ところで、logのこのメッセージって何。
loggerでログ取ったら紛れ込んでくるんだが。
daemon.infoカテゴリー
last message repeated 2 times
0816761
2009/01/19(月) 01:03:47皆さん色々なアドバイス、ありがとうございました。
0817名無しさん@お腹いっぱい。
2009/01/19(月) 01:14:31とりあえず下のようにa hrefタグだけ抜こうとしてもうまくゆかないです。
なんででしょう?
echo ' fadadf <a href="2xxxxxx"> fdskaf' | sed 's/\(<a href[^>]*>\)/\1/'
0818名無しさん@お腹いっぱい。
2009/01/19(月) 01:26:44htmlの内容にもよるけど、
< a href="hoge">hoge<\a>< a href="hoge2">hoge2<\a>< a href="hoge3">hoge3<\a><br>
っていう感じだからそれじゃ全然だめ。
例題はこれでいけたけど?
echo ' fadadf <a href="2xxxxxx"> fdskaf' | sed -E 's/.*(<a href[^>]*>).*/\1/'
0819名無しさん@お腹いっぱい。
2009/01/19(月) 01:36:53strings hoge.html | fold -s -w 60 | grep "href"
よくfetchでエロを(ry
0820名無しさん@お腹いっぱい。
2009/01/19(月) 01:59:23ありがとうございます
そういえばマッチするとこの前後を考えてませんでした。
一応対象のファイルは1行につき<a href>タグ一個なのでうまくいきそうです
>>819
これは初めて知りましたがうまくつかうと楽そうですね
0821初心者です
2009/01/19(月) 18:53:31教えてください。
最近10日以内に変更したファイルやディレクトリ(新規作成ファイルを含む)を検索して、ディレクトリとファイル名の詳細(ls -ltrのような感じ)を変更時刻でソートして画面出力したいのですが、どなたかご教授お願いします。
ちなみに、IBMのAIXを使っています。
0822名無しさん@お腹いっぱい。
2009/01/19(月) 18:57:12変更時刻でソートをちゃんとやるのは難しい。
find / -mtime -10 -ls
あたりで我慢して。
0823名無しさん@お腹いっぱい。
2009/01/19(月) 19:03:00AIXは知らんが、-print0が使えるfindがあるなら、
↓
find / -mtime -10 -print0 | xargs -0 ls -ldtr
なければGNU find入れれば使える。
0824名無しさん@お腹いっぱい。
2009/01/19(月) 19:06:39>>821
find . -mtime -10 -exec ls -ldtr {} +
コマンドラインの最後、「+」 なので注意してね。
0825名無しさん@お腹いっぱい。
2009/01/19(月) 19:06:56ソートしやすい形式にすれば楽だと思うよ。
0826名無しさん@お腹いっぱい。
2009/01/19(月) 19:10:50それだとファイルが多いときにlsが複数回起動されて、lsによる
ソートが起動毎になっちゃうからだめなんじゃない?
0827名無しさん@お腹いっぱい。
2009/01/19(月) 19:19:39実用上問題ないからヨシとする
0828名無しさん@お腹いっぱい。
2009/01/19(月) 19:25:530829初心者です
2009/01/19(月) 19:49:11早速のレスありがとうございます。
本当に助かりますし、心強く思います。
ただ、私はただいま会社にいませんので、すぐにでも試したいのですが試せないんです。
明日会社で必ず試してみます!
0830名無しさん@お腹いっぱい。
2009/01/19(月) 20:16:21find . -mtime -10 -exec ls -ld --time-style=full-iso {} + | sort -k 6,7
日付の表示形式が気に食わなければ+FORMATでdateコマンドと同様の
フォーマット文字列が使えるので工夫してくれ。
0831名無しさん@お腹いっぱい。
2009/01/19(月) 20:19:380832名無しさん@お腹いっぱい。
2009/01/19(月) 20:19:510833名無しさん@お腹いっぱい。
2009/01/19(月) 20:33:02分単位でソート。
同じ分のファイルごとにグループに分けてls -ltrdでソート。
(グループ内にはそれほど多量にないと仮定)
連結。
コードは誰かまかせた。
0834初心者です
2009/01/19(月) 20:41:25みなさん、レスありがとうございます。
「変更時刻でソートして画面出力」と書きましたが、誤解があってはいけませんので、目的を書きますが、
ファイルの新しいものが一番下にくるように画面出力したいのです。
正しくは、変更時刻とは分単位ではなく、タイムスタンプの順番です。
ですから、できることなら100分の1秒でも新しいファイルが下に来てほしいです。
この目的だと、どんな記述がよろしいでしょうか?
0835名無しさん@お腹いっぱい。
2009/01/19(月) 21:12:36find で -ls した結果を保存。
(2)
argsがオーバーフローしないように、
上から1000ファイルずつ区切ってそれぞれをls -ltrdでソート。
(3)
次に、上から500ファイルを飛ばして、
その次から1000ファイルずつ区切ってそれぞれをls -ltrdでソート。
(4)
今の状態を一時保存し、(2)と(3)をもう一度繰り返す。
その結果が一時保存した結果と変わっていれば、再度(2)から繰り返す。
変化がなくなればソート完了なので、これで終了。
コードは誰かまかせた。
0836名無しさん@お腹いっぱい。
2009/01/19(月) 21:25:28ファイルの持っているタイムスタンプは秒単位だから
1/100秒とかは無理
・・・AIXのFSは知らないけど
0837名無しさん@お腹いっぱい。
2009/01/19(月) 21:36:190838名無しさん@お腹いっぱい。
2009/01/19(月) 21:40:19ディレクトリはわからんなぁ。
0839名無しさん@お腹いっぱい。
2009/01/19(月) 21:43:26通常ファイルの中でも、テキストファイルだけ。
バイナリファイルだと diffに拒否される。
0840名無しさん@お腹いっぱい。
2009/01/19(月) 21:46:150841名無しさん@お腹いっぱい。
2009/01/19(月) 21:48:42diff の -a は GNU 依存だろ。
0842名無しさん@お腹いっぱい。
2009/01/19(月) 21:54:14じゃあ>>833か>>835だな。
>>835って、2ファイルずつだとバブルソートをシェルスクリプトで実装する感じだな。
0843名無しさん@お腹いっぱい。
2009/01/19(月) 22:03:340844名無しさん@お腹いっぱい。
2009/01/19(月) 22:05:35mkdir ../temp
find . -mtime -10 -exec ln {} "../temp/`echo '{}'| tr / :`" \;
ls -t ../temp | tr : /
0845名無しさん@お腹いっぱい。
2009/01/19(月) 22:07:14適当な一時ディレクトリを作り、
その一時ディレクトリに find の結果出て来たファイルをすべて ln -s する。
その一時ディレクトリ上で、
ls -lLdtr を実行して結果を画面に表示。
一時ディレクトリをシンボリックリンクごと削除。
コードは誰かまかせた。
0846名無しさん@お腹いっぱい。
2009/01/19(月) 22:10:180847名無しさん@お腹いっぱい。
2009/01/19(月) 22:11:390848名無しさん@お腹いっぱい。
2009/01/19(月) 22:14:290849名無しさん@お腹いっぱい。
2009/01/19(月) 22:14:49ディレクトリ自体のタイムスタンプがチェックできないし、
ファイル名に : が含まれていると破綻する。
>>845 でいいじゃん。
0850名無しさん@お腹いっぱい。
2009/01/19(月) 22:17:10異なるディレクトリに同名のファイルがあったら破綻するのでは?
/hoge/file と /boke/file とか。
0851名無しさん@お腹いっぱい。
2009/01/19(月) 22:19:42>>845でうまくエスケープするコードも必要。
0852名無しさん@お腹いっぱい。
2009/01/19(月) 22:19:53PerlとかRubyとか使うんじゃないの?
find path -mtime -10 -print | perl -e 'chomp( @all = <> ); print join "\n", sort { -M $b <=> -M $a } @all;'
0853名無しさん@お腹いっぱい。
2009/01/19(月) 22:22:15sort一発にするなぁ。
0854名無しさん@お腹いっぱい。
2009/01/19(月) 22:23:580855名無しさん@お腹いっぱい。
2009/01/19(月) 22:26:12>>853 は >>852 に答えたんだが、、
お題を解くのとは別に、実際に自分が必要になった場合の話。
お題の解は実際には実用にならないので。
0856名無しさん@お腹いっぱい。
2009/01/19(月) 22:28:38無くてもやらなきゃならない場合がある。
0857名無しさん@お腹いっぱい。
2009/01/19(月) 23:09:33みる方が幅が広がっていいんじゃねー?
0858名無しさん@お腹いっぱい。
2009/01/19(月) 23:21:28先のファイルがsymbolic linkだったときは結果が違ってしまう
のが惜しいね。
0859名無しさん@お腹いっぱい。
2009/01/19(月) 23:42:080860名無しさん@お腹いっぱい。
2009/01/20(火) 00:07:190861名無しさん@お腹いっぱい。
2009/01/20(火) 00:30:45command 2>> /tmp/stderr.log | tee -a /tmp/stdout.log
こんな感じでやってみてるのですが、上記だと端末にstderrは出ません。
0862名無しさん@お腹いっぱい。
2009/01/20(火) 00:35:41別の端末でtail -f /tmp/stderr.logしなよ。
0863名無しさん@お腹いっぱい。
2009/01/20(火) 06:42:12できるよ。
(command | tee -a stdout.log) 2>&1 > /dev/tty | tee -a stderr.log
>>862
無理じゃないよ。
0864名無しさん@お腹いっぱい。
2009/01/20(火) 09:28:24sh hoge.sh > >(tee stdout.log) 2> >(tee stderr.log)
0865名無しさん@お腹いっぱい。
2009/01/20(火) 14:53:39さらに、commandのexit statusを得ることは出来ないでしょうか?
0866名無しさん@お腹いっぱい。
2009/01/20(火) 15:08:28できるよ。
(((command; echo $? 1>&3) | tee -a stdout.log) 2>&1 > /dev/tty | tee -a stderr.log) 3>&1
0867名無しさん@お腹いっぱい。
2009/01/20(火) 15:54:51それだと、exit statusが表示されてしまうだけだ。
ややこしくなるけど↓かな。
(((command; echo $? 1>&3) | tee -a stdout.log) 2>&1 > /dev/tty | tee -a stderr.log > /dev/tty) 3>&1 | (read s; exit $s)
0868初心者です
2009/01/20(火) 20:50:30皆さん、本当にいろいろアドバイスいただき、ありがとうございました。
無事、できました!感激です!
特に、「824」さんの解答にあった通りにしたら、できました。
ありがとうございます。
ところで、もしこのレスを見ていたらで結構ですので、たびだび質問で恐縮ですが、
find . -mtime -10 -exec ls -ldtr {} +
の最後の+記号の意味はなんでしょうか?
私がもっている本で調べたりしても、のっていなかったので、もしよかったら教えてください。
他の方々の例もいろいろと勉強になると思い、試してみたのですが、まだまだ、私の勉強不足で思い通りに動かなかったりしました。
どうやら私の会社のUNIXは、GNUツールが使えないようです。残念・・・
でも、みなさんのアドバイス、本当にうれしかったです。
ありがとうございました。
また、何かありましたらご教授ください。
0869827
2009/01/20(火) 20:55:310870名無しさん@お腹いっぱい。
2009/01/20(火) 21:11:22全部出てこないじゃないかーと怒られる
0871名無しさん@お腹いっぱい。
2009/01/20(火) 21:16:21出てくることは出てくるだろ。
0872名無しさん@お腹いっぱい。
2009/01/20(火) 21:17:310873名無しさん@お腹いっぱい。
2009/01/20(火) 21:19:09http://www.opengroup.org/onlinepubs/009695399/utilities/find.html
0874名無しさん@お腹いっぱい。
2009/01/20(火) 23:53:05OSのバージョンをuname -rで取得し、5.4-RELEASE-p6以上だったら、echo hogeを実行し、
5.4-RELEASE-p5以下だったら、echo fooを表示するシェルスクリプトを作りたいと思ってます。
しかし、5.4-RELEASE-p5のような形式の文字列を比較する方法がわかりませんが、どのように比較すればよいのでしょうか?
0875名無しさん@お腹いっぱい。
2009/01/20(火) 23:55:30if [ `uname -r` = "5.4-RELEASE-p6" ]; then
echo "hoge"
fi
if [ `uname -r` = "5.4-RELEASE-p5" ]; then
echo "foo"
fi
0876名無しさん@お腹いっぱい。
2009/01/21(水) 00:15:28testコマンドが対応していれば strcmp()による文字列比較も使えるので、
一応(p10とか2桁とかならない範囲なら)これで出来る
if [ `uname -r` \> "5.4-RELEASE-p5" ]
then
echo foo
fi
0877名無しさん@お腹いっぱい。
2009/01/21(水) 00:33:385.4-BETAはどうするの?
仕様をもうちょっときっちり書いて欲しい。
一桁.一桁-RELEASE-p一桁でいいのかどうかとか。
0878名無しさん@お腹いっぱい。
2009/01/21(水) 02:53:58d、助かりました。
この辺の、サブシェルとリダイレクトの組み合わせは、なかなか慣れない物で。
0879名無しさん@お腹いっぱい。
2009/01/21(水) 03:49:240880名無しさん@お腹いっぱい。
2009/01/21(水) 04:57:45入力されたコマンドをwhichまたはtypeでパスを抜き出して
そのコマンドのハッシュ値を得るにはどうしたら一番効率がいいですか?
自分で初心者ながら書いてみてるのですが全然うまくいきません。
お願いします。
0881名無しさん@お腹いっぱい。
2009/01/21(水) 06:40:16bash限定なら、
#!/bin/bash
echo -n 'コマンド? '
read comm
md5sum `type -p $comm`
0882名無しさん@お腹いっぱい。
2009/01/21(水) 07:53:05ありがとうございました。できました。
>>875
質問をちゃんと読んでください。
0883名無しさん@お腹いっぱい。
2009/01/21(水) 08:12:30>p10とか2桁とかならない範囲なら
なに、この素人
2桁でもできる方法もかけないならプロじゃない。
と素人のおれがいってみる。
0884名無しさん@お腹いっぱい。
2009/01/21(水) 10:03:340885名無しさん@お腹いっぱい。
2009/01/21(水) 10:12:462000年問題とは話が違う。
FreeBSD 5.xはもうEOLになるし、
そもそもシェルスクリプトというのはその場で動けばいいものを
「書き捨て」で書くもの。
0886名無しさん@お腹いっぱい。
2009/01/21(水) 10:13:42後は捏ねくり回したい人たちでどぞー↓
0887名無しさん@お腹いっぱい。
2009/01/21(水) 10:17:22たとえが悪過ぎ。
ちなみに、2000年問題は、騒がれていたほどの問題は起きず。
ほとんど無害で2000年を迎えた経過した。
2000年問題対策でかかった費用は実は必要なかったことが後でわかった。
むしろ、2000年問題対策と称して儲ける業者がいたことの方が問題。
0888名無しさん@お腹いっぱい。
2009/01/21(水) 10:17:520889名無しさん@お腹いっぱい。
2009/01/21(水) 10:19:33あの騒ぎ自体を「2000年問題」と言っている。
0890名無しさん@お腹いっぱい。
2009/01/21(水) 10:19:56メモは残してはいけない。
変にメモを残して別の担当者に引き継がれると困る。
自分が辞めたらだれもやりかたがわからなくなるのが望ましい。
だから会社は自分を辞めさせられない。
0891名無しさん@お腹いっぱい。
2009/01/21(水) 10:54:160892名無しさん@お腹いっぱい。
2009/01/21(水) 11:11:01それ、昔の考え。
0893名無しさん@お腹いっぱい。
2009/01/21(水) 14:50:43仕事がすべて自分に割り当てられる。
典型的な下っ端ですね。
0894名無しさん@お腹いっぱい。
2009/01/21(水) 16:28:23お答えありがとうございます。そのまま書いて実行してみたのですが
そのようなファイルやディレクトリはありませんと出てしまいました。
なんとかなりませんか?
0895名無しさん@お腹いっぱい。
2009/01/21(水) 16:37:29bashをインストールしていない(/bin/bashがない)のでは?
/bin/bashがないのに #!/bin/bash スクリプトを実行しようとすると、
「そのようなファイルやディレクトリはありません」と出るよ。
0896名無しさん@お腹いっぱい。
2009/01/21(水) 16:41:160897名無しさん@お腹いっぱい。
2009/01/21(水) 18:03:31/bin/bashはあるみたいです。
自分のやりかたが悪いのでしょうか・・・
0898名無しさん@お腹いっぱい。
2009/01/21(水) 18:05:330899名無しさん@お腹いっぱい。
2009/01/21(水) 18:16:41/bin/bash^M というシンボリックリンクを本当に作っておくという方法もあり。
0900名無しさん@お腹いっぱい。
2009/01/21(水) 18:39:25ありがとうございます。教えていただいたのを参考に
組み込んでみたところハッシュ値は取ってくるようになりました。
以下に書いたのが自分で書いてみたものの一部なのですが
取ってくるハッシュ値と実際にターミナル上でみたハッシュ値が
違うのですが、何が原因でしょうか?
シェルスクリプトはlist.lstに書いてあるコマンドを読んで
ハッシュ値をcachというフォルダにコマンド名で保存するというものなのですが
例えばlist.lstにfindと書いておくとこのスクリプトだと
e1b58755ded5d89cd50789f850232111と出るのにターミナル上でmd5sum findすると
4c66ef9549b37df90fb36ebc06f88ef0と出ます。何度もすいません・・・
#!/bin/sh
BUFIFS=$IFS
IFS=
exec 3<list.lst
while read file 0<&3
do
type -p "$file" | md5sum> cach/"$file".txt
echo "$file [ ok ]"
done
exec 3<&-
IFS=$BUFIFS
echo -e "\n"
0901名無しさん@お腹いっぱい。
2009/01/21(水) 18:53:00パイプとコマンド置換を混同してるね
× type -p "$file" | md5sum> cach/"$file".txt
○ md5sum `type -p "$file"` > cach/"$file".txt
0902名無しさん@お腹いっぱい。
2009/01/21(水) 18:57:10ありがとうございます。できました。
パイプとコマンド置換について勉強しなおします。
本当にありがとうございました。
0903名無しさん@お腹いっぱい。
2009/01/21(水) 20:20:03パイプとコマンド置換の違いと言う認識だと、
そもそも全然別物なので、
比較検討再構成的な学習法が成立しない。
ようは、引数と標準入力の違いでしょ。
0904903
2009/01/21(水) 20:24:45hoge
$ echo 'hoge' | echo
$ echo 'hoge' | cat
hoge
$ cat `echo hoge`
cat: hoge: No such file or directory
$
って事でしょ。
0905名無しさん@お腹いっぱい。
2009/01/21(水) 20:54:480906903
2009/01/21(水) 21:00:01type とか md5sum って、
どこのOSの話だ?
/bin/bash とかも、変だぞ。
パイプとかコマンド展開とか標準入力とか以前に、
使用するOSとシェルを間違えていませんか?
0907名無しさん@お腹いっぱい。
2009/01/21(水) 21:03:00おまえ、面白くないからもう書かなくていいよ。
md5sumはともかく、typeコマンド自体は純正シェルにある純正コマンド。
(-pオプションはないけどね)
「コマンド展開」とか間違った用語使わずに、用語も正確に覚えようね。
0908名無しさん@お腹いっぱい。
2009/01/21(水) 21:05:490909名無しさん@お腹いっぱい。
2009/01/21(水) 21:10:31とでも書いて欲しかったのかな?
もちろん、そんなことは知った上で、質問者のレベルを推定し、
質問者に合った回答をするのが上級な回答者。
0910903
2009/01/21(水) 21:25:52>>905
間違った解決は良くない。
#!/bin/sh
md5 `type -p \`cat list.lst\``
コマンド展開は普通に使うだろ、
チルダ展開と
変数展開と同列のレイヤーの処理だ。
0911名無しさん@お腹いっぱい。
2009/01/21(水) 21:29:57どこも間違ってないよ。
>>901 よりも早く回答を出せなかったくせに、
後から何言っても言い訳にしかならない。
あと、typeコマンドも知らなかったというお前の程度がこれで知れた。
× コマンド展開
○ コマンド置換(command substitution)
ちなみにチルダ展開は tilde expansion だから、「展開」でよい。
substitutionとexpansionをちゃんと用語として区別すること。
0912903
2009/01/21(水) 21:36:25ファイル記述子の扱いが二重に無駄。
exec が無駄。while が無駄。
なのにスルーして、手前味噌の話に誘導。
md5sum(そんなコマンド知らんが)の引数と標準入力の
扱いの違いを言及していないで、コマンド展開とパイプの話にすり替えている。
嘘だらけ。
0913名無しさん@お腹いっぱい。
2009/01/21(水) 21:41:330914名無しさん@お腹いっぱい。
2009/01/21(水) 21:41:57「引数と標準入力の違い」という言い方では、質問者には意味が通じにくい。
で、問題が解決した後で、質問者が「引数と標準入力について勉強してみます」
と言ったとしても、「引数と標準入力」では範囲が広過ぎて、
具体的なパイプやコマンド置換の用法の話に直接結び付かない。
こういう場合は、「パイプとコマンド置換の違い」と、単刀直入に説明するのが、
よい解説者。これなら、後で質問者が、パイプやコマンド置換について、
直接調べて勉強することができる。
0915名無しさん@お腹いっぱい。
2009/01/21(水) 21:46:55へ。
>>900 の元のスクリプト、もう一度良く見てみろ。
ファイル毎に別々のファイルにmd5を出力してるんだよ。
そうやって質問してるんだから、別々のファイルへの出力が要求仕様。
それに対し、お前の >>910 の例では、1つのファイルにmd5を書き出すから、
仕様を満たしていない。
whileは無駄ではない。この仕様の場合には必要。
0916名無しさん@お腹いっぱい。
2009/01/21(水) 21:49:070917903
2009/01/21(水) 21:50:49犬もsolも使った事があると言う程度だが、悪いか?
白痴じゃないから、md5sum位はググればすぐに分かるが、
敢えて、/bin/bashという設定に反発しただけで、(typeが勇み足)
真面目にとるな。
>>914
いや、そこが大事。
別に引数と言う概念全般とか標準入力全般やfd0の話ではなく、
あるコマンドが、引数や標準入力をどう扱うかという話しであり、
その方が明らかに調べやすい。
0918903
2009/01/21(水) 21:54:43なら、doneの後ろでリダイレクトで十分。
そうしても尚、無駄は残るがね。
>>916
気をつけた方がいい。
職を失うだけでは済まないかも?
0919名無しさん@お腹いっぱい。
2009/01/21(水) 21:55:27シェルのコマンド置換には行きつかない。
そもそもコマンド置換自体の存在を知らないと、
そういう使い方ができることすらわからない。
だから、「引数と標準入力」じゃなく、「パイプとコマンド置換」と
説明した方がよいことは明らか。
0920名無しさん@お腹いっぱい。
2009/01/21(水) 21:58:49> doneの後ろでリダイレクトで十分。
もちろんそんなこと知ってるよ。
でもそこは質問のポイントではないので、
焦点をぼかさないように敢えて答えない。
問題になっているのはなぜmd5sumがちゃんと動かないか、だから、
その点を回答すれば良い。
0921名無しさん@お腹いっぱい。
2009/01/21(水) 22:02:52それを言うなら、IFSだって、わざわざ別変数にバックアップして戻す必要はない。
(どうせシェルを抜ければ関係ないから)
しかし、質問は「このシェルスクリプトの無駄な部分を改良してください」
ではないのだから、そういうことはあえて回答しない。
0922903
2009/01/21(水) 22:05:10そんないい加減な。
全体がおかしいいんだから、きちんと添削しないと駄目だろ。
それに、>>900の、list.lst のフォーマットも未分明だし、
find と言う行が含まれるのか、
find とだけ書いてあるのかも、
あれだけじゃどちらともとれる。
>>問題になっているのはなぜmd5sumがちゃんと動かないか
こういうのをまさしく手前味噌と言うのだよ。
0923名無しさん@お腹いっぱい。
2009/01/21(水) 22:08:26>>900 より引用
>取ってくるハッシュ値と実際にターミナル上でみたハッシュ値が
>違うのですが、何が原因でしょうか?
ハッシュ値=md5sum値
として、質問者が聞いているのは md5sumがなぜ違ってしまうか、の点ですね。
その質問にダイレクトに答えてるだけですね。
(手前味噌ではありませんね)
「全体をきちんと添削してください」なんて質問していませんねw
0924903
2009/01/21(水) 22:08:59ああ、それもおかしいな。
当然、添削すべき。
単にこちらが、書き漏らしただけだが、
少なくとも、普通は「全部論外」と切って捨てるだろ。
要するに、アピールしたいことの為に
目をつぶったのが正解だろ?
0925903
2009/01/21(水) 22:16:12>>何が原因でしょうか?
普通は、それ以前の問題と回答するのが本当の親切。
部分的に正解を教えても、他が論外なのをスルーしたら
質問者が勘違いする元。
ようは、知っている自慢、教えたがりの自己満足。
0926名無しさん@お腹いっぱい。
2009/01/21(水) 22:24:49>>900 の質問の場合、「それ以前の問題」ではないぞ。
スクリプトは無駄があるとはいえ、
>>901 が回答した急所の1行以外は正常に動作している。
そして、>>901 の回答によって全体が正常に動作したのだから、
「それ以前の問題」はとくに存在しない。
0927名無しさん@お腹いっぱい。
2009/01/21(水) 22:27:22質問されてもいないことを、
別の回答者が回答して解決した後にわざわざ書き込んで話を蒸し返してるし。
0930名無しさん@お腹いっぱい。
2009/01/21(水) 22:39:59仕様通りの出力が得られれば正常動作。
スクリプト内部で無駄があったとしても正常動作かどうかの判断には関係ない。
0931903
2009/01/21(水) 22:44:16それは結局「バグ隠し」に繋がる。
コンピュータが期待した動作をするのと、
期待した出力をするのは別物。
バグは潰さないといけない。
0932名無しさん@お腹いっぱい。
2009/01/21(水) 22:45:31質問者にとって解決ならばそれがすべて。
それを「嘘の解決」と言っているのはお前だけ。
「嘘の解決じゃ駄目だから、真の解決を」なんて言い出すのは、
まさに教えたがりの特徴。
0933名無しさん@お腹いっぱい。
2009/01/21(水) 22:46:49で、どこにバグがあるの?
0934903
2009/01/21(水) 22:47:42頑張らなくても最適化されている場合が殆どだろうが、
そう言う気概を持ちつづけることは重要。
0935903
2009/01/21(水) 22:52:44掲示板では、発呼した質問者の背後に数多の質問者が居ると言うスタンスが肝要。
>>933
知らん。繋がる考え方と言っているだけで、今バグがあると言っている訳じゃない。
0936名無しさん@お腹いっぱい。
2009/01/21(水) 22:58:46そんな仮想の質問者まで仮定して、
質問されていないことまで解答にこだわろうとするのは
教えたがりの特徴。
0937名無しさん@お腹いっぱい。
2009/01/21(水) 23:51:410938名無しさん@お腹いっぱい。
2009/01/21(水) 23:58:52スクリプトが正しく動くかのほうが大事。
それがこのスレの存在意義。
0939名無しさん@お腹いっぱい。
2009/01/22(木) 06:31:53type -p や md5sumについて知らなかったり、
「コマンド置換」の用語を知らなかったり、
「別ファイルに出力」という要件を読み落すような
レベルの低い教えたがりは要らないな。
あと、本題のmd5sumのコマンドラインの修正点について一切答えず、
本題に関係ない部分の突っ込みばかり入れる
>>903 みたいな教えたがりは要らないな。
>>901 が先に本題の解答をしていなかったら、
>>903 によって、本題以外の突っ込みばかりで
質問者が潰されていたことだろう。
0940名無しさん@お腹いっぱい。
2009/01/22(木) 07:03:54fd3を開いて閉じる必然性:
while ...
do
:
done < list.lst
の方式では、whileループの中で(readコマンド以外が)
もし本来の標準入力を読む必要があった場合、読めなくなってしまう。
かと言って、while read file < list.lst と書いてしまうと、
ループのたびに list.lstがオープンし直されて頭から読み直されるから正常動作しない。
そこで、exec 3<list.lst で、あらかじめ list.lstをオープンしたままにしておき、
while read file 0<&3 で、readコマンドだけにリダイレクトする。
0<&3は単なるファイル記述子の複製だから、read ... <list.lst とは違って、
ファイルを頭から読み直さないから、正常動作する。
whileループを抜けたら、fd3は必要なくなるので、
exec 3<&- で閉じる。
以上、必然性は認められる。
0941名無しさん@お腹いっぱい。
2009/01/22(木) 11:27:470942名無しさん@お腹いっぱい。
2009/01/22(木) 12:50:43ってやると行頭の空白が $a に入らないんだけど、
うまく空白まで拾う方法ってないんだっけ?
0943名無しさん@お腹いっぱい。
2009/01/22(木) 12:53:44IFS= read a
0944名無しさん@お腹いっぱい。
2009/01/22(木) 13:00:460945名無しさん@お腹いっぱい。
2009/01/22(木) 13:04:26行頭の空白を拾わないと言う認識だと、
そもそも全然別物なので、
比較検討再構成的な学習法が成立しない。
ようは、デリミタ展開の問題でしょ。
0946名無しさん@お腹いっぱい。
2009/01/22(木) 13:37:08お前まだいたのかw
質問が解決した「後」で蛇足な書き込みする前に、正しい用語覚えろ。
× デリミタ展開
○ 単語分割(word splitting)
0947名無しさん@お腹いっぱい。
2009/01/23(金) 23:29:51アフォのこじつけ丸出し。
while read って書いたのは誰だ?
以外のコマンドって何だ?
読む必要とは?
おまいは、コマンドの指示に従ってスクリプトを書くのか?
本末転倒。
0948名無しさん@お腹いっぱい。
2009/01/23(金) 23:32:58見苦しい自演でご苦労ですな。
しったかをするために、
更に無知な人間をでっち上げるとは、
たいした念の入り様だ。
死ねカス。
0949名無しさん@お腹いっぱい。
2009/01/23(金) 23:35:21意味わかってる?
本来の標準入力を読むのは、readじゃなくて、
whileループ内の、do 〜 done の間のコマンドのことだよ。
while read file
do
mv -i "$file" "$file"-hoge
done < list.lst
みたいな場合、mv -i コマンドが確認のために標準入力を読んでしまう。
これが、< list.lstと競合して正常動作しない。
これを回避するために fd3 を使う。
0950名無しさん@お腹いっぱい。
2009/01/23(金) 23:56:03まさに、牽強付会。
read がリダイレクトを読むのが前提で、
do以下が読むのを「本来の」ってのが、無理やりだ。
意味分かってる?
0951名無しさん@お腹いっぱい。
2009/01/23(金) 23:59:42逆に聞くが、
>>949 のような場合 (ループ中にmv -i がある)
done < list.lst の方式でどうやって書くつもりだよ?
まさかいちいち mv -i < /dev/tty はないだろ?
fd3 (別にfd4以降でもいいが) を使うのが一番美しいだろ?
よって、お前の負け。
0952名無しさん@お腹いっぱい。
2009/01/24(土) 00:01:39何でわざわざ競合する状況にしないといけないのか?
普通に標準入力を読むと、困るのか?
特殊なライブラリを無理にリンクして、
レースコンディションを作る趣味でも有るの?
0953名無しさん@お腹いっぱい。
2009/01/24(土) 00:04:11だから、変なコード書くな。
>>949の様な場合・・を作るな。
0954名無しさん@お腹いっぱい。
2009/01/24(土) 00:05:21おい、mv -i の動作、理解してないのかよ。
done < list.lst
の状態で、mv -i が標準入力を読むと、
list.lstを読んでしまう。
で、ファイルリストが読み飛ばされてめちゃくちゃになるだけでなく、
「y」以外のデータが読めた場合は mv コマンドがキャンセルされる。
全く意図通りに動かない。
まずは、>>951 の質問に答えること。話はそれからだ。
0955名無しさん@お腹いっぱい。
2009/01/24(土) 09:11:15答える必要無し。
なんで、>>949のような場合って言う意味不明の状況に対して、
人様の脳みそを使わせようとするのか?
>>900でfd3を開いて閉じる必然性が無い事について、
「これこれこういう場合に必然性が有る」というのは、
単なる詭弁。
0956名無しさん@お腹いっぱい。
2009/01/24(土) 09:38:06>答える必要無し。
なんだ、答えられないのか。お前、負けを認めたなw
>「これこれこういう場合に必然性が有る」というのは、
>単なる詭弁。
詭弁ではない。
お前自身も、>>931 で、
「それは結局「バグ隠し」に繋がる。」と発言してる。
今現在はバグはなくても、「これこれこういう場合に」にバグが発生する可能性が
あるのをあらかじめ潰しておくことを、お前自身は肯定していたわけだ。
ならば、whileループにおいて、リダイレクトの必要があるのは readだけなのだから、
read以外の、do〜doneの間にあるコマンドはリダイレクトの影響を受けないよう、
標準入力をもとの標準入力のままにしておくことが
将来を見通したバグのないコーディングといえる。
ちなみに、do〜doneの間に mv -i を入れて、インタラクティブに確認するという
スクリプトは、普通にあり得る。
で、そういう場合、fd3を使ってオープンした上で、read 0<&3 で読むというのも、
テクニックとして存在する。
お前は、そのテクニックについて知らなかったわけだ。
0957名無しさん@お腹いっぱい。
2009/01/24(土) 10:09:380958名無しさん@お腹いっぱい。
2009/01/24(土) 10:26:46>>955 は fd3を使ったwhileループのテクニックについて理解できない。
0959名無しさん@お腹いっぱい。
2009/01/24(土) 13:05:59出来ていないのはお前。
というか、お前はシェルスクリプトのあらゆる事が、
まったく理解できていない。
やめてしまえ。
0960名無しさん@お腹いっぱい。
2009/01/24(土) 13:14:13妄想は程々に。
よくもまあ、それだけ嘘ばっかり書けるな。
本当の事が一つも書いていない。
まあ、お前のレスは何時もそうだがな。
0961名無しさん@お腹いっぱい。
2009/01/24(土) 13:44:15だから、>>951 の質問に答えろよ。
論破されて答えられなくなったからと言って、
「答える必要なし」で誤魔化すなよw
>>960 は、
whileループ中のループ本体のコマンドが標準入力を読むこともあるという、
ごく普通の状況すら想像できなかったんだろw
もっと想像力を身に付けろ。
シェルスクリプトは、様々な可能性を考慮してコーディングすること。
あと、>>959,960 には、具体的なことが一言も書かれていない。
つまり、全然反論になっていない。
これは、論破された人間が負け惜しみで書く典型的な文章。
0962名無しさん@お腹いっぱい。
2009/01/24(土) 13:53:070963名無しさん@お腹いっぱい。
2009/01/24(土) 17:11:48結論: 解決済みの質問に的外れな文句付けた>>903が無様。面白いから、もっとやれ。
>>904 解決済みの事をくどく教えたがる。(後ろの方で仮想的を教えたがりと叩いているのが笑える)
>>906, >>910, >>912 恥の上塗り。
>>922 必死に質問者のあらさがし。
>>925 元質問者の質問の一部を取り出して意味不明のレス。
>>928 必死に探しあてた(と確信した)アラにすがる
>>934-935 撤収用意?
>>947, >>950 もはや日本語になっていない
0964名無しさん@お腹いっぱい。
2009/01/24(土) 17:39:22テクニックを知っているにも関わらず、
質問内容自体はごくごく初歩的なのでちょっと驚いた
まわりからシェルスクリプト書くときのルールみたいにして
教え込まれてるのかな?
0965名無しさん@お腹いっぱい。
2009/01/24(土) 18:47:440966名無しさん@お腹いっぱい。
2009/01/25(日) 21:31:320967名無しさん@お腹いっぱい。
2009/01/25(日) 23:34:48do
echo $buf
done < hogehoge
のhogehogeのところをファイルじゃなくてコマンドにすることは可能ですか?
これじゃ無理でしたが、イメージはこんな感じです。
while read buf
do
echo $buf
done < `grep . hogehoge`
0968名無しさん@お腹いっぱい。
2009/01/25(日) 23:37:45do
echo $buf
done
0969名無しさん@お腹いっぱい。
2009/01/25(日) 23:47:06ありがとうございます!
ついでにCSVファイルの各レコードのカラム数を出したいんですが、うまい方法ありますか?
awk -F ' { print NF } ' hoge.csv
でもいいんですが、awkが嫌いなので使いたくないです
0970名無しさん@お腹いっぱい。
2009/01/26(月) 00:10:00sed 's/\\,//' hoge.csv | awk -F, '{ print NF; }'
0971名無しさん@お腹いっぱい。
2009/01/26(月) 00:10:210972名無しさん@お腹いっぱい。
2009/01/26(月) 06:33:55IFS=,
while read line 0<&3
do
set $line
echo $#
done 3< hoge.csv
ちなみに、fd3を使う方式にしといたよw
0973名無しさん@お腹いっぱい。
2009/01/26(月) 11:08:04while read line 0<&4
do
echo ",$line" | tr -cd "," | wc -c
done 4< hoge.csv
0974名無しさん@お腹いっぱい。
2009/01/26(月) 12:31:330975名無しさん@お腹いっぱい。
2009/01/26(月) 12:34:45質問は、
>>969 が言うように、
> awk -F, '{ print NF }' hoge.csv
>でもいいんですが、
なのだから、↑のawkと同等のシェルを作ればいいだけ。
エスケイプなんて余計なことする必要なし。
0976名無しさん@お腹いっぱい。
2009/01/26(月) 12:45:130977名無しさん@お腹いっぱい。
2009/01/26(月) 13:34:54そんなら、とっとと「awkと同等のシェル」作れ。
0978名無しさん@お腹いっぱい。
2009/01/26(月) 13:36:50Excelで読めないようなCSVはCSVとは認めません。
0979名無しさん@お腹いっぱい。
2009/01/26(月) 13:56:43>>972
0980名無しさん@お腹いっぱい。
2009/01/26(月) 13:58:36awkと同等のものがスクリプトなわけないだろ。
シェルでいいんだよ。
0981名無しさん@お腹いっぱい。
2009/01/26(月) 14:55:350982名無しさん@お腹いっぱい。
2009/01/26(月) 22:11:300983名無しさん@お腹いっぱい。
2009/01/26(月) 22:32:210984名無しさん@お腹いっぱい。
2009/01/26(月) 22:35:25>>980
次スレ立ててよ。
0985名無しさん@お腹いっぱい。
2009/01/27(火) 07:24:42次スレでは、>>11 を >>9 のfindの記述のところにマージしてね。
0986名無しさん@お腹いっぱい。
2009/01/27(火) 07:28:040987名無しさん@お腹いっぱい。
2009/01/27(火) 07:46:15とりあえず、>>903が、分かってないのに偉そうなところまで読んだ
レス数が950を超えています。1000を超えると書き込みができなくなります。