#!/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 символов с одним специальным символом. Проблемы находятся в строке 40 и 45, обе дают мне ту же ошибку «Синтаксическая ошибка: ожидание операнда» [специальный символ] ». Я попытался создать переменные и вызвать их, используя переменную $? Для проверки вывода и т. Д. К сожалению, эта ошибка остается стабильно даже при том, что скрипт делает правильно работать.Ошибка синтаксиса BASH Script с использованием grep для переменной, содержащей специальные символы
Я хотел бы предложить вам уменьшить количество кода в вашем ответьте и лучше определите код, который не работает, как вы ожидаете, какие точные входы и т. д. – Fred
также вместе с^полезным комментарием, скопируйте свой скрипт в http://www.shellcheck.net, чтобы исправить тривиальные синтаксические проблемы и уязвимость кода ilities – Inian
В дополнение к проблеме, которую вы видите, существует множество потенциальных проблем из-за неправильного цитирования. '$ password' должен * всегда * быть в двойных кавычках, а ваши шаблоны' grep' должны быть одинарной кавычкой, чтобы предотвратить совпадение оболочки с ней в качестве подстановочных знаков имен файлов. Кроме того, регулярное выражение '[A-Z] [a-z]' соответствует заглавной букве, за которой следует строчная буква; если вы хотите сопоставить любую букву, используйте '' [A-Za-z] ''. –