Check if files exist in case some files contain [ Bash

I've got a set of files, let say

file1.txt
File2.txt
File [3].txt
file 4.txt

In my script, I store the path of each file in a var called $file. Here is my issue: in bash, testing the existence of it with following command

[[ ! -f "$file" ]]

WILL WORK (= system see that the file exists) for regular file like file1.txt File2.txt file 4.txt BUT WILL NOT WORK (= system don't find the file - as it is not existing) with file containing [ ] in it, like File [3].txt does.

I assume it is because of the [ ] that interfer with the double [[. Testing with

test ! -f "$file"

is the same, system do not see it and return a missing file.

What can I do to escape the [ or to avoid such behaviour ? I've tried to find the solution on the net, but as I type "check if file exist with filename containing [" there is a bias as [ / [[ is used to check the existence..

Thanks for your help !


EDIT - 2022-01-15 Here is the loop I'm using

while read -r file; do
    if [[ ! -f "$file" ]]; then
        echo "Missing file $file"       
    fi
done < Compil.all ;

where Compil.all is a text file containing the path of file :

$cat Compil.all
/media/veracrypt1/file1.txt
/media/veracrypt1/File2.txt
/media/veracrypt1/File [3].txt
/media/veracrypt1/file 4.txt
$

AS I don't want to have issue with space in filenames, I've put the following code in the beginning of the script. Could it be the reason ?

IFS=$(echo -en "\n\b")

Solution 1:

How are you storing the file var? Simply iterating works as shown below:

$ ls
 file1.txt   File2.txt  'File [3].txt'  'file 4.txt'
$ for file in ./* ;do if [[ -f "$file" ]];then echo $file; fi; done
./file1.txt
./File2.txt
./File [3].txt
./file 4.txt

This also works:

$ [[ ! -f "File [3].txt" ]]
$ echo $?
1