【问题标题】:How to check ! $ & present in password variable in Shell script如何检查! $ & 出现在 Shell 脚本的密码变量中
【发布时间】:2022-10-21 20:15:29
【问题描述】:

我正在编写 shell 脚本,它将验证输入的密码,不应该接受! $ & 登录密码。我需要抛出错误消息。请在这里帮助我。

当我提供像 yt!$& 这样的密码时,这里会出现问题

它不会向我抛出错误消息

echo "enter password which do not include ! $ & sign" 
read -s password 
if [[ $password != *"&"* || $password != *"!"* || $password != *"$"* ]];
 then 
echo "Do not enter ! $ & in password" else 
echo $password  
fi

【问题讨论】:

  • 类似echo $INPUT | grep -q "[\$\!\&]" && echo "invalid character found"

标签: bash shell


【解决方案1】:

x!=a || x!=b || x!=c 等价于 !(x==a && x==b && x==c)

这仅在三个条件都不匹配时才成立。

但是,我想即使只有一个条件匹配,您也希望失败。

为此,您应该使用:!(x==a || x==b || x==c)
或等效地:x!=a && x!=b && x!=c

在那之后,应该清楚你还需要反转测试。


您可以组合测试并缩短为:

if [[ $password == *[&!$]*  ]]; then 
    echo "Do not enter ! $ & in password"
else 
    echo $password  
fi

& 必须转义。)

【讨论】:

  • 我通过反复试验看到,& 确实需要在这里转义,但为什么会这样呢? AFIK & 的唯一特殊作用是作为语句分隔符(在后台运行前面的命令时),即 A & B。但是这里我们是在比较的上下文中,无论如何都不能出现语句分隔符。
  • @user1934428 我认为任何元字符都需要转义(|&;()<> 和空格、制表符、换行符),因为它们在全局扩展发生之前就被解析了。见Quoting
  • @user1934428 想象一下,如果这条线是 ls /usr/bin/*[&echo ok
  • ls 的示例不计算在内,因为在这种情况下,我们没有 [[ 表达式引入的特定上下文,其中其他解析规则适用于正常语句(例如,分词的工作方式不同)。但我认为你是对的,解析器(或者更有可能是词法分析器)在语句解析器启动之前首先完成它的工作。
【解决方案2】:

您只需要修复您的状况:

if [[ $password == *"&"* || $password == *"!"* || $password == *"$"* ]]; then
  echo "Do not enter ! $ & in password"
fi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多