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)

コメント

コメントを投稿する