Search code examples
bashwc

Bash: Using Number of Lines in File in Variable


I am trying to extract the number of lines from a file, and then use it in a variable. However, it keeps passing the file name, not the number of lines. I read through this question, but the examples are not working.

for i in $BASE/$TEMPLATE_DIR-$i$PRUNING_METHOD/*.txt
    do
        NUM_LINES=$(wc -l < $i)
        echo $NUM_LINES
        UPLOAD_CMD="sh sshpass_setup_verification.sh $EXP_ID-$i$PRUNING_METHOD__$NUM_LINES__features";
        echo "$UPLOAD_CMD"
        break 1;
    done

Prints:

15 #the correct number of lines
sh sshpass_setup_verification.sh di-60sec-max/TemplateUser1.txt #where TemplateUser1.txt is the name of the file

Should print:

15
sh sshpass_setup_verification.sh di-60sec-max__15__features

Solution

  • A summary of what people are telling you in the comments:

    for i in "${BASE}/${TEMPLATE_DIR}-${i}${PRUNING_METHOD}"/*.txt
    do
        num_lines=$(wc -l < "$i")
        echo "$num_lines"
        upload_cmd="sh sshpass_setup_verification.sh ${EXP_ID}-${i}${PRUNING_METHOD}__${num_lines}__features"
        echo "$upload_cmd"
        break
    done
    

    The key thing here is using double quotes around your parameter expansions and curly braces to disambiguate in situations where characters such as _ could be interpreted as part of a variable name but shouldn't. I've added them in several places where they aren't strictly needed but they do no harm.

    I've also changed your variable names to lowercase. This will help you one day when you decide to have a variable called PATH and suddenly all your commands stop working.