$をテストする理由は何ですか? -eq 0 は偽であると予想しても真です。

$をテストする理由は何ですか? -eq 0 は偽であると予想しても真です。

このシェルスクリプト(パスワードの確認)ではまだ問題が発生しており、解決策を見つけましたが、まだ正しい解決策が見つかりませんでした。

#!/bin/sh

echo "enter the password"
read password

len="${#password}"

if test $len -ge 8 ; then
    echo "$password" | grep -q [A-Z]
    echo "$password" | grep -q [a-z]
    echo "$password" | grep -q [0-9]

    if test $? -eq 0 ; then
      echo "Strong password"
    else
      echo "Weak password"
    fi

else
    echo "password lenght should be greater than or equal 8"
fi

このスクリプトの結果は次のとおりです。

# ./password.sh 
enter the password
12345678
Strong password >> Not as I expected which is should be weak password

私のせいは何ですか?

ベストアンサー1

何:

  • readなしで使用するとパスワードが-r難しくなります。\

  • 正規表現を引用しないと、シェルはそれをワイルドカードパターンとして扱い、ファイル名に展開されます。

  • この$?変数は最後の終了状態のみを保持しますgrep

以下を考慮してくださいbashスクリプト:

#!/bin/bash

read -r -p "password:" -s password

if (( ${#password} < 8 )); then
  echo "Passwords need 8 or more characters"
  exit 1
fi

has_upcase=0
has_locase=0
has_digit=0
has_other=0

case "$password" in
  *[[:upper:]]*) has_upcase=1 ;;&
  *[[:lower:]]*) has_locase=1 ;;&
  *[[:digit:]]*) has_digit=1  ;;&
  *[^[:alnum:]]*) has_other=1 ;;
esac

if (( !has_upcase )); then
  echo "Make sure you password has at least one upper-case letter"
elif (( !has_locase )); then
  echo "Make sure your password has at least one lower-case letter"
elif (( !has_digit )); then
  echo "Make sure your password has at least one digit"
elif (( !has_other )); then
  echo "Make sure your password has at least non-alphanumeric character"
else
  echo "Your password is ok"
fi

私はテストに「英数字ではない」要件を自由に追加しました。

ofはユーザーにプロンプ​​トを出し、入力した内容をエコーすることなく読むことができますreadbash

このcaseステートメントは、入力されたパスワードに1つの大文字、1つの小文字、1つの数字、1つ以上の英数字以外の文字が含まれていることを確認します(次の使用)。POSIX 文字クラス)。;;&各行の末尾のファンキーな外観は、「次のパターンをテストするためにこの文字列を使い続ける」という意味です。

shPOSIXバリアントを取得するには、次のようreadに置き換えます。

stty -echo
printf "password: "
read -r password
stty echo
printf "\n"

そしてcase同様の声明

case "$password" in *[[:upper:]]*) has_upcase=1 ;; esac
case "$password" in *[[:lower:]]*) has_locase=1 ;; esac
case "$password" in *[[:digit:]]*) has_digit=1  ;; esac
case "$password" in *[^[:alnum:]]*) has_other=1 ;; esac

残りはまだPOSIXでなければなりません。

おすすめ記事