Bash

在編寫使用正則表達式來驗證密碼輸入是否滿足長度和特殊字元要求的 bash 腳本時需要幫助

  • May 26, 2022

我已經在這方面工作了一段時間,訪問了幾十個站點並嘗試了各種組合;但是,我無法讓腳本按預期執行。即使他們在https://regex101.com/中工作,我仍然無法讓他們在 bash 中工作。

我正在嘗試編寫一個 bash 腳本來驗證輸入(“ $ password") is at least eight characters long and contains at least one number and at least one of these special characters: #?!@ $ %^&*-

GNU bash,版本 5.1.16(1)-release-(x86_64-pc-linux-gnu)

任何幫助將不勝感激!

read -p "Please enter a password to test: " password
echo "You entered '$password'"
# I have tried all of the following (plus a few others) and cannot get it to work
#regex='^[a-zA-Z0-9#@$?]{8,}$'
#regex='^[a-zA-Z0-9@#$%&*+-=]{8,}$'
#regex='^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[@#$%&*+-=]).{8,}$'
#regex='^(?=.*?[a-zA-Z0-9])(?=.*?[#?!@$ %^&*-]).{8,}$'
#regex='^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[#?!@$ %^&*-]).{8,}$'
if [[ $password =~ $regex ]]; then
       echo "This works"
else
       echo "Nope"
fi

支持的擴展正則表達式語法bash缺乏構造單個表達式的能力,這些表達式在幾個子表達式之間執行布爾 AND 測試。因此,您可以更輕鬆地針對每個條件執行一項測試。

您的字元串似乎需要滿足三個條件:

  1. 至少八個字元。
  2. 至少一個數字(這就是我假設您所說的“數字”的意思)。
  3. 集合中的至少一個角色#?!@$ %^&*-

這意味著三個測試:

if [ "${#password}" -ge 8 ] &&
  [[ $password == *[[:digit:]]* ]] &&
  [[ $password == *[#?!@$\ %^\&*-]* ]]
then
   echo 'good'
else
   echo 'not good'
fi

一些特殊字元必須在最後一次測試中轉義。我們可以使用變數讓它看起來更漂亮:

has_digit='*[[:digit:]]*'
has_special='*[#?!@$ %^&*-]*'  # or possibly '*[[:punct:]]*'

if [ "${#password}" -ge 8 ] &&
  [[ $password == $has_digit ]] &&
  [[ $password == $has_special ]]
then
   echo 'good'
else
   echo 'not good'
fi

請注意,我在這裡使用的不是正則表達式,而是普通的 shell 模式。匹配的集合[[:punct:]]是稍大的“標點符號”集合(特別是不包含空格字元,但您可以使用[[:punct:] ]or[[:punct:][:blank:]][[:punct:][:space:]]):

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

如果您真的只需要使用正則表達式,請執行以下操作

has_8='.{8}'
has_digit='[[:digit:]]'
has_special='[#?!@$ %^&*-]'  # or possibly '[[:punct:]]'

if [[ $password =~ $has_8 ]] &&
  [[ $password =~ $has_digit ]] &&
  [[ $password =~ $has_special ]]
then
   echo 'good'
else
   echo 'not good'
fi

注意改變的模式。


關於該regex101.com站點的一般警告是,它不聲稱支持大多數標準 Unix 文本處理工具使用的 POSIX 正則表達式,僅支持這些的各種擴展變體。

引用自:https://unix.stackexchange.com/questions/703751