bash - 如何禁用 bash 中的特殊字符?

标签 bash shell special-characters positional-parameter

我创建了一个执行计算的脚本。例如: count 1 + 3

1 + 3 = 4 , -/也有效,但如果我输入 计数1 * 3 ,我得到了

应该是数字操作数

这是脚本的一部分:

if [ "$#" -ne 3 ]; then
        echo "Should be number operand number"
        exit 1
fi
...
elif [ "$2" = "*" ]; then
        result=`echo $1 \* $3 | bc`
  echo "$1 * $3 = $result"

是的,如果我输入 \之前*在命令行中它可以工作,但我需要它仅使用 * 运行.

我尝试使用 set -f在脚本内部它不起作用(是的,如果我输入 bash 本身,它会禁用特殊字符,但这不是我需要的)。还有一个shopt命令控制 shell 行为,因此我尝试启用一些选项,例如 shopt -s globstar , nullglob , promptvars等等,但没有成功。我把命令放在if语句之前,可能是错误的。

如果有人纠正我或告诉我其他方法来禁用脚本内部特殊字符的解释,我将不胜感激。

最佳答案

POSIX specification of expr 中提到了这个确切的问题,由于您所描述的原因,该工具具有“相当困难的语法”。

换句话说,这绝对是一个已知问题,而 POSIX 本身并没有解决这个问题。您确实应该考虑使用 Unix 并做同样的事情,而不是试图对抗它。

一些选项是:

  • 要求整个表达式为一个带引号的参数,例如计数“1 * 2”

    这是一种务实、快速失败的方法,可确保参数始终被引用,以便任何 * 的引入仍然有效。 bash 内置的 let 可以做到这一点。

  • 自己阅读表达式,例如只需运行 count,然后输入 1 * 2

    这可以避免 shell 接触您的数据,以便您可以按照您想要的方式解释它。这就是 bcdc 所做的。

  • 接受这样一个事实:传递 * 需要仔细引用。

    这就是expr的作用。

  • 使用magic alias仅在非常特定的情况下对某些 shell 起作用的 hack。

    没有人这样做,因为它很脆弱且不可预测,即使它在某些情况下允许您想要的语法。

关于bash - 如何禁用 bash 中的特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37737983/

相关文章:

庆典 [ : too many arguments greater than symbol

bash - Bash 参数扩展中的 `//` 是什么意思?

linux - 从 bash 脚本创建的全局 bash 脚本别名

linux - 重新分配变量时 Shell 脚本无法正常运行

python - Django 编码/解码问题

hadoop - 将文本中的数据加载到外部配置单元表中,并插入具有特殊字符的行

regex - 替换字符串中最后一次出现的字符

bash - 批处理文件/bash 脚本验证器

linux - Bash 备份检查器

r - 管道标准输入到 R