Bash - 참조로 전달되는 인수(일종의)

Bash - 참조로 전달되는 인수(일종의)

그래서,

지금까지 나는 한 함수에서 다른 함수로 변수를 "참조로 전달"하는 데 효과적으로 사용할 수 있는 "local -n" 명령을 사용하는 방법을 알아냈습니다.

이는 $[#] 매개변수를 어떤 순서로든 구문 분석할 때 유용합니다.

%1이(가) 항상 같은 것이라면 문제가 되지 않습니다. 그러나 (예를 들어):

git checkout -b --track MyBranch

동일합니까?

git checkout --track -b MyBranch

그러나 "git" 함수 체크아웃의 가상 개념에서 -b, --track 및 MyBranch는 단순히 %1, %2, %3 및 %4입니다. 이는 함수가 어느 것을 해석할 수 있을 만큼 충분히 똑똑해야 함을 의미합니다. 어느 것입니다.

이 퍼즐을 풀고 bash 스크립팅 지식을 확장하기 위해 local -n 명령을 사용하기 시작하고 다음과 같은 함수를 만들었습니다.

parseParam %1 -d opt -c opt "%" name
parseParam %2 -d opt -c opt "%" name
parseParam %3 -d opt -c opt "%" name

"parseParam"은 첫 번째 매개변수(%[#] 전달)를 평가하고 매개변수 2, 4, 6(%는 - 또는 / 접두사가 없는 문자열 이름)과 비교하고 값 할당과 일치할 때 로컬 -n을 사용합니다. 매개변수 3, 5, 7. 그러면 호출 함수는 원래 $[#] 매개변수에 신경 쓰지 않고 $opt 또는 $name에 액세스할 수 있습니다.

발견한 작품입니다. 그러나 위의 호출 규칙에서 임박한 결함을 볼 수 있듯이 -d 및 -c가 모두 호출 함수와 함께 제공되면 "parseParam"을 실행한 후 제공된 마지막 매개변수가 "opt"에 할당됩니다.

두 가지 솔루션을 시도했는데 하나는 효과가 있었지만 다른 하나(더 깨끗한 솔루션)는 작동하지 않았습니다.

parseParam $1 "%" name -c opt -d opt -s opt -m msg
if [[ $? -ge 2 ]] && [[ $? -le 4 ]]; then
    parseParam $2 "%" name -m msg
else parseParam $2 "%" name -c opt -d opt -s opt -m msg
fi;
if [[ $? -ge 2 ]] && [[ $? -le 4 ]]; then
    parseParam $3 "%" name -m msg
else parseParam $3 "%" name -c opt -d opt -s opt -m msg 
fi;

이 기능 버전은 단일 매개변수 문제에 이상적입니다. 흐름은 -c, -d 또는 -s를 인수로 사용할 수 있지만 그 중 하나만 허용됨을 나타냅니다. 그러나 "이름"과 "대상" 매개변수가 있으면 흐름이 매우 복잡해지고 실제로는 ParseParam의 목적이 무산될 것입니다. 그래서 저는 다른 전략을 시도했습니다.

parm="\"%\" name -c opt -d opt -s opt -m msg"

parseParam $1 $parm
cleanParam $? parm $parm 

따라서parseParm은 동일한 작업을 수행하지만 매개변수 목록은 $parm 변수에 의해 제공됩니다. 예상할 수 있듯이 CleanParam은 채워진 매개변수(parseParam 함수에서 반환됨)를 기반으로 $parm 변수에서 매개변수 옵션을 제거합니다.

그러나parseParam은 11개의 인수를 해석하고 각 인수를 개별적으로 식별하지만 이러한 방식으로 parseParam을 실행할 때 local -n 명령은 함수 경계를 넘지 못합니다. 따라서 parseParam 내부에서 $opt는 -d를 반환하지만 일단 반환되면 $opt 호출 함수는 여전히 비어 있습니다. 매개변수를 개별적으로 전달하면 작동하지만 단일 문자열로 전달하면 작동하지 않습니다.

모든 서문이 끝난 후 내 질문은 다음과 같습니다.

한 함수에서 다른 함수로 목록을 전달하는 방법이 있습니까?

parseParam $! $listOfParameters $listOfVariableNames

따라서 변수 이름을 처리할 때,parseParam은 호출 함수에서 액세스할 수 있는 이름에 값을 할당할 수 있습니다(예: local -n 사용).

Jaeden "Sifo Dyas" al'Raec Ruiner에게 감사드립니다.

참조용 현재 기능 정의:

#======================================
# ParseParam function
#======================================

parseParam()
{
    p=$1;
    shift;
    l=$#;
    # echo "Param Count : $l, $p"
    if [ $((l%2)) -eq 0 ]; then
        paramType $p $1 $3 $5 $7 $9
        idx=$?
        if [[ $idx -gt 0 ]]; then
            shift $(( ($idx - 1) * 2 ))
            # echo "Index: $idx - $1 = $2"
            local -n var="$2"
            if [[ ${p:2:1} = "=" ]]; then var=${p:3}; 
            elif [[ $p == /* ]] || [[ $p == -* ]]; then var=${p:1:1};
            else var=$p;
            fi;
            # echo "Var = $var, $opt"
            return $idx;
        fi;
    fi;
    return 0;
}

#======================================
# ParamType function
#======================================

paramType() 
{
    ret=0;
    p=$1; 
    shift;
    while [ "${1+defined}" ]; do
        let ret+=1
        l=${#1}
        if ([[ $p == /* ]] || [[ $p == -* ]]) && ([[ $1 == /* ]] || [[ $1 == -* ]]) && [[ ${p:1:1} = ${1:1:1} ]]; then 
            return $ret
        elif [[ $p != /* ]] && [[ $p != -* ]] && [[ $1 = "%" ]]; 
            then return $ret;
        fi;
        shift
    done
    return 0;
}

관련 정보