【问题标题】:Bash variable from command with pipes, quotes, etc带有管道、引号等的命令中的 Bash 变量
【发布时间】:2013-03-06 19:22:23
【问题描述】:

我有一个用于获取 hostname.localdomain 的命令:

dig axfr @dc1.localdomain.com localdomain.com | grep -i Lawler | awk '{ getline ; $1=substr($1,1,length($1)-1); print $1 ; exit }'

这很好地返回了如下结果:

michael.lawler.localdomain.com

我想进一步将该结果用作 Bash 脚本中的变量。

我似乎无法通过第一个管道。

如果我VAR="dig axfr @dc1.localdomain.com localdomain.com | grep -i Lawler | awk '{ getline ; $1=substr($1,1,length($1)-1); print $1 ; exit }'"

...我拿回了整个区域传输。我还尝试了许多小的更改,在dig 命令之前添加$,不带引号,但似乎没有任何效果。我该如何解决这个问题?

【问题讨论】:

  • 如果您的目标是存储命令以多次运行,请参阅mywiki.wooledge.org/BashFAQ/050(“我正在尝试将命令放入变量中,但复杂的情况总是失败!”) .如果您的目标只是存储输出,var=$(command)
  • 仅供参考——您可以要求dig 提供更少的信息,以使输出更易于解析。参见例如+short 选项。
  • @CharlesDuffy awk '{ getline ; $1=substr($1,1,length($1)-1); print $1 ; exit }' 满足我的需要,+short 实际上不适用于我的情况,不知道为什么..可能是因为 OSX。不过感谢您的建议。
  • 两个答案都按预期工作。有什么想法更容易受到未来复杂性的影响?我愿意接受提供最大灵活性的那个。谢谢

标签: bash variables pipe


【解决方案1】:
VAR=$( dig axfr @dc1.localdomain.com localdomain.com |
     grep -i Lawler |
     awk '{ getline ; $1=substr($1,1,length($1)-1); print $1 ; exit }' )

【讨论】:

  • 使用$() 通常优于反引号,因为反引号不会嵌套。反引号更便于携带,但 $() 表示法已经成为标准大约 20 年了,大多数 shell 都接受它。
【解决方案2】:

使用反引号代替引号:

VAR=`dig axfr @dc1.localdomain.com localdomain.com | grep -i Lawler | awk '{ getline ; $1=substr($1,1,length($1)-1); print $1 ; exit }'`

Backtics 实际上的意思是“运行此处的任何内容并返回标准输出作为表达式的值”,但引号不会这样做。

【讨论】:

  • 两者都运行良好。我认为这种方式最容易记住并且适用于许多系统。正如 Pursell 所说,它不会嵌套,但我认为在这种情况下这不是问题。不过,您可以将 $() 嵌套在 backtics 中,因此它不像死胡同。也就是说,我不认为真的有明显的赢家。
猜你喜欢
  • 2022-11-04
  • 2018-03-20
  • 1970-01-01
  • 2021-10-23
  • 2019-04-19
  • 2016-01-22
  • 2023-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多