1. Qiita
  2. 投稿
  3. shell

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

  • 534
    いいね
  • 7
    コメント
  • 「これ知らなきゃ分からないだろ!」
  • 「エラーの原因はわかったけど、なんか腑に落ちない」
  • いま悩んだ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に"$"を忘れたので怒ってくれます。
便利!