【问题标题】:Bash: split long string argument to multiple lines?Bash:将长字符串参数拆分为多行?
【发布时间】:2017-10-18 10:22:03
【问题描述】:

给定一个带有单个长字符串参数的命令,例如:

mycommand -arg1 "very long string which does not fit on the screen"

是否有可能以类似于使用\ 拆分单独参数的方式拆分它。

我试过了:

mycommand -arg1 "very \
long \
string \
which ..."

但这不起作用。

mycommand 是一个外部命令,因此不能修改为采用单个参数。

【问题讨论】:

  • 这应该可以工作,即使没有反斜杠。你能描述一下“它不起作用”是什么意思吗?
  • @randomir:该命令不接受有效的字符串,并在解析时抛出错误; (它是传递给pytest -k "keyword1 or keyword2 or keyword3... 的关键字参数)。 更新:你说得对,我确认原始问题中的语法可以正常工作 - 结果是一个关键字以数字开头,并在pytest 中引发了错误(显然是一个错误)。跨度>
  • 只要反斜杠是每行的最后一个字符,那 几乎 就可以满足您的要求。但是,您不能缩进以下行,因为这些空格仍然是字符串的一部分。
  • @randomir:没有反斜杠,字符串是多行的,这不是 OP 愿意的。
  • 而且,您还可以考虑创建一个中间变量来存储它。

标签: bash multiline


【解决方案1】:

您可以将字符串分配给这样的变量:

long_arg="my very long string\
 which does not fit\
 on the screen"

那就只用变量吧:

mycommand "$long_arg"

在双引号内,删除前面带有反斜杠的换行符。请注意,字符串中的所有其他空格都很重要,即它将出现在变量中。

【讨论】:

  • 我怀疑 OP 没想到缩进会成为结果参数的一部分。 (在这种情况下,cat+heredoc 可以提供帮助,使用 <<- 和前导制表符,但这通常只提供缩进 close 到您想要的内容。)
  • 我必须始终在使用 java 运行任何东西的脚本中执行此操作,尤其是在 oracle 下。我有这么久的命令字符串,以至于我将 args 分成组,然后在引用的 supergoups 中分配组,以便实际调用是逻辑上可读的,并且如果您通读所有设置,则可以解析。痛苦,但有时是必要的……
  • 谢谢。我认为这不适用于 awk,但我使用单引号将变量设置为脚本,然后用双引号引用它,尽管 awk 脚本中有双引号,但它仍然有效!
  • 谢谢。这种技术也适用于 POSIX sh。
【解决方案2】:

你试过不加引号吗?

$ foo() { echo -e "1-$1\n2-$2\n3-$3"; }

$ foo "1 \
2 \
3"

1-1 2 3
2-
3-

$ foo 1 \
2 \ 
3

1-1
2-2
3-3

当您将其封装在双引号中时,它会尊重您的反斜杠并忽略以下字符,但由于您将整个内容用引号括起来,因此它会认为应该处理引号内的整个文本块作为单个参数。

【讨论】:

    猜你喜欢
    • 2018-05-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 2020-05-08
    • 2023-02-24
    相关资源
    最近更新 更多