Bash技巧:把变量赋值为换行符(判断文件是否以换行符结尾)
变量赋值为换行符
在bash中,如果要把变量赋值为换行符,写为'\n'没有效果,需要写为$'\n'。具体举例如下:
$newline='\n' $echo$newline \n $newline=$'\n' $echo$newline
可以看到,把newline变量赋值为'n',得到的是n这个字符串,而不是换行符自身。
这是bash和C语言不一样的地方。
在C语言中,'n'对应换行符自身,只有一个字符;而"n"对应一个字符串。
但是在bash中,'n'也是对应一个字符串。
把newline赋值为$'\n',就能获取到换行符自身。查看manbash对这个写法的说明如下:
Wordsoftheform$'string'aretreatedspecially.Thewordexpandstostring,withbackslash-escapedcharactersreplacedasspecifiedbytheANSICstandard.Backslashescapesequences,ifpresent,aredecodedasfollows:
\nnewline \rcarriagereturn \thorizontaltab \'singlequote
Theexpandedresultissingle-quoted,asifthedollarsignhadnotbeenpresent.
即,$'string'这个写法可以使用C语言的转义字符来获取到对应的字符自身。
判断文件的最后一行是否以换行符结尾
在Linux中,可以使用下面命令来判断文件的最后一行是否以换行符结尾:
test-n"$(tailfilename-c1)"
这里使用tailfilename-c1命令获取到filename文件的最后一个字符。
实际使用时,需要把filename换成具体要判断的文件名。
tail命令可以获取文件末尾的内容。它的-c选项指定要获取文件末尾的多少个字节。
查看mantail对-c选项的说明如下:
-c,--bytes=K
outputthelastKbytes;alternatively,use-c+KtooutputbytesstartingwiththeKthofeachfile.
即,tail-c1命令指定获取所给文件的最后一个字符。
获取到文件的最后一个字符后,要判断该字符是不是换行符。这里不能直接判断该字符是否等于换行符,而是要判断该字符是否为空。
原因在于,使用$(tailfilename-c1)命令替换来获取内部命令的输出结果时,bash会去掉末尾的换行符。
所以当文件的最后一行以换行符结尾时,$(tailfilename-c1)命令替换会去掉获取到的换行符,最终结果为空,并不会返回换行符自身。
查看manbash对命令替换(commandsubstitution)的说明如下:
Commandsubstitutionallowstheoutputofacommandtoreplacethecommandname.Therearetwoforms:
$(command) or `command`
Bashperformstheexpansionbyexecutingcommandandreplacingthecommandsubstitutionwiththestandardoutputofthecommand,withanytrailingnewlinesdeleted.Embeddednewlinesarenotdeleted,buttheymayberemovedduringwordsplitting.
可以看到,经过命令替换后,会去掉末尾的换行符。
由于$(tailfilename-c1)命令替换会去掉末尾的换行符,这里使用test-n来判断最终结果是否为空字符串。
如果文件最后一行以换行符结尾,那么$(tailfilename-c1)的结果为空,test-n命令会返回1,也就是false。
如果文件最后一行没有以换行符结尾,那么$(tailfilename-c1)的结果不为空,test-n命令会返回0,也就是true。
可以根据实际需要,改用test-z来判断。如果文件最后一行以换行符结尾,$(tailfilename-c1)的结果为空,test-z命令会返回0,也就是true。
到此这篇关于Bash技巧:把变量赋值为换行符,判断文件是否以换行符结尾的文章就介绍到这了,更多相关变量赋值为换行符内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。