我正在阅读 Unix、Linux 和 OS X 中的 Shell 编程,第四版。
在P.112中,它展示了这样的例子
$ lines=one'
> 'two
$ echo "$lines"
one
two
$ lines=ones\
> two
$ echo "$lines"
onetwo
$
我被第一句话卡住了。
我尝试的是这样的
jackson@jackson-VirtualBox:~$ lines=one'>'two
jackson@jackson-VirtualBox:~$ echo "$lines"
one>two
jackson@jackson-VirtualBox:~$ $lines=one'>'two
one>two=one>two: command not found
jackson@jackson-VirtualBox:~$ lines=one \n '>'two
n: command not found
jackson@jackson-VirtualBox:~$ lines=one' \n>'two
jackson@jackson-VirtualBox:~$ echo "$lines"
one \n>two
jackson@jackson-VirtualBox:~$ lines=one'>'two
jackson@jackson-VirtualBox:~$ lines=one'\n>'two
jackson@jackson-VirtualBox:~$ echo "$lines"
one\n>two
jackson@jackson-VirtualBox:~$ lines=one\n>two
jackson@jackson-VirtualBox:~$ echo "$lines"
onen
我的问题是:如何打字
$ lines=one'
> 'two
答案1
这被键入为:
lines=one'
'two
即在第一个引号后按下 Enter 键。
因为它位于引号内,所以 bash 将下一个输入行(以结束引号开头)视为上一行的一部分。这>
只是 bash 的一个提示,表明它已准备好接受更多输入以继续上一行 - 它并不意味着要键入。
提示符是$PS2
变量的值,也称为“辅助提示符字符串”。它用于连续/辅助输入行,而$PS1
用于主输入行。尝试declare -p PS1 PS2
查看它们在您的系统上的定义 - 人们自定义 PS1 很常见,但自定义 PS2 则很少见(因此它可能默认为>
)。
使用现代版本的 bash(以及其他一些类似 bourne 的 shell)执行相同操作的另一种方法是:
lines=$'one\ntwo'
使用$'...'
not 只是'...'
告诉 bash 解释\n
字符串中的转义码(如换行符)。
答案2
好吧,有几种解决方案可以在 var 中添加换行符,但我相信您实际上是在问这个:
在新的提示下,
- 类型lines=one
- 输入单引号
'
并按enter - 将出现“>”提示等待您输入。
- 类型'和two
- 按enter,完成。
当然,您可以使用以下方法在变量中获取换行符:
lines=$'one\ntwo' # in bash, zsh
lines=$(printf 'one\ntwo') # in any shell
例如。如果您需要更多解决方案,请询问。