![Bash - 참조로 전달되는 인수(일종의)](https://linux55.com/image/79242/Bash%20-%20%EC%B0%B8%EC%A1%B0%EB%A1%9C%20%EC%A0%84%EB%8B%AC%EB%90%98%EB%8A%94%20%EC%9D%B8%EC%88%98(%EC%9D%BC%EC%A2%85%EC%9D%98).png)
그래서,
지금까지 나는 한 함수에서 다른 함수로 변수를 "참조로 전달"하는 데 효과적으로 사용할 수 있는 "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;
}