string “if” a comparação de instrução é string vazia

0

Eu tenho problema para verificar se a string está vazia.
Eu recebo a primeira coluna de ls -l info e tento grep string procurando por "x". Se a string estiver vazia, devo contar. Mas quando a string está vazia ou não, ainda recebo meu código de saída 0 para essa instrução if.

Se eu usar o comando ls -l $1 | awk '{print $1}' , receberei -rw-r--r-- e quando eu o grep, eu recebo uma string vazia.

#!/bin/sh

test= ' ls -l $1 | awk '{print $1}' | grep x ' ;
if [ -n $test ];
echo "file is not executable";

Notas:

    O script
  1. é usado para fins acadêmicos para obter o código funcionando sem a opção [-x file].
  2. O script
  3. é escrito em shell e não em bash.
  4. Se você está com preguiça de rolar para baixo, há um fragmento de código fixo:

      #!/bin/sh
      PartOfString=' file $1 | awk '{print $2}' ';
      if [ $PartOfString == executable ];
      then
      echo "file is executable";
      else
      echo "file is not executable or its not file";
      fi
    
por Paulius Mickus 19.04.2016 / 14:53

3 respostas

4

O código que você está usando tem alguns problemas:

  1. Não é recomendado analisar ls , mas vamos mantê-lo por enquanto, pois não tem nada a ver com o seu problema.
  2. Usar '' para executar seus comandos funciona, mas é um estilo antigo e deve ser substituído com $() . Não é muito importante aqui, mas talvez valha a pena mencionar para o futuro.
  3. Seu if -construct tem a sintaxe incorreta. Está faltando um then e um fi .
  4. A maneira como você está usando -n está errada. -n testa se uma string não está vazia.

Aqui está uma versão melhorada:

#!/bin/sh                                       

testString=$(ls -l $1 | awk '{print $1}' | grep x)
if [ -n "$testString" ]
then
    echo "file is executable"
else
    echo "file is not executable"
fi

A questão é sobre manipulação de strings e usa o flag executável apenas como exemplo, mas eu ainda quero mencionar a maneira recomendada de verificar se um arquivo é executável:

#!/bin/bash
file="$1"

if [[ -x "$file" ]]
then
    echo "File '$file' is executable"
else
    echo "File '$file' is not executable or found"
fi
    
por Wayne_Yux 19.04.2016 / 15:04
1

É desnecessário usar ls e awk para testar se o arquivo é executável, use o sinalizador -x com o teste

  [ -x $1 ] && echo executable || echo not executable
    
por Sergiy Kolodyazhnyy 19.04.2016 / 15:55
0

Então eu finalmente encontrei a solução.

agora o fragmento de código é assim:

#!/bin/sh

test=' file $1 | awk '{print $2}' ';
if [ $test == executable ];
then
echo "file is executable";
else
echo "file is not executable or its not file";
fi

observe que é esperado que o primeiro argumento seja o arquivo que você deseja verificar. A idéia deste código é verificar se o arquivo é executável por não usar a opção -x. Se você está procurando código produtivo e não acadêmico, use o método Wayne_Yux descrito anteriormente.

    
por Paulius Mickus 19.04.2016 / 15:42