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标准的规定替换反斜杠转义字符。反斜杠转义序列(如果存在)按如下方式解码:\n新行\r回车\t水平制表符\'单引号展开后的结果是单引号,就好像符号不存在一样。也就是$'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,为真。
