Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Checking whether file exists

Tags:

bash

file-io

I'm in the final stages of a project and need to create a script that will run an executable a given number of times with varying input. One of the inputs is a file kept in a separate folder from the executable.

Before doing anything, I want to check whether the file exists. There are two possible file inputs that can be given, so I need to compare them. The possible inputs are

  • execute cancer 9
  • execute promoter 9

where cancer and promoters are the datasets to be used in the program and 9 is the number of times the script loop has to execute.

Here's what I've come up with:

#!/bin/bash

#Shell script to execute Proj 4 requirements while leaving the folder
#structure alone separated.

file1= "Data/BC/bc80-train-1"
file2= "Data/Promoters/p80-train-1"

if [ "$1" == "cancer" ] then #execute command on the cancer dataset
    echo "Executing on the cancer dataset"
    if [ -f "$file1" ] then
        echo "$file1 file exists..."

    else 
        echo "$file1 file Missing, cancelling execution"
        echo "Dataset must be in ../Data/BC/ and file must be bc80-train-1"
    fi

elif [ "$1" == "promoter" ] then #execute on the promoter dataset
    echo "Executing on the promoter dataset"

    if [ -f "$file2"] then
        echo "$file2 file exists..."

    else
        echo "$file2 file missing, cancelling execution"
        echo "Dataset must be in ~/Data/Promoters/ and file must be p80-train-1"
    fi  
fi

The problem with this is it opens the files and outputs them to terminal, where each line ends in : command not found

I thought the -f and -e flags were used to check whether a file exists. So why is the file content being output to the terminal?

like image 776
Jason Avatar asked Jun 28 '26 05:06

Jason


2 Answers

Drop the space to the right of = in:

file1= "Data/BC/bc80-train-1"
file2= "Data/Promoters/p80-train-1"

Also the keyword then should be on a line by itself or if on the same line as if should have a ; before it:

if [ condition ] ; then
...
fi

OR

if [ condition ]
then
...
fi
like image 92
codaddict Avatar answered Jun 30 '26 21:06

codaddict


Your error messages mix ../Data/ and ~/Data/, but your file1 and file2 don't have either .. or ~ in their definitions:

file1= "Data/BC/bc80-train-1"
file2= "Data/Promoters/p80-train-1"
like image 37
sarnold Avatar answered Jun 30 '26 19:06

sarnold