gcloud 设置 zsh 别名

gcloud 设置 zsh 别名

我试图为 gcloud 设置一些别名命令和函数。我写了下面的函数并在 mac 中的 zsh 中运行它。当我通过candi作为单独的参数时,它运行良好,但当我通过 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 instancesis 作为单个参数传递给gcloud而不是两个?

答案1

${translation[ci]}是一个单词(其中恰好有一个空格字符),但该gcloud命令需要computeandinstances作为单独的参数。存储单词列表的最佳方法是作为数组,但不能将一个数组放入另一个数组中(无论它们是普通数组还是关联数组)。因此,请继续存储${translation[ci]}为单个字符串,但当您展开时${translation[$arg]},将其拆分为空格上的单独单词。 (您可以选择任何分隔符,只要它不出现在您想要结束的任何参数中即可,但空格很直观,而且最容易使用。)

改变

args+=("${translation[$arg]}")

args+=($=translation[$arg])

=参数名称前的符号参数扩展指示 zsh 在空格处将字符串拆分为单独的单词。 (更准确地说,单词分隔符由 的值给出IFS,但除非您在脚本中进行了更改IFS,否则不必担心这一点。)

相关内容