Bash:检查是否给出了参数(例如是否存在参数“-a”?)

时间:2015-02-22 23:33:28

标签: linux bash

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

Shure有两个论点,我可以做那个“蛮力”:

if test $1 != "-d" && test $2 != -d then
rm $debug
fi

但如果我有2个以上就会变得复杂,那么检查任何参数是否为“-d”的正确方法是什么?

编辑:我应该用for循环吗? 编辑2:从$#向下到$ 1的while循环

3 个答案:

答案 0 :(得分:2)

这里有一个过于简化的参数解析你,所以你明白了:

#!/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 你可以查看我的mock which,它有一个支持该参数解析的参数。

答案 1 :(得分:1)

使用getopt(1)解析shell脚本中的命令行选项。

答案 2 :(得分:0)

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

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

对于更复杂的解析,您应该考虑使用builtin-command getopts