IF statement with square brackets

Hi All,

Hope you all are doing good. Yesterday in my project i came across a scenario which i can not guess why it was working in one region and why it was not in another region. Please find my issue below.

I am using AIX version 6.0 of UNIX in my project, in shell scripting i have the following code to check if a file exists in a directory or not.

       
if [ -f $com_dir/$dup_file_name_chk ] || 
[ -f $save_dir/$dup_file_name_chk ]
then
.
.
.
fi

I tested this code in the development region every thing went fine and moved the code to QA there also testing went fine. After 2 successful tests the code was moved to UAT region, my onsite manager tested it in UAT and found this is not working, the file existence was not detected there and testing failed.

After this i doubted this if condition and made it like below.

       
if [[ -f $com_dir/$dup_file_name_chk ]] || 
[[ -f $save_dir/$dup_file_name_chk ]]
then
.
.
.
fi

Now the same was tested in dev, QA & UAT regions. Now this file existence check was working in UAT region.

Can anyone explain what made this '[[' double brackets to work in the UAT region instead of '[' single bracket. What is the difference between them?
Also why regions differ(single brackets working in dev & QA not in UAT).

The real question is not what the region is when the code works or fails, but to what do the expansions of the three shell variables: com_dir , dup_file_name_chk , and save_dir expand when the code works and to what do they expand when it fails. One might guess that it is failing when one of those variables contain one or more whitespace characters. One might also guess that the following would also work:

if [ -f "$com_dir/$dup_file_name_chk" ] || 
[ -f "$save_dir/$dup_file_name_chk" ]
then
.
.
.
fi

You haven't told us what shell you're using, but if [[ expression ]] is working and you're running on AIX, I'll assume you are using ksh or bash . The command:

[ -f $com_dir/$dup_file_name_chk ]

is a shell built-in utility that performs the same parameter expansion and field splitting that happens whenever the shell evaluates a command line. Without the double quotes surrounding the parameter expansions, if there are whitespace characters in the expansions of those variables, field splitting will cause one or both of those tests to fail. It will also fail if $dup_file_name_chk expands to an empty string. but in that case the double bracket test would also fail.

The command:

[[ -f $com_dir/$dup_file_name_chk ]]

is part of the syntax of the shell; not a utility. Parameter expansion still occurs in this case, but field splitting does not occur.

2 Likes