gcloud에 대한 일부 별칭 명령어와 기능을 설정하려고 합니다. 다음 함수를 작성하고 Mac의 zsh에서 실행했습니다. 별도의 매개변수로 전달하면 c
제대로 i
작동하지만 전달하면 정상적으로 작동합니다 ci
. 하지만 아래 번역을 보면 똑같습니다.
gcp() {
local -A translation=(
[c]=compute
[i]=instances
[ci]="compute instances"
)
stg="stg-proj-12911"
tst="tst-proj-1797"
prd="prd-proj-817"
local -a args
for arg in "$@"; do
if [[ -v "translation[$arg]" ]]; then
args+=("${translation[$arg]}")
elif [[ -v ${arg} ]]; then
echo "project $arg has been set"
#args+="--project=eval echo \$$arg"
args+="--project=${(e)arg:+\$$arg}"
#statements
else
echo "$arg"
args+=("$arg")
fi
done
echo "${args[@]}"
gcloud "${args[@]}"
}
gcp ci list stg
매개변수로 전달하면 다음과 같은 오류가 발생하지만 정상적으로 작동합니다.gcp c i list stg
ERROR: (gcloud) Invalid choice: 'compute instances'.
Maybe you meant:
gcloud compute instances
어쩌면 두 개가 아닌 compute instances
단일 인수로 전달되기 때문일까요 ?gcloud
답변1
${translation[ci]}
는 단어(정확히 하나의 공백 문자 포함)이지만 명령에는 및 별도의 인수가 gcloud
필요합니다 . 단어 목록을 저장하는 가장 좋은 방법은 배열로 저장하는 것이지만, 한 배열을 다른 배열 안에 넣을 수는 없습니다(일반 배열이든 연관 배열이든). 따라서 계속해서 단일 문자열로 저장하되 확장할 때 공백에서 별도의 단어로 분할하세요. (종료하려는 매개변수에 표시되지 않는 한 구분 기호를 선택할 수 있지만 공백은 직관적이고 사용하기 쉽습니다.)compute
instances
${translation[ci]}
${translation[$arg]}
변화
args+=("${translation[$arg]}")
도착하다
args+=($=translation[$arg])
=
매개변수 이름 앞의 기호매개변수 확장문자열을 공백의 별도 단어로 분할하도록 zsh에 지시합니다. (더 정확하게는 단어 구분 기호는 의 값으로 지정되지만 IFS
스크립트에서 변경하지 않는 한 IFS
걱정할 필요가 없습니다 .)