Variáveis em testes 'if' em bash [closed]

-2

Eu quero verificar se o ~/tost1 file existe, usando a variável $ i, que é igual a ~/tost1 . Se a declaração não funcionar com a variável. Existe alguma maneira de corrigir isso?

i=~/tost1
$ echo $i
~/tost1
$ if [ -e ${i} ]; then echo "file exists"; fi

$ if [ -e ~/tost1 ]; then echo "file exists"; fi
file exists
    
por Josef Klimuk 06.11.2017 / 19:39

2 respostas

2

Isso funciona para mim em 16.04 LTS, quando executado a partir da linha de comando em uma janela de terminal,

$ i=~/tost1
$ echo "$i"
/home/sudodus/tost1

$ touch ~/tost1
$ if [ -e ${i} ]; then echo "file exists";else echo "file does not exist";fi
file exists

Mas é uma boa idéia usar $HOME ao invés de til, particularmente se você pretende fazer um shellscript com os comandos que você testa interativamente, então comece com

$ i="$HOME"/tost1
$ touch ~/tost1
$ if [ -e "${i}" ]; then echo "file exists";else echo "file does not exist";fi
file exists

É um bom hábito de aspas duplas, se você quiser evitar surpresas desagradáveis. (Existem algumas exceções.)

    
por sudodus 06.11.2017 / 20:19
3

OBSERVAÇÃO : OP indicado no comentários "Estou usando o bash temporariamente no app do termux. Parece se comportar de maneira diferente, do que o 'regular' bash." Isso explica o comportamento incomum.

De acordo com o manual bash 4.3 usado no Ubuntu 16.04:

% bl0ck_qu0te%

No seu caso específico, o til é tratado como um caractere literal, e seu [ está procurando pelo arquivo no diretório que é literalmente chamado de ~ . É por isso que falha.

Use a variável de ambiente $HOME , ou seja, $HOME/tost1 .

    
por Sergiy Kolodyazhnyy 06.11.2017 / 20:07