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"

したがって、ユーザーはsumパラメータを使用して--foo変数--barsumを設定$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"

関連情報