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.

Reply via email to