はい!今やってます!

Work Pertly, Live Idly

シェルの引数あれこれ

シェルで引数を取得したい場合は

$1:1つ目の引数

という感じで取得できるが、

$0:実行時のコマンド名
$#:引数の数
$@:実行時に指定された全パラメーター

というような指定も可能。

というのは割と常識なんだけど、

$BASH_SOURCE:実行時のコマンド名

という方法で$0と同等のことをすることができる。

ただ厄介なのが、shellの実行方式や実行するshellによって結果が変わる。

具体的には

source ./shell_name

とすると$0には-bash

zsh test

とすると$BASH_SOURCEには空文字が入ってくる

結論どうするのが良いかというと$0を使いたいときは

${BASH_SOURCE:-$0}

とするか

if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
  <処理>
fi

とするのがよい

パイプラインの左側でエラーが発生したら処理を止めたい

bash-eのオプション

#!/bin/bash 
set -eu

をつけたとしても、パイプラインの左側のコマンドにエラーがある場合に処理が停止しない。

pipefailのオプション

set -euo pipefail

を設定してやると

この場合は"hoge"が出力されるが

#!/bin/bash
set -eu

false | true
echo "hoge"

この場合は"hoge"が出力されない

#!/bin/bash
set -euo pipefail

false | true
echo "hoge"

MySQLでauto incrementカラムに0を入力したくなってしまった場合

このコマンドを打てば0も入力できる。

ただし0を0として認識するようになる。

(デフォルトの挙動は0またはnullのときに自動採番)

set global sql_mode='NO_AUTO_VALUE_ON_ZERO';

何故かオペレーションで必要になった。