【Shell】シェル ~ 基本編・引数あれこれ ~

■ はじめに

https://dk521123.hatenablog.com/entry/2021/07/09/115553

などで、シェルを使う機会があり、引数を使って
もう少しきれいに書けるので、メモ。

目次

【1】引数を取得する
 例1:引数を変数に設定
【2】引数チェック
 例1:引数が3つない場合エラーにする
【3】引数を配列として取得する
 例1:引数を配列として取得し、出力する
 例2:引数の一部を配列として取得し、出力する
 補足1:shift コマンド
 補足2:配列
 補足3:$@ と $* の違い
【4】引数により処理を変える

【1】引数を取得する

* $1~$9 で取得できる
* 10以降は、${10}, ${11}, ... (${X}で癖をつけておいたほうが良さそう)

例1:引数を変数に設定

sample.sh

#!/bin/bash

VAL1="${1}"
VAL2="${2}"
VAL3="${3}"

echo "Result [${1}, ${2}, ${3}]"

出力結果例

$ ./sample.sh hello world Mike
Result [hello, world, Mike]

 【2】引数チェック

例1:引数が3つない場合エラーにする

#!/bin/bash

if [ $# -ne 3 ]; then
  echo "ERROR MESSAGE"
  exit 1
fi

【3】引数を配列として取得する

* 「@」で取得する
* 引数の一部を変数、以降を配列として取得するには、shift を使う

例1:引数を配列として取得し、出力する

sample.sh

#!/bin/bash

VALS="$@"

for val in ${VALS[@]};
do
  echo "Result ${val}"
done

出力結果例

$ ./sample.sh hello world Mike
Result hello
Result world
Result Mike

例2:引数の一部を配列として取得し、出力する

sample.sh

#!/bin/bash

VAL1=${1}
VAL2=${2}
shift 2
VALS=("$@")

echo "VAL1 = ${VAL1}"
echo "VAL2 = ${VAL2}"

for val in ${VALS[@]};
do
  echo "Result ${val}"
done

出力結果例

$ ./sample.sh hello world Mike Tom Sam
VAL1 = hello
VAL2 = world
Result Mike
Result Tom
Result Sam

補足1:shift コマンド

* 引数をずらしたい場合に使用する

構文

# 引数をNつずらす
shift N

参考文献
https://xtech.nikkei.com/it/article/COLUMN/20060227/230882/

補足2:配列

* 以下のサイトなどを参照のこと。

https://www.atmarkit.co.jp/ait/articles/1905/22/news004.html

補足3:$@ と $* の違い

* ほぼ同じだが、以下の違いがある(これでハマってうまく動かなかった)
 + "$*" : "a  b  c" に展開される
 + "$@":"a"  "b"  "c"  と別々の文字列に展開される

https://se.cite.ehime-u.ac.jp/~aman/memo/bash/shell_prog1.html

【4】引数により処理を変える

* CASE 文を使うと奇麗に書ける

例1:Hello world

#!/bin/bash

ENV="$1"

case "${ENV}" in
  prod)
    echo "Hello!"
    ;;
  stage)
    echo "Good morning!!"
    ;;
  dev | *)
    echo "Good bye so long..."
    ;;
esac

参考文献

https://hi-yamamoto.hatenablog.com/entry/2014/09/29/153935
https://maku77.github.io/linux/startup/command-line-params.html

関連記事

シェル ~入門編~
https://dk521123.hatenablog.com/entry/2014/10/23/005406
シェル ~ 基本構文編 ~
https://dk521123.hatenablog.com/entry/2015/02/20/001600
シェルスクリプトあれこれ
https://dk521123.hatenablog.com/entry/2018/03/03/210642
Github Actions ~ 外部シェルスクリプト実行 ~
https://dk521123.hatenablog.com/entry/2024/01/19/003044