Example:
A=`who` NUM_USERS=`echo "$A"|wc -l` echo "Number of users: $NUM_USERS"Unfortunately this approach is not correct.
If there are users on the system it works fine and the correct count is reported.
But if there are no users then the code above still reports a user count of 1.
Why?
Because echo of an empty variable still adds a newline to the output which is counted by wc. Look at this example (assuming that you don't have a variable called avTyh).
echo "$avTyh" |wc -l 1
Replacing echo by printf does not help much.
printf "$A"|wc -lworks correctly for empty variables but it counts wrongly for a multiline string since it omits the final newline.
Rather than using an if ... else ... construct there is a more elegant solution. Look at this:
printf "$A${A:+\n}" |wc -lThe parameter substitution ${A:+\n} achieves the following:
If $A is set and is non-null then substitute a newline; otherwise substitute nothing.
So if $A is empty then "$A${A:+\n}" is something empty and nothing which counts to zero.
If $A is non-empty then "$A${A:+\n}" is something plus a newline.
Note: in the end I think the strange thing is that in an assignment like A=`who` the string is missing a final newline which leads to the issue after all, I should check why this is the case, maybe in another post.
No comments:
Post a Comment