blog-image

シェルスクリプトの基本構文とかをまとめてみた

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

ループ

Bashのfor文の書き方: ループ文で繰り返し処理を行う

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 #############"

スクリプトの実行パスを取得する

[bash] 実行スクリプトの絶対パスの取得

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