MLSC
MLSC

Reputation: 5972

How to break infinite loop in this script

I am doing something interesting with bash

I wrote script below:

#!/bin/bash
while :
do
    if [ -s /tmp/file.txt ]; then
        for line in $(cat /tmp/file.txt)
        do
            echo $line
            #May be some commands here
        done
    fi
done

and the content of my file.txt is:

1 True
2 Flase

How can I say the script if command cat /tmp/file.txt is finished (I mean all lines are read) and also echo $line and other commands are finished then break the infinitive while : loop?

Thank you

Upvotes: 0

Views: 717

Answers (1)

konsolebox
konsolebox

Reputation: 75488

Use break.

#!/bin/bash
while :
do
    if [ -s /tmp/file.txt ]; then
        for line in $(cat /tmp/file.txt)
        do
            echo $line
            #May be some commands here
        done
        break
    fi
done

Although it would be simpler and more proper with:

#!/bin/bash
for (( ;; )); do
    if [[ -s /tmp/file.txt ]]; then
        # Never use `for X in $()` when reading output/input. Using word splitting
        # method for it could be a bad idea in many ways. One is it's dependent with
        # IFS. Second is that glob patterns like '*' could be expanded and you'd
        # produce filenames instead.
        while read line; do
            # Place variables between quotes or else it would be subject to Word
            # Splitting and unexpected output format could be made.
            echo "$line"
        done < /tmp/file.txt
        break
    fi
done

On another note, do you really need the outer loop? This time you don't need to use break.

#!/bin/bash
if [[ -s /tmp/file.txt ]]; then
    while read line; do
        echo "$line"
    done < /tmp/file.txt
fi

Upvotes: 2

Related Questions