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

파일 config.cfgsource함수를 호출하기 전에 생성되며 $database_username선택적 매개변수 중 하나입니다.

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

다음을 모두 달성할 수 있는 방법에 대한 제안이 있는 사람이 있습니까?

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

답변1

100% 확신할 수는 없지만 파일이 config다음과 같다고 가정합니다.

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 ...)변수에 할당할 수 있습니다.

관련 정보