2016-04-29 82 views
1

我努力学习的bash参数替换,有一个很基本的问题:猛砸参数替换

为什么这个工作:

#!/bin/sh 
v1="-E" 
v2="s/./x/g" 
sed "$v1" "$v2" <<<"abc" # result = "xxx" 

但这不起作用:

#!/bin/sh 
v1="-E" 
v2="s/./x/g" 
sed "$v1 $v2" <<<"abc" # result = "sed: illegal option..." 

我正在使用Mac OS X bash。

+0

你应该像这个'sed'引用正则表达式$ v1'$ v2'“<<<”abc“ – taras

+0

我试过了,它给出了同样的错误信息。 – scolfax

+1

@scolfax您应该了解wordsplitting:http://mywiki.wooledge.org/WordSplitting – andlrc

回答

0

因为在第二个例子中,(错误的)您使用的引号错误。引号被用来指定什么东西出来的变量必须被视为一个字符串,并且你在其中添加了两个变量。每个人都必须分开,因为像这样说它的一个变量,所以sed看到一个变量不是两个变量。因此,例如,让说:

v1=123 
v2=456 

因为你拥有了它的第二个例子,sed中会看到这一点:“123456”,尽管你希望SED看到的是两个变量,一个有123和第二一个拥有456.这就是为什么你应该让他们分开的引号! 我希望我解释它足够好让你理解!

PS

你实际上是在第二个例子中所做的,你可以在某些时候,如果你想concutenate两个变量使用它,而在另一个添加它们作为字符串:)

UPDATE

所以让我们这里有一个例子.....

v1=123 
v2=456 
CASE1="$v1" "$v2" 
CASE2="$v1 $v2" 
echo CASE1 
echo CASE2 

对于CASE1,输出将是123456,对于CASE2,输出将是123 456 .....现在你有什么区别了吗? 只有这样,才能做到这一点的两种方式,并打印出同样的事情会是这样.....

v1=123 
v2=456 
CASE1="$v1" "$v2" 
CASE2="$v1$v2" 

具有情形2没有变量之间的空间......

+0

我不认为我已经掌握了它。在第二个示例中,$ v1和$ v2之间有一个空格。这不会导致替换后的字符串“-E s /./ x/g”,从而等于第一个例子吗? – scolfax

+0

@scolfax让我给你一个简单的例子.....如果我给你一个脸上的一拳,或者如果我给你两个,它是一样的吗?:p只是开玩笑,顺便说一句,我只是提出了一个有趣的观点:) – hedgehog

+0

@scolfax我的观点是,如果你在sed上传递两个变量或一个变量是不一样的,我们举一个例子来看看它是否更好。检查答案的更新。 – hedgehog

1

的问题你的第二个例子是双引号保护封闭式从分词空格中击:

,而不是两个参数-Es/./x/g,只有一个单一的参数-E s/./x/g(包含空格)将被传递到相应的exec()系统调用,最后到sed在这种情况下。

+0

解释它!非常感谢你。 – scolfax

+0

不客气。 –