在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
//案例1用户:pass@host
//案例2user@host
//案例3host
用户: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[*]}