1

我有一个 bash 变量,例如

var=root@283.45.67.89:/root/test

并且想要访问不同的部分(用户、主机、路径,其中用户是可选的)。我试过了:

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

虽然PATHand的表达式user按预期工作(即USER有 stringrootpath有 string /root/test),但用于获取的表达式host(即@符号和:符号之间的部分)给出了bad substitution错误。是否有一种简单/优雅的方法可以在一行中修复此表达式,以便提取原始变量的“中间”部分?

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

var=283.45.67.89:/root/test

我期待以下结果

path=/root/test
host=283.45.67.89
user=
4

2 回答 2

3

使用小写的变量名。$PATH 和 $USER 是特殊的。

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

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

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

[[ @$var =~ (.*)@(.*):(.*) ]]
user=${BASH_REMATCH[1]#@}
于 2013-07-10T09:32:18.200 回答
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
于 2013-07-10T10:09:55.820 回答