【问题标题】:pass arguments to a command in bash将参数传递给 bash 中的命令
【发布时间】:2021-11-25 13:19:53
【问题描述】:

我正在尝试将arg 传递给clang-format

arg="-style=\"{BreakBeforeBraces: Attach}\""
clang-format -i $arg 'myfile.h'

但出现以下错误:

No such file or directory
Invalid value for -style

但是,如果我只是简单地运行如下命令:

clang-format -i -style="{BreakBeforeBraces: Attach}" 'myfile.h'

效果很好。

【问题讨论】:

  • 为此使用 shell 数组或函数
  • @anubhava 谢谢。你能详细说明一下为什么以及如何使用 shell 数组/函数来解决这个问题吗?

标签: bash clang-format


【解决方案1】:

Shell 会在你直接运行命令时去掉双引号,所以不需要在变量值中引用它们。

但是,您需要对变量进行双引号,以使其内容保持在一个单词中:

arg='-style={BreakBeforeBraces: Attach}'
clang-format -i "$arg" myfile.h

如果参数个数不固定(包括可能的0),使用数组:

args=('-style={BreakBeforeBraces: Attach}')
clang-format -i "${args[@]}" myfile.h

【讨论】:

  • 好像 arg 是一个空字符串(如果我不需要额外的样式,例如 arg="",那么这样使用它会给我一个错误“没有这样的文件或目录"。
  • 如果参数个数不固定,使用数组。
  • 太棒了!谢谢!
【解决方案2】:

您可以像这样简单地创建一个函数:

cfmt() {
   clang-format -i "$@"
}

然后将其用作:

cfmt -style="{BreakBeforeBraces: Attach}" myfile.h

其他安全的方法是将参数存储在 shell 数组中:

arg=('-i' '-style="{BreakBeforeBraces: Attach}"')

# use it as
clang-format "${arg[@]}" 'myfile.h'

【讨论】:

  • 我的目的是将样式传递给clang-format,因为这在不同情况下可能是不同的样式。我可以将它们包装在一个函数中。
  • 当然,检查我的更新答案
猜你喜欢
  • 1970-01-01
  • 2021-04-30
  • 2014-09-13
  • 2023-04-05
  • 2016-05-31
  • 1970-01-01
  • 2020-11-20
  • 2018-02-13
  • 2020-07-30
相关资源
最近更新 更多