Duplo colchetes para o FreeBSD

3

Eu tenho este código:

[[ "$1" =~ [/\]$ ]]

No linux funciona muito bem, mas quando eu testei no FreeBSD ocorreu um erro: ./projekt2.sh: [[: not found e it .. Eu tenho alguma alternativa que funcione em ambos os sistemas? Obrigado

VERSÃO BASH: 4.3.30 (1) -release

    
por applenic 29.03.2015 / 13:30

3 respostas

2

A sintaxe [[ é uma coisa do tipo ksh e bash e não está presente em todos os shells. Seu shell padrão do FreeBSD é provavelmente sh (ou bash agindo como sh ), não bash. A sintaxe equivalente que deve funcionar em todos os shells é:

case $1 in
        *[/\] ) echo "Yes";;
esac
    
por 29.03.2015 / 14:19
5

[[ é um bashismo. /bin/sh não é garantido como sendo o shell Bourne Again.

Mesmo em sistemas operacionais Linux, pode ser o shell do Debian Almquist ou o shell Ordinário Compatível com Políticas. Nos BSDs, não é o shell Bourne Again pronto para uso porque nos BSDs o shell Bourne Again é um complemento opcional para o sistema operacional adequado . Está na coleção de ports do FreeBSD . ("ports" são maneiras úteis de construir programas adicionais, não parte do FreeBSD, no FreeBSD a partir dos repositórios de fontes mantidas externamente por esses programas.)

/bin/sh nos BSDs é geralmente uma das primeiras reescritas de Bourne. No FreeBSD é o shell do Almquist, como no Debian Linux. (No OpenBSD é o shell Korn operando no modo POSIX).

Existe uma regra simples para os bashisms:

If you use bashisms in your script, explicitly set /bin/bash as the script interpreter. If you instead use /bin/sh as your script interpreter, then stick to the POSIX-conformant shell language alone.

=~ também é uma base e não faz parte da sintaxe compatível com POSIX do comando test . Mas aqui a expressão regular é exagerada, porque tudo o que você aparentemente está fazendo é verificar o último caractere.

Aqui está a sugestão de Thorsten Glaser de 2012 para fazer essas coisas:

case $1 in 
    */|*\)
        wibble ;;
    *)
        wobble ;;
esac

Leitura adicional

por 29.03.2015 / 14:21
1

A construção [[ não existe em todas as variantes sh. É uma coisa do ksh que foi adotada por bash e zsh. O sh do FreeBSD é derivado de cinzas e não suporta [[ .

Se você quiser usar [[ em um script, use uma linha shebang que chame um shell que suporta [[ . Você pode instalar bash ou ksh93 ou mksh como um pacote no FreeBSD; todos eles suportam [[ . Os pacotes são instalados em /usr/local/bin , enquanto o bash no Linux é quase sempre em /bin ; você pode usar /usr/bin/env para chamar um programa no PATH (é um hack clássico). Portanto, se você quiser usar [[ e outras construções bash, certifique-se de que o pacote bash esteja instalado e inicie seu script com

#!/usr/bin/env bash

Como alternativa, crie um link simbólico /usr/local/bin/bash -> /bin/bash no Linux e inicie seus scripts com

#!/usr/local/bin/bash

ou crie um link simbólico /bin/bash -> /usr/local/bin/bash no FreeBSD e inicie seus scripts com #!/bin/bash .

Como alternativa, escreva scripts que fiquem no sh core comum. Use [ em vez de [[ . Esteja ciente de que [ é um comando comum, não uma palavra reservada, então o que está dentro de colchetes é analisado normalmente, diferentemente do que está dentro de colchetes duplos - por exemplo você não pode escrever [[ condition1 && condition2 ]] da mesma forma com colchetes, você precisa para escrever [ condition1 ] && [ condition2 ] . Sh simples não tem uma construção de correspondência de expressão regular, mas para o que você está fazendo, a correspondência de padrão de caractere curinga é suficiente:

case "$1" in
  *[\/]) echo "$1 ends with a slash or backslash";;
  *) echo "$1 does not end with a slash or backslash";;
esac
    
por 29.03.2015 / 21:07