在bash中将字符串拆分为(可选)块,并有条件地传递参数

时间:2017-12-20 01:26:11

标签: bash mongodb

我有一个字符串可能是:

  • user:pass@host //案例#1
  • user@host //案例#2
  • host //案例#3

(这是一个mongoDB连接字符串,如果你很好奇的话)

我最终需要:

案例#1:user:pass@host

  • $hostVar - > host
  • $userVar - > user
  • $passVar - > pass

然后运行:

mongodump --host $host -u $user -p $pass ...

案例#2:user@host

  • $hostVar - > host
  • $userVar - > user
  • $passVar - > (空)

然后运行:

mongodump --host $host -u $user ...

注意:不传递mongo的-p参数。

案例#3: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的连接字符串,而且我有一个设置变量,我在配置文件中显示的格式...

1 个答案:

答案 0 :(得分:1)

我愿意:

# $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[@]}"