bash - 具有包含等号的命名参数的 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 语句有什么问题。
谢谢布拉德
解决方案
你可以这样做:
#!/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"
推荐阅读
- html - 忽略内联样式 HTML CSS
- cakephp - 当我想用身份验证插件分离模型时该怎么办?
- algorithm - LZ77 压缩速度慢
- javascript - 避免在引用前一个状态时在 setState 中使用回调
- spring-boot - 如何检查对象是否为空
- regex - RegEx: Ignoring only characters that meet both lookahead and lookbehind
- xquery - 将变量传递给 xdmp:eval Marklogic Xquery
- python - pyqt5 QPushButtone 平面时的悬停样式=True
- javascript - 如何将道具存储到单个状态对象中
- node.js - 在 Nodejs 中为来宾和用户使用相同的 API 端点