Home > Enterprise >  Binary operator expected in my bash script
Binary operator expected in my bash script

Time:04-18

With this bash script, I check the directory for *xls files, and if they are, I send them for conversion using ssconvert to *xlsx. All this works if there is only one file in the directory. If there are several or more in the directory, a "binary operator expected" error appears. Please help me fix my script.

#!/bin/bash
while true
do
test -f /home/doc/testy/*.xls && for f in /home/doc/testy/*.xls; do ssconvert "$f" "${f%.xls}.xlsx";
chown www-data:www-data "${f%.xls}.xlsx";
rm -f -- "$f"; done
sleep 10
done

CodePudding user response:

test -f can only handle 1 file at a time, but you can use find instead. I don't know how to combine find's -exec with your ${f%.xls}.xlsx, so i made this look a little bit different.

#!/bin/bash -u                                                                                                                                                                                

DIRECTORY=/home/doc/testy/
export EXTENSION_OLD=xls
export EXTENSION_NEW=xlsx

function doConvert {
    fOld="$1"
    fNew="${fOld%.$EXTENSION_OLD}.$EXTENSION_NEW"
    ssconvert "$fOld" "$fNew";
    chown www-data:www-data "$fNew";
    rm -f -- "$fOld";
}
export -f doConvert

cd $DIRECTORY
while true; do
    find -type f -name "*.$EXTENSION_OLD" -exec bash -c "doConvert {}" \;
    sleep 10
done

CodePudding user response:

Let me assume you are intentionally creating an infinite loop to watch the specified directory for newly generated files.
You need to check the existence of the file within the for f in .. loop. Then would you please try:

while true; do
    for f in /home/doc/testy/*.xls; do
        if [[ -f $f ]]; then
            newfile=${f}x
            ssconvert "$f" "$newfile"
            chown www-data:www-data "$newfile"
            rm -f -- "$f"
        fi
    done
    sleep 10
done
  • Related