在此语句中,如果路径/ 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:55] [用户/桌面/脚本] - > ./xmodule加载firefox / 3.6.12 '有斜线
3.6.12 不匹配,您要查找的版本不存在
如果有空白(3.6.1以上),则应该有应用程序名称。我现在意识到这一定是我的问题,它使用的路径我可能只是/ app。 但我不认为我在代码的那一部分有任何改变。
答案 0 :(得分:27)
您可以使用整个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作为子进程运行。
答案 1 :(得分: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