Я намагаюся зробити щось досить поширене: Проаналізувати введення користувача в сценарій оболонки. Якщо користувач надав дійсне ціле число, сценарій виконує одне, а якщо не дійсний, він робить щось інше. Проблема полягає в тому, що я не знайшов легкого (і досить елегантного) способу зробити це - мені не хочеться вибирати його за межі чару.
Я знаю, що це повинно бути легко, але я не знаю як. Я міг би це зробити на десятках мов, але не БАШ!
У своєму дослідженні я виявив це:
Регулярне вираження, щоб перевірити, чи складається рядок з дійсного дійсного числа в базі 10
І тут є відповідь, що говорить про регулярне вираження, але наскільки я знаю, це функція, доступна в C (серед інших). Тим не менш, це мало те, що виглядало як чудова відповідь, тому я спробував це з grep, але grep не знав, що з цим робити. Я спробував -П, що на моїй коробці означає трактувати це як PERL regexp - nada. Dash E (-E) також не працював. І ні -F.
Щоб було зрозуміло, я намагаюся щось подібне, шукаю будь-який вихід - звідти я зламаю сценарій, щоб скористатися тим, що я отримаю. (IOW, я очікував, що невідповідний вхід нічого не поверне, коли дійсний рядок повторюється.)
snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
echo "Not an integer - nothing back from the grep"
else
echo "Integer."
fi
Хтось, будь ласка, проілюструє, як це найлегше зробити?
Відверто кажучи, це, на мою думку, короткочасне тестування. Він повинен мати такий прапор
if [ -I "string" ] ;
then
echo "String is a valid integer."
else
echo "String is not a valid integer."
fi
[
стара суміснаtest
;[[
- це нова річ Баша, що має більше операцій та різних правил цитування. Якщо ви вже вирішили дотримуватися Баша, продовжуйте[[
(це дійсно набагато приємніше); якщо вам потрібна переносимість інших снарядів, уникайте їх[[
повністю.