シンプルな書き方
SH_DIR=$(realpath $(dirname $0))
引数 $0 にはスクリプト名が入っているので、ディレクトリを切り出す
相対パスで実行しているときは 相対パス名が入るので realpath で正規化する
「正しい」書き方
SH_DIR="$(realpath "$(dirname "${BASH_SOURCE[0]}")")"
まず $0 は sourceコマンドなどで呼んでるときには使えないので、${BASH_SOURCE[0]} を利用するのが正しい。
それと、空文字列になる可能性が無いわけではないので ひとつひとつ きちんと "" で括った方がいい
realpathコマンドが無いとき
SH_DIR=$(cd $(dirname $0) && pwd -P)
移動するやり方。ださい。