2014-03-18 30 views
2
while getopts gpr: | gpd: name 
do 
    case $name in 
     g) echo " -g";; 
     p) echo " -p";; 
     r) echo " -r with '$OPTARG'";; 
     d) echo " -d with '$OPTARG'";; 
    esac 
done 

我知道这是写错了。我想这样写,所以它会显示我需要它做什么。需要使用一个参数或另一个getopts

具有g,p,d或r选项的脚本。关键是那个OR。

我曾试着谷歌它,阅读手册,发现很多简单的例子。 问题是,如果有办法做到这一点或getopts不支持这种行为。

回答

2

我这样做:

have_r=false 
have_d=false 

while getopts gpr:d: name; do 
    case $name in 
     g) echo " -g";; 
     p) echo " -p";; 
     r) echo " -r with '$OPTARG'"; have_r=true;; 
     d) echo " -d with '$OPTARG'"; have_d=true;; 
    esac 
done 
shift $((OPTIND - 1)) 

if $have_r && $have_d; then 
    echo "error, cannot use both -r and -d" >&2 
    exit 1 
fi 
0

以下将在第一个-g,-p,-r-d被解析后停止处理选项。如果需要,您可以在if声明中采取更强的措施(发出警告,退出脚本等)。

while getopts gpr:d: name 
do 
    if ((option_found == 1)); then 
     break 
    fi 
    case $name in 
     g) echo " -g"; option_found=1;; 
     p) echo " -p"; option_found=1;; 
     r) echo " -r with '$OPTARG'"; option_found=1;; 
     d) echo " -d with '$OPTARG'"; option_found=1;; 
    esac 
done 

就其本身而言,getopts并未对所使用的选项强制执行任何形式的相互排他性。

相关问题