bourne shell if [-e $ diretório / arquivo. $ sufixo]

5

Eu estive procurando, inclusive, chequei até mesmo o manual do bash e tentei no modo cli.

#!/bin/sh
CONFIG_DIR="/var/opt/SUNWldm/"
read option
if [ $option -eq 9 ]; then
        ret=1
elif [ -e ${CONFIG_DIR}file.xml.${option} ]; then
        echo "TRUE"
fi

Eu tenho o código acima em um loop while para apresentar uma lista de opções. Infelizmente estou tendo problemas com a instrução elfi .

From: IF for Beginners the -e returns true if the file exists.

Eu verifiquei novamente a sintaxe e até mesmo executei o script no modo de depuração (coloquei set -x no início deste script e vi que a substituição no if é feita corretamente como visto inline:

+ [ 201301271355 -eq 9 ]
+ [ -e /var/opt/SUNWldm/file.xml.201301271355 ]
./ldm_recover.sh: test: argument expected

Eu tenho procurado até agora e não encontrei um motivo para falhar, alguma idéia do que estou fazendo de errado?

    
por BitsOfNix 28.01.2013 / 09:25

2 respostas

5

O shell Bourne é um pouco antigo. A versão do Solaris não tem o operador -e para o test (a.k.a. [ ) embutido que foi introduzido um pouco tarde na vida do shell Bourne® e consagrado pelo POSIX.

Como solução alternativa, você pode usar -f para testar a existência de um arquivo normal ou -r se não estiver interessado em arquivos ilegíveis.

Melhor, altere #!/bin/sh para #!/usr/xpg4/bin/sh ou #!/bin/ksh para obter um shell POSIX.

Tenha em atenção que [ $option -eq 9 ] provavelmente não está certo: -eq é um operador de comparação numérica, mas $option não é realmente numérico - é uma data. Em uma máquina de 32 bits, quando 201301271355 é interpretado como um número, é obtido o módulo 2 32 . Acontece que nenhuma data no século 21 está muito próxima de 0 módulo 2 32 , mas confiar nisso é muito frágil. Faça este [ "$option" = 9 ] em vez disso.

Como um princípio geral de programação de shell, sempre coloca aspas duplas em torno das substituições de variáveis e comandos : "$foo" , "$(foo)" . Se você não fizer isso, o shell dividirá o resultado em cada caractere de espaço em branco e tratará cada palavra resultante como um padrão de caractere curinga de nome de arquivo. Portanto, um $foo desprotegido só será seguro se o valor de foo não contiver nenhum espaço em branco ou \[?* . Jogue com segurança e sempre use aspas duplas (a menos que você pretenda que a divisão e a correspondência de padrões ocorram).

¹ Ou foi uma adição de ksh que nunca foi portada para Bourne? Não tenho certeza.

    
por 29.01.2013 / 01:35
0

Bem, isso foi mais fácil do que eu:

Parece que o operador -e para o if não está definido no shell bourne (sh), mas apenas no bourne novamente shell (bash).

Substitui o if [ -e ... por if [ -r ... e está funcionando.

    
por 28.01.2013 / 09:54