Bash script: binary operator expected

So I have reviewed a lot of entries on here and cannot figure out what I am doing wrong here. I am new to scripting and want to know why this does not work:

input is

./filedirarg.sh /var/logs fileordir.sh

script is

#! /bin/bash
echo "Running file or directory evaluation script"
LIST=$@
if [ -f $LIST ]
then
echo "The entry ${LIST} is a file"
elif [ -d $LIST ]
then
echo "The entry ${LIST} is a directory"
fi

This results in

./filedirarg.sh: line 4: [: /var/logs: binary operator expected
./filedirarg.sh: line 7: [: /var/logs: binary operator expected

It runs fine with this

./filedirarg.sh fileordir.sh 

Quoting the $LIST in the evaluation results in no output except the first echo statement.

11

2 Answers

I think [ -f … ] (or test -f …) requires exactly one argument. When you run

./filedirarg.sh /var/logs fileordir.sh

there are two. The same with [ -d … ].


This is a quick fix:

#! /bin/bash
echo "Running file or directory evaluation script"
for file ; do if [ -f "$file" ] then echo "The entry '$file' is a file" elif [ -d "$file" ] then echo "The entry '$file' is a directory" fi
done

Thanks to quoting it should work with names with spaces (e.g. ./filedirarg.sh "file name with spaces").

Also note for file ; do is equivalent to for file in "$@" ; do.

9

binary operator expected

if [ -f $LIST }

The } above should be a ], as explained by ShellCheck:

$ shellcheck myscript
Line 4:
if [ -f $LIST }
^-- SC1009: The mentioned parser error was in this if expression. ^-- SC1073: Couldn't parse this test expression. ^-- SC1072: Expected test to end here (don't wrap commands in []/[[]]). Fix any mentioned problems and try again.
$ 
4

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like