如何让bash参数替换正常工作?

时间:2013-07-10 09:27:06

标签: regex bash substitution

我有一个像

这样的bash变量
var=root@283.45.67.89:/root/test

并希望访问不同的部分(用户,主机,路径,用户是可选的)。我试过了:

path=${var#*:*}
user=${var%*@*}
host=${{var#*@*}%*:*}

虽然PATHuser的表达式按预期工作(即USER有字符串rootpath有字符串/root/test),获取host(即@符号和:符号之间的部分)的表达式会产生bad substitution错误。是否有一种简单/优雅的方法可以在一行中修复此表达式,以便提取原始变量的“中间”部分?

附加信息:当没有给出用户时,它也必须工作,即在没有用户的情况下(没有'@'符号),变量user必须为空,但其他变量必须相应填写:

var=283.45.67.89:/root/test

我希望得到以下结果

path=/root/test
host=283.45.67.89
user=

2 个答案:

答案 0 :(得分:3)

使用小写变量名称。 $ PATH和$ USER很特别。

要解析字符串,可以使用正则表达式:

[[ $var =~ (.*)@(.*):(.*) ]]
user=${BASH_REMATCH[1]} 
host=${BASH_REMATCH[2]} 
path=${BASH_REMATCH[3]} 

<强>更新 对于可能缺少的用户,您可以将其更改为

[[ @$var =~ (.*)@(.*):(.*) ]]
user=${BASH_REMATCH[1]#@}

答案 1 :(得分:0)

临时变量(tmp)可能会修复错误替换错误的问题,无论是否有用户都可以这样做:

path=${var#*:}      # Get path
tmp=${var%:*}       # Get all before ":"
host=${tmp#*@}      # Get host by removing any user and "@"
tmp=${tmp%${host}}  # Get any user and "@" by prevoving host
user=${tmp%@}       # Remove any "@" from user