Issue
I have read a lot about variable expansion in bash scripts this morning but I have still not been able to identify what has caused the script to stop expanding the variable in this line of code:
CURRENT_HASH=`git log --pretty=format:"%H %s" | grep ${LIBRARY_VERSION}-SNAPSHOT | head -1 | cut -d ' ' -f 1`
Here is more context, with comments showing the output of each line:
SCRIPTPATH=`pwd`
# get the application name and library name from the cloned repo in the deploy directory
DEPLOY_DIRECTORY="$(basename `pwd`)"
LIBRARY_SUFFIX="-library.txt"
cd ..
for d in */ ; do
if [[ "$d" == *"library"* ]] ; then
LIBRARY_NAME="${d%?}" # myAppLibrary
fi
if [[ "$d" != "${DEPLOY_DIRECTORY}" && "$d" != *"library"* ]] ; then
APP_NAME="${d%?}" # myAppName
fi
done
# get the latest version from the library
cd ..
LIBRARY_LATEST=$(head -n 1 $SCRIPTPATH/../${LIBRARY_NAME}/${APP_NAME}${LIBRARY_SUFFIX})
LIBRARY_VERSION=`echo $LIBRARY_LATEST | sed '$s/,//'`
echo $LIBRARY_LATEST # outputs 320,
echo $LIBRARY_VERSION # outputs 320 (no comma)
# get the hash matching the last frozen version from the app repo
cd $SCRIPTPATH/../$APP_NAME
CURRENT_HASH=`git log --pretty=format:"%H %s" | grep ${LIBRARY_VERSION}-SNAPSHOT | head -1 | cut -d ' ' -f 1`
echo "Current hash: $CURRENT_HASH" # blank
If I do the git log
command from the command line I get a hash, as expected.
This block of code was working perfectly last week, but now $CURRENT_HASH
is blank every time. If I manually include the ${LIBRARY_VERSION}
it works fine. If I manually populate the variable, it works fine. I have also tried $LIBRARY_VERSION
to no avail.
Am I missing something obvious? What would cause a variable to stop working?
Solution
As discussed in the comments on the question, the immediate cause of the problem appears to be that the string in $LIBRARY_VERSION
has a trailing carriage return character.
A likely underlying cause of the problem is that the file from which the LIBRARY_LATEST
variable value was read has recently acquired Windows text file line endings (CRLF).
Unexpected CRLF line endings are a common cause of problems described in questions relating to Bash (and similar shells). These references may be useful:
- The first point in the "Before asking about problematic code" section of the Stack Overflow 'bash' Info page
- Are shell scripts sensitive to encoding and line endings?
- How to convert Windows end of line in Unix end of line (CR/LF to LF)
Answered By - pjh Answer Checked By - David Marino (WPSolving Volunteer)