[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Long variable value get corrupted sometimes
From: |
Greg Wooledge |
Subject: |
Re: Long variable value get corrupted sometimes |
Date: |
Wed, 16 Feb 2022 07:43:17 -0500 |
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.