Teste um script simples, mas continuo recebendo um erro para muitos argumentos na linha 20 [closed]

1

Saudações a usuários UNIX e Linux. Eu tenho um inquérito em relação a algum código que escrevi no script bash. Meu programa deveria fazer o seguinte:

Escreva um script que lerá duas seqüências do usuário. O script executará três operações nas duas sequências:

(1) Use o comando test para ver se uma das strings tem comprimento zero e se a outra é de comprimento diferente de zero, informando o usuário dos dois resultados. (2) Determine o comprimento de cada string e diga ao usuário qual é o maior ou se ele é de comprimento igual. (3) Compare as cordas para ver se elas são iguais. Deixe o usuário saber o resultado.

  6 #(1) Use the test command to see if one of the strings is of zero length and if the other is
  7 #of non-zero length, telling the user of both results.
  8 #(2) Determine the length of each string and tell the user which is longer or if they are of
  9 #equal length.
 10 #(3) Compare the strings to see if they are the same. Let the user know the result.
 11 
 12 echo -n "Hello user, please enter String 1:"
 13 read string1
 14 echo -n "Hello User, please enter String 2:"
 15 read string2
 16 
 17 myLen1=${#string1} #saves length of string1 into the variable myLen1
 18 myLen2=${#string2} #saves length of string2 into the variable myLen2
 19 
 20 if [ -z $string1 ] || [ -z $string2 ]; then
 21         echo "one of the strings is of zero length"
 22 
 23 else
 24         echo "Length of The first inputted string is: $myLen1"
 25         echo "Length of The second inputted string is: $myLen2"
 26 
 27 fi
 28 
 29 if [ $myLen1 -gt $myLen2 ]; then #Determine if string1 is of greater length than string2
 30         echo "The First input string has a greater text length than the Second input string."
 31         exit 1
 32 elif [ $myLen2 -gt $myLen1 ]; then #Determine if String2 is of greater length than String1
 33         echo "The second string has a greater text length than the First string."
 34         exit 1
 35 elif [ $myLen1 -eq $myLen2 ]; then #Determine if the strings have equal length
 36         echo "The two strings have the exact same length."
 37         exit 1
 38 fi

Estou recebendo o seguinte erro do meu script: (caso contrário, funciona conforme o esperado)

./advnacedlab4.sh: line 20: [: too many arguments
./advnacedlab4.sh: line 20: [: too many arguments

Por favor, me dê sua opinião. Obrigado!

    
por Linuxn00b 27.10.2015 / 00:49

1 resposta

5

Como jasonwryan apontou, você precisa se proteger de ter espaços nas strings que está testando. Você pode fazer isso colocando cotas em torno das variáveis, portanto, quando elas são expandidas, elas ainda são tratadas como uma única unidade ou usando o operador [[ em vez de [ , que é mais inteligente em lidar com essas expansões, mas é menos portátil.

Caso contrário, se string1 ou string2 tiver um espaço, você terá uma expressão como:

string1="string one"
if [ -z string one ] ...

então ele passará 2 strings "string" e "one" para -z , que espera apenas um único argumento.

    
por 27.10.2015 / 01:00