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