bash脚本参数[重复]

Posted

技术标签:

【中文标题】bash脚本参数[重复]【英文标题】:bash script parameters [duplicate] 【发布时间】:2010-10-24 02:12:11 【问题描述】:

我需要编写一个bash脚本,并希望它能够解析无序参数的格式:

scriptname --param1 <string> --param2 <string> --param3 <date>

有没有一种简单的方法可以做到这一点,还是我几乎坚持使用 1 美元、2 美元、3 美元?

【问题讨论】:

【参考方案1】:

你想要getopts。

【讨论】:

getopts 不支持长开关(以 -- 开头)。 getopt 可以,但是使用/读取非常可怕 好点 - 如果长开关是必须具备的,getopts 不是正确的工具。 这个答案会更好的内容和/或示例,而不仅仅是一个链接。【参考方案2】:
while [[ $1 = -* ]]; do
    arg=$1; shift           # shift the found arg away.

    case $arg in
        --foo)
            do_foo "$1"
            shift           # foo takes an arg, needs an extra shift
            ;;
        --bar)
            do_bar          # bar takes no arg, doesn't need an extra shift
            ;;
    esac
done

【讨论】:

不应该 do_foo "$2" 是 do_foo "$1" 吗? @xx77aBs 是的,应该!【参考方案3】:

mcurl 是一个很好的例子,说明如何并排实现短开关和长开关:

http://www.goforlinux.de/scripts/mcurl/

【讨论】:

【参考方案4】:

如前所述,Bash 有一个 getops 函数,它可能会解决您的问题。

如果您需要更复杂的东西,bash 还支持位置参数(顺序为 $1 ... $9,然后 $10 .... $n),您必须提出自己的逻辑来处理这个输入。一种简单的方法是在 for 循环中放置一个 switch/case,迭代参数。您可以使用处理输入的两个特殊 bash 变量之一:$* or $@。

【讨论】:

【参考方案5】:
#!/bin/bash

# Parse the command-line arguments
while [ "$#" -gt "0" ]; do
  case "$1" in
    -p1|--param1)
      PARAM1="$2"
      shift 2
    ;;
    -p2|--param2)
      PARAM2="$2"
      shift 2
    ;;
    -p3|--param3)
      PARAM3="$2"
      shift 2
    ;;
    -*|--*)
      # Unknown option found
      echo "Unknown option $1."

      exit 1
    ;;  
    *)
      CMD="$1"
      break
    ;;
  esac
done 


echo "param1: $PARAM1, param2: $PARAM2, param3: $PARAM3, cmd: $CMD"

当我执行这个时:

./<my-script> --param2 my-param-2 --param1 myparam1 --param3 param-3 my-command

它输出你所期望的:

param1: myparam1, param2: my-param-2, param3: param-3, cmd: my-command

【讨论】:

以上是关于bash脚本参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

考虑到它的参数,如何检测bash脚本是不是已经在运行[重复]

Bash脚本不处理传递的输入参数[重复]

带有带参数的函数的Bash脚本[重复]

如何在bash脚本中通过函数调用将参数/参数从一个函数传递到另一个函数[重复]

用于提取目录中所有 .tgz 的 Bash 脚本[重复]

从 bash 或 perl 脚本中读取 CSV [重复]