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
Shubhanshu Mishra
fonte

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
dogbane
fonte
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
RajeshKashyap
fonte
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!"
hyde
fonte
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 .

elomage
fonte
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
6

Para verificar se uma string está vazia ou contém apenas espaços em branco, você pode usar:

shopt -s extglob  # more powerful pattern matching

if [ -n "${str##+([[:space:]])}" ]; then
    echo '$str is not null or space'
fi

Consulte Expansão de parâmetros de shell e correspondência de padrões no Manual do Bash.

Eugene Yarmash
fonte
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

Harsh Shandilya
fonte