Bash延续线

你如何使用bash延续线?

我意识到你可以这样做:

echo "continuation \ lines" >continuation lines 

但是,如果您有缩进的代码,则效果不佳:

  echo "continuation \ lines" >continuation lines 

这是你可能想要的

 $ echo "continuation"\ > "lines" continuation lines 

如果这会创build两个参数来回显,而您只需要一个参数,那么我们来看看string连接。 在bash中,将两个string相邻放置在一起:

 $ echo "continuation""lines" continuationlines 

所以没有缩进的延续线是分解string的一种方法:

 $ echo "continuation"\ > "lines" continuationlines 

但是,当使用缩进:

 $ echo "continuation"\ > "lines" continuation lines 

你会得到两个参数,因为这不再是连接。

如果你想要一个跨越行的单个string,而缩进却没有得到所有这些空间,你可以尝试的一种方法是把延续线和variables放在一起:

 $ a="continuation" $ b="lines" $ echo $a$b continuationlines 

这将允许您以附加variables为代价获得干净的缩进代码。 如果你把variables放在本地,应该不会太差。

这里带有<<-HERE终止符的文档适用于缩进的多行文本string。 它将从这里的文件中删除任何领先的标签。

 cat <<-____HERE continuation lines ____HERE 

另请参阅http://ss64.com/bash/syntax-here.html

如果你需要保留一些,但不是全部,领先的空白,你可以使用一些东西

 sed 's/^ //' <<____HERE This has four leading spaces. Two of them will be removed by sed. ____HERE 

我遇到了一个情况,我不得不作为命令参数的一部分发送一个长信息,并且必须遵守行长限制。 这些命令看起来像这样:

 somecommand --message="I am a long message" args 

我解决这个问题的方法就是把这个消息作为一个文档(像@tripleeebuild议的那样)。 但是这里的文档变成了标准input,所以需要重新读入,我采用了下面的方法:

 message=$( tr "\n" " " <<- END This is a long message END ) somecommand --message="$message" args 

这样做的好处是$message可以像string常量一样使用,没有额外的空格或换行符。

请注意,上面的实际消息行前面加上了一个tab符,这是由这里的文档剥离的(因为使用了<<- )。 最后还有换行符,然后用空格代替。

还要注意的是,如果你不删除换行符,当"$message"被展开时,它们将显示为现状。 在某些情况下,您可以通过移除$message周围的双引号来解决问题,但该消息将不再是单个参数。

你可以使用bash数组

 $ str_array=("continuation" "lines") 

然后

 $ echo "${str_array[*]}" continuation lines 

有一个额外的空间,因为(在bash手册之后):

如果单词是双引号, ${name[*]}将扩展为单个单词,每个数组成员的值由IFSvariables的第一个字符分隔

所以设置IFS=''来摆脱额外的空间

 $ IFS='' $ echo "${str_array[*]}" continuationlines 

这可能并不能真正回答你的问题,但你可能会发现它有用。

第一个命令创build第二个命令显示的脚本。

第三个命令使该脚本可执行。

第四个命令提供了一个使用示例。

 john@malkovich:~/tmp/so$ echo $'#!/usr/bin/env python\nimport textwrap, sys\n\ndef bash_dedent(text):\n """Dedent all but the first line in the passed `text`."""\n try:\n first, rest = text.split("\\n", 1)\n return "\\n".join([first, textwrap.dedent(rest)])\n except ValueError:\n return text # single-line string\n\nprint bash_dedent(sys.argv[1])' > bash_dedent john@malkovich:~/tmp/so$ cat bash_dedent #!/usr/bin/env python import textwrap, sys def bash_dedent(text): """Dedent all but the first line in the passed `text`.""" try: first, rest = text.split("\n", 1) return "\n".join([first, textwrap.dedent(rest)]) except ValueError: return text # single-line string print bash_dedent(sys.argv[1]) john@malkovich:~/tmp/so$ chmod a+x bash_dedent john@malkovich:~/tmp/so$ echo "$(./bash_dedent "first line > second line > third line")" first line second line third line 

请注意,如果您确实想要使用此脚本,将可执行脚本移动到~/bin以使其位于您的path中更有意义。

检查python参考了解textwrap.dedent如何工作的细节。

如果$'...'或者"$(...)" $'...'的用法让你感到困惑,那就问另一个问题(每个构造一个),如果还没有的话。 提供您find/询问的问题的链接可能会很好,这样其他人就可以获得链接参考。

但是,如果您有缩进的代码,则效果不佳:

  echo "continuation \ lines" >continuation lines 

尝试用单引号和连接string:

  echo 'continuation' \ 'lines' >continuation lines 

注意:连接包含一个空格。