bash脚本参数

bash脚本参数,bash,scripting,parameters,Bash,Scripting,Parameters,我需要编写一个bash脚本,并希望它解析格式为的无序参数: scriptname --param1 <string> --param2 <string> --param3 <date> scriptname--param1--param2--param3 有没有一个简单的方法来实现这一点,或者我几乎被1美元、2美元、3美元困住了?你想要的。Bash有一个getops函数,正如前面提到的,它可能会解决你的问题 如果您需要更复杂的东西,bash还支持位置参数(

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

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

有没有一个简单的方法来实现这一点,或者我几乎被1美元、2美元、3美元困住了?

你想要的。

Bash有一个getops函数,正如前面提到的,它可能会解决你的问题


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

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

当我执行此命令时:

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

getopts不支持长开关(从--)开始)。getopt是的,但是使用/readGood point非常可怕-如果必须使用长开关,getopts不是正确的工具。这个答案最好使用内容和/或示例,而不仅仅是链接。do_foo“$2”不应该是do_foo“$1”@xx77aBs是的,应该!
#!/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