Alternativa para Bash double globet match

0

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 ao 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?

    
por Stphane 04.08.2018 / 00:26

3 respostas

2

Na verdade, você pode usar as expansões de parâmetros padrão aqui (estava faltando o caractere curinga):

$ args=a:b:c:
$ x=b
$ echo "${args%$x:*}"
a:
$ if [ "$args" != "${args#*$x:}" ]; then echo 'b: is present'; fi
b: is present

(ou igualmente "${args%$x:*}" )

A desvantagem é que você precisa ter os dois-pontos depois de b , então a:b ou um b comum não corresponderia e também corresponderia a a:bb:c . ( [[ $var = *$x:* ]] , assim como a correspondência óbvia de padrões com case , têm a mesma desvantagem).

A correspondência de todos os b , b:c , a:b , a:b:c , embora não corresponda a a:bb:c , seria um pouco mais complicada. Tudo o que posso pensar é algo assim:

args=a:b:c
x=b
IFS=:                   # affects globally
set -f                  # affects globally...
for x in $args; do
    if [ "$x" = "b" ]; then
        echo "b is present"
    fi
done

A menos que você queira escrever todos os casos:

args=a:b:c
x=b
found=0
case "$args" in
    $x)     found=1;;
    $x:*)   found=1;;
    *:$x)   found=1;;
    *:$x:*) found=1;;
esac
if [ "$found" = 1 ]; then ...; fi

Muito mais fácil com os regexes (no Bash):

args=b:c
x=b
if [[ $args =~ (^|:)$x(:|$) ]]; then
    echo "b found"
fi
    
por 04.08.2018 / 01:26
6

Não é um one-liner, mas isso é bastante legível e pode ser expandido para verificar qualquer número de argumentos:

hasArgs="a:b:c"
x=b
case "$hasArgs" in
    *$x*)
        echo "$x is present"
        ;;
esac
    
por 04.08.2018 / 00:30
2

O seguinte irá funcionar em sh:

if echo "$hasArgs" | grep -q "$x"; then
    
por 04.08.2018 / 00:30

Tags