regex bash中的脚本中的Grep

a1o7rhls  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(158)

作为训练和提高我的bash技能的一部分,我试图设置below基本bash脚本来测试用grep从stdin读取的值/变量。

#!/bin/bash

declare -A COMPLIANCE=( [special_characters]="[^a-zA-Z0-9_]|[[:blank:]]" )

read -sp "Enter Password: " password
echo

for rule in "${!COMPLIANCE[@]}"; do
    grep -E "\"${COMPLIANCE[${rule}]}\"" <<< "\"${password}\""; exit="${?}"
    if [[ "${exit}" -gt 0 ]]; then echo "status ${exit}: ${rule} not compliant"; fi;
done

当我使用包含特殊字符的普通文本值直接从终端运行grep命令时,它可以正常工作

grep -E "[^a-zA-Z0-9_]|[[:blank:]]" <<< "abc@"

结果:abc@
但是当包含在脚本中时,相同的命令不起作用。
我也很好奇,当提供一个特殊字符(如“@”)时,脚本是否可以工作。所以我在正则表达式中添加了“+”量词,但仍然没有成功
我认为regex有一些问题,可能是:blank:,如这里所解释的https://www.regular-expressions.info/posixbrackets.html。但我的问题又没有得到调查结果。
我用的是centos stream 9盒子。
谢谢

llycmphe

llycmphe1#

正如@GordonDavisson指出的那样,我删除了额外的双引号,它可以工作。但我做了一个直接的声明。我还在读cmd行中添加了IFS=以保留前导和/或结尾空格,并添加了-r选项以保留最终的反斜杠。

#!/bin/bash

declare -A COMPLIANCE=( [special_characters]="[^a-zA-Z0-9_]|[[:blank:]]" )

IFS= read -srep "Enter Password for user \`${user}\`: $(echo $'\n> ')" password
printf "\n"

echo

for rule in "${!COMPLIANCE[@]}"; do
    if ! [[ "${password}" =~ ${COMPLIANCE[${rule}]} ]]; then
        echo "${rule} not compliant"
    fi
done

相关问题