Help us understand the problem. What is going on with this article?

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

More than 3 years have 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に"$"を忘れたので怒ってくれます。
便利!

kugyu10
意識ゆるい系WEBエンジニア。 2019年9月にSIerからWEB系へ転向した。 Java/Ruby/Javascriptなどを弄ってる日々。
http://kugyu10.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away