Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中将字符串拆分为(可选)块,并有条件地传递参数_Bash_Mongodb - Fatal编程技术网

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

在bash中将字符串拆分为(可选)块,并有条件地传递参数,bash,mongodb,Bash,Mongodb,我有一个字符串可能是: 用户:pass@host//案例1 user@host//案例2 host//案例3 (如果您好奇,这是一个mongoDB连接字符串) 我需要以以下方式结束: 案例#1:用户:pass@host $hostVar->host $userVar->user $passVar->pass 然后运行: mongodump --host $host -u $user -p $pass ... mongodump --host $host -u $user ... mo

我有一个字符串可能是:

  • 用户:pass@host
    //案例1
  • user@host
    //案例2
  • host
    //案例3
(如果您好奇,这是一个mongoDB连接字符串)

我需要以以下方式结束:

案例#1:
用户:pass@host
  • $hostVar
    ->
    host
  • $userVar
    ->
    user
  • $passVar
    ->
    pass
然后运行:

mongodump --host $host -u $user -p $pass ...
mongodump --host $host -u $user ...
mongodump --host $host ...
案例2:
user@host
  • $hostVar
    ->
    host
  • $userVar
    ->
    user
  • $passVar
    ->(空)
然后运行:

mongodump --host $host -u $user -p $pass ...
mongodump --host $host -u $user ...
mongodump --host $host ...
注意:
-p
参数未传递给mongo

案例三:
host
  • $hostVar
    ->
    host
  • $userVar
    ->(空)
  • $hostVar
    ->(空)
然后运行:

mongodump --host $host -u $user -p $pass ...
mongodump --host $host -u $user ...
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[@]}"

从我的时代起,耶酥·巴什就进化了。。。你能告诉我那个
参数[@]
是什么吗。。。?重赛是一场神奇的比赛,我喜欢!我知道上面写着“不只是谢谢你”,但是。。。真的,非常感谢。惊人的、简洁的、切中要害的、华丽的编码。
“${params[@]}”
将数组的元素
params
引用为引用参数列表(类似于
“$@”
是位置参数,任何引用等都是完整的)。它的答案详细说明了
“$@”
“$*”
$@
$*
之间的区别,并且在访问数组元素
“${params[@]}”时可以得出相同的结论
“${params[*]}”相比
${params[@]}
相比
${params[*]}