首页 > 解决方案 > 具有包含等号的命名参数的 Bash 脚本

问题描述

我正在尝试使用类似于以下的命名参数将一些值传递给我的 bash 脚本:

./script.sh --username='myusername' --password='superS3cret!' --domainou="OU=Groups with Space,OU=subou,DC=mydomain,DC=local"

我有以下代码:

#!/bin/bash

while [ "$1" != "" ]; do
    PARAM=`echo $1 | awk -vFPAT='([^=]*)|("[^"]+")' -vOFS="=" '{print $1}'`
    VALUE=`echo $1 | awk -vFPAT='([^=]*)|("[^"]+")' -vOFS="=" '{print $2}'`
    case $PARAM in
        -u | --username)
            username=$VALUE
            ;;
        -p | --password)
            password=$VALUE
            ;;
        -ou | --domainou)
            domainou=$VALUE
            ;;
        *)
            echo "ERROR: unknown parameter \"$PARAM\""
            exit 1
            ;;
    esac
    shift
done

echo $username
echo "$password"
echo "$domainou"

当我运行我的脚本时,我得到的是:

myusername
superS3cret!
OU

现在前两行是正确的,但显然我不想要 OU... 我想要:

OU=Groups with Space,OU=subou,DC=mydomain,DC=local

awk 似乎与引号内的 = 匹配。尽我所能告诉解决方法是使用

-vFPAT='([^=]*)|("[^"]+")' -vOFS="=" 

但显然这不起作用,所以我只是想知道是否有任何 awk 专家可以帮助我理解我的 awk 语句有什么问题。

谢谢布拉德

标签: bashshellawk

解决方案


你可以这样做:

#!/bin/bash

while [ $# -gt 0 ]; do
  case "$1" in
    -u=* | --username=*)
      username="${1#*=}"
      ;;
    -p=* | --password=*)
      password="${1#*=}"
      ;;
    -ou=* | --domainou=*)
      domainou="${1#*=}"
      ;;
    *)
      printf "Error: unknown option: $1\n"
      exit 1
  esac
  shift
done

printf "username: $username\n"
printf "password: $password\n"
printf "domainou: $domainou\n"


推荐阅读