检查文件是否存在

时间:2011-11-09 04:00:39

标签: bash file-io

我正处于项目的最后阶段,需要创建一个脚本,该脚本将使用不同的输入运行可执行文件一定次数。其中一个输入是保存在与可执行文件不同的文件夹中的文件。

在做任何事情之前,我想检查文件是否存在。可以给出两种可能的文件输入,因此我需要对它们进行比较。可能的输入是

  • execute cancer 9
  • execute promoter 9

其中cancerpromoters是要在程序中使用的数据集,9是脚本循环必须执行的次数。

以下是我的想法:

#!/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

这样做的问题是它会打开文件并将它们输出到终端,其中每一行都以: command not found

结尾

我认为-f-e标志用于检查文件是否存在。那么为什么文件内容会输出到终端呢?

4 个答案:

答案 0 :(得分:5)

将空格放在=的右侧:

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

此外,关键字then应该单独排在一行,或者如果与if位于同一行,则该关键字应该在;之前:

if [ condition ] ; then
...
fi

OR

if [ condition ]
then
...
fi

答案 1 :(得分:1)

您的错误消息混合了../Data/~/Data/,但您的file1file2中没有..~定义:

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

答案 2 :(得分:1)

删除file1=file2=

中=后的空格

答案 3 :(得分:1)

不要重复自己,使用功能:

#!/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