如果参数是文件名,bash getopts是否会被删除?

如果参数是文件名,bash getopts是否会被删除?,bash,getopts,Bash,Getopts,我正在使用getopts编写一个脚本,该命令可以有任意顺序的参数,既有有效的参数,如-a,也有文件名,如stuff.txt。问题是,当我运行这样的命令时: while getopts ":a:b:c:d" opt; do case "$opt" in a) # do something;; b) # do something;; /?) echo ERROR exit 1;; esac done program.sh-a-b stuff.txt

我正在使用getopts编写一个脚本,该命令可以有任意顺序的参数,既有有效的参数,如
-a
,也有文件名,如
stuff.txt
。问题是,当我运行这样的命令时:

while getopts ":a:b:c:d" opt; do

case "$opt" in

    a) # do something;;

    b) # do something;;

    /?) echo ERROR
        exit 1;;

esac
done
program.sh-a-b stuff.txt-c-d

我的代码处理参数
-a
-b
直到到达文件名为止,然后停止处理,之后不接触参数
-c
-d
。我的代码看起来有点像这样:

while getopts ":a:b:c:d" opt; do

case "$opt" in

    a) # do something;;

    b) # do something;;

    /?) echo ERROR
        exit 1;;

esac
done

我在
循环时处理
之外的文件,它们似乎注册得很好。

因为您指出每个选项都需要一个参数,因为
中的每个选项字母后面都有一个冒号“:a:b:c:d”
(第一个冒号会影响错误处理),脚本将
-b
视为
-a
的参数。当遇到文件名时,它会检测到选项处理应该停止

您应该为
-a
提供一个参数,或者从不需要参数的选项字母中删除冒号


在进行这些更正后,您的脚本将文件名视为
-b
的参数,并且在处理
-b
时,变量
$OPTARGS
将包含文件名。

因为您已经指出每个选项都需要一个参数,因为
中的每个选项字母后面都有冒号“:a:b:c:d”
(第一个冒号影响错误处理),脚本将
-b
视为
-a
的参数。当遇到文件名时,它检测到选项处理应停止

您应该为
-a
提供一个参数,或者从不需要参数的选项字母中删除冒号


在进行这些更正之后,您的脚本将看到文件名作为
-b
的参数,并且变量
$OPTARGS
将在处理
-b
时包含文件名。

对不起,我应该已经解决了这个问题。我需要做的是能够输入类似于:program.sh-a 2-b 4 stuff.txt-c 5-d和hav的内容e getopts()不要在我身上搞砸-c和-d,因为我还需要随时在其中插入一个文件名,与参数无关。也就是说,文件名不依赖于作为参数的选项。@user1419715:将不是选项参数的参数放在所有选项及其参数之后。您可以测试是否与此不符,并将其作为参数进行处理一个错误。如果您不能这样做,那么
getopts
不适合您的需要,您必须自己滚动。对不起,我应该已经修复了。我需要做的是能够输入类似以下内容:program.sh-a2-b4 stuff.txt-c5-d和have getopts()不要在我身上搞砸-c和-d,因为我还需要随时在其中插入一个文件名,与参数无关。也就是说,文件名不依赖于作为参数的选项。@user1419715:将不是选项参数的参数放在所有选项及其参数之后。您可以测试是否与此不符,并将其作为参数进行处理一个错误。如果你不能这样做,那么
getopts
就不适合你的需要,你必须自己动手。