我编写了一个脚本来检查给定文件是否存在(我仅考虑常规文件) 它显示相反的内容,即如果文件存在则“找不到”,如果文件不存在则“找到”。 我是否搞砸了否则? 请告诉我如何纠正它。
#! /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
答案 0 :(得分:1)
正如我的评论所述,您在return 0
函数中使用了错误的方法return 1
和is_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