我有一个像
这样的bash变量var=root@283.45.67.89:/root/test
并希望访问不同的部分(用户,主机,路径,用户是可选的)。我试过了:
path=${var#*:*}
user=${var%*@*}
host=${{var#*@*}%*:*}
虽然PATH
和user
的表达式按预期工作(即USER
有字符串root
而path
有字符串/root/test
),获取host
(即@
符号和:
符号之间的部分)的表达式会产生bad substitution
错误。是否有一种简单/优雅的方法可以在一行中修复此表达式,以便提取原始变量的“中间”部分?
附加信息:当没有给出用户时,它也必须工作,即在没有用户的情况下(没有'@'符号),变量user
必须为空,但其他变量必须相应填写:
var=283.45.67.89:/root/test
我希望得到以下结果
path=/root/test
host=283.45.67.89
user=
答案 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