我试图为 gcloud 设置一些别名命令和函数。我写了下面的函数并在 mac 中的 zsh 中运行它。当我通过c
andi
作为单独的参数时,它运行良好,但当我通过 it is 时,它运行良好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
is 作为单个参数传递给gcloud
而不是两个?
答案1
${translation[ci]}
是一个单词(其中恰好有一个空格字符),但该gcloud
命令需要compute
andinstances
作为单独的参数。存储单词列表的最佳方法是作为数组,但不能将一个数组放入另一个数组中(无论它们是普通数组还是关联数组)。因此,请继续存储${translation[ci]}
为单个字符串,但当您展开时${translation[$arg]}
,将其拆分为空格上的单独单词。 (您可以选择任何分隔符,只要它不出现在您想要结束的任何参数中即可,但空格很直观,而且最容易使用。)
改变
args+=("${translation[$arg]}")
到
args+=($=translation[$arg])
=
参数名称前的符号参数扩展指示 zsh 在空格处将字符串拆分为单独的单词。 (更准确地说,单词分隔符由 的值给出IFS
,但除非您在脚本中进行了更改IFS
,否则不必担心这一点。)