Bash:如何拆分字符串并分配多个变量

时间:2015-10-24 16:35:16

标签: bash

我必须拆分一个URL字符串并将变量分配给少数分裂。这是字符串

http://web.com/sub1/sub2/sub3/sub4/sub5/sub6

我想从bash中分配如下变量

var1=sub2
var2=sub4
var3=sub5

如何在bash中执行此操作?

3 个答案:

答案 0 :(得分:6)

x="http://web.com/sub1/sub2/sub3/sub4/sub5/sub6"
IFS="/" read -r foo foo foo foo var1 foo var2 var3 foo <<< "$x"
echo "$var1 $var2 $var3"

输出:

sub2 sub4 sub5

或者使用数组:

x="http://web.com/sub1/sub2/sub3/sub4/sub5/sub6"
IFS="/" read -r -a var <<< "$x"
echo "${var[4]}"
declare -p var

输出:

sub2
declare -a var='([0]="http:" [1]="" [2]="web.com" [3]="sub1" [4]="sub2" [5]="sub3" [6]="sub4" [7]="sub5" [8]="sub6")'

来自man bash

  

IFS:内部字段分隔符,用于扩展后的单词拆分,并使用read builtin命令将行拆分为单词。

答案 1 :(得分:3)

这应该有效:

IFS=/ read -r proto host dummy var1 dummy var2 var3 dummy <<< "$url"

read -ra读入数组。 read -r使反斜杠变得非特殊。

这在bash中不起作用:

echo "$url" | read ...

因为read会在子shell中运行so the variables wouldn't be set in the parent shell

答案 2 :(得分:0)

我认为更好的解决方案是将拆分结果分配到数组中。例如:

IFS='/' read -a array <<< "http://web.com/sub1/sub2/sub3/sub4/sub5/sub6"

不幸的是,这会产生3&#39;无关的&#39;元素,你将不得不照顾!

echo ${array[*]}
http: web.com sub1 sub2 sub3 sub4 sub5 sub6

编辑:在这里$ {array [1]}是一个空元素!