変数の未定義チェックに
Bash
シェルの-v
オプションをBourne
シェルで使うと、unknown operand
エラーが発生する。
Alpine Linux
などのBourne
系シェル(Ash
)で変数や環境変数の未定義をチェックできないか。
「bourne
シェル
未定義
確認
」とググっても、Bash
シェルの情報ばかりだったので、自分のググラビリティとして。
TL;DR
z
オプションと、変数の代替代入を組み合わせる
VARが未定義か確認する
[-z"$VAR"]&&["${VAR:-A}"="${VAR-A}"]
- 参考文献:bashで[ -v "$VAR" ]を使わずに変数が未定義か判定する @ Qiita
TS;DR
確かに bash
をインストールすればいいだけなのです。しかし、Docker での利用なので、なるべく余計なものを入れたくない(レイヤーを作りたくない)のです。
Docker コンテナ起動時にホストからコンテナに環境変数を渡す必要がある場合、必須の環境変数がセットされていないとエラーでコンテナが起動しないようにしたかったのです。
以下は Docker の Alpine Linux イメージで試しました。
Alpine3.10.2
~ #cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.10.2
PRETTY_NAME="Alpine Linux v3.10"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"
shのバージョン(Bourneというより正確にはAsh)
~ # sh --helpBusyBox v1.30.1 (2019-06-12 17:51:55 UTC) multi-call binary.
Usage: sh [-/+OPTIONS] [-/+o OPT]... [-c 'SCRIPT' [ARG0 [ARGS]] / FILE [ARGS] / -s [ARGS]]
Unix shell interpreter
bashのバージョン(別途インストール)
~ # bash --versionGNU bash, version 5.0.0(1)-release (x86_64-alpine-linux-musl)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
-v
オプションの場合
サンプル・スクリプトの内容
~ # cat sample1.sh#!/bin/sh[-v HOGE ]||{echo'Not defined HOGE'exit 1
}echo'HOGE is defined with value:'$HOGE
環境変数を未定義でテスト
~ #unset HOGE
~ ## Bash シェルで実行(正常)~ # bash sample1.sh
Not defined HOGE
~ ## Bourne シェルで実行(エラー)~ # sh sample1.sh
sh: HOGE: unknown operand
Not defined HOGE
環境変数を定義してテスト
~ #export HOGE=FUGA
~ ## Bash シェルで実行(正常)~ # bash sample1.sh
HOGE is defined with value: FUGA
~ ## Bourne シェルで実行(エラー)~ # sh sample1.sh
sh: HOGE: unknown operand
Not defined HOGE
空の環境変数を定義してテスト
~ #export HOGE=''~ ## Bash シェルで実行(正常)~ # bash sample1.sh
HOGE is defined with value:
~ ## Bourne シェルで実行(エラー)~ # sh sample1.sh
sh: HOGE: unknown operand
Not defined HOGE
-z
オプション
~ # cat sample2.sh#!/bin/sh[-z"$HOGE"]&&["${HOGE:-A}"="${HOGE-A}"]&&{echo'Not defined HOGE'exit 1
}echo'HOGE is defined with value:'$HOGE
同じように動いた
~ #unset HOGE
~ # bash sample2.sh
Not defined HOGE
~ # sh sample2.sh
Not defined HOGE
~ #export HOGE=''~ # bash sample2.sh
HOGE is defined with value:
~ # sh sample2.sh
HOGE is defined with value:
~ #export HOGE=FUGA
~ # bash sample2.sh
HOGE is defined with value: FUGA
~ # sh sample2.sh
HOGE is defined with value: FUGA
~ ## 🎉
参考文献
- bashで[ -v "$VAR" ]を使わずに変数が未定義か判定する @ Qiita
- Bourne Shell Tutorial @ The Grymoire
- Embedded Linux | Almquist shell @ Wikipedia