21
pathname=$(cat $HOME/.rm.cfg)
if [ ! -z $pathname/$1 ]

.rm.cfg is a file that contains the following directory

/home/username/deleted1

$1 is the name of a file eg. glass

why does the line if [ ! -z $pathname/$1 ] give a binary operator expected error.

Josh Jolly
  • 11,258
  • 2
  • 39
  • 55
user3809938
  • 1,114
  • 3
  • 16
  • 35

3 Answers3

41

I had faced the same error (binary operator expected) when receiving more than one word for some variable when using it as shown below:

if [ ! -z ${variable} ];

So to resolve this error I changed it to:

if [[ ! -z ${variable} ]];
AdHorger
  • 470
  • 6
  • 13
Sanjay
  • 1,078
  • 11
  • 15
32

Looks like your $pathname includes more than one word. Could be multiple lines in your .rm.cfg file, or perhaps the path includes spaces. Anyway, you end up with

if [ ! -z word word word/$1 ]

which is no good. If you're just expecting a single path and want to protect against the path containing whitespace, change your if line to

if [ ! -z "$pathname/$1" ]
chrisdowney
  • 1,528
  • 1
  • 11
  • 21
  • For me, the problem was that I had a trailing space in my definition of $pathname. I used the strip function to prevent this from happening (see [here](https://www.gnu.org/software/make/manual/html_node/Text-Functions.html)). – rkersh Jun 16 '16 at 16:33
  • Accept this as answer ! – Eric Mar 15 '17 at 11:59
  • Thank you! I can't tell you how many times I've been bitten by spaces in arg lists. – Karl Pokus Dec 29 '20 at 14:58
0

When using single square brackets, double quote your variable in the test construct when intaking more than one argument. In this case, shell considers $pathname/$1 as more than one argument.

tychen
  • 39
  • 4