Подтвердить что ты не робот

Если 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), должно быть имя приложения. Я теперь понимаю, что это должна быть моя проблема, грешит путь, который он использует, вероятно, просто/приложение. Но я не думаю, что я что-то изменил в этой части кода.

4b9b3361

Ответ 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