Bash 함수는 전달된 매개변수에 값을 할당합니다.

Bash 함수는 전달된 매개변수에 값을 할당합니다.

다음과 같은 상황이 발생했습니다.

구성 파일(존재하고 매개변수가 있는 경우)에서 해당 매개변수를 읽거나 매개변수가 없으면 사용자에게 해당 매개변수를 입력하도록 요청하는 스크립트를 작성 중입니다.

나는 소수의 매개변수에 대해 이 작업을 수행하고 있으므로 함수를 작성하는 것이 좋은 방법이라고 생각했습니다.

그러나 내가 이해하는 한, 함수는 결과 값을 echo입력하거나 전역 변수에 할당하여 결과 값을 반환합니다. 하지만 함수의 화면에 에코를 표시하고 싶으므로 옵션 2여야 합니다. 그래서 나는 이것을 시도했습니다 :

# parameters: $1=name of parameter, $2=user prompt, $3=value read from config.cfg
function getParameter {
    # If the value couldn't be read from the config file
    if [ -z "$3" ]; then
        # Echo the prompt
        echo "$2"
        # Read the user input
        read parameter

        # If it's empty, fail
        if [ -z "$parameter" ]; then
            echo "Parameter $1 not found"
            exit
        # Else, try to assign it to $3   <---- This is where it fails
        else
            $3="$parameter"
        fi
    fi
}

나는 그것을 이렇게 부른다:

getParameter "Database username" "Please enter database username" $database_username

파일은 함수가 호출되기 전의 d config.cfg이며 선택적 매개변수 중 하나입니다.source$database_username

이제 이것은 분명히 작동하지 않습니다. 할당할 수 없으며 $3메서드가 일반적이기를 원하기 때문에 MY_VARIABLE=$parameter둘 중 하나를 수행할 수 없습니다.

아래의 모든 사항을 달성할 수 있는 방법에 대한 제안이 있는 사람이 있습니까?

  1. 둘 중 하나에서 변수 값을 가져오거나 config.cfg사용자 입력에서 읽습니다.
  2. 일반적인 방식으로 이 작업을 수행합니다. 즉, 각 매개변수에 대해 위의 코드(함수 없이)를 반복하지 마세요.

답변1

config내가 따랐는지 100% 확신할 수는 없지만 파일이 다음과 같다고 가정해 보겠습니다 .

foo
database_user tom
bar

우리가 원하는 명백한 값은 입니다 database_user.

스크립트에 다음과 같은 줄을 넣으면 됩니다.

dbUser=$(sed -nE 's/database_user (.*$)/\1/p' config)

그러면 변수에 $dbUser다음 정보가 포함됩니다.

echo $dbUser 
tom

답변2

좋아요, 제가 직접 문제를 해결한 것 같습니다.

function getParameter {
    if [ -z "$3" ]; then
        # User read -p to show a prompt rather than using echo for this
        read -p "$2`echo $'\n> '`" parameter

        # Print to sdterr and return 1 to indicate failure
        if [ -z "$parameter" ]; then
            >&2 echo "Parameter $1 not found"
            return 1
        else
            echo $parameter
        fi
    else
        echo $3
    fi
}

를 사용하여 echo -p콘솔에 프롬프트를 표시할 수 있었고 여전히 일반을 사용하여 함수에서 문자열을 반환할 수 있었습니다 echo. 이렇게 하면 함수를 호출하여 database_username=$(getParameter ...)변수에 할당할 수 있습니다.

관련 정보