Eu configurei uma função em um shell script que verifica se existe uma pasta, se não existe, tenta criá-la, e se não conseguir criar a pasta (por exemplo se o usuário não tiver a permissão certa) retornar 1 . Então eu verifico este "retorno", mas não entendo porque "se" não funciona porque o retorno é igual a 1.
Código:
#!/bin/bash
# Main folders
INPUT="input"
OUTPUT="output"
# Functions
function checkFolderExist(){
if [ -d $1 ]
then
# 0 = true
# Change to 0, only for tests.
return 1
else
mkdir $1
result=$?
if [ result==0 ]
then
# 0 = true
return 0
else
# 1 = false
return 1
fi
fi
}
CHECKINPUT=$(checkFolderExist $INPUT)
echo $?
CHECKOUTPUT=$(checkFolderExist $OUTPUT)
echo $?
# If folders does not exist, exit the script
if [[ "$CHECKINPUT" = 1 || "$CHECKOUTPUT" = 1 ]]; then
echo "[+] Error. Folder does not exist. Check user permissions."
exit 1
fi
Tem algumas coisas aqui.
$?
qualquer coisa ou salvá-la em uma variável (a menos que precise fazer referência ao mesmo status de saída várias vezes).return
raramente é necessário um explícito (raramente com um valor de retorno explícito, pelo menos).create_dir_if_needed
.[ result==0 ]
. A stringresult==0
é uma string de comprimento diferente de zero, e testar uma string dessa forma retornará true se a string tiver comprimento diferente de zero, então o teste é sempre true. Você provavelmente queria[ "$result" -eq 0 ]
em vez disso.Com essas coisas em mente:
Isso retornaria o status de saída de
mkdir -p -- "$1"
. Este comando criaria o diretório nomeado (e quaisquer diretórios intermediários) se ele ainda não existisse. Se omkdir
comando falhar ao criar o diretório, ele sairá com um status de saída diferente de zero, que se tornará o status de saída da função.mkdir -p
não falhará se o diretório já existir.Você usaria isso como
ou, como a função é trivial, você pode se livrar dela e dizer
Uma variação da
create_dir_if_needed
função que usamkdir
sem-p
e, portanto, nunca criará diretórios pai ausentes para o caminho de diretório fornecido:ou,
Uma chamada para esta função retornaria true (zero) se o diretório já existisse ou se a
mkdir
chamada fosse bem-sucedida. Umareturn
instrução sem valor explícito retornará o status de saída da instrução executada mais recentemente, neste caso retornaria o resultado positivo do[ -d "$1" ]
teste.Bash não funciona como linguagens de programação regulares quando se trata de retornar valores.
Aqui você está confundindo a saída de checkFolderExist com o status de retorno de checkFolderExist.
Suas variáveis CHECKINPUT e CHECKOUTPUT estarão vazias porque sua função não tem
echo
nadaprintf
.Se você realmente deseja salvar o status de retorno da sua função para uso posterior, deve fazer:
Além disso, eu recomendo que você siga os conselhos na resposta de Kusalananda que o direcionam para melhores técnicas para resolver o problema.
Você está misturando saída versus valor de retorno de uma função. Eu mostro exemplos mínimos de trabalho, para que você possa ver seu erro:
Ou faça um retorno:
ou escreva para stdout e verifique a saída:
Observe também que prefiro distinguir integer de string da variável
ret
, o que não é realmente necessário se você souber que a saída só pode ser numérica, mas a torna mais limpa. Além disso, não é necessário capturar o valor de retorno em uma variável se a instrução condicional for seguida imediatamente.É o primeiro que você queria ter, então você não deve usar
$()
. Você realmente os misturou: Valor de retorno como no primeiro exemplo e verificação de saída como no segundo exemplo.