/cygdrive/?/...
私のzshスクリプトで、私の作業ディレクトリが次に始まるかどうか、または正確に一致するかどうかを知りたいです/cygdrive/?
(ドライブ文字(?)は文字c以外の文字かもしれません)。その場合は、2つの変数/cygdrive/?
部分とThe残りを検索します/...
。例:私の作業ディレクトリがある場合は、変数をに設定し、変数をに設定したいと/cygdrive/r/abc/xyz
思います。たとえば、PWDがonlyの場合、この変数は空でなければなりません。head
/cygdrive/r
tail
/abc/xyz
/cygdrive/r
tail
私はzsh内部コマンドのみを使用するソリューションを好みます。つまり、生成プロセスは必要ありません。
私は仕事をする次の解決策を思いついたが、気に入らない。
if [[ $PWD == /cygdrive/[abd-z]* ]]
then
local head=${PWD:0:11}
local tail=${PWD#/cygdrive/?}
....
fi
特にハードコーディングされた値が11のhead計算が気に入らず、まったく異なるアプローチがあればもう少しエレガントになるのではないかと思います。
if
更新:たとえば、PWDがある場合、私の条件も本当であることを知っていますが、私の/cygdrive/foo
アプリケーションではこれは問題ではないと思います。もちろん、条件を作成するためのより良い選択肢を提案できれば、正確に私が望むことをやっており、すべてのコメントに感謝します。
答え1
if [[ $PWD =~ '^(/cygdrive/[abd-z])(.*)' ]]; then
head=$match[1]
tail=$match[2]
fi
グローバルと同じ:
set -o extendedglob
if [[ $PWD = (#b)(/cygdrive/[abd-z])(*) ]]; then
head=$match[1]
tail=$match[2]
fi
zsh
d-z
Globには、一致するものだけが使用される独自のパターンマッチングを使用する利点がありますが、defghijklmnopqrstuvwxyz
システム=~
の正規表現を使用すると、はるかに多くの文字(ハンガリーのロケールの文字シーケンスまで)を[d-z]
一致させることができます。実行するとPCREを使用することになりますが、これに関してはより意味があります。é
dzs
set -o rematchpcre
=~
不一致/cygdrive/foo
:
if [[ $PWD =~ '^(/cygdrive/[abd-z])(/.*)?$' ]]; then
head=$match[1]
tail=$match[2]
fi
ボールで:
set -o extendedglob
if [[ $PWD = (#b)(/cygdrive/[abd-z])(/*|) ]]; then
head=$match[1]
tail=$match[2]
fi
答え2
変数のサフィックスを取得する方法は既にわかっているので、変数からプレフィックスを削除してプレフィックスを持つことができます。
if [[ $PWD == /cygdrive/[abd-z] ]]
then
local tail=${PWD#/cygdrive/?}
local head=${PWD%%$tail}
....
fi
条件はZshで正規表現を使用できます。
if [[ $PWD =~ '^/cygdrive/[abd-z](/.*)?$' ]]
then
tail=${PWD#/cygdrive/?}
head=${PWD%%$tail}
echo "head is $head"
echo "tail is $tail"
else
echo "no match"
fi