후속작입니다이 문제;
이유는 모르겠지만, 다음 코드를 이해하려고 노력했음에도 불구하고 계속해서 오해가 발생합니다.
function read_and_verify {
read -p "$1:" tmp1
read -p "$2:" tmp2
if [ "$tmp1" != "$tmp2" ]; then
echo "Values unmatched. Please try again."; return 2
else
read "$1" <<< "$tmp1"
fi
}
read_and_verify domain "Please enter the domain of your web application twice"
read_and_verify dbrootp "Please enter the app DB root password twice"
read_and_verify dbuserp "Please enter the app DB user password twice"
$1
왜 필요한지 $2
, 왜 필요한지 오해했습니다 read "$1" <<< "$tmp1"
.
이 비교 시나리오에서는 실제로 어떤 일이 발생합니까?
답변1
read -p "$1:" tmp1
그리고 함수의 첫 번째( ) 및 두 번째( ) 매개 변수를 read -p "$2:" tmp2
각각 사용자 입력 줄을 읽는 프롬프트로 사용합니다. 결과는 및에 저장됩니다. 그런 다음, 두 값이 같으면 from의 값을 함수의 첫 번째 인수로 명명된 변수로 읽습니다.$1
$2
tmp1
tmp2
tmp1
read "$1" <<< "$tmp1"
read_and_verify domain "Please enter the domain of your web application twice"
따라서 사용자 입력이 기울임꼴로 표시되어 다음과 같은 결과를 얻게 됩니다 .
필드:부자 웹 애플리케이션의 도메인 이름을 두 번 입력하세요.부자
그런 다음 입력 된 값을 위에 표시된 후 실행되는 변수에 저장합니다 domain
.echo "$domain"
foo
왜 $1과 $2가 필요한지, 왜 "$1" <<< "$tmp1"을 읽어야 하는지 오해했습니다.
$1
$2
사용자에게 프롬프트 역할 $1
을 하며반품결과 변수의 이름을 함수에 전달하는 데 사용됩니다. 이로 인해 첫 번째 팁이 약간 이상해졌습니다. 다음과 같이 좀 더 설명적인 내용을 사용하는 것이 더 나을 수도 있습니다.
read -p "Please enter value for '$1': " tmp1
read -p "Please repeat the value to verify: " tmp2
또는 $2
두 프롬프트 모두에 전달된 메시지를 사용하십시오.다른 질문에 대답하려면하다.
read "$1" <<< "$tmp1"
일반적으로 한 변수의 값을 다른 변수에 할당할 수 있기 때문에 이는 약간 이상합니다. 하지만 여기서 문제는 $1
다음과 같습니다.이름변수의 값이므로 간접 할당이 필요합니다. Bash 4.3 이상에서는 이름 참조를 사용할 수 있습니다.
declare -n ref="$1"
ref=$tmp1
따라서 전체 함수는 다음과 같이 작성하는 것이 더 좋습니다.
#!/bin/bash
function read_and_verify {
read -p "Please enter value for '$1': " tmp1
read -p "Please repeat the value to verify: " tmp2
if [ "$tmp1" != "$tmp2" ]; then
echo "Values unmatched. Please try again."; return 2
else
declare -n ref="$1"
ref=$tmp1
fi
}
(두 번째 매개변수는 사용하지 않습니다.)
답변2
read_and_verify
이 컨텍스트에서 $1
첫 번째 인수(domain, dbrootp 또는 dbuserp 중 하나를 사용하여 호출됨)인 함수이자 $2
두 번째 인수(호출에서 각 옵션 뒤에 오는 문자열)입니다. 이것을 확장하여 하나를 호출하면:
function read_and_verify {
read -p "domain:" tmp1
read -p "Please enter the domain of your web application twice:" tmp2
if [ "$tmp1" != "$tmp2" ]; then
echo "Values unmatched. Please try again."; return 2
else
read "domain" <<< "$tmp1"
fi
}
이것이 귀하의 함수에서 수행되는 작업입니다 $1
.$2