Bash 函数为未设置的变量分配默认值

Bash 函数为未设置的变量分配默认值

我正在尝试创建一个 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"

相关内容