シェルスクリプトを書く機会があり、色々調べたのでメモとして残します。
シェルスクリプトとは?
シェルスクリプト(Shell Script)は、コンピュータのオペレーティングシステムのコマンドラインシェル(通常はUnixシェルやLinuxシェル)で実行できるスクリプトプログラムです。シェルスクリプトは、コマンドラインインターフェース(CLI)を使用してオペレーティングシステムに対する一連のコマンドや操作を自動化するために使用されます。
VScodeの拡張機能
コーディングにあたって便利な拡張機能の紹介です
下記をインストールすると静的コード解析やフォーマット調整など出来ます
基本構文
シバン シェバング(Shebang)
実行するシェルスクリプトのインタプリタを指定します
pythonを指定したりも出来ます
# bash
#!/bin/bash
# python
#!/usr/bin/env python3
変数宣言
変数名=値で宣言します。間にスペースがあるとエラーになるので注意
#!/bin/bash
TEXT="HELLO"
echo "$TEXT"
$bash test.sh
HELLO
配列
変数と同様に変数名=値で宣言
カッコの中に値を入れます
値は半角スペースで区切って書きます
Bashの配列の使い方: 要素の参照、追加、削除。要素数の取得など
#!/bin/bash
ARRAY=(0 1 2 3 4 5)
# 全部の値を展開するとき
echo "${ARRAY[@]}"
# どれか一つの時
echo "${ARRAY[0]}"
$ bash test.sh
0 1 2 3 4 5
0
連想配列
#!/bin/bash
declare -A items=([item]="Orange" [price]=100)
echo "${items[@]}"
$ bash test.sh
100 Orange
スクリプト実行時に引数を渡す
スクリプト実行時に何か値を渡したい場合は特殊変数を使います
第一引数 $1
第二引数 $2 ...
9番目までは上記のような形ですが10番目からは${10}
のように書かないといけません
#!/bin/bash
echo "$1"
echo "$2"
$ bash test.sh 1 2
1
2
デフォルト値の設定も可能です
${1:-デフォルト値}
という形で指定します
#!/bin/bash
echo "${1:-10}"
echo "${2:-100}"
$ bash test.sh 1
1
100
if文
#!/bin/bash
value=1
if [[ "$value" =~ ^[0-9]+$ ]]; then
echo "OK"
else
echo "NG"
fi
$ bash test.sh
OK
ループ
#!/bin/bash
FRUITS=("apple" "orange" "banana")
for name in "${FRUITS[@]}"; do
echo "$name"
done
$ bash test.sh
apple
orange
banana
エラーが起きた時に処理を止める
shellscriptはエラーが起きてもデフォルトではそのまま後続処理が走ってしまいます
ここが自分は一番びっくりでした…
対策は下記のようにset -eu
という宣言を最初にします
この宣言をしておけばエラーがあった際そこで処理が止まります
#!/bin/bash
set -eu
ロギング
実行ログをファイルに出しておきたい時は下記のように書けます
#!/bin/bash
LOG_OUT=invoke.log
exec > >(tee -a "$LOG_OUT") 2>&1
echo "[$(date +"%Y-%m-%d %H:%M:%S")][INFO]: ############# invoke start #############"
スクリプトの実行パスを取得する
#!/bin/bash
CURRENT_PATH=$(cd $(dirname $0); pwd)
実行前に実行しても良いか確認する
BASHシェルスクリプトで「キー入力待ち」プロンプトを実装する
#!/bin/bash
echo -n "実行してもいいですか? [yes/no] : "
while read -r confirmation; do
case $confirmation in
'yes' )
echo "実行してます"
break ;;
'no' ) echo "実行やめます"
exit 0 ;;
*) echo "yes,noで答えてください"
echo -n "実行しても良いですか? [yes/no] : " ;;
esac
done
一時ファイル作りたい
temp_file=$(mktemp)
他のファイルを読み込みたい
#!/bin/bash
CURRENT_PATH=$(cd $(dirname $0); pwd)
source $CURRENT_PATH/conf.sh