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

问题描述 投票:0回答:1

我有一个字符串可能是:

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

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

我需要最终得到:

Case #1: user:pass@host

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

然后运行:

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

Case #2: user@host

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

然后运行:

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

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

Case #3: host

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

然后运行:

mongodump --host $host ...

请注意,-u-p未通过。

So...

由于参数的可选性,我疯了。我的第一个解决方案是经典:

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

bash mongodb
1个回答
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[@]}"
© www.soinside.com 2019 - 2024. All rights reserved.