トップページunix
987コメント345KB

シェルスクリプト総合 その13

■ このスレッドは過去ログ倉庫に格納されています
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/
0588名無しさん@お腹いっぱい。2009/01/06(火) 14:13:16
やっぱ色々使いたいじゃん
perlがあってもsedやawkは使うしもちろんシェルスクリプトも使う
オナニー万歳
0589名無しさん@お腹いっぱい。2009/01/06(火) 14:29:48
ふつー、sedやawkは使ってもperlは使わないなぁ
0590名無しさん@お腹いっぱい。2009/01/06(火) 14:31:13
goshやsbclを使う人がいるんだもの
perlぐらいフツーっすよ
0591名無しさん@お腹いっぱい。2009/01/06(火) 14:32:56
sedで足りるものはsedで、足りないものはperlで、awkは中途半端
0592名無しさん@お腹いっぱい。2009/01/06(火) 14:39:18
sed→awk→ruby かな俺の場合
awkがメイン
0593名無しさん@お腹いっぱい。2009/01/06(火) 14:43:02
まぁ、もうその辺で。
0594名無しさん@お腹いっぱい。2009/01/07(水) 00:45:44
何でもphpなオレは負け組
0595名無しさん@お腹いっぱい。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:34
telnetの代わりにnetcat(あるいはnc)を使ったらうまくいきそうな気がする。
0597名無しさん@お腹いっぱい。2009/01/07(水) 01:13:23
telnetは標準入力じゃなくてttyを入出力とするからリダイレクト出来ない。
0598名無しさん@お腹いっぱい。2009/01/07(水) 01:27:44
>>596
netcat,nc初めて聞きます。調べておこう。
>>597
どうも助かります。
>telnetは標準入力じゃなくてttyを入出力とするからリダイレクト出来ない
となると、
>telnet hoge.net < `tty` という具合ですね。
別の端末から
>echo "user MYID" > /dev/あっち とか。
telnetをやるスクリプトを動かすスクリプトを書いて
上位からttyへ流し込むとか。

いろいろやってみますね。
どうもサンクスです。
05995952009/01/07(水) 02:25:51
>>596
ncで動きました。これで自動化できます。
0600名無しさん@お腹いっぱい。2009/01/07(水) 08:36:31
telnetも標準入力から読むよ
UNIX FAQにあるように echo と sleep で
間隔開けて1行ずつ出せばいけたかも
0601名無しさん@お腹いっぱい。2009/01/07(水) 09:58:53
expect
0602名無しさん@お腹いっぱい。2009/01/07(水) 10:01:37
>>601
>>599
0603名無しさん@お腹いっぱい。2009/01/07(水) 11:04:24
?
06045952009/01/08(木) 22:29:27
動いた気がしただけでした(藁
セキュリティ絡みでひっかかって駄目みたい。
ok
ok
ok
とくるからpassまではいけてるから、そっから先に
いろいろあるんだろうなあ。
ぐぐったらperlのスクリプトが沢山あったから、
参考にしてみます。
06055712009/01/09(金) 02:21:36
563-578
御礼遅れてすいません。ありがとうございました!
--overwrite なんてオプションあったんですね。知りませんでした。

あとすいません、573の方が書いてくださったシェルスクリプトの--&&-- ってのはどういう意味でなのでしょう?
ご教示いただきたくm(_ _)m
0606名無しさん@お腹いっぱい。2009/01/09(金) 07:14:00
FreeBSDで書いた自作シェルって、Linuxでもそのまま動くんですね!!
こりゃ便利です。移行もスムーズです!!!
0607名無しさん@お腹いっぱい。2009/01/09(金) 07:16:59
>>605
--&&-- じゃなく --$$-- な。
echo --$$--
ってやってみ。

別に .aho でも .baka でも .tmp でもいいんだろうが、
.bak だと同名のファイルが既に存在していて壊してしまうおそれが高いし、
.--$$-- ならその可能性は低いだろうと、それだけのこと。
0608名無しさん@お腹いっぱい。2009/01/09(金) 10:07:01
>>606
シェルってゆうな。クズ。
06095712009/01/09(金) 11:29:11
なるほど、プロセスIDを保持しているんですね。ありがとうございます。

すいません、あとひとつお聞きしたいのですが
outfile=`basename "$file" .txt` .text
で、
""は必要ですか??
試してみると
outfile=`basename $file .txt` .text
でもできました。
0610名無しさん@お腹いっぱい。2009/01/09(金) 11:39:04
ファイル名に空白文字が入っている可能性がなければ不要。
0611名無しさん@お腹いっぱい。2009/01/09(金) 11:39:54
>>609
" " は必要。
" "がないと、スペースとか、特殊記号を含んだファイル名で正常動作しない。
0612名無しさん@お腹いっぱい。2009/01/09(金) 11:45:58
GUIやsambaが当たり前の環境ではスペース含みのファイル名は普通にあると
思った方がいいので当面必要無くても常にダブルクォートを付けるルールを守ること
その意味で >>573 は失格
0613名無しさん@お腹いっぱい。2009/01/09(金) 11:47:57
>>611
> 特殊記号を含んだファイル名
問題になるな特殊記号って?
0614名無しさん@お腹いっぱい。2009/01/09(金) 11:48:53
*
0615名無しさん@お腹いっぱい。2009/01/09(金) 11:51:31
おけ。把握。
0616名無しさん@お腹いっぱい。2009/01/09(金) 11:58:14
&が取り込んだ曲のアーティスト名にありがち。
0617名無しさん@お腹いっぱい。2009/01/09(金) 12:14:32
バッククォートはシェルが再解釈するから、(ファイル名が外からやっ
てくるなら)普通にメタキャラクタのチェックしないと危険だろ。
0618sage2009/01/10(土) 14:55:14
>>551の置換えって、結局プログラムでやるしかないという結論?
0619名無しさん@お腹いっぱい。2009/01/10(土) 15:11:30
>>618
そんなコマンドは見たことないな。

置き換え対象のファイルがあまり大きくないならperlかなにかで
一つの文字列にまるごと読み込んで置換するのが楽だと思う。
メモリにおけないぐらいでかいファイルなら工夫が必要だけど
0620名無しさん@お腹いっぱい。2009/01/10(土) 21:49:06
>>551
今一何をしたいのかよく分からないんだけど、
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:26
ONENUM=1
TWONUM=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:26
ネタで書いてるものだと思ってたが、もしかして違うのか?
0624名無しさん@お腹いっぱい。2009/01/11(日) 03:29:31
たまにいるなこうゆう人。 プログラム書かないでほしいよ、、今の上司とか
0625名無しさん@お腹いっぱい。2009/01/11(日) 09:06:20
>>620
とりあえず、頭の関数ひとつだけ添削してやるよw

File_line_digit(){
FLINE=`wc -l < "$1"`
echo $FLINE # ここは、わざとダブルクォートを付けない
}

↑のようにすれば、wc -l の出力のスペースをカットするために
わざわざsedを使う必要がない。あと、もちろんcatは不要。
wc -l の出力にファイル名が付かないように、
標準入力からリダイレクトする。
0626名無しさん@お腹いっぱい。2009/01/11(日) 11:42:35
>>622>>623>>624
自分で見直しても読みにくいの書いてすいません(藁
出直してきます。
>>625
目から鱗です。
06275712009/01/12(月) 13:28:52
なるほど!。さんくすですm(_ _)m
0628名無しさん@お腹いっぱい。2009/01/12(月) 14:18:39
俺も>>551に挑戦してみたんだが、
何故か思うように動かない。
考え方としては有っていると思うのだが、
最後のif文の比較がどうしても真にならない。

set -x して、トレースしたら同じ文字列のはずだし、
空白が混入しているようにも思えないのだが・・
06296282009/01/12(月) 14:22:44
#!/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"
   }
   /'"$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"
06306282009/01/12(月) 14:37:35
ああ、余計な $ が、一個付いてるけど、
そもそも、そこに処理が行かないわけで・・
06316282009/01/12(月) 14:57:09
お騒がせしました。
trが最後に改行が無くても空白を追加していました。

しかし、どうも上記はまだまだ使い物になりません。
もう少し精進します。

てか、これ、結構ムズい。
06326282009/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:11
そんなの誰も見ないから、ちらしの裏に書いとけ
0634名無しさん@お腹いっぱい。2009/01/12(月) 22:40:43
>>633

そうは言うけど、>>551の設問を
>>557の要件で満たすのは大変だぞ。

現に誰もまともな解答例が無いだろう。

仮に三つのファイルを
1・対象ファイル
2・参照ファイル
3・置換ファイル

として、1の行数が不定の上、
2が何回マッチするかも不定で、
シェルスクリプト流に一行づつ処理するならば
途中でマッチしないことが判明したら、仕切り直さないといけない。
(でも、マッチしたらその分行を進めないといけない)

いっそC言語とかで書いて、2のファイルを読み出して保持しておき、
同じサイズのバッファをmallocとかで確保し、順次改行迄ごとに1のファイルを読んで、
strcmpとかする方が楽に思える。

無駄な処理が実に多いのは承知の上で、
tail と awk の合わせ技で料理したのに、
実に君は無礼だな。
0635名無しさん@お腹いっぱい。2009/01/13(火) 02:34:49
複数行の置換をawkで考えたくないなあ
富豪的に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:53
>>551

cat a.dat b.dat c.dat | uniq

おまいら大丈夫か?
0637名無しさん@お腹いっぱい。2009/01/13(火) 07:57:11
>>635

>まあワンライナーだよな

ぷぷぷ
0638名無しさん@お腹いっぱい。2009/01/13(火) 08:00:14
>>636
>>557 を欲詠め
あなたの回答は全くの見当違い
0639名無しさん@お腹いっぱい。2009/01/13(火) 12:20:07
>>635
多大なるヒントを有難う。
やっぱり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:52
>>639
BEGINで$1, $2のファイル読み込むといいと思うよ。
awkは(初期のを除いて)リダイレクト使えるから。
# すれ違いっぽいからコードは書かないけど
0641名無しさん@お腹いっぱい。2009/01/13(火) 15:30:14
>>640
有難う御座います。

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
searchLine="^" arg1 "$"
と書いたつもりでした。
0644名無しさん@お腹いっぱい。2009/01/13(火) 21:12:10
なんで上記コードでは、awkスクリプト全体の「'」と
正規表現中の「'」がうまく認識されるのですか?

awk '
$0 !~ /^'

ここでぶったぎられそうな気がするのですが。
0645名無しさん@お腹いっぱい。2009/01/13(火) 21:23:35
>>644
ぶったぎられる、というのはその通り。
ところが、その直後にスペースを入れずに "$searchLine" と続けているから、
結局これら全体がシェル上で「1つの引数」になって awkに渡される。
0646名無しさん@お腹いっぱい。2009/01/13(火) 22:38:22
>>644

単にシェルが「'」を食べるだけ。

#!/usr/bin/awk -f というスクリプトを考えたら良い。
そう言う場合は「'」は不要でしょう?。

要するに、「'」と「'」に挟まれたところをシェルがそのまま awk に渡し、
その外側の部分を、シェルが先に解釈(展開)すると言うだけの事。
最終的には全部 awk に渡される。
0647名無しさん@お腹いっぱい。2009/01/13(火) 22:44:06
>>646
違うよ。

>>645
が正解。
0648名無しさん@お腹いっぱい。2009/01/13(火) 23:13:01
>>644
$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
>>647

むむ。
>>645 は、何も言っていないに等しいとしか読めない。
スペースの有る無しは変数名が変わると言うことだし、
awk への引数ではなく、その文脈上の展開した値として単純に awk に渡されると
認識している。

念を押すが、awk (にしろ他のコマンドにしろ)「'」の存在は知らない。
0650名無しさん@お腹いっぱい。2009/01/13(火) 23:17:03
いや、正直良く分かりません。

??
0651名無しさん@お腹いっぱい。2009/01/13(火) 23:28:32
>>648
なるほど。ありがと。
0652名無しさん@お腹いっぱい。2009/01/14(水) 03:13:11
シェルスクリプト中にawkみたいな感じで
ペタってコード書ける言語って、
他になにがありますかね。
0653名無しさん@お腹いっぱい。2009/01/14(水) 03:55:52
スクリプト系言語で出来ない方が珍しい。
引数にコード渡せればいいだけだから。
0654名無しさん@お腹いっぱい。2009/01/14(水) 06:50:56
>>649
あなた、微妙に理解がズレてますよ。

>スペースの有る無しは変数名が変わると言うことだし、

じゃなくて、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
>>649 氏は、
>>645 は、何も言っていないに等しいとしか読めない。」
なんて発言しちゃってるから、

>>645 の意味が理解できてないみたいだね。

>>645 の解答が出た後で、
なんでピンボケな >>646 のカキコがあるのか不思議に思ってた。


あと、>>649 氏の発言をもうひとつ指摘、
「スペースの有る無しは変数名が変わると言うことだし」
もしかして、『変数』と『引数』の用語を混同してますか?
もしスペースがあって、awkプログラム部分が複数の『引数』に分かれてしまうと、
そもそもawkは正常動作しませんよ。変数名が変わるだけの問題では済みません。
0657名無しさん@お腹いっぱい。2009/01/14(水) 13:33:15
>>656
>>>>645 は、何も言っていないに等しいとしか読めない。
のはそのとおりで、実際に質問の答えになっていない。
空白が無いかどうかではなく何でぶった切られないかと言うのが質問。
だから「,」の外側はシェルが解釈出来る内容であれば良いが、
空白があればシェルによって別の引数として扱われるのは別の問題だし、
要するに
awk 'N''R == '`expr 1 + 1`' { pr''in''t'' }' file
がちゃんと動くことの説明としては、不足がある。
0658名無しさん@お腹いっぱい。2009/01/14(水) 13:50:45
空白がないから「1つの引数」になってと説明されて、わからない奴が知能障害。ww
0659名無しさん@お腹いっぱい。2009/01/14(水) 13:56:28
>>658

空白が有っても動く例

echo 'wa' `echo r\`echo o\`` 'ta'

cシェルじゃ動かないが
0660名無しさん@お腹いっぱい。2009/01/14(水) 14:03:49
>>659
それ、3つの引数に分断されるよ。echoだから結局問題にならないだけで、
awkだと動かない。
0661名無しさん@お腹いっぱい。2009/01/14(水) 14:05:40
>>657
> 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
>>661

>>質問したかったことは「引数がなぜ1つになるのか」と言うことであることは明らか。

君はエスパーか?
もし仮にそう言う意図で質問していたとしたら
>>644では言葉が足りなさすぎる。
>>659のようなものに対しても当てはまる質問と読むのが妥当。
従って、>>645は何の説明にもなっていない。

まあ、エスパー相手じゃこっちに勝ち目は無いが。
0663名無しさん@お腹いっぱい。2009/01/14(水) 14:24:31
>>662

× >>645 は何の説明にもなっていない
>>662 の頭脳では、せっかくの >>645 の説明が理解できない。


エスパーしなくても、
もう一度 >>648 の書き込みを見てみろ。
複数のクォート同士を、「空白」を入れた場合と入れない場合で説明してるだろ。
それに対して、質問者が「なるほど」と言って理解したんだから。

ポイントは、シェルの単語分割(引数分割)の際の「空白」について。
0664名無しさん@お腹いっぱい。2009/01/14(水) 14:31:19
エスパーだろ。

>>644>>651 が、同一人物だと見抜けてるし。
>>644 の質問から「引数がなぜ1つになるのか」という意図を見抜いたし。

常人には真似のできないことをするからエスパー。

ちなみに >>648 を何度読んでも
「それはそうですが、何か?」
と言う感想しか抱けない。
0665名無しさん@お腹いっぱい。2009/01/14(水) 14:42:10
>>664
なんだ、>>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
>>657 = >>667 よ、興奮してるからと言って
シングルクォートとカンマを間違えるな。しかも3回も。

アンタ、もしかしてawkプログラムが複数の引数に分かれて渡されても、
awk側で(例えば BEGIN { と } の対応とかで)適切に連結されて
うまく処理されると誤解してたんじゃない?

だから、>>649 で、
「スペースの有る無しは変数名が変わると言うことだし」
みたいなトンチンカンなことを言ったんでしょ。
0669名無しさん@お腹いっぱい。2009/01/14(水) 15:16:08
>>668
typo位スルーしろ。

そもそも、そんなこと考えようともしないだろ普通。
第一>>645が何も言っていないと言うのと無関係。
そんな変態的な事を考えていたら、>>645が間違いだと突っ込むだろう。

スペースの有る無しは単に変数の内部、つまり$の後ろと勘違いしただけだろう。

で?
0670名無しさん@お腹いっぱい。2009/01/14(水) 15:23:54
>>667
> >>644は明らかにシェル変数もクォートされていると誤解した書き方だろう。
君はエスパーか? www
0671名無しさん@お腹いっぱい。2009/01/14(水) 15:24:10
>>669
>スペースの有る無しは単に変数の内部、つまり$の後ろと勘違いしただけ

ふつー、そんな勘違いあり得ないよ。
そういう勘違いが起きること自体、
この問題の場合は「空白の有無」が重要、ということに
>>669 が気づいていなかった証拠。

だから >>645 を見ても、その意味が >>669 にはわからなかったのだろう。

>>645 は、
「シングルクォートは終了(ぶった切れ)しても、シェルの引数としては続いている」
と言うことを言ってるんだよ。それが的確な答え。
0672名無しさん@お腹いっぱい。2009/01/14(水) 15:26:58
てか、>>665

そんなこと書いて知らない人が鵜呑みにしたらどうするんだ?

0と1は、まあtypoと大目に見ても、
オプションとか全く考慮していないのはどうか?
0673名無しさん@お腹いっぱい。2009/01/14(水) 15:27:29
そろそろサマリをくれ。
0674名無しさん@お腹いっぱい。2009/01/14(水) 15:29:18
>>672
typeじゃないよ。argv[1] で合ってる。
argv[0] は awk の文字列。
0675名無しさん@お腹いっぱい。2009/01/14(水) 15:32:18
>>670

>>正規表現中の「'」
内部に無い以上前後を一括りにしてしまっていると読むのは妥当。

>>671

だから>>644の質問に「空白の有無」なんて重要じゃないと何度言ったら・・
分からなくて当然で、明後日の回答内容なんて気にするわけないだろ。
斜め読みにきまってる。

>>シェルの引数としては続いている

こう言う常人には見えない文字が見えるのがエスパー
0676名無しさん@お腹いっぱい。2009/01/14(水) 15:35:08
>>673
>>665 がサマリとしてもよくまとまってると思う。

>>674 の言うとおり、typoじゃないね。
(674自身はtypeがtypoだがw)
0677名無しさん@お腹いっぱい。2009/01/14(水) 15:35:18
>>674

誰が、処理内容がargv[0]だと言った?

自分で第一引数って書いただろ。
まあ第一と第二のtypoということにしておいてもいいが、
そんなことより根本的におかしいだろ「重要」だなんて。
0678名無しさん@お腹いっぱい。2009/01/14(水) 15:38:27
>>676

そりゃ最悪だ。
嘘を重要といい、
明後日の事をくどくど書いて「問題の本質」だと?
0679名無しさん@お腹いっぱい。2009/01/14(水) 15:41:40
>>677
だからtypoじゃないって。

awk = argv[0] = 第0引数
awkプログラム = argv[1] = 第1引数

awkプログラム部分を「1つの引数にする」「2つ以上に引数に分けてはいけない」
ことは重要。

確かに、-F とか、その他awkのオプション引数が入る場合は
awkプログラム部分は argv[1]より後ろにずれるが、
そういうことを言ってるんじゃない。
0680名無しさん@お腹いっぱい。2009/01/14(水) 15:42:37
>>765
自分が理解できないということすなわち自分が無能であることを、
力説しているキミには同情を禁じ得ない。ww
0681名無しさん@お腹いっぱい。2009/01/14(水) 15:43:20
>>675
自分が理解できないということすなわち自分が無能であることを、
力説しているキミには同情を禁じ得ない。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
>>675

理解できないんじゃなく価値が低いと看做したから
斜め読みしたと書いたつもりだが?

で、変数のところに空白がはいりゃそりゃ意味が変わるから
動かなくて当然だと早とちりしただけであり、
>>645>>644に対して何も言っていないと言う主張と全く矛盾しない
というか、極めて整合性が有る。
0685名無しさん@お腹いっぱい。2009/01/14(水) 15:54:17
>動かなくて当然だと早とちりしただけであり、

www
なんだ、>>646 の解答はやっぱり「早とちり」だったのか。
それがすべてだな。
0686名無しさん@お腹いっぱい。2009/01/14(水) 16:00:07
まあ良い。
シェルから見て第0引数という表現は
実に気持ち悪いが、まあ無いわけではないから許してやる。

しかしオプションを無視した上に、
別に何の変哲もないことを力説して、
重要だの本質だのというのは頂けない。
しかもawk特有の様に語るところがミスリードを意図しているようで気持ち悪い。

空白をセパレータとして認識するのはシェルだし、
パラメータを複数受け取っても、
それがコマンドにとって適正であれば動くし、
不適であれば動かないという一般的な話なだけであって、
敢えてawkを例に出して力説するような物じゃあ無い。
0687名無しさん@お腹いっぱい。2009/01/14(水) 16:03:59
>>685

恣意的な誘導だな。

>>646ではなく
>>649が早とちり(しかもどうでもよい)

だろ。
■ このスレッドは過去ログ倉庫に格納されています