gcloudはzshエイリアスを設定します。

gcloudはzshエイリアスを設定します。

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

たぶん、2つではなくcompute instances単一の引数として渡されるのでしょうか?gcloud

ベストアンサー1

${translation[ci]}は単語(正確に1つの空白文字を含む)ですが、コマンドには別の引数がgcloud必要です。単語リストを保存する最善の方法は配列として保存することですが、ある配列を別の配列に配置することはできません(通常の配列でも連想配列でも)。したがって、単一の文字列として保存し続けますが、展開するときはスペースから別の単語に分割します。 (終了したいパラメータに表示されない限り、区切り文字を選択できますが、スペースは直感的で使いやすいです。)computeinstances${translation[ci]}${translation[$arg]}

変化

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

到着

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

=パラメータ名の前の記号パラメータ拡張文字列を空白の別の単語に分割するようにzshに指示します。 (より正確には、単語区切り文字はの値で指定されますが、IFSスクリプトで変更しない限りIFS心配する必要はありません。)

おすすめ記事