在Shell脚本中检查文件是否存在错误

时间:2018-08-06 13:56:07

标签: bash

我编写了一个脚本来检查给定文件是否存在(我仅考虑常规文件) 它显示相反的内容,即如果文件存在则“找不到”,如果文件不存在则“找到”。 我是否搞砸了否则? 请告诉我如何纠正它。

#! /bin/bash
is_file_exists(){
 local file="$1"
 if  [[ -f "$file" ]]
 then
  return 1
 else
 return 0
 fi
}

if [[ "$#" -eq 0 ]]
then
 echo "enter a file name" 
 exit
fi

if ( is_file_exists "$1" )
then
  echo "file found"
else
  echo "not found"
fi

3 个答案:

答案 0 :(得分:1)

正如我的评论所述,您在return 0函数中使用了错误的方法return 1is_file_exists,并且应该使用:if is_file_exists "$1",即没有括号。

Shell if语句测试给定命令的成功或失败。成功定义为返回值为零。因此,也许您获得了这种回报,因为您可能来自C,Java或类似的语言,其中零为 false 。用成功或失败而不是正确或错误来思考。

我还建议了其他一些调整,包括一致的缩进:

#! /bin/bash
is_file_exists(){

    local file="$1"

    # [ (test) could have been used here
    # Is the name given a regular file?        
    if  [[ -f $file ]]     # quotes not required with [[ (but are with [ )
    then
        return 0
    else
        return 1
    fi
}

# Use (( )) for arithmetic comparisons
if (( $# == 0 ))
then
    echo "enter a file name" >&2       # error messages should go to stderr
    exit
fi

# Delimit filenames on display, shows unintended whitespace
if is_file_exists "$1"
then
    echo "'$1' file found"
else
    echo "'$1' not found"
fi

答案 1 :(得分:0)

首先,您不检查是否存在(-e);您正在检查它是否存在并且是常规文件。

第二,如果不存在,则返回0(成功)。

但是由于函数的返回值是最后一个命令的返回值,因此根本不需要if / else

is_file_exists() {
   test -f "$1"
}

重写程序(作为可移植的shell,因为它不需要Bash特定的任何东西):

#!/bin/sh

regular_file_exists() {
   test -f "$1"
}

# Is it used correctly?
if [ $# -ne 1 ]
then
  echo "enter a file name" >&2
  exit 1
fi

if regular_file_exists "$1"
then
  echo "file found"
else
  echo "not found"
fi

答案 2 :(得分:0)

如果您仍然希望保留is_file_exists()函数的“反逻辑”,则可以执行以下操作:

#! /bin/bash
is_file_exists(){
 local file="$1"
 if  [[ -f "$file" ]]
 then
  return 1
 else
  return 0
 fi
}

if [[ "$#" -eq 0 ]]
then
 echo "enter a file name" 
 exit
fi

is_file_exists "$1"
retVal=$?

if [ $retVal -ne 0 ]; then
  echo "file found"
else
  echo "not found"
fi

这会将函数的返回值存储到retVal变量中,并检查其值以提供所需的输出。

此外,如@Toby所建议,另一种解决方案是(跳过功能):

if [[ "$#" -eq 0 ]]
then
 echo "enter a file name" 
 exit
fi

if ! is_file_exists "$1"; then
  echo "file found"
else
  echo "not found"
fi