我正在尝试创建一个 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"
因此,用户可以使用参数--foo
和--bar
来设置变量$foo
和$bar
。该validate_input
函数检查是否设置了变量,如果没有设置,则应为其分配值“默认”。这是最后一点不起作用:
$ ./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"