如何在Bash中输出多行字符串?
在Bash中如何输出多行字符串?
有人在这篇问答页面上的答案的启发下,我创建了一种混合方法,我认为这是最简单和更灵活的方法。你觉得怎么样?
首先,我将用法定义为一个变量,这样我就可以在不同的上下文中重复使用它。格式非常简单,几乎是所见即所得,不需要添加任何控制字符。在我看来,这似乎是可移植的(我在MacOS和Ubuntu上运行它)。
__usage=" Usage: $(basename $0) [OPTIONS] Options: -l, --levelSomething something something level -n, --nnnnn Something something something n -h, --help Something something something help -v, --version Something something something version "
然后,我可以简单地使用它:
echo "$__usage"
甚至更好的是,在解析参数时,我可以在一行代码中直接将其打印出来:
levelN=${2:?"--level: n is required!" "$__usage"}
这在一个脚本中对我起作用,而上述答案则不起作用(没有修改的情况下)。
这比涉及大量的字符(如\t和\n)要干净得多,这些字符很难在文本中找到并扩展,从而使输出与脚本中的字符串大不相同。
由于某些原因,它对我来说会将所有内容打印在同一行上 :/
如果你使用了这个解决方案,并发现所有内容都在同一行上,请确保用引号括住变量:
echo $__usage
将会在一行上打印所有内容,而
echo "$__usage"
将会保留换行符。
在我的情况下,使用双引号
echo "$__usage"
是必需的。
echo $__usage
不起作用。
这实际上是对我起作用的唯一解决方案。Printf做了很多事情,对于我的多行xml,它可能需要很多转义,因为它完全搞乱了内容。我将foo赋值为cat <
问题:如何在Bash中输出多行字符串?
出现的原因:在Bash中,输出多行字符串可能会遇到一些问题。如果直接使用echo命令,每个换行符将被解释为一个新的命令,导致输出不符合预期。因此,需要找到一种方法来正确输出多行字符串。
解决方法:可以使用以下方法来输出多行字符串。
1. 使用双引号和换行符:可以使用双引号将多行字符串括起来,并在每行末尾添加一个换行符。例如:
echo "usage: up [--level <n>| -n <levels>][--help][--version] Report bugs to: up home page: "
这种方法适用于大多数情况,甚至适用于Bourne shell(如Dash和Heirloom Bourne Shell)。
2. 使用单引号和换行符:如果不希望字符串中的内容被解释,可以使用单引号将多行字符串括起来。例如:
echo 'usage: up [--level <n>| -n <levels>][--help][--version] Report bugs to: up home page: '
使用单引号将字符串括起来可以防止字符串中的特殊字符被解释。
需要注意的是,如果需要在输出中保留字符串中的变量或命令替换符号(如$和`),应该使用单引号而不是双引号。
以上是在Bash中输出多行字符串的两种常用方法。无论是使用双引号还是单引号,都可以正确输出多行字符串。
如何在Bash中输出多行字符串?
在Bash中,可以使用Here documents来实现这个目的。它们在所有Bourne衍生的shell中都受支持,包括所有版本的Bash。下面是一个使用Here documents输出多行字符串的示例:
cat << EOF usage: up [--level| -n ][--help][--version] Report bugs to: up home page: EOF
这段代码将输出一个包含多行字符串的文本块。
除了使用Here documents外,还可以使用其他方法将多行字符串输出到Bash中。例如,可以使用`read -d ''`命令将多行字符串读入变量中,然后使用`echo`命令输出结果。
如果需要将Here documents保存到变量中,也是可以实现的。只需将Here documents的内容赋值给一个变量即可。
如果在多行字符串中需要转义反引号等特殊字符,可以在Here documents的第一行使用双引号将定界符括起来。
以上是关于如何在Bash中输出多行字符串的一些方法。希望对你有所帮助!