Thanks for your tips, a lot learned. Greg Wooledge <g...@wooledge.org> 于2022年2月16日周三 20:47写道:
> > On Wed, Feb 16, 2022 at 04:10:40PM +0800, Daniel Qian wrote: > > FOO=$(cat /tmp/foo.txt) > > got_md5=$(echo "$FOO" | md5sum -b | cut -d ' ' -f 1) > > In addition to what other people have said... echo is not reliable. It > may alter your text, if you feed it backslashes, or arguments like "-e" > or "-n". > > text=$(cat /tmp/foo.txt) # this strips all trailing > newlines > md5=$(printf '%s\n' "$text" | md5sum -b) # this adds one newline > md5=${md5%% *} # this removes " *-" > > If you need to preserve the correct number of trailing newlines, then > you'll also have to change the command substitution. The common > workaround is: > > text=$(cat /tmp/foo.txt; printf x) > text=${text%x} > > If you do this, remember that the final newline(s) are still inside the > variable, so you don't need to add one: > > md5=$(printf %s "$text" | md5sum -b) > > Finally, you should get in the habit of NOT using all-caps variable > names for regular shell variables. The all-caps namespace is "reserved" > for environment variables (like HOME and PATH) and special shell variables > (like BASH_VERSION and SECONDS). > > Ordinary variables that you use in a script should contain lowercase > letters. Mixed caps/lowercase is fine, if you swing that way. > -- Daniel Qian Apache Committer(chanjarster) blog:https://chanjarster.github.io github:https://github.com/chanjarster segmentfault: https://segmentfault.com/u/chanjarster