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