【问题标题】:A '*' argument results in "value too great for base" error'*' 参数导致“值对于基础来说太大”错误
【发布时间】:2018-11-12 18:00:34
【问题描述】:

我正在制作这个非常简单的算术脚本,但是当我尝试传递 * 运算符时出现了这个奇怪的错误。 语法:[命令] [num1] [num2] [算术运算符] 代码如下:

result=$(($1$3$2))
echo "Calculation result is: $result "

像这样传递“*”运算符:

bash my_script.sh 1 2 *

... 返回以下错误:

第 7 行:3Access:值对于 base 来说太大(错误标记是“3Access”)

我通过测试语句将* 替换为\\\* 来修复它。虽然我想了解为什么会发生此错误。

我发现的唯一线程是指关于 BASH 假定为八进制的上述八进制值的错误。但我不清楚为什么 * 被视为一个数值。

【问题讨论】:

  • 可以使用echo "$((3Access))" 重现,默认情况下,基数为 10,字母字符在基数 10 中非常好,但是在基数 36 中它可以工作 echo "$((36#3Access))",但可能不是您想要的,原因它看起来是一个数值是双括号用于算术扩展
  • 您没有共享确切的命令,但我认为您没有正确引用 *,因此 shell 会扩展它。
  • 你如何“传递*”?你运行cmd 4 5 * 吗?还是你避开了星号?
  • 能否提供echo $1echo $2echo $3的输出。通过提供允许其他人重现问题的代码,您还可以显着增加获得帮助的机会。见stackoverflow.com/help/mcve

标签: bash command-line-arguments


【解决方案1】:

* 在 shell 语言中有特殊的含义。它用于文件名扩展,并扩展到当前目录中的所有非隐藏文件和文件夹,并将它们作为单独的参数传递给脚本。

试试这个脚本看看:

#!/bin/bash
# star.sh
echo "$1"
echo "$2"
echo "$3"
# and so on ...

现在运行它:

bash star.sh *

它将打印您当前目录中的前 3 个文件。


为避免发生文件名扩展,您需要引用*。像这样:

bash your_script.sh 1 2 '*'

或者逃避它

bash your_script.sh 1 2 \*

Bash Manual: Filename Expansion

【讨论】:

  • 我没有正确地逃避它,是的。感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
相关资源
最近更新 更多