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
注意:连接包含一个空格。