IT技術を詳しく解説し、IT業界の本音を探る。

シェルの結果。半数が正解の一方、自信満々で間違える。

»

サーチマン佐藤です。
こんにちは。

前回記事の「シェルのクイズ」の
回答結果、みてみましょう。

━━━━━━━━━━━━━━━━━━━━━
【質問】以下、二つのシェルがあります。
どっちのシェルが動きますか?

【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"のあとのスペースですかね。
自分がハマって苦労したところで、
わかりました。
=======================

きちんと勉強した人、
昔ハマって勉強した人、
当然の「正解」です。



ではでは。
ありがとうございました。

-----------------------------------

サーチマン佐藤のメルマガ

サーチマン佐藤のJava

サーチマン佐藤のブログ

サーチマン佐藤のTwitter

Comment(0)

コメント

コメントを投稿する