設定されていない変数にデフォルト値を割り当てるBash関数を作成しようとしています。以下は、機能しないスクリプトの簡単な例です。
#! /usr/bin/env bash
# My broken validation function
validate_input() {
if [ -z "$1" ]; then
set -- "default"
fi
}
# Parse arguments
while [ "$#" -gt 0 ]; do
case "$1" in
--foo=*)
foo="${1#*=}"
;;
--bar=*)
bar="${1#*=}"
;;
*)
printf '%s\n' "Invalid argument ($1)"
exit 1
;;
esac
shift
done
# Validate foo and bar
validate_input "$foo"
validate_input "$bar"
# Print results
printf '%s\n' "foo: $foo"
printf '%s\n' "bar: $bar"
したがって、ユーザーはsumパラメータを使用して--foo
変数--bar
sumを設定$foo
できます$bar
。このvalidate_input
関数は変数が設定されていることを確認し、そうでない場合は「default」値を割り当てる必要があります。この最後のビットは動作しません。
$ ./test --foo=hello
foo: hello
bar:
予想される出力は次のとおりです。
foo: hello
bar: default
私は場所の議論を読んset
だが、私は安全ゾーンから少し外れた。
答え1
ご覧のとおり、関数の位置パラメータを変更しても変数には影響しません。いくつかの代替実装:
使用パラメータの置換:
# Validate foo and bar
foo=${foo:-"default"}
bar=${bar:-"default"}
他のパラメータ置換にはコロンコマンドを使用してください:
。
# Validate foo and bar
: ${foo:="default"} ${bar:="default"}
以下を使用する関数を使用してください。名前参照(bashバージョン4.3以降が必要です)
validate_input() {
local -n var=$1
[[ -z $var ]] && var=default
}
# Validate foo and bar
validate_input foo
validate_input bar
別の方法は、デフォルト値を設定することです。今後パラメータを解析します。
foo=default
bar=default
# Parse arguments
while [ "$#" -gt 0 ]; do
...
done
# Print results
printf 'foo: %s\n' "$foo"
printf 'bar: %s\n' "$bar"