Bash测试是否存在参数

时间:2011-06-02 22:52:12

标签: bash testing command-line-arguments

我想测试是否将扩充(例如-h)传递到我的bash脚本中。

在Ruby脚本中:

#!/usr/bin/env ruby
puts "Has -h" if ARGV.include? "-h"

如何在Bash中做到最好?

5 个答案:

答案 0 :(得分:3)

这是非常复杂的。最快捷的方式也是不可靠的:

case "$*" in
(*-h*) echo "Has -h";;
esac

不幸的是,这也会将“command 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 "$@"

答案 1 :(得分:1)

#!/bin/bash
while getopts h x; do
  echo "has -h";
done; OPTIND=0

正如Jonathan Leffler所指出的那样 OPTIND = 0将重置getopts列表。如果测试需要不止一次进行,那就是这样。

答案 2 :(得分:1)

我在这里的问题中找到了答案:https://serverfault.com/questions/7503/how-to-determine-if-a-bash-variable-is-empty

请参阅下面的函数mt()以获取示例用法:

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

答案 3 :(得分:0)

最简单的解决方案是:

if [[ " $@ " =~ " -h " ]]; then
   echo "Has -h"
fi

答案 4 :(得分:0)

我正在尝试以一种简单而正确的方式解决这个问题,并且只是分享对我有用的方法。

下面的专用函数解决了它,你可以像这样使用:

if [ "$(has_arg "-h" "$@")" = true ]; then
    # TODO: code if "-h" in arguments
else
    # TODO: code if "-h" not in arguments
fi

此函数检查第一个参数是否在所有其他参数中:

function has_arg() {
    ARG="$1"
    shift
    while [[ "$#" -gt 0 ]]; do
        if [ "$ARG" = "$1" ]; then
            echo true
            return
        else
            shift
        fi
    done
    echo false
}