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を使用するスクリプト構文エラー
私はあなたのコードの量を減らすことを示唆していますあなたが期待する方法、正確な入力が何であるか、より良いコードを特定することができます。 – Fred
^有用なコメントとともに、簡単な構文の問題を解決するためにhttp://www.shellcheck.netにスクリプトを貼り付けてください。コードの脆弱性机能 – Inian
あなたが見ている問題に加えて、不適切な引用のために潜在的な問題の束があります。 '$ password'は必ず二重引用符で囲むべきです。シェルがファイル名のワイルドカードとしてそれらをマッチさせないように' grep'パターンを一重引用符で囲む必要があります。また、正規表現 '[A-Z] [a-z]'は、大文字の直後に小文字がマッチします。あなたが任意の文字にマッチしたいなら、 '' [A-Za-z] ''を使います。 –