Я написал сценарий оболочки для определения того, установлен ли пакет или нет. Мой скрипт должен записать свое имя и статус, если он установлен. Я не могу понять какие-либо проблемы с моим кодом, но когда я его запускаю, он не выполняет команды в соответствии с условием if [ $? == 0 ]
.Ошибка в сценарии оболочки для обнаружения пакетов в системе
#!/bin/bash
if [ "$1" == "" ]; then
echo "Please hold the line."
else
dpkg -s [email protected] &> /dev/null
fi
if [ $? == 1 ]; then
echo -e "Package \033[0;31mNOT\033[0m found." >&2
else
if [ $? == 0 ]; then
for i in [email protected]; do
dpkg -s $i | grep Package
dpkg -s $i | grep Status
done
fi
fi
Но самая странная вещь для меня в том, что она работает, если я добавляю эхо после утверждения if. Похоже, что:
#!/bin/bash
if [ "$1" == "" ]; then
echo "Please hold the line."
else
dpkg -s [email protected] &> /dev/null
fi
if [ $? == 1 ]; then
echo -e "Package \033[0;31mNOT\033[0m found." >&2
else
echo hi
if [ $? == 0 ]; then
for i in [email protected]; do
dpkg -s $i | grep Package
dpkg -s $i | grep Status
done
fi
fi
Так что, если я добавить echo -n
в правильном положении в моем коде он будет работать, как я хочу. Но я просто хочу знать, что не так с первым?
Вы пробовали 'elif'? –
Сохранить $? к переменной. – Cyrus
В стороне: поскольку вы используете 'bash', вам [лучше использовать' [[', а не' ['for conditionals] (http://stackoverflow.com/a/29320710/45375). Если цель состоит в том, чтобы оставаться переносной, объединение '[' с '==' не имеет смысла, потому что строго POSIX-совместимые оболочки распознают '='. Наконец, '==' (и '=') предназначены для сравнения _string_; лучше использовать '-eq' для тестирования _numeric_ equal. – mklement0