【问题标题】:Bash parameter substitutionBash 参数替换
【发布时间】:2016-04-29 20:51:39
【问题描述】:

我正在尝试学习 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 '$v2'" &lt;&lt;&lt;"abc"
  • 我试过了,它给出了同样的错误信息。
  • @scolfax 你应该了解分词:mywiki.wooledge.org/WordSplitting
  • 分词、多种扩展、指挥变电站...很多好东西要学。感谢您的链接。

标签: bash parameters substitution


【解决方案1】:

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

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

【讨论】:

  • 这就解释了!非常感谢。
【解决方案2】:

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

v1=123
v2=456

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

附言

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

更新

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

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"

在变量之间没有空格的情况下...

【讨论】:

  • 我想我还没有掌握它。在第二个示例中,$v1 和 $v2 之间有一个空格。替换后不会导致字符串“-E s/./x/g”,因此与第一个示例等效吗?
  • @scolfax 让我给你举个简单的例子.....如果我给你一拳还是给你两拳,是一样的吗? :p 开个玩笑顺便说一句,我刚刚提出了一个有趣的观点 :)
  • @scolfax 我的意思是,如果您在 sed 上传递两个或一个变量,这不是一回事,让我们举个例子来更好地了解它......检查答案的更新。
  • 我想我知道我的想法哪里错了。关键是引号改变了空格字符的含义。不带引号时,空格字符被视为命令参数分隔符,但带引号时,空格字符被视为字符串中的字符。对吗?
  • @scolfax 你明白了!!!我从不喜欢给出现成的答案,例如迈克尔所做的那样,因为您实际上并没有那样学习,这样我就给了您深思熟虑,而您自己得到了它:)所以下次更容易为您排除故障:D
猜你喜欢
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多