У меня есть следующий if
блок в моем скрипте bash:
if [ ${PACKAGENAME} -eq kakadu-v6_4-00902C ]; then
echo "successfully entered if block!!"
fi
Выполнение скрипта не входит в мой if
блок, хотя $PACKAGENAME
оно равно kakadu-v6_4-00902C
. Что я делаю не так?
bash
shell-script
test
DemiSheep
источник
источник
-eq
истинно для целых чисел, вы хотите проверить строку или регулярное выражение (==
или=~
): mywiki.wooledge.org/BashGuide/TestsAndConditionalsjasonwryan
я посмотрю на этот ресурс!Ответы:
-eq
является арифметическим оператором, который сравнивает два числа.Используйте
=
(портативный / стандартныйsh
)=~
или==
вместо.Также используйте кавычки, потому что если
${PACKAGENAME}
содержит пробел или подстановочный знак, то он будет разбит на несколько аргументов, что заставит[
видеть больше аргументов, чем нужно . Смотрите здесь список распространенных ошибок Bash.Смотрите
man bash
, ищите ( /) дляCONDITIONAL EXPRESSIONS
.источник
polym
я посмотрю, спасибо за ресурс! Я открою эту вкладку рядом с моим руководством по VI. :)[[ $PACKAGENAME == "kakadu..." ]]
все в порядке.=
,==
и!=
, поскольку эта сторона является шаблоном, а не строкой. Например,foo='*'; [[ whatever = $foo ]]
это правда.Замените
-eq
на==
ваш блок if так: -источник
Другой способ - отрицать их:
Вышеприведенные блок первые тесты , если
"$PACKAGENAME"
имеет какое - либо значение вообще, и, если не он выходит с ошибкой и эхо - сигналов?'this'}
сstderr
. Если его родительская оболочка все еще существует, то тест пройден, и затем он проверяет, приводит ли удаление строки 'kakadu ...' из переменной к-z
пустой строке. Если это не так, то он снова выдает ошибку и выходит из оболочки. Если ваша оболочка все еще существует в этой точке, что-нибудь после выполнения блока, в противном случае это не так.Вероятно, такого рода вещи лучше всего реализовать в функции. Подобно:
С помощью этой функции вы можете предоставить столько аргументов, сколько позволит ваша система. Если вы предоставите меньше 2, он вернет 1 и отправит сообщение
stderr
. Если вы предоставите 2 или более аргумента, он будет обрабатывать все как строки и вернет 0, если все они идентичны, а не ноль, иначе он вернет номер аргумента, который сначала не пройдет проверку.В вашем случае это может быть использовано как:
Для демонстрации я напишу еще одну функцию:
DEMO:
ВЫХОД:
источник