search
LoginSignup
775
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

  • 「これ知らなきゃ分からないだろ!」
  • 「エラーの原因はわかったけど、なんか腑に落ちない」
  • いま悩んだ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時間悩みました。

!もやばいです。

まだ悩んだことないけど、
恐ろしい。

まとめ

あれ? Shellcheck でいいんじゃね?
https://www.shellcheck.net/

使い方

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

#!/bin/bash
set -Ceu

val=1

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

すると

image

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
775
Help us understand the problem. What are the problem?