bash中给变量赋值换行符,如果要给变量赋值给换行符,写'\n'没有作用,需要为$'\n'写。具体例子如下:$newline='\n'$echo$newline\n$newline=$'\n'$echo$newline可以看出,如果给newline变量赋值为'n',得到字符串n。而不是换行符本身。这就是bash和C语言的区别。在C语言中,'n'对应换行符本身,只有一个字符;“n”对应一个字符串。但在bash中,'n'也对应一个字符串。通过将换行符分配给$'\n',您可以获得换行符本身。看manbash对这种写法的描述如下:$'string'形式的词特殊处理。该词扩展为字符串,并按照ANSIC标准的规定替换反斜杠转义字符。反斜杠转义序列(如果存在)按如下方式解码:\nnewline\rcarriagereturn\thorizo??ntaltab\'singlequote扩展结果是单引号,就好像符号不存在一样。即$'string'可以使用C语言的转义符来得到对应的字符本身。判断文件最后一行是否以换行符结尾在Linux中,可以使用如下命令判断文件最后一行是否以换行符结尾:test-n"$(tailfilename-c1)"这里,使用tailfilename-c1命令获取文件文件名的最后一个字符。实际使用时,需要将filename替换为具体的文件名进行判断。tail命令可以获取文件末尾的内容。它的-c选项指定从文件末尾获取多少字节。查看mantail对-c选项的说明如下:-c,--bytes=K输出最后K字节;或者,使用-c+K输出从每个文件的第K个开始的字节。也就是说,tail-c1命令指定获取给定文件的最后一个字符。拿到文件的最后一个字符后,需要判断该字符是否为换行符。这里不能直接判断字符是否等于换行符,而是判断字符是否为空。原因是当使用$(tailfilename-c1)命令替换来获取内部命令的输出时,bash会去除尾随的换行符。所以当文件的最后一行以换行符结束时,$(tailfilename-c1)命令替换会将获取到的换行符去掉,最终结果为空,不会返回换行符本身。有关命令替换(commandsubstitution)的说明,请参见manbash命令替换,命令替换允许命令的输出替换命令名称。有两种形式:$(command)或`command`Bash通过执行command并将命令替换替换为命令的标准输出来执行扩展,并删除任何尾随换行符。嵌入的换行符不会被删除,但它们可能会在分词时被删除。由于$(tailfilename-c1)命令替换会去掉末尾的换行符,所以这里使用test-n来判断最终结果是否为空串。如果文件的最后一行以换行结束,$(tailfilename-c1)的结果为空,test-n命令返回1,为false。如果文件的最后一行不是以换行结束,则$(tailfilename-c1)的结果不为空,test-n命令返回0,为真。可以根据实际需要使用test-z来判断。如果文件的最后一行以换行结束,$(tailfilename-c1)的结果为空,test-z命令返回0,为真。