关于脚本:bash脚本参数

bash script parameters

本问题已经有最佳答案,请猛点这里访问。

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

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

有没有一个简单的方法可以做到这一点,或者我是被1美元,2美元,3美元卡住了?


你要的是getopts。


1
2
3
4
5
6
7
8
9
10
11
12
13
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


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

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


正如前面提到的,bash有一个getops函数,可以解决您的问题。

如果您需要更复杂的东西,bash还支持位置参数(订购$1…9美元,然后10美元。$n),您必须想出自己的逻辑来处理这个输入。一个简单的方法是在for循环中放置一个开关/案例,迭代参数。您可以使用处理输入的两个特殊bash变量之一:$*或$@。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/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"

当我执行此操作时:

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

它输出您所期望的:

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