Verifique se a string não está vazia nem há espaço no script de shell


91

Estou tentando executar o script de shell a seguir, que deve verificar se uma string não tem espaço nem está vazia. No entanto, estou obtendo a mesma saída para todas as 3 strings mencionadas. Eu tentei usar a sintaxe "[[" também, mas sem sucesso.

Aqui está o meu código:

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str"!=" " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2"!=" " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3"!=" " ]; then
        echo "Str3 is not null or space"
fi

Estou recebendo a seguinte saída:

# ./checkCond.sh 
Str is not null or space
Str2 is not null or space

Respostas:


121

Você precisa de um espaço de cada lado do !=. Altere seu código para:

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str" != " " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2" != " " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3" != " " ]; then
        echo "Str3 is not null or space"
fi

Muito obrigado, funciona. Mas eu me pergunto por que a atribuição não usa um espaço, enquanto uma comparação sim.
— Shubhanshu Mishra

5
^^ É a sintaxe. A primeira palavra na linha de comando é o comando e as subsequentes são argumentos. var=value [command [args]]é a sintaxe, na qual um valor é atribuído a uma variável. para comparação, [( /usr/bin/[) é o comando e requer que var1,! = & var2 sejam 3 argumentos separados. var1! = var2 é um único argumento.
— anishsane

61

Para verificar a string vazia no shell

if [ "$str" == "" ];then
   echo NULL
fi

OU

if [ ! "$str" ];then
   echo NULL
fi

9
O operador de igualdade de strings do shell é =. O ==é um hack não portátil inventado por autores de shell para confundir as mentes de jovens programadores.
— Jens,

17

Caso você precise verificar qualquer quantidade de espaço em branco, não apenas um espaço, você pode fazer o seguinte:

Para retirar a sequência de espaço em branco extra (também condensa os espaços em branco no meio a um espaço):

trimmed=`echo -- $original`

O --garante que se $originalcontiver opções entendidas por eco, eles ainda serão considerados como argumentos normais a serem ecoados. Também é importante não colocar ""ao redor $original, ou os espaços não serão removidos.

Depois disso, você pode apenas verificar se $trimmedestá vazio.

[ -z "$trimmed" ] && echo "empty!"

3
No shell bourne, acabo com "-" como o valor de aparado.
— Sridhar Sarnobat

De acordo com este post , echo não interpreta - quer dizer o fim das opções. No meu shell Bash, obtenho o mesmo resultado que Sridhar Sarnobat
— Sr.C

9

Outro teste rápido para uma string conter algo além de espaço.

if [[ -n "${str// /}" ]]; then
    echo "It is not empty!"
fi

"-n" significa string de comprimento diferente de zero.

Então, as duas primeiras barras significam que correspondem a todos os itens a seguir, em nosso caso, espaço (s). Em seguida, a terceira barra é seguida pela string de substituição (vazia) e fechada com "}". Observe a diferença da sintaxe usual da expressão regular.

Você pode ler mais sobre a manipulação de strings em scripts de shell bash aqui .


não é [[ -n "$1" ]]o mesmo que [[ ! -z "$1" "]]?
— Alexander Mills,

@AlexanderMills você está certo, usar -n o tornaria um pouco mais curto. Acabei de atualizar a resposta de acordo.
— elomage


1
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty"

Retirar todas as novas linhas e espaços da string fará com que um em branco seja reduzido a nada que possa ser testado e aplicado

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.