Bash 参数替换

Bash parameter substitution

我正在尝试学习 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.

因为在第二个例子中,(错误的)你用错了引号。使用引号是为了指定必须将来自该变量的任何内容视为字符串,并且您在其中一个变量中添加了两个变量。每一个都必须分开,因为这样就像说它是一个变量,所以 sed 看到一个变量而不是两个。例如,假设:

v1=123
v2=456

正如您在第二个示例中看到的那样,sed 将看到:“123456”,尽管您希望 sed 看到的是两个变量,一个有 123,第二个有 456。这就是为什么你应该将它们放在单独的引号中! 我希望我的解释足够让你理解!!

P.S

你在第二个例子中实际做了什么,如果你想连接两个变量,你可以在某个时候使用它,并将它们作为字符串添加到另一个中:)

更新

所以让我们在这里举个例子......

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 变量之间没有 space...

第二个示例中的问题是双引号保护封闭的空格免受 Bash:

中的分词

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