【问题标题】:Bug while checking for symbols inside of a string?检查字符串中的符号时出现错误?
【发布时间】:2017-12-07 23:44:12
【问题描述】:

我正在创建一个小型计算器脚本,但偶然发现了一个奇怪的错误。一切似乎都有效,但当我输入以( 开头的任何内容时,一切都没有了。当我这样做时,if 给出 false 并且 else 内部的代码执行。我尝试了很多方法来重写"$input" =~ [-,+,*,/,\(,\)] 的外观,但没有任何效果。你知道为什么会发生这种情况以及如何解决这个错误吗?

#!/bin/bash
read -p "Input: " input
if [[ ! "$input" =~ ^[A-Za-z_]+$ && "$input" =~ ^[0-9] && "$input" =~ [-,+,*,/,\(,\)] ]]; then
 (echo $input = $(($input))) 2>- || echo "Please, do not input ..."
else
 echo "Please, do not input letters or other special symbols and type in only expressions."
fi

【问题讨论】:

  • 您是否尝试过删除括号前面的反斜杠?我认为,在 [] 字符匹配中,您不应该需要这些。

标签: linux bash shell ubuntu


【解决方案1】:
  1. ...当我输入以( 开头的任何内容时。当我这样做时,如果给出错误

    这是因为第二个测试要求表达式以数字开头:当表达式以( 开头时,测试"$input" =~ ^[0-9] 失败。

  2. [-,+,*,/,\(,\)] 可以简化为[-,+*/()]。这是因为 (a) 括号不需要在 [...] 内转义,并且 (b) 没有理由在方括号表达式 [...] 内指定 , 五次。如果您希望正则表达式匹配逗号,则列出一次就足够了。如果您不希望它与逗号匹配,请不要将逗号放在 [...] 中。

【讨论】:

  • 写点#2:字符类中的字符之间没有分隔符。 (如果意图只是将其他字母分开,也许根本不应该有 , .. 向 OP 提出一个问题。)
  • @user2864740 非常好。我编辑了答案,以便更清楚地说明这一点。
  • 非常感谢您的回答,我会考虑的。
【解决方案2】:

如果您需要确保您的输入仅包含某些字符,请使用这个更简单的正则表达式:

#!/bin/bash

read -r -p "Input: " input

if [[ $input =~ ^[0-9+*/()-]*$ ]]; then
   (echo "$input = $((input))") 2> /dev/null || echo "Please, do not input ..."
else
   echo "Please, do not input letters or other special symbols and type in only expressions."
fi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多