我可以在bashshell变量中指定以多个空格行结尾的字符串吗?
我在bashshell变量中存储一些行时遇到问题 有一个文件包含如下字符串我可以在bashshell变量中指定以多个空格行结尾的字符串吗?,bash,shell,Bash,Shell,我在bashshell变量中存储一些行时遇到问题 有一个文件包含如下字符串 $ vim a.txt ------we-are-in-vim------ first line second line -------end-of-file------- 此文件末尾有两行空行 当我编辑这个文件时,我可以看到打印的是空白 $ cat a.txt first line second line $ 嗯。现在,我可以很容易地想象,我可以把它放在一个bash变量中 让我们试试看 $ VAR=`cat
$ vim a.txt
------we-are-in-vim------
first line
second line
-------end-of-file-------
此文件末尾有两行空行
当我编辑这个文件时,我可以看到打印的是空白
$ cat a.txt
first line
second line
$
嗯。现在,我可以很容易地想象,我可以把它放在一个bash变量中
让我们试试看
$ VAR=`cat a.txt`
$ echo "${VAR}"
first line
second line
$
嗯。我没有用双引号敲打cat命令的输出!;)
嗯。让我们试试printf内置的变量赋值功能
$ printf -v VAR "`cat a.txt`"
$ echo "${VAR}"
first line
second line
$
…好的,让我们尝试使用mapfile命令
$ mapfile < a.txt VAR
$ printf '%s' "${VAR[@]}"
first line
second line
$
我已经在bash中尝试过“将if改为nothing”
但结果完全一样
如何将末尾有两个空行的字符串分配给bash变量?这是因为bash中的命令替换就是这样工作的 请参见此
manbash
,除了在命令替换下
命令替换允许命令的输出替换命令名。有两种形式:
$(命令)
`命令`
[…]Bash通过执行命令并用命令的标准输出替换命令替换来执行扩展,并删除任何尾随的换行符。[……]
通常的做法是附加一个字符,并在以下情况后将其删除:
$ a="`cat a.txt; echo x`"; echo "${a%x}"
first line
second line
$
这是POSIX(大多数Shell)指定的变量扩展的解决方法。POSIX要求这样做 删除替换结束时一个或多个字符的序列 另一种方法是,如果从文件中读取(而不是执行某些命令),则直接使用shell进行读取。如果shell的
read
接受选项-d
(自bash 2.04起):
$IFS=''读取-d''变量
或者使用您已经找到的命令
readarray
(又称mapfile
,自bash 4.0 alpha以来)阅读。很抱歉听到。。。我应该有阅读手册的习惯。:)谢谢大家!@이형욱: 这不是问题,映射文件的方法似乎是正确的。用这种方法来解决您的问题:)如果您想将文件写入变量中,只需使用适当的内置代码。在本例中,您希望使用read
:IFS=read-r-d''var
。
$ VAR2=`printf '%s' "${VAR[@]}"`
$ echo "${VAR2}"
first line
second line
$
$ a="`cat a.txt; echo x`"; echo "${a%x}"
first line
second line
$
$ IFS='' read -d '' VAR < a.txt
$ echo "$VAR"