Linux Bash:检查是否给出了参数(例如,是否存在参数";-a";?)

Linux Bash:检查是否给出了参数(例如,是否存在参数";-a";?),linux,bash,Linux,Bash,我有一个脚本,它应该接受两个参数。(-s和-d)。如果没有给出-d参数,我想删除调试文件。与-s相同。如何检查$1或$2是-s还是-d 舒尔有两个论点,我可以做到“蛮力”: 但是,如果我有超过2个参数,它将变得复杂,那么检查任何参数是否为“-d”的正确方法是什么呢 编辑:我应该使用for循环吗? 编辑2:从$#向下到$1的While循环用于解析shell脚本中的命令行选项。下面是一个过于简化的参数解析,您可以理解: #!/bin/bash arg_s=0 arg_d=0 show_help(

我有一个脚本,它应该接受两个参数。(-s和-d)。如果没有给出-d参数,我想删除调试文件。与-s相同。如何检查$1或$2是-s还是-d

舒尔有两个论点,我可以做到“蛮力”:

但是,如果我有超过2个参数,它将变得复杂,那么检查任何参数是否为“-d”的正确方法是什么呢

编辑:我应该使用for循环吗?
编辑2:从$#向下到$1的While循环用于解析shell脚本中的命令行选项。

下面是一个过于简化的参数解析,您可以理解:

#!/bin/bash

arg_s=0
arg_d=0

show_help() { printf 'Help me\n'; }
show_version() { printf 'version -∞\n'; }
show_usage() { printf 'Usage: %s [-s|-d|-v|-h] [args...]\n' "${0##*/}"; }
invalid_option() { printf >&2 "you can't use option %s. You dumbo\n" "$1"; show_usage; exit 1; }

while (($#)); do
    [[ $1 = -- ]] && { shift; break; }
    [[ $1 = -?* ]] || break
    case $1 in
        (-s) arg_s=1 ;;
        (-d) arg_d=1 ;;
        (-h) show_help; exit 0 ;;
        (-v) show_version; exit 0 ;;
        (-*) invalid_option "$1" ;;
    esac
    shift
done

printf 'You passed the -s flag: %d\n' "$arg_s"
printf 'You passed the -d flag: %d\n' "$arg_d"
printf 'Remaining arguments:\n'
printf '   %s\n' "$@"
请注意,它需要一些额外的工作来处理标志,如
-ds
,这意味着
-d-s
1,需要一些额外的工作来让选项接受参数,需要一些额外的工作来处理长选项。所有这些都是可行的,没有任何重大问题



1您可以查看my,它有一个支持该功能的参数解析。

您可以实现如下基本循环:

for arg in "$@"; do
    if [ "$arg" = '-d' ]; then
        rm -f $debug
    fi
done

<>对于更复杂的解析,您应该考虑使用构造函数命令gopts

而不是<代码> <解析>参数,但<代码> > <代码>循环> @ GNIUFFGNIUURF,while循环从$$向下降到1美元。没有比这更优雅的版本了吗?不,一个
while
循环是目前为止最好的!而且它也很优雅!。在Bash中,最好使用内置的
getopts
@gniourf\u gniourf,但如果他说我不应该检查参数,我应该检查选项,那么他是对的。a
for
循环根本不适合参数解析。如果一个开关接受一个参数,你不能用一种简单的方法来处理它。
while
循环对于该任务来说要优越得多。这只允许在命令开始时使用标志。例如,如果你通过了
test-d blah
它会说
你通过了-d标志:0
@JID我不理解你的评论。如果你运行
/test-d blah
你会得到
你通过了-d标志:1
剩余参数:blah
。对不起,我的意思是如果你通过了三个参数,比如
/Script test-d blah
@JID,你是对的。但是处理这个案子也不是很难。我不想修改脚本,因为OP的需求似乎相当简单(有些工具确实表现出这种行为)。我在回答中提到过“过于简单化”这个词吗?它确实处理了POSIX提到的强制的
--
(尽管
:)
@JID,例如。,
for arg in "$@"; do
    if [ "$arg" = '-d' ]; then
        rm -f $debug
    fi
done