【问题标题】:Bash script double quote escapingBash脚本双引号转义
【发布时间】:2020-08-25 08:52:16
【问题描述】:

我正在尝试使用变量作为参数在 bash 脚本中运行命令,但我未能正确转义引号。 这就是我所拥有的:

vsnames=$(comm -13 --nocheck-order $cur_ha_stat_report $old_ha_stat_report | awk -F\| '{print $1}' | tr '\r\n' ' ')
create event type=0xfff00033 text="$vsnames" mh=$dev_mh &

其中 vsnames 是一个由空格分隔的单词的字符串。 当我运行脚本时,这就是我得到的:

+ vsnames='VS1 VS2 '
+ create event type=0xfff00033 'text=VS1 VS2 ' mh=xxx

如何将 $vsnames 变量放在引号之间? 我尝试过使用\",但它没有用,bash 只是添加了一堆不需要的单引号。 有小费吗? 我真正需要的命令是: create event type=0xfff00033 text="VS1 VS2 " mh=xxx

【问题讨论】:

  • 在 bash 扩展您的扩展后,单引号由 bash 自动添加,以便它们符合您的意图。通常你不需要担心它们。执行后是否有意外结果?
  • 是的,因为如果缺少双引号,则只有第一个 - 示例中的“VS1” - 将被定义为“文本”参数。
  • @mafagafo :我不清楚你的问题。您希望 create 参数为 text="VS1 " "VS2 " 吗?请准确指定命令create 应该看到的参数。
  • @user1934428,我希望那个参数是text="VS1 VS2 " 完整的命令应该是:create event type=0xfff00033 text="VS1 VS2 " mh=xxx
  • 将此放入您的问题中,而不是在评论中。

标签: bash escaping


【解决方案1】:

将变量 vsnames 设置为 8 个字符的字符串 VS1 VS2 (从跟踪中可以看出),执行一个

create event type=0xfff00033 text=\""$vsnames"\" mh=xxx

create 命令的 argv[2] 设置为

text="VS1 VS2 "

解释:我用单引号将$vsnames 括起来,告诉bash 我们不想在这里进行分词。然后我将它包裹在文字 \" 引号之间,因为您希望 create 看到这些引号。

【讨论】:

  • 谢谢,这行得通,但整个参数被封装在单引号中:create event type=0xfff00033 'text="VS1 VS2 "' mh= 这还不错,但属性text 被定义为"VS1 VS2 " 而不是VS1 VS2 .有什么办法可以解决吗?
  • 您确定 create 想要查看此参数周围的单引号吗?如果你真的想要,这会很奇怪,但微不足道。只需将其包裹在 \' 之间即可。
  • 不,它不需要单引号,属性定义只有双引号(文本)
  • @mafagoto :嗯,这正是我在回答中指定的。实际上,有了这些信息,您现在可以明确地将引号放在您想要的任何位置。每当您从脚本中调用程序时,想象这是一个 C 程序,并想一想该程序的 argc 向量中究竟应该存储什么。有了这张图,通常很容易把参数写正确。
  • 所以如果我想删除双引号,我应该使用:text=\"$vsnames\"?
猜你喜欢
  • 1970-01-01
  • 2019-08-10
  • 2020-06-25
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
相关资源
最近更新 更多