expr e variáveis

1

Como executo o script: ./script.sh 1 \* 2

Eventualmente: ./script.sh 1 '*' 2

Como é meu script:

args="$@" # the first line of the script
result=$(($args))
echo "$args = $result"

Funciona: sim

O que eu quero alcançar: eu quero usar expr em vez de $((...))

Algo como:

args="$@" # the first line of the script
result='expr $args'
echo "$args = $result"

Ele funciona bem para argumentos de entrada como 1 + 2 , mas não funciona corretamente (ou, mais provavelmente, em todos os: expr: syntax error ) para o símbolo asterisco (estrela). Eu gostaria de saber por que isso não funciona como desejado e como devo corrigir isso.

Script como este: expr "$@" funciona - Eu simplesmente não entendo o que está acontecendo quando atribuo $@ a uma variável.

    
por SantaXL 11.05.2017 / 20:21

1 resposta

1

Por que seu script não funciona

Seu script como está agora executa a expansão de curingas para substituir o caractere curinga por todos os arquivos em seu diretório de trabalho atual. Isso fica evidente se você adicionar a opção set -x ao topo do script.

$ ./expr_script.sh 2 '*' 2
+ args='2 * 2'
++ expr 2 -23.txt add_location_name.py expr_script.sh kusalananda 'Movie A (2014)' 'Movie B (2016)' one.test popup_script.sh somefile2.txt somefile.txt somethings texts three.test turnSignal.v two.test 2
expr: syntax error
+ result=
+ echo '2 * 2 = '
2 * 2 = 

Como corrigir isso

Você não precisará da expansão de nome de arquivo no script aritmético, portanto, desabilite a expansão glob com a opção set -f .

#!/bin/bash
set -f
##set -x
args="$@" # the first line of the script
result=$(expr $args)
echo "$args = $result"

Isso funciona:

$ ./expr_script.sh 2 '*' 2
2 * 2 = 4
    
por 11.05.2017 / 20:54

Tags