我正在尝试使用类似于以下内容的命名参数将一些值传递给我的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可以提供更强大的解析:
另请参阅:使用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] 删除。
我来说两句