3

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?

3
  • None of the code there should output the contents of the file. I assume there is some other code you're not showing us? If you stick set -x near the top of your code, it will output each command before running it, kind of like a debugger for bash. I also highly recomend sticking making the first line #!/bin/bash -u which will error on unset variables Commented Nov 9, 2011 at 4:14
  • I've just started putting the script together. This is really my first time putting together a somewhat complex script and decided to test it in chunks. First step was to check for file existence, second step is to get the loop running. When all that's done, I'll put the executable call in. Commented Nov 9, 2011 at 4:23
  • @Jason: Then please remove your statement about the files being output to the terminal from your question. If you have abstracted them from the problem, they make no sense here! Commented Nov 9, 2011 at 12:06

4 Answers 4

5

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 
Sign up to request clarification or add additional context in comments.

Comments

1

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" 

Comments

1

Remove the space after the = in file1= and file2=

Comments

1

Don't repeat yourself, use a function:

#!/bin/bash checkfile() { echo "Executing on the $1 dataset" file="$2/$3" if [ -f "$file" ] then echo "$file file exists..." else echo "$file file Missing, cancelling execution" echo "Dataset must be in $2 and file must be $3" fi } case $1 in cancer) checkfile $1 Data/BC bc80-train-1 ;; promoter) checkfile $1 Data/Promoters p80-train-1 ;; *) echo "Error: unknown dataset. Use 'cancer' or 'promoter'" ;; esac 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.