Bash参数替换

Bash参数替换,bash,parameters,substitution,Bash,Parameters,Substitution,我试图学习bash参数替换,有一个非常基本的问题: 为什么这样做有效: #!/bin/sh v1="-E" v2="s/./x/g" sed "$v1" "$v2" <<<"abc" # result = "xxx" #/垃圾箱/垃圾箱 v1=“-E” v2=“s//x/g” sed“$v1”“$v2”,因为在第二个示例中,(错误的一个)您使用了错误的引号。引号用于指定从该变量中产生的内容必须被视为字符串,您在其中一个变量中添加了两个变量。每一个变量都必须分开,因为这样说就像

我试图学习bash参数替换,有一个非常基本的问题:

为什么这样做有效:

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

sed“$v1”“$v2”,因为在第二个示例中,(错误的一个)您使用了错误的引号。引号用于指定从该变量中产生的内容必须被视为字符串,您在其中一个变量中添加了两个变量。每一个变量都必须分开,因为这样说就像说它是一个变量,所以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
案例1的输出为123456,案例2的输出为123456。。。。。你现在明白了吗? 用这两种方法打印相同内容的唯一方法是

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

让case2在变量之间没有空格…

第二个示例中的问题是,双引号保护封闭的空格不受Bash中的单词拆分的影响:


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

您应该像这样引用正则表达式
sed“$v1'$v2”我试过了,但它给出了相同的错误信息。@scolfax你应该学习单词分割:单词分割,多种类型的扩展,命令子站…很多好东西需要学习。谢谢你的链接。我想我还没领会。在第二个示例中,在$v1和$v2之间有一个空格。这难道不会导致替换后的字符串“-E s//x/g”,从而与第一个示例等效吗?@scolfax让我给你一个简单的示例。。。。。我在你脸上打一拳还是打两拳都一样p只是开玩笑,顺便说一句,我只是提出了一个有趣的观点:)@scolfax我的观点是,如果你在sed上传递两个或一个变量,那就不同了,让我们举个例子来更好地了解它。。。。查看答案的更新。我想我知道我的想法错在哪里了。关键是引号改变了空格字符的含义。不带引号时,空格字符被视为命令参数分隔符,但带引号时,空格字符被视为字符串中的字符。对吗?@scolfax你明白了!!!我从来不喜欢给出现成的答案,就像迈克尔那样,因为你实际上不是这样学习的,这样我给了你思考的食物,你自己得到了:)所以下次对你来说更容易的故障排除:这就解释了!非常感谢你。
v1=123
v2=456
CASE1="$v1" "$v2"
CASE2="$v1$v2"