2017-02-07 10 views
0
#!/bin/bash 

password=$1 

if [[ $# -gt 1 || $1 = "-h" ]]; then 
      echo 'Usage: pw | pw -h | pw password' 
      echo "Note: Valid passwords must be between 8-16 characters long. 
      contain at least 1 digit 
      contain at least 1 lowercase letter 
      contain at least 1 uppcase letter 
      contain one of @ # $ % & * + - =" 
fi 
if [[ $# -lt 1 ]]; then 
    regex='[email protected]*+#$%&a-z' 
    password=$(cat /dev/urandom | tr -dc '[email protected]*+#$%&a-z' | head -c $((8 + $RANDOM % 8))) 
    check=$(echo $password | grep -o ['@*+#$%&'] | wc -m) 
    while [[ $check -gt 2 || $check -lt 1 ]] 
      do 
      password=$(cat /dev/urandom | tr -dc '[email protected]*+#$%&a-z' | head -c $((8 + $RANDOM % 8))) 
      check=$(echo $password | grep -o ['@*+#$%&'] | wc -m) 
    done 
    echo $password 
fi 
if [[ $# = 1 ]]; then 
    password=$1 
    echo "$password" | grep [A-Z][a-z] 
    if [[ $? = 1 ]]; then 

    echo "Password must contain at least one upper or lowercase characer" 
      exit 2 
    fi 

    echo "$password" | grep [0-9] 
    if [[ $? = 1 ]]; then 

    echo "Password must contain at least one digit" 
      exit 3 
    fi 

    if [[ `echo "$password" | grep -o ['@#$%&*+-'] 2>/dev/null` -gt 2 ]]; then 
      echo "You must only use one special character" 
      exit 4 
    fi 

    if [[ `echo "$password" | grep -o ['\@\#\$\%\&\*\+\-'] 2>/dev/null` -lt 1 ]]; then 

    echo "Password must contain at least one special character" 
      exit 5 
    fi 
    woc=$(echo "$password" | wc -m) 
    if [[ $woc -lt 8 || $woc -gt 16 ]]; then 

    echo "Password must be between 8 and 16 characters" 
      exit 6 
    fi 
echo "$1 is a valid password" 
fi 

このスクリプトの最初の部分は完全に動作し、8-16文字の長さの特殊文字を1文字だけ生成します。問題は40行目と45行目のどちらにも同じエラーが出ます "構文エラー:オペランドが期待されています" [特殊文字] "変数を作成して呼び出し、$変数を使用して出力などをチェックしました。スクリプトが正しく実行されない一貫していても滞在。特殊文字を含む変数にgrepを使用するスクリプト構文エラー

+3

私はあなたのコードの量を減らすことを示唆していますあなたが期待する方法、正確な入力が何であるか、より良いコードを特定することができます。 – Fred

+3

^有用なコメントとともに、簡単な構文の問題を解決するためにhttp://www.shellcheck.netにスクリプトを貼り付けてください。コードの脆弱性机能 – Inian

+2

あなたが見ている問題に加えて、不適切な引用のために潜在的な問題の束があります。 '$ password'は必ず二重引用符で囲むべきです。シェルがファイル名のワイルドカードとしてそれらをマッチさせないように' grep'パターンを一重引用符で囲む必要があります。また、正規表現 '[A-Z] [a-z]'は、大文字の直後に小文字がマッチします。あなたが任意の文字にマッチしたいなら、 '' [A-Za-z] ''を使います。 –

答えて

2

私はそれは、単純な間違いだった、コードを修正しました。私は-m WC含めるのを忘れていました。

if [[ `echo "$password" | grep [\@\#\$\%\&\*\+\-] | wc -m` -lt 2 ]] 
+0

@ kieran-oconnor私は自分自身を修正する人が好きです:)。 **あなたが間違いを見つけた場合。 **以上の問題は始まらない –

関連する問題