Edited at

bashの初見殺しっぷりがハンパない件

More than 1 year has passed since last update.


  • 「これ知らなきゃ分からないだろ!」

  • 「エラーの原因はわかったけど、なんか腑に落ちない」

  • いま悩んだ2時間返せ!

bashというか、UNIXのコマンドに慣れてない

僕みたいな新人エンジニアが

気をつけた方がいいポイントまとめました。


あいことばをわすれない

微妙にエラーが出ないため、気づかないまま進んでしまい、

のちのち絶妙に致命的なことになってしまうので注意。

#!/bin/bash

set -Ceu

一行目忘れて2時間悩みました

二行目のオプションつけなかったため2時間悩みました

setのオプションはお好みで

あいことばの解説:

http://qiita.com/magicant/items/f3554274ee500bddaca8


半角スペースをつけるな!半角スペースをつけろ!

shellさんはスペースに非常に神経質です。

よくある変数代入では=の前後にスペースいれてはダメです。

val=1

これだけで1時間悩みました

また、if文とかで使うカッコの前後、

if [ $val -eq 0 ];then

echo ok
fi

こっちはスペースが無いとエラーでます。

1時間ほど悩みました

ほか、ドットもスペース有り無しで違います。

#カレントディレクトリにあるhoge.shを(別Shell立ち上げて)実行する

./hoge.sh

#ルートにあるhoge.shを、カレントシェルで実行する。(ドットコマンド)

. /hoge.sh

は全く違う。

こんなの初見殺し以外なんでもない。

2時間は悩みました


カッコやクオートのとじ忘れはあさっての行数でエラーでる。

40行目で閉じ忘れたのに

エラーは105行目で発生とかザラ。

超単純なシンタックスエラーでも

15分くらい悩めます。


引数を全部表示する$*と$@

ダブルクオートで囲ったとき挙動が違います。

2時間悩みました。


!もやばいです。

http://qiita.com/anqooqie/items/785f46a8cc5f10ba7abb

まだ悩んだことないけど、

恐ろしい。


まとめ

あれ? Shellcheck でいいんじゃね?

https://www.shellcheck.net/


使い方

例えば以下を、Shellcheckにつっこみます。

#!/bin/bash

set -Ceu

val=1

if [ val -eq 0 ];then
echo ok
fi

すると

image

6行目のvalに"$"を忘れたので怒ってくれます。

便利!