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