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
必要です。単語リストを保存する最善の方法は配列として保存することですが、ある配列を別の配列に配置することはできません(通常の配列でも連想配列でも)。したがって、単一の文字列として保存し続けますが、展開するときはスペースから別の単語に分割します。 (終了したいパラメータに表示されない限り、区切り文字を選択できますが、スペースは直感的で使いやすいです。)compute
instances
${translation[ci]}
${translation[$arg]}
変化
args+=("${translation[$arg]}")
到着
args+=($=translation[$arg])
=
パラメータ名の前の記号パラメータ拡張文字列を空白の別の単語に分割するようにzshに指示します。 (より正確には、単語区切り文字はの値で指定されますが、IFS
スクリプトで変更しない限りIFS
心配する必要はありません。)