シェルの結果。半数が正解の一方、自信満々で間違える。
サーチマン佐藤です。
こんにちは。
前回記事の「シェルのクイズ」の
回答結果、みてみましょう。
━━━━━━━━━━━━━━━━━━━━━
【質問】以下、二つのシェルがあります。
どっちのシェルが動きますか?
【xx1.sh】
====================
#!/bin/sh
if [ $1 = "0"]; then
echo "success"
else
echo "fail"
fi
====================
【xx2.sh】
====================
#!/bin/sh
if [ $1 = "0" ]; then
echo "success"
else
echo "fail"
fi
====================
━━━━━━━━━━━━━━━━━━━━━
【回答結果】
・「上(xx1.sh)だけ動く」
90票(17.0%)
・「下(xx2.sh)だけ動く」
238票(45.1%)
・「両方動く」
102票(19.3%)
・「質問の意味がわからない」
56票(10.6%)
・「そのほか」
42票(8.0%)
━━━━━━━━━━━━━━━━━━━━━
まずは、ズバリ言いますが、
正解は、
「下(xx2.sh)だけ動く」です。
正解率は50%を切りましたし、
「えー何で?」と思った方も多いでしょう。
解説しますね。
xx1.shとxx2.shの違いは、
if文に半角スペースがあるかないか、
それだけなのですが、
(わからない人は、↑のソース、
じっくり見てくださいね)
実は、シェルは、
その半角スペースがないと、
エラーになるんですね。
慣れてない方には、
ますます、「えー?」でしょうが、
まずは、間違った方のお便り、
掲載しますね。
ただし、この掲載は、もちろん、
その間違いを、
バカにするとかじゃなくて、
我々が、どうやったら、
ドツボにはまることなく、
効率的にスイスイ、プログラムを作れるのか?
その観点で掲載するわけで、
ご了承くださいね。
では、いってみます。
【読者から】
=======================
両方動く。
何度見ても
同じコードにしか見えません。
=======================
【読者から】
=======================
両方動く
【xx1.sh】
if [ $1 = "0"]; then
【xx2.sh】
if [ $1 = "0" ]; then
の"0"]にスペースがあるかないかですが、
この場合は、あってもなくても、同じ。
=======================
【読者から】
=======================
問いの意味が解りません。
【xx1.sh】と【xx2.sh】の
違いが判りません。
敢えて答えるならば、両方動く。
但し、期待した動作にならない。
理由
if文の判定式「 $1 = "0"」
は代入文なので、必ずTrueになる。
=======================
【読者から】
=======================
どちらも動かない。
/bin/bash にしないとエラー。
=======================
【読者から】
=======================
(xx1.sh)だけ動く
xx2.shはダブルコーテーションが、
全角になっている
=======================
【読者から】
=======================
上(xx1.sh)だけ動く
2は全角のスペースがある。
これは確かにはまる
=======================
【読者から】
=======================
両方動く
違いは、
"0"の後ろの半角スペースですが、
有っても無くても動きます!
=======================
【読者から】
=======================
両方動く
xx1.sh と xx2.sh の内容が同じ...。
=======================
以上、
間違った方のお便りを掲載しましたが、
みんな、自信満々でしょ。
自信満々だけど、間違っている(笑)。
特にね、ソース中の
「半角スペース関係なし」と、
断言する人が多数。
確かにね、ソースの半角スペース
関係ない場合、多いですよ。
でもね、この先入観こそ、
ドハマりの原因です(苦笑)。
ここは、一つのポイントですね。
次に、今までの経験と勘で、
(シェルに詳しくなくても)
正解を当てた人のお便り。
【読者から】
=======================
【xx1.sh】は、
"0"と]の間のスペースが無いので、
多分動かないです。
=======================
【読者から】
=======================
シェルわかんね~~!!と思いつつ、
両者の差はif文の
半角スペースあるなしの違いだったので、
あったほうが文法的に合ってるかな?と
推測しました。
※シェルはほぼド素人なので完全に推測です。
=======================
【読者から】
=======================
シェルスクリプトは全く知りません。
とりあえず両ソースを比較したところ、
差が「if文の閉じカッコの前に、
半角スペースがあるかないか」だけでした。
であれば、スペースがない場合に
閉じカッコとして認識されず、
書式エラーとなる位しか
パターンが思いつきませんでした。
まぁ、基礎知識がないので、
どちらかが動かないという前提での推測ですが。
=======================
「半角スペース関係なし」と
断言する人がいる一方で、
それが怪しいと疑う人もいて、
正解をもぎ取っている。
もしくは、前提として、
一つ正しいものがあれば、
そこから正解を導いている。
いわゆる、「勘が働く」状況です。
どうやったら、
この状況になれるのか?
ここも、ポイントです。
で、最後に、
シェルをやっている人は、
当然のように正解。
お便り、掲載しますね。
【読者から】
=======================
下(xx2.sh)だけ動く
まさに今日、ほんの数時間前に
shellのお勉強購入しました。
3日前から、
10数年ぶりにシェルを作ってます。
同じところで何で動かないんだ???と、
はまりました!!
日ごろ、JAVAやScalaをやってると、
本当にviすら使わなくなります。
時々、サーチマンさんのところで勉強しないと
と思ったところでこの問題!!
身にしみてます。
=======================
【読者から】
=======================
ifの閉じ括弧(])の前に
スペースが無いと、
[ がコマンドで、$1 = "0"] が、
パラメータとして扱われるため、
コマンドの略式表記としては、
正しいxx2.shが意図通りに動作する。
=======================
【読者から】
=======================
"0"のあとのスペースですかね。
自分がハマって苦労したところで、
わかりました。
=======================
きちんと勉強した人、
昔ハマって勉強した人、
当然の「正解」です。
ではでは。
ありがとうございました。
-----------------------------------