여기 문자열과 비교하려면 $1과 $2가 필요합니다.

여기 문자열과 비교하려면 $1과 $2가 필요합니다.

후속작입니다이 문제;
이유는 모르겠지만, 다음 코드를 이해하려고 노력했음에도 불구하고 계속해서 오해가 발생합니다.

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$2tmp1tmp2tmp1read "$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

관련 정보