Если grep найдет то, что он ищет, сделайте X else Y
В этом выражении я пытаюсь сопоставить, существует ли версия ($ var2) в пути /app/ $var1 (имя приложения)
if
find /app/$var1 -maxdepth 1 -type l -o -type d | grep $var2 #results in a nice list where i can manually get a true match.
# if match is found then execute command.
$realcmd "[email protected]"
rc=$?
exit $rc
else
echo "no match, the version you are looking for does not exist"
fi
текущий код:
это включает весь мой код (не очищается).
command Я запускаю: "./xmodule load firefox/3.6.12"
эта версия завершает работу
#!/bin/bash
# hook for some commands
#echo [email protected] #value of sting that is entered after "xmodule"
cmd=$(basename "$0")
#echo "called as $cmd"
if [[ $cmd = "xmodule" ]]
then
realcmd='/app/modules/0/bin/modulecmd tcsh'
# verify parameters
fi
# check if [email protected] contains value "/" to determine if a specific version is requested.
case "[email protected]" in
*/*)
echo "has slash"
var1=$(echo "[email protected]" | grep -Eio '\s\w*') # Gets the aplication name and put it into var1
echo $var1 # is not printed should be "firefox"
var2=$(echo "[email protected]" | grep -o '[^/]*$') # Gets version name and put it into var2
echo $var2
# Checking if version number exist in /app/appname/
if find /app/$var1 -noleaf -maxdepth 1 -type l -o -type d | grep $var2; then
$realcmd "[email protected]"
exit $?
else
echo "no match, the version you are looking for does not exist"
# Should there be an exit here?
fi
;;
*)
echo "doesn't have a slash"
;;
esac
Выход:
mycomputer [9:55 am] [пользователь/рабочий стол /script] → ./xmodule load firefox/3.6.12
'имеет слэш
3.6.12
нет совпадения, версия, которую вы ищете, не существует
Если есть пробел (выше 3.6.1), должно быть имя приложения. Я теперь понимаю, что это должна быть моя проблема, грешит путь, который он использует, вероятно, просто/приложение.
Но я не думаю, что я что-то изменил в этой части кода.
Ответы
Ответ 1
Вы можете использовать весь конвейер grep как условие оператора if
. Используйте grep -q
, чтобы он не распечатывал совпадение, которое он находит (если вы не хотите, чтобы это было напечатано). Я также упростил выход (нет необходимости хранить $?
в переменной, если вы просто собираетесь использовать его немедленно). Здесь результат:
if find "/app/$var1" -maxdepth 1 -type l -o -type d | grep -q "$var2"; then
$realcmd "[email protected]"
exit $?
else
echo "no match, the version you are looking for does not exist"
# Should there be an exit here?
fi
Кстати, поскольку вы собираетесь выйти сразу после $realcmd, вы можете использовать exec $realcmd "[email protected]"
для замены оболочки $realcmd вместо запуска $realcmd в качестве подпроцесса.
Ответ 2
Из grep
manpage:
Статус выхода равен 0, если выбранные строки найдены, и 1, если не найден. Если произошла ошибка, статус выхода равен 2.
Другими словами, сразу после вашего blah blah | grep $var2
просто проверьте возвращаемое значение.
Так как код выхода для конвейера - это код выхода для последнего процесса в этом конвейере, вы можете использовать что-то вроде:
find /app/$var1 -maxdepth 1 -type l -o -type d | grep $var2
greprc=$?
if [[ $greprc -eq 0 ]] ; then
echo Found
else
if [[ $greprc -eq 1 ]] ; then
echo Not found
else
echo Some sort of error
fi
fi