Como Kusalananda já apontou em seu comentário, é claro que você pode usar expr
em zsh, mas eu acho que você quis dizer se o Zsh tem uma maneira integrada para fazê-lo.
A resposta é "não", mas contém algo semelhante:
v="abcdefghijklmnopqrstuvwxyz"
i=${(SB)v#cdef}
Isso definiria i
como 3. No entanto, há dois motivos pelos quais isso não funciona exatamente como expr index
:
No exemplo que você deu, você está procurando por xyzd , que não está presente em sua string, mas como sua string termina em xyz , expr
normalmente cai o 'd' e retorna uma correspondência. Pode-se argumentar que o comportamento de Zsh é mais razoável a este respeito, mas é claro que se isso é uma questão importante para você, eu ficaria com Zsh.
A outra razão pela qual o Zsh é diferente, é que ${(SB)v#...}
retorna 1 se a string não corresponde. Por exemplo,
echo ${(SB)v#a}
echo ${(SB)v#7}
os dois retornariam 1. Com isso sozinho, você não pode distinguir entre um não-jogo e uma correspondência no primeiro caractere. Uma solução possível é calcular a posição e a duração da partida:
# N returns the length of the match
index_and_length=${(SBN)v#...}
# index_and_length contains the index, a space, and the length
if [[ ${index_and_length#* } == 0 ]]
then
echo no match
else
index=${index_and_length% *}
echo match at index $index
fi
UDPATE: Como os comentários deste post revelam, não entendi o propósito de expr index
; portanto, minha resposta, como dada, é inadequada. No entanto, podemos adaptá-lo, porque a "string" a ser pesquisada é um padrão glob. Assim, colchetes fará o trabalho:
# Search for the first occurance of one of the letters x y z d
index_and_length=${(SBN)v#[xyzd]}