具有命名参数包含等号的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语句的问题所在。

谢谢布拉德

破折号

要解析同时包含长和短视域的命令行选项,请考虑使用getopt支持长选项的GNU 虽然可以构建自己的解析器替换,但使用getopt可以提供更强大的解析:

  • 选项的缩写(例如,将--user用作--username)。
  • 检查所需/可选值
  • 错误处理

另请参阅:使用getopts处理长和短命令行选项

set $(getopt --long 'username:,password:,ou:,domain:' -o 'u:p:' -- "$0" "$@")
while [ "$#" -gt 0 ] ; do
    OP=$1
    shift
    case "$OP" in
        --) PROG=$1 ; shift ; break ;;
        -u | --username) username=$1 ; shift ;;
        -p | --password) password=$1 ; shift ;;
        --ou | --domain) domainou=$1 ; shift ;;
    esac
done
# Positional arguments are set ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章