Apenas escape do sinal de dólar na linha de comando. Bash interpreta isto antes de passar isto como argumento para o script. É por isso que 5.50 é passado para o script (variável $ 5 não tem valor)
./myscript \.50
Eu quero executar um script que aceita argumentos em um formato de moeda. Exemplo:
> ./myscript $55.50
total is $55.50
> ./myscript $3.40
total is $58.90
Agora, não importa o quanto eu tente escapar do cifrão no argumento, fico:
> ./myscript $55.50
total is $5.50
> ./myscript $3.40
total is $5.90
Então, como você lida com valores monetários em scripts de shell? Obviamente, se eu especificar os valores no script, posso escapar deles corretamente: variável = '$ 65' OU variável="\ $ 65 '
mas como você faz essa entrada com base nos argumentos stdin ou de linha de comando?
Apenas escape do sinal de dólar na linha de comando. Bash interpreta isto antes de passar isto como argumento para o script. É por isso que 5.50 é passado para o script (variável $ 5 não tem valor)
./myscript \.50
Outra maneira de escapar do argumento é colocá-lo entre aspas simples da mesma maneira que você faria no script:
./myscript '$55.50'
A expansão da variável é executada pelo shell antes que os argumentos sejam passados para o executável. Cifrões introduzem expansão de parâmetros (e substituição de comandos e expansão aritmética. Neste caso, já que há um dígito seguindo o cifrão, ele está sendo tratado como um parâmetro posicional, então ele está procurando pelo quinto argumento. Já que você está em um prompt de comando shell interativo, não é provável que tenha algum valor (você pode fazer set --
para afetar isso, no entanto).
$ echo $55.50
5.50
$ echo \.50
$55.50
$ echo '$55.50'
$55.50
$ set -- aaa bbb ccc ddd eee fff
$ echo $55.50
eee5.50