![Bash 함수는 설정되지 않은 변수에 기본값을 할당합니다.](https://linux55.com/image/204441/Bash%20%ED%95%A8%EC%88%98%EB%8A%94%20%EC%84%A4%EC%A0%95%EB%90%98%EC%A7%80%20%EC%95%8A%EC%9D%80%20%EB%B3%80%EC%88%98%EC%97%90%20%EA%B8%B0%EB%B3%B8%EA%B0%92%EC%9D%84%20%ED%95%A0%EB%8B%B9%ED%95%A9%EB%8B%88%EB%8B%A4..png)
설정되지 않은 변수에 기본값을 할당하는 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"