Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2722

Alpine などの Bourne/Ash シェルで変数・環境変数が未定義か確認・判定する

$
0
0

変数の未定義チェックに Bashシェルの -vオプションを Bourneシェルで使うと、unknown operandエラーが発生する。

Alpine Linuxなどの Bourne系シェル(Ash)で変数や環境変数の未定義をチェックできないか

bourneシェル未定義確認」とググっても、Bashシェルの情報ばかりだったので、自分のググラビリティとして。

TL;DR

zオプションと、変数の代替代入を組み合わせる

VARが未定義か確認する
[-z"$VAR"]&&["${VAR:-A}"="${VAR-A}"]

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

~ ## 🎉

参考文献


Viewing all articles
Browse latest Browse all 2722

Trending Articles