Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux getopts中的顺序参数_Linux_Bash_Shell - Fatal编程技术网

Linux getopts中的顺序参数

Linux getopts中的顺序参数,linux,bash,shell,Linux,Bash,Shell,我必须写非常简单的脚本。它应该需要2个args-h和-q。两者都是可选的,-h可以在某个地方。所以,-h-q应该做与-q-h相同的动作。如果我通过了-a,或者-a-a-a-应该会发生错误(我的意思是退出1)。如果我通过-a-h-a-a-b…-它应该返回“我无法识别-a”+调用帮助案例。So-h具有优先权。 你能帮我吗 while getopts "hq" OPTION do case $OPTION in h) echo "Help here!&quo

我必须写非常简单的脚本。它应该需要2个args-h和-q。两者都是可选的,-h可以在某个地方。所以,-h-q应该做与-q-h相同的动作。如果我通过了-a,或者-a-a-a-应该会发生错误(我的意思是退出1)。如果我通过-a-h-a-a-b…-它应该返回“我无法识别-a”+调用帮助案例。So-h具有优先权。 你能帮我吗

while getopts "hq" OPTION
do
case $OPTION in
  h)
     echo "Help here!" ;
     exit 0;
     
esac
done
shift $(($OPTIND - 1))

while getopts "hq" OPTION
do
case $OPTION in
  q) #quiet - return 0, do nothing. 
     exit 0;;
 

                   
  *) #If -a or sth
     echo "I couldn't recognize args" 
     echo "Help here" 
     exit 1
     ;;
     
esac
     
done

这是正确的实现:

#!/usr/bin/env bash

while getopts :hq OPTION
do  
    case $OPTION in
    h) echo "Help here!" ;
       exit 0;;
    q) echo "quiet do nothing."
       exit 0;;
    ?) echo "I couldn't recognize option [$1]" 
       exit 1;;
    esac
done
shift $((OPTIND - 1))

注意
:hq
?)
要处理不正确的选项(-a-b…

您需要使用一个
,而getopts
循环处理所有选项,而不是一个用于
-h
然后一个用于
-q
。我发现这个技巧在堆栈上有两个循环。堆栈上的哪个位置?它可能应该被更正,因为它将无法正常工作(除非有一些奇怪的情况是有意义的)。请看一下您可以解释的问题:
,而getopts
将循环传递给脚本的每个选项。。。