Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
Bash 同时使用getopts和${1}_Bash_Getopts - Fatal编程技术网

Bash 同时使用getopts和${1}

Bash 同时使用getopts和${1},bash,getopts,Bash,Getopts,我正在尝试编写一个脚本,它可以同时使用${1}和getopts选项。我希望它能够使用使用行: ./test_script test -a 要打印: test -a was triggered! 我试过了 echo ${1}; while getopts "c:a" opt; do case $opt in a) echo "-a was triggered!" >&2 ;; \?) echo "Invalid o

我正在尝试编写一个脚本,它可以同时使用${1}和getopts选项。我希望它能够使用使用行:

./test_script test -a
要打印:

test
-a was triggered!
我试过了

echo ${1};

while getopts "c:a" opt; do
      case $opt in
    a)
      echo "-a was triggered!" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      ;;
    esac
done
它不能让我同时访问${1}并检测到-a选项被同时使用。有没有办法同时使用这两种方法?我希望避免将测试字符串转换为另一个getopts选项。

您可以在getopts退出时使用shift。 例如:

while [ $# -gt 0 ] ; do
    while getopts "c:a" opt ; do
        case $opt in
            # YOUR OPTIONS
        esac
    done

    OTHER_VALUE=$1
    shift
done
PS:通常我不使用getopts,但我更喜欢自己解析args,如下所示:

while [ $# -gt 0 ] ; do
    case "$1" in
        '-a' | '--along' ) 
            echo '-a was triggered' ;;
        '-b' | '--blong' ) 
            echo '-b was trigger with arg ' $2 ; 
            shift ;; # One extra shift for the argumnent $2
        * ) 
            echo 'Unknown value (maybe test)' ;;
    esac
    shift
done

我不明白你在问什么。您可以访问
$1
,并且可以检测到
-a
已传递给脚本。那你到底不能做什么呢?我两个都不能。对于上面的脚本,如果我这样做。/test\u script test-a,输出就是“test”。。。如果我这样做。/test\u script-a测试输出为“-a\n-a已触发!”。。。我希望输出“test\n-a已触发!”您的问题似乎是
getopts
在第一个非选项之后停止。意思是
/test\u script-a test
可以正常工作,但是
/test\u script test-a
不能。。。
getopts
手册页上说:
以下任何一项都应标识选项的结尾:特殊选项“-”,查找不以“-”开头的参数,或遇到错误。
注意@twalberg描述的行为是标准的(只要有标准)shell命令语法:选项位于常规参数之前。有些命令允许选项跟随常规参数,但这是不标准的。