O comando unix read -p causa um erro bash, como faço para corrigir isso?

1

Estou tentando solicitar ao usuário um comentário

function comment {
  if [ ! $1 ]
  then
   read -p "enter checkin comment < " COMMENT;     
  else
   export COMMENT="$1"
  fi 

  if [ ! $COMMENT ]
  then
    echo 'no comment!'
  else
    echo "$COMMENT";
  fi  
}

ATUALIZADO Isso acontece quando eu digito mais de uma palavra no prompt, se eu digitar "atualizar" por exemplo eu não recebo uma mensagem de erro ... mas se eu digitar mais de uma palavra

enter checkin comment >> sun mars venus

então eu recebo o erro (sempre na segunda palavra)

-bash: [: mars: binary operator expected
    
por qodeninja 12.09.2011 / 19:43

2 respostas

6
if [ ! $COMMENT ]

Eu acho que você quis verificar se $COMMENT não é vazio, mas não é isso que esse comando faz. Uma substituição de variável sem aspas sofre geração de nome de arquivo (globbing) e divisão de palavras. Aqui, você está digitando várias palavras em seu comentário ( sun mars venus ), portanto, o comando [! sun mars venus (4 argumentos), que não é uma sintaxe válida. Sempre coloque aspas duplas em torno das substituições de variáveis:

if [ ! "$COMMENT" ]

Nesse caso específico, isso testa se $COMMENT não está vazio. Este é um atalho porque existem apenas duas palavras dentro dos colchetes. No caso geral, a maneira de testar se uma cadeia é não vazia é usar o operador -n e o operador -z testa se a cadeia está vazia.

if [ -z "$COMMENT" ]

Em ksh / bash / zsh, você pode usar a construção [[ … ]] em vez do comando [ … ] . Os colchetes únicos são um comando comum vinculado às regras usuais de sintaxe do shell, enquanto os colchetes duplos são uma sintaxe especial do shell com suas próprias regras. Não há palavras divididas entre colchetes duplos, então você pode escrever

if [[ -z $COMMENT ]]

Aspas duplas não dariam dano.

O mesmo vale para if [ ! $1 ] , que deve ser if [ -z "$1" ] ou if [[ -z $1 ]] .

Há uma estranheza adicional em exportar a variável COMMENT para o ambiente quando o comentário é passado como um argumento para a função, mas não quando você a lê com o read interno. A menos que você precise passar COMMENT para um programa externo, elimine a palavra export .

    
por 13.09.2011 / 09:08
1

O Bash está interpretando o [ como o comando test (que requer espaços ao redor do argumento). Veja O Wiki de Greg em testes & condicionais ...

    
por 12.09.2011 / 20:25

Tags