Linux getopt、unixshell脚本中的问题

Linux getopt、unixshell脚本中的问题,linux,unix,shell,Linux,Unix,Shell,嗨,有人可以解决这个问题,我不能得到输出 我不能得到-p的输出 #!/bin/bash args=`getopt c:m:p $*` if [ $? != 0 -o $# == 0 ] then echo 'Usage: -c <current-dir> -m <my dir> -p <argument>' exit 1 fi set -- $args for i do case "$i" in -c

嗨,有人可以解决这个问题,我不能得到输出

我不能得到-p的输出

#!/bin/bash 

args=`getopt c:m:p $*` 

if [ $? != 0  -o $# == 0 ] 
then 
  echo 'Usage: -c <current-dir> -m <my dir> -p <argument>' 
  exit 1 
fi 

set -- $args 

for i 
do 
 case "$i" in 
         -c) shift;CURRDIR=$1;shift;shift ;; 
         -m) MYDIR=$1;shift;; 
         -p) ARGVAL=$OPTARG;; 
   esac 
done 

echo "CURRDIR = $CURRDIR" 
echo "MYDIR = $MYDIR" 
echo "ARGVAL = $ARGVAL" 

./1.sh -c "def" -m "ref" -p "ref -k ref" 
getopt 您需要在p之后添加冒号,以指示-p接受参数。您还应该将$*更改为$@以更好地处理空间

args=`getopt c:m:p: "$@"` 
您还混淆了getopt和getopts$OPTARG是一种getopts功能。使用普通的getopt和set,您只需使用$2,然后转移参数

-p) ARGVAL=$2; shift 2;; 
在这一点上,您已经用getopt做了尽可能好的工作。不幸的是,不管你做什么,它都不能处理-p的多词参数。为此,我们需要使用getopts

格托普斯 发件人:

更易于使用,通常比getopt更好,当然在类似csh的shell中不可用。无论如何,你不应该用那些

这与getopt的工作方式大不相同。首先,因为它是内置的,所以通常找不到单独的手册页,尽管help getopts可能会为您提供所需的帮助

旧的getopt只调用一次,它修改了环境,正如我们上面看到的。每次处理参数时都会调用内置的getopts,它不会更改原始参数

使用getopts要简单得多。您的整个循环可以简化为:

while getopts c:m:p: flag
do 
    case "$flag" in 
        c) CURRDIR=$OPTARG;; 
        m) MYDIR=$OPTARG;; 
        p) ARGVAL=$OPTARG;; 
    esac 
done 
无需移位,每次只需读取$OPTARG即可获得每个选项的值。

getopt 您需要在p之后添加冒号,以指示-p接受参数。您还应该将$*更改为$@以更好地处理空间

args=`getopt c:m:p: "$@"` 
您还混淆了getopt和getopts$OPTARG是一种getopts功能。使用普通的getopt和set,您只需使用$2,然后转移参数

-p) ARGVAL=$2; shift 2;; 
在这一点上,您已经用getopt做了尽可能好的工作。不幸的是,不管你做什么,它都不能处理-p的多词参数。为此,我们需要使用getopts

格托普斯 发件人:

更易于使用,通常比getopt更好,当然在类似csh的shell中不可用。无论如何,你不应该用那些

这与getopt的工作方式大不相同。首先,因为它是内置的,所以通常找不到单独的手册页,尽管help getopts可能会为您提供所需的帮助

旧的getopt只调用一次,它修改了环境,正如我们上面看到的。每次处理参数时都会调用内置的getopts,它不会更改原始参数

使用getopts要简单得多。您的整个循环可以简化为:

while getopts c:m:p: flag
do 
    case "$flag" in 
        c) CURRDIR=$OPTARG;; 
        m) MYDIR=$OPTARG;; 
        p) ARGVAL=$OPTARG;; 
    esac 
done 
无需移位,每次只需读取$OPTARG即可获得每个选项的值。

尝试getopt-T时会看到什么;echo$??当您尝试getopt-T时,您看到了什么;echo$??