bash script está tentando executar uma variável

4

Eu tenho um script Bash muito curto, assim:

variable="3 things"
if $(echo $variable|grep "^[0-9]\{1,\}") #if $variable begins with [0-9]
then
    echo $(echo $variable|sed 's/ .*$//')
else
    echo "0"
fi

$variable será eventualmente a saída de um comando que será uma cadeia que começa com um número ou com a palavra "Não". Eu quero que o script retorne apenas o número ou o dígito 0.

Estou recebendo o erro script.bash: line 2: 3: command not found e não entendo por que o bash está tentando executar "3" como um comando. Qualquer insight seria apreciado (ou sugestões sobre melhores maneiras de escrever isso - eu não sou bom com o script bash).

Obrigado

    
por Wolf 28.04.2011 / 03:13

2 respostas

3

Tente isto:

variable="3 things"
if echo "$variable" | grep "^[0-9]\{1,\}" >/dev/null 2>&1 #if $variable begins with [0-9]
then
    echo "$variable" | sed 's/ .*$//'
else
    echo "0"
fi

Ao usar a notação $(...) , você está executando o comando interno e colocando sua saída em seu lugar. A diretiva if executa a saída disso e vê se ela é bem-sucedida. Nesse caso, você realmente quer testar o sucesso do comando colocado dentro do $(...) . Também é bom citar variáveis quando usado.

    
por 28.04.2011 / 03:30
3

Seu script não está tentando executar sua variável .
Ele está tentando executar a saída de 'grep' ...
A razão pela qual ele está tentando executar 3 é pelo mesmo motivo de quando if command é encontrado no script. O comando é executado e seu código de saída é testado por if . Sua saída do grep apresenta if 3 para bash.

if command ;then do-something; fi está ok porque if testa o código de saída de command .
if 3 ; then do-somethin; fi falhará, porque 3 não é um comando ... Aqui está um exemplo simples para indicar if command...

function error() { return 1 ; }
if error  ;then echo A-cond1 ; else echo A-cond2 ;fi
if echo -n;then echo B-cond1 ; else echo B-cond2 ;fi
# 'if 3' fails as you already know..
# output:
A-cond2
B-cond1

Você pode facilmente evitar tudo isso e deixar 'sed' lidar com os testes de condição e a saída.

for var in \
  "3 things" \
  " 1 leading space" \
  "10 green bottles" \
  "albatross"
do 
  echo "$var" |sed -e "s/^\([0-9]\+\).*//" \
                   -e "s/^[^0-9].*/0/"
done

Saída:

3
0
10
0
    
por 28.04.2011 / 06:32