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"

관련 정보