Dado
hasArgs=a:b:c:
x=b
if [[ ${hasArgs} = *$x:* ]] ; then …
Eu gostaria de poder substituir o teste de colchetes duplos acima por uma alternativa menos específica do Bash (ou seja, sem subshell/comando etc.)
A expansão de parâmetros não ajuda porque não gasta variáveis.
if [ "${hasArgs}" != "${hasArgs#$x:}" ] ; then …
Existe alguma solução simples (uma linha) que se encaixe nesse caso de uso?
Não é uma linha, mas isso é bastante legível e pode ser expandido para verificar qualquer número de argumentos:
O seguinte funcionará em sh:
Na verdade, você pode usar as expansões de parâmetros padrão aqui (só faltava o curinga):
(ou igualmente
"${args%$x:*}"
)A desvantagem é que você precisa ter os dois pontos depois
b
, entãoa:b
ou uma planícieb
não corresponderia, e também corresponderiaa:bb:c
. ([[ $var = *$x:* ]]
assim como a correspondência de padrão óbvia comcase
têm a mesma desvantagem.)Corresponder a todos
b
,b:c
,a:b
,a:b:c
, sem correspondera:bb:c
seria um pouco mais complicado. Tudo o que consigo pensar é algo assim:A menos que você queira escrever todos os casos:
Muito mais fácil com regexes (em Bash):