bash howto script - se não houver resposta ou resposta mutliline

1

Eu tenho um script, que lê alguma entrada foo , e com base nessa entrada tenta calcular o valor para a variável bar . Se for bem sucedido, então deverá definir bar . Caso contrário, o usuário deve poder inserir esse valor para bar manualmente.

Atualmente, tenho:

read foo
bar=$(some manipulation with foo)
if [ $bar ]
then 
  echo $bar
else
  read bar
fi

O problema que estou enfrentando é que, em alguns casos, recebo mais de uma resposta de uma única palavra da manipulação de foo. Eu sei que eu poderia contornar isso com citações ou o novo teste, mas não é isso que eu quero. Eu gostaria que, se some manipulation with foo retornasse a saída multilinha, ele pedisse para definir bar manualmente. A mesma reação a não responder. Como eu faria isso?

    
por user857990 04.02.2014 / 09:44

3 respostas

1

Você está procurando o tamanho da matriz da barra:

#!/bin/bash

read foo
bar=(${foo})

case ${#bar[@]} in
  0) echo "bar has 0 words" ;;
  1) echo "bar has 1 word" ;;
  *) echo "bar has > 1 words" ;;
esac

Dependendo da entrada, você obtém as informações que a barra de palavras contém. O ${#bar[@]} fornece o número de elementos que a barra contém.

    
por 04.02.2014 / 10:23
1

Com qualquer shell parecido com o Bourne:

case $bar in
  "" | *[!$IFS]*[$IFS]*[!$IFS]*) echo empty or multi-word;;
  *) echo OK
esac

Ou:

set -f
set -- $bar
if [ "$#" -eq 1 ]; then
   echo OK
else
   echo empty of multi-word, words being:
   printf '  "%s"\n' "$@"
fi

Defina o IFS como o separador word . Por exemplo, se as palavras forem linhas não vazias:

IFS='
'
    
por 04.02.2014 / 10:44
0

Você pode ter apenas uma pequena função para verificar isso. Este é um exemplo, com alguns testes:

empty_or_multiline()
{
  [ -z "$1" ] && return 0
  count=$(echo "$1" | wc -l)
  [ $count -gt 1 ] && return 0

  return 1
}

# test number 1
bar=
if empty_or_multiline "$bar"
then
  echo Empty or multiline
else
  echo bar="$bar"
fi

# test number 2
bar=jajhsflgkh
if empty_or_multiline "$bar"
then
  echo Empty or multiline
else
  echo bar="$bar"
fi

# test number 3
bar="kjh\nskjfjhgf"
if empty_or_multiline "$bar"
then
  echo Empty or multiline
else
  echo bar="$bar"
fi
    
por 04.02.2014 / 10:21

Tags