我正在创建一个小型计算器脚本,我偶然发现了一个奇怪的错误。一切似乎都有效,但是当我输入以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
答案 0 :(得分:4)
...当我输入以
nothing
开头的任何内容时。当我这样做时,如果给出错误的
这是因为第二个测试要求表达式以数字开头:当表达式以(
开头时,测试(
会失败。
"$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