我有一个字符串可能是:
user:pass@host
//案例#1user@host
//案例#2host
//案例#3(这是一个mongoDB连接字符串,如果你很好奇的话)
我需要最终得到:
user:pass@host
$hostVar
- > host
$userVar
- > user
$passVar
- > pass
然后运行:
mongodump --host $host -u $user -p $pass ...
user@host
$hostVar
- > host
$userVar
- > user
$passVar
- >(空)然后运行:
mongodump --host $host -u $user ...
注意:不传递mongo的-p
参数。
host
$hostVar
- > host
$userVar
- >(空)$hostVar
- >(空)然后运行:
mongodump --host $host ...
请注意,-u
和-p
未通过。
由于参数的可选性,我疯了。我的第一个解决方案是经典:
user=$(echo $DBHOST | cut -d : -f 1)
pass=$(echo $DBHOST | cut -d : -f 2 | cut -d @ -f 1)
host=$(echo $DBHOST | cut -d : -f 2 | cut -d @ -f 2)
但是,如果缺少位,则会完全崩溃。
我尝试了条件解析,基于:
的存在,但结果是......好吧,这里显示的尴尬。
第二个问题是:有没有办法“可能”将参数传递给没有条件的命令?像hostParam="--host $host"
然后通过$hostParam
之类的东西会起作用吗?
所有这一切都是因为mongodump
不支持mongo的连接字符串,我有一个设置变量,我在配置文件中显示的格式...
我会做:
# $conn holds the connection string
# this array will contain the parameters
params=()
if [[ $conn =~ ^(.+):(.+)@(.+)$ ]]; then
params=( -u "${BASH_REMATCH[1]}" -p "${BASH_REMATCH[2]}" --host "${BASH_REMATCH[3]}" )
elif [[ $conn =~ ^(.+)@(.+)$ ]]; then
params=( -u "${BASH_REMATCH[1]}" --host "${BASH_REMATCH[2]}" )
else
params=( --host "$conn" )
fi
# call the command
mongodump "${params[@]}"