如果存在参数,则进行Bash测试

如果存在参数,则进行Bash测试,bash,testing,command-line-arguments,Bash,Testing,Command Line Arguments,我想测试是否向我的bash脚本中传递了一个增强(例如-h) 在Ruby脚本中: #!/usr/bin/env ruby puts "Has -h" if ARGV.include? "-h" if [[ " $@ " =~ " -h " ]]; then echo "Has -h" fi 如何在Bash中最好地做到这一点?它有点复杂。最快的方法也不可靠: case "$*" in (*-h*) echo "Has -h";; esac 不幸的是,这也会将“命令this here”视为

我想测试是否向我的bash脚本中传递了一个增强(例如-h)

在Ruby脚本中:

#!/usr/bin/env ruby
puts "Has -h" if ARGV.include? "-h"
if [[ " $@ " =~ " -h " ]]; then
   echo "Has -h"
fi

如何在Bash中最好地做到这一点?

它有点复杂。最快的方法也不可靠:

case "$*" in
(*-h*) echo "Has -h";;
esac
不幸的是,这也会将“
命令this here
”视为具有“
-h

通常,您会使用
getopts
来解析所需的参数:

while getopts habcf: opt
do
    case "$opt" in
    (h) echo "Has -h";;
    ([abc])
        echo "Got -$opt";;
    (f) echo "File: $OPTARG";;
    esac
done

shift (($OPTIND - 1))
# General (non-option) arguments are now in "$@"
等等

正如乔纳森·莱夫勒指出的那样
OPTIND=0将重置getopts列表。这是为了防止测试需要多次进行。

我在这里的一个重复问题中找到了答案:

有关用法示例,请参见下面的my function mt():

      # mkdir -p path to touch file
      mt() {
        if [[ -z $1 ]]; then
          echo "usage: mt filepath"
        else
          mkdir -p `dirname $1`
          touch $1
        fi
      }

最简单的解决办法是:

#!/usr/bin/env ruby
puts "Has -h" if ARGV.include? "-h"
if [[ " $@ " =~ " -h " ]]; then
   echo "Has -h"
fi

我试图以一种直截了当但正确的方式解决这个问题,我只是在分享对我有用的东西

下面的专用函数解决了这个问题,您可以这样使用:

if[“$(has_arg“-h”“$@”)”=true];然后
#TODO:在参数中使用“-h”时编码
其他的
#TODO:如果参数中没有“-h”则编码
fi
此函数检查第一个参数是否在所有其他参数中:

函数具有_arg(){
ARG=“$1”
转移
而[[“$#”-gt 0]];则
如果[“$ARG”=“$1”];则
回音正确
返回
其他的
转移
fi
完成
回音错误
}

该选项未被删除。重新划分参数列表的诀窍是在
getopts
循环之间重置
OPTIND=0
。已证实的答案已更正。感谢Jonathan Leffler为我提供的所有提示。请注意,对于我来说,这会多次输出“has-h”,尽管
-h
只被指定一次作为参数…可能是@Thomas的副本--检查是否存在任何参数--我认为这个问题询问是否存在一个特定参数此检查是否至少存在一个参数,但问题似乎是关于特定参数的存在,这会报告嵌入子字符串“%h”的字符串参数的误报(例如,
my_命令“oh goods-h game over”
)。唯一的通用解决方案是迭代
getopts
结果,如下所述<代码>正确!今天我也会支持getopts。简单的解决方案更像是一个不可靠的黑客。。。