在bash中测试命令行参数

MK.*_*MK. 21 bash command-line

我正在测试我的脚本的第一个参数是否是 --foo

if [ $# > 1 ]
then
    if [[ "$1" = "--foo" ]]
    then
        echo "foo is set"
        foo = 1
    fi
fi

if [[ -n "$foo"]]
then
    #dosomething
fi
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我什么是bash的测试方式,如果--foo作为参数之一存在,不一定是第一个?

Pau*_*ce. 34

getopt如果要支持长选项,则应使用外部实用程序.如果您只需要支持短选项,最好使用Bash内置getopts.

这是一个使用的例子getopts(getopt并没有太大的不同):

options=':q:nd:h'
while getopts $options option
do
    case $option in
        q  )    queue=$OPTARG;;
        n  )    execute=$FALSE; ret=$DRYRUN;; # do dry run
        d  )    setdate=$OPTARG; echo "Not yet implemented.";;
        h  )    error $EXIT $DRYRUN;;
        \? )    if (( (err & ERROPTS) != ERROPTS ))
                then
                    error $NOEXIT $ERROPTS "Unknown option."
                fi;;
        *  )    error $NOEXIT $ERROARG "Missing option argument.";;
    esac
done

shift $(($OPTIND - 1))
Run Code Online (Sandbox Code Playgroud)

并非您的第一个测试将始终显示true结果,并将在当前目录中创建名为"1"的文件.你应该使用(按照优先顺序):

if (( $# > 1 ))
Run Code Online (Sandbox Code Playgroud)

要么

if [[ $# -gt 1 ]]
Run Code Online (Sandbox Code Playgroud)

要么

if [ $# -gt 1 ]
Run Code Online (Sandbox Code Playgroud)

此外,对于作业,您不能在等号周围留出空格:

foo=1
Run Code Online (Sandbox Code Playgroud)


Pet*_*ner 10

正如Dennis所说,getopt并且getopts是解析命令行参数的标准方法.换句话说,您可以使用$ @特殊变量,该变量扩展到所有命令行参数.因此,您可以在测试中使用通配符测试它:

#!/usr/bin/env bash

if [[ $@ == *foo* ]]
then
    echo "You found foo"
fi
Run Code Online (Sandbox Code Playgroud)

也就是说,如果你早点发现getopt,那么你会更好.

  • 没有必要加倍星号.这种技术可以用作快速测试,但它容易出现误报. (4认同)