26

在此语句中,我尝试匹配路径 /app/$var1 (应用程序名称)中是否存在版本($var2)

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 "$@"
    rc=$?
    exit $rc
else
echo "no match, the version you are looking for does not exist"
fi

当前代码:这包括我所有的代码(未清理)。我运行的命令:“./xmodule load firefox/3.6.12”这个版本确实退出

#!/bin/bash
# hook for some commands

#echo $@  #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 $@ contains value "/" to determine if a specific version is requested.
case "$@" in
*/*)
    echo "has slash"
var1=$(echo "$@" | grep -Eio '\s\w*') # Gets the aplication name and put it into var1
echo $var1   # is not printed should be "firefox"
var2=$(echo "$@" | 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 "$@"
    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:55am] [user/Desktop/script] -> ./xmodule load firefox/3.6.12 '有斜线

3.6.12 不匹配,你要找的版本不存在

有空格的地方(3.6.1 以上)应该有应用程序名称。我现在意识到这一定是我的问题,因为它使用的路径可能只是 /app。但我不认为我在这部分代码中进行了任何更改。

4

2 回答 2

31

您可以使用整个 grep 管道作为if语句的条件。用于grep -q阻止它打印找到的匹配项(除非您想要打印)。$?我还简化了出口(如果您要立即使用它,则无需将其存储在变量中)。结果如下:

if find "/app/$var1" -maxdepth 1 -type l -o -type d | grep -q "$var2"; then
    $realcmd "$@"
    exit $?
else
    echo "no match, the version you are looking for does not exist"
    # Should there be an exit here?
fi

顺便说一句,由于您将在 $realcmd 之后立即退出,您可以使用exec $realcmd "$@"$realcmd 替换 shell,而不是将 $realcmd 作为子进程运行。

于 2012-10-23T06:54:09.890 回答
19

grep手册页:

如果找到选定的行,则退出状态为 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
于 2012-10-23T06:45:05.497 回答