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.