ShellScript
ShellScript Tips
シェルスクリプト コーディングスタイル
ShellScript echo 色付ける
ShellScript 変数格納一覧
ShellScript が落ちた時にスクリプトを止める
setコマンドオプション一覧
set euxについて
setコマンドを先頭に記載する
#!/bin/bash -eu # とするか
set -eu # を書いておく
set -euox pipefail
-e : エラーがあったらシェルスクリプトをそこで打ち止めにする。exit 0 以外が返ってきた場合、止まるようになる。
-u : 未定義の変数使用時、打ち止めにしてくれる。
-v : シェルの入力行を表示する
-o : 設定したシェルオプションを「on」と表示する
-x : トレース情報としてシェルが実行したコマンドとその引数を出力する。
Shellで毎回困る、ifの条件文一覧
シェルスクリプト 例外処理
たいていの高級なプログラミング言語では例外処理をしなければプログラムが終了する。 しかし、シェルスクリプトではエラーが発生しても後続の処理が普通に実行される。
コマンドのlogを表示させたくない
> /dev/null 2>&1 をつけるとログが表示されない
改行コードを反映し出力する
OSを分別する
if [ "$(uname)" == 'Darwin' ]; then
OS='Mac'
elif [ "$(expr substr $(uname -s) 1 5)" == 'Linux' ]; then
OS='Linux'
elif [ "$(expr substr $(uname -s) 1 10)" == 'MINGW32_NT' ]; then
OS='Cygwin'
else
echo "Your platform ($(uname -a)) is not supported."
exit 1
fi
シェルスクリプトを作成するにあたり
まず使用するシェルを決める必要がある。
シェルスクリプト値共有(サブシェルとか考慮しなくて良いなど)
データをファイルに出力するテクニックが結構使われる。
if文 オプション
実行場所を気にしなくてもいいシェルスクリプト
シェルスクリプトの冒頭に以下を記載すると実行場所を気にしなくてよいスクリプトになる。
cd `dirname $0`
注意
ググるとよく出てくる dirname $(pwd) を使った cd $(dirname $(dirname $0)) ですが、実はスクリプトを呼び出した場所、ディレクトリ名や方法によっては正常に動作しません。 ディレクトリ名にスペースが含まれていたり、呼び出し元のディレクトリや呼び出し元が相対パスだったりする場合です。
# 実行中のスクリプトがあるディレクトリの絶対パス (/ で始まるパス) 文字列
$(cd $(dirname $0) && pwd)
$(cd "$(dirname "$0")" && pwd)
# 実行中のスクリプトがあるディレクトリの親ディレクトリの絶対パス文字列
$(cd "$(dirname "$0")"/.. && pwd)
シェルスクリプトのパス取得のあれこれ
# dirnameコマンド
# パスのうちディレクトリ部分を取得できます。
$ dirname /home/vagrant/sample.sh
/home/vagrant
# basename コマンド
# パスのうちファイル名の部分を取得できます。
$ basename /home/vagrant/sample.sh
sample.sh
# $0
# 自分自身 (実行中のコマンドファイル) へのパスを取得できます。
$ echo $0
/bin/zsh # zshのpathが取得できる
シェルスクリプト実行後参照したい場合
参考URL 実行後も参照したい場合は、「source」コマンドを使って、シェルスクリプトを“現在動作している”bashに読み込ませる必要がある。
シェルスクリプト オプションをparse(解析)する
2つのコマンドがある。
getopts POSIX準拠シェルの組み込みコマンド
getopt 高機能だが環境依存が多くなる。
一番大事な考え方
複雑なオプション解析が必要な処理の場合は、シェルスクリプトでやるのではなく rust や go でCLI実装するのがいい選択。
シェルスクリプト errorハンドリング
シェルスクリプト 拡張子を取得する
親ディレクトリを不変に取得する
ユーザー利用のシェルスクリプトを作成する
Shell script
一般的にはシェルスクリプトは環境依存が激しいと言われている。 一方で移植性を高くするためのPOSIXという標準規格があるためそれに準拠してシェルスクリプトを書けば問題ないはずと考える人もいるが問題がある。 また、シェルスクリプトは小さいstringをコネコネといじるのに非常に不向き
シェルスクリプト御作法 shebang(シェバンについて) シェルスクリプト(コマンドライン引数) シェルスクリプト例外処理