Enric Agud Pique
Enric Agud Pique

Reputation: 1105

Problems with "while" bash

I need to control files in a folder... The script has to wait the file until it exists...

These files have the name... The format is file_d01_YYYY-MM-DD_HH:00:00. For example:

file_d01_2018-11-12_00:00:00
file_d01_2018-11-12_01:00:00

And so on, for 7 days ahead.

!/bin/bash


ZZ=`date +%k`
date=$(date +%Y%m%d)
if [[ $ZZ -ge 2 ]] && [[ $ZZ -lt 14 ]] ; then  #03:45 UTC
ZZ=00
PARAM=`date +%Y%m%d`$ZZ
PARAM2=`date +%Y-%m-%d`
elif [[ $ZZ -ge 14 ]] && [[ $ZZ -lt 23 ]] ; then #15:45 UTC
ZZ=12
PARAM=`date +%Y%m%d`$ZZ
PARAM2=`date +%Y-%m-%d`
fi


rundir=/home/$PARAM/wrfv3
dir=/home/$PARAM

data=$(date +%Y-%m-%d)
data1=$(date -d "1 day" +%Y-%m-%d)
data2=$(date -d "2 day" +%Y-%m-%d)
data3=$(date -d "3 day" +%Y-%m-%d)
data4=$(date -d "4 day" +%Y-%m-%d)
data5=$(date -d "5 day" +%Y-%m-%d)
data6=$(date -d "6 day" +%Y-%m-%d)




days=( "$data" "$data1" "$data2" "$data3" "$data4" "$data5" "$data6" )   #array of days
values=( {00..23} ) #array of 24 hours
echo ${#values[@]}

# Here, using to loops, I check if files exist...for every day and hour
for day in "${days[@]}"; do
for value in "${values[@]}"; do
echo file_d01_${day}_${value}:00:00

while [ ! -f $rundir/file_d01_2018-11-15_20:00:00  ] # while file doesn't exist...wait...and repeat checking till it exists...
do
echo "waiting for the file"
sleep 10
done
echo "file exists"
sleep 5

done
done

I receive always "waiting for the file"...and they exist... where is the problema in the code?

Upvotes: 3

Views: 75

Answers (2)

Amessihel
Amessihel

Reputation: 6354

You should add the double quotes "" to protect the path. It's a good practice. Also bash expansion escapes the : character, so maybe it is an issue in your context (not in the one i did the test).

while [ ! -e "$rundir/file_d01_2018-11-15_20:00:00" ]

I would suggest to follow those steps:

  1. Protect the path with double quotes "" (not simple ones, otherwise $rundir won't be expanded)
  2. Write echo "waiting for the file $rundir/file_d01_2018-11-15_20:00:00" to see what path you're testing
  3. Additionally, use -e to see any changes (-e checks for a path existence, not only a regular file one)

Note: the brackets [ ] invokes in fact test. So, man test will give you the operators you can use and their meanings. Also nowadays bash has double brackets [[ ]] as built-in operators, more powerful, which can be used instead.

Upvotes: 2

pjh
pjh

Reputation: 8054

The code in the question contains:

echo file_d01_${day}_${value}:00:00
while [ ! -f $rundir/file_d01_2018-11-15_20:00:00  ]

It's calculating a file name, echoing it, and then checking for a (probably different) fixed, unchanging, file name. It should check for the calculated file name. For example:

file=file_d01_${day}_${value}:00:00
echo "$file"
while [ ! -f "$rundir/$file"  ]

To make debugging easier, it would be better to have:

filepath=$rundir/file_d01_${day}_${value}:00:00
echo "$filepath"
while [ ! -f "$filepath"  ]

The full code in the question has many issues (starting with a broken shebang line). It's a good idea to make Bash code Shellcheck-clean.

Upvotes: 0

Related Questions