检查字符串内的符号时出错?

时间:2017-12-07 23:44:13

标签: linux bash shell ubuntu

我正在创建一个小型计算器脚本,我偶然发现了一个奇怪的错误。一切似乎都有效,但是当我输入以if开头的任何东西时都没有。当我这样做时else给出false并且"$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 应该是什么样子但是没有用。你知道为什么会发生这种情况以及如何解决这个错误吗?

class DropTutorProfileTable < ActiveRecord::Migration[5.1]
  class Subject < ActiveRecord::Base
    has_and_belongs_to_many :tutor_accounts
  end

  class TutorAccount < ActiveRecord::Base
    has_and_belongs_to_many :subjects
  end

  def change
    send_data_to_subject_tutor_account
    drop_table :tutor_profiles
  end

  private

  def send_data_to_subject_tutor_account
    TutorProfile.all.find_each do |tutor_profile|
      # data migration code here
      tutor_account.subjects << subject
    end
  end
end

2 个答案:

答案 0 :(得分:4)

  1.   

    ...当我输入以nothing开头的任何内容时。当我这样做时,如果给出错误的

    这是因为第二个测试要求表达式以数字开头:当表达式以(开头时,测试(会失败。

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

答案 1 :(得分:1)

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

#!/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