I am trying to check if a file has CR line feed and store the result 0 or 1 into a variable.
Here is my command that runs inside a script.
isCR="$(file ${fileName} | grep -c 'with CR line terminators')"
The script runs until the previous line and doesn’t run this line but terminates abruptly.
Inside an echo statement it works perfectly.
echo "isCR=$(file ${fileName} | grep -c 'with CR line terminators')"
This prints isCR=0 or isCR=1 depending on the file I use.
But just storing the value into variable isCR doesn’t work. I am confused what am i missing here. Any help is appreciated.
Advertisement
Answer
Using set -e (aka set -o errexit) tells the shell to exit whenever any command returns a nonzero exit status.
grep returns a nonzero exit status when it finds no matches.
Thus, when using bash -e, set -e, set -o errexit, an ERR trap which triggers an exit, or similar configuration, isCR="$(file ${fileName} | grep -c 'with CR line terminators')" will terminate your script because the nonzero exit status from the grep command is passed through as the exit status of the command as a whole.
By contrast, echo "$(false)" does not because its exit status is that of echo, not that of false; this holds true when the command returning the failed exit status is grep as well.
If you want to use set -e but bypass its behavior for this specific line, consider:
isCR="$(file ${fileName} | grep -c 'with CR line terminators')" || [[ $isCR ]]
The || [[ $isCR ]] will make the line as a whole have a truthy result even if grep returns false, so long as it emitted a nonzero number of characters.