Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在bashshell变量中指定以多个空格行结尾的字符串吗?_Bash_Shell - Fatal编程技术网

我可以在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

我在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 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"