🤮

Shellscript(bash) TIPS

2022/01/02に公開

想定する読者

  • shellscriptをたまに書く方
  • shellscript初心者

#!(シェバン)

日本語の記事の多くでは、shellscriptの1行目を以下のように書かれているものが多いかと思います。
#!/bin/bash
これは、/bin/bashにbashがあることが前提になっていて、bashのpathが/bin/bashでないユーザが./shellscript.shのように実行した場合、エラーになってしまうため、あまり良くないです。
できれば、#!/usr/bin/env bashとしたほうが望ましいです。

参考

set コマンド

shellのオプションを設定(set)したり、解除(unset)したりします。

書き方としては、set -uset -euxなどと書き
不思議ですが、-uでuオプションを設定し、+uでuオプションを解除します。

代表的なところだと
e: コマンドが0以外のステータスコードを返した場合、エラーとなる。
u: 実行したコマンドに定義されていない変数が入っていた場合、エラーとなる。

参考

簡単に説明すると

#!/usr/bin/env bash
set -u

echo $FOO <- エラーとなる

set +u

echo $FOO <- エラーにならず、ターミナルには何も出力されない

if 構文

知らず使っている方がいるかも知れませんが、
以下の[ -z "$FOO" ]ですが、if構文の機能ではなく、testコマンドを実行しています。
そのため、ググるときは、if オプションではなく、testコマンドで調べたほうが希望の結果がでるかもしれません。

if ! [ -z "$FOO" ]; then
  echo "$FOO"
fi

ちなみにtestコマンドの-zフラグは、引数に渡された変数が空の場合、正です。
ので上記の場合は、FOOになにか値が入っていた場合、echo $FOOを実行しています。

$ test -z $FOO <- FOOに何も入っていない場合、正
$ echo $?
0
$ test ! -z $FOO <- FOOに何か入っていた場合、正(!は否定を意味します)
$ echo $?
1

書くのが途中になってしまいましたが、モチベがなくなってしまったので、とりあえず公開だけしておきます。
気が向いたら、付け足します。

GitHubで編集を提案

Discussion