Что не так с этим простым сценарием оболочки - PullRequest
1 голос
/ 27 июня 2011

Я новичок в сценарии Shell.Просто задайте небольшой вопрос о сценарии, который я написал.

pkgs="./cppcheck-1.48.tar.bz2 ./sshpass-1.04.tar.gz"
for pkg in $pkgs ; do
echo ${pkg} | grep -qE "bz2$"

if [ $? ] ; then
                echo "here1"
else
                echo "here2"            
fi

done

Он всегда печатает здесь1, т.е. если условие всегда выполняется.Я не могу определить причину этого до сих пор.Пожалуйста, укажите мне правильное направление.

Я знаю, что могу использовать команду переключения оболочки.Просто хочу знать, что с этим не так.Оболочка - это / bin / bash

[EDIT] - оператор switch работает безупречно.Для тех, кто сталкивается с этой проблемой в другой раз

case ${pkg} in
     *bz2) echo "here1";;
     *) echo "here2";;
esac

Ответы [ 3 ]

4 голосов
/ 27 июня 2011

Bash имеет как арифметические, так и условные выражения.

Ответ, который дает sarnold, является способом заставить это работать, используя условное выражение, но если вы хотите использовать вместо этого арифметическое выражение, вы можете заменить

[ $? ]

с

(( $? ))

Если вы будете искать по этим темам справочные страницы bash, есть гораздо больше информации о том, как они работают.

edit: Моя ошибка, условные выражения[[]].(()) дает поведение, которое вы, вероятно, ожидали, хотя.

3 голосов
/ 27 июня 2011

if [ $? ] не работает, как вы могли ожидать:

$ false ; if [ $? ] ; then echo "true" ; else echo "false" ; fi 
true
$ true ; if [ $? ] ; then echo "true" ; else echo "false" ; fi 
true

Достаточно легко исправить, сравнив с 0 явно:

$ false ; if [ $? -eq 0 ] ; then echo "true" ; else echo "false" ; fi 
false
$ true ; if [ $? -eq 0 ] ; then echo "true" ; else echo "false" ; fi 
true

Итак, для вашего сценария:

pkgs="./cppcheck-1.48.tar.bz2 ./sshpass-1.04.tar.gz"
for pkg in $pkgs ; do
echo ${pkg} | grep -qE "bz2$"

if [ $? -eq 0 ] ; then
                echo "here1"
else
                echo "here2"            
fi

done

here1
here2
0 голосов
/ 27 июня 2011

Заменить echo ${pkg} | grep -qE "bz2$" на echo ${pkg} | grep -q -E "bz2$" и это будет работать как шарм! [РЕДАКТИРОВАТЬ] Упс .. также измените условие if () на if [ $? -ne 1 ] ; then

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...