2010-03-26 115 views
2

从包装器shell脚本我调用Java程序。我希望Unix shell脚本将除了 EMAIL参数之外的所有参数传递给java程序。如何删除EMAIL参数并将其余参数传递给java程序。 EMAIL的论据可以来自任何位置。shell脚本传递参数的子集

valArgs() 
{ 

    until [ $# -eq 0 ]; do 
     case $1 in 
      -EMAIL) 
       MAILFLAG=Y 
       shift 
       break 
       ;; 
     esac 
    done 
} 



main() 

{ 

valArgs "[email protected]" 

$JAVA_HOME/bin/java -d64 -jar WEB-INF/lib/test.jar "[email protected]" 

回答

1

只是要删除“-EMAIL”选项吗?我假设它在“-EMAIL”之后没有附加额外参数

main(){ 
args="$1" 
case "$1" in 
    *-EMAIL*) 
     args=${args/-EMAIL/} 
esac 
$JAVA_HOME/bin/java -d64 -jar WEB-INF/lib/test.jar "$args" 
} 
+0

args被赋予第一个参数。 then args = $ {args/-EMAIL /} 上面的语句试图做什么。 – Arav 2010-03-26 03:55:58

+0

如果在$ args中找到“-EMAIL”,则将其删除(替换为空白) – ghostdog74 2010-03-26 04:13:57

+0

EMAIL参数可以出现在第一个或第二个或...(可选一个)中。我如何更改上述程序将其删除并将其余部分传递给程序 – Arav 2010-03-28 23:07:37

1

如果您使用的是bash,您可以使用下面的代码片段。使用数组有助于解决位置参数中存在空格时可能发生的问题。

请记住,原始示例中传递的位置参数仅在valArgs()调用期间持续存在。


#!/bin/bash 

main() 
{ 
    # Build up arg[] array with all options to be passed 
    # to subcommand. 
    i=0 

    for opt in "[email protected]"; do 
     case "$opt" in 
     -EMAIL) 
      MAILFLAG=Y 
      ;; 
     *) 
      arg[i]="$opt" 
      i=$((i+1)) 
      ;; 
     esac 
    done 

    $JAVA_HOME/bin/java -d64 -jar WEB-INF/lib/test.jar "${arg[@]}" 
} 

main "[email protected]" 
+0

我正在使用korn shell。它会起作用吗? – Arav 2010-03-26 03:35:38

+0

我在Debian Lenny系统上用/ usr/bin/ksh替换了/ bin/bash,它对我很有用。 – 2010-03-26 03:45:06

+0

这个$ {arg [@]}是什么意思? @表示数组中的值的数量?如果我在主“$ @” 之后使用echo“$ {arg [@]}”作为全局变量很好。我想调用main函数,之后我需要调用带有参数 – Arav 2010-03-26 06:06:14