Bash 脚本函数返回 True-False

Bash 脚本函数返回 True-False

我想通过返回值来查询函数。我的代码如下;

check(){
    file=/root/Turkiye.txt
    local funkx=$1
    while read line; do
        if [ "$line" == "$funkx" ]
        then
            true
            break
        else
            false
        fi
    done < $file
}

printf "Please enter the value : "
read keyboard

if check $keyboard;
then
    echo "yes";
else
    echo "no";
fi

它不起作用,我做错了什么?

答案1

truefalse是分别以成功和失败退出代码退出的命令。它们不会让您的函数返回这些值,为此请使用命令return以及与成功 (0) 或失败(0 以外的任何值)相对应的整数值。另外,我很确定您不想为不匹配的第一行返回失败,只要行匹配:

check(){
    file=/root/Turkiye.txt
    local funkx=$1
    while read line; do
        if [ "$line" == "$funkx" ]
        then
            return 0    # 0 = success ("true"); break is not needed because return exits the function
        fi
    done < $file
    # If a line matched, it won't get here (it will have returned out of the middle
    # of the loop). Therefore, if it gets here, there must not have been a match.
    return 1    # 1 = failure ("false")
}

但有一种更简单的方法可以做到这一点。 Use grep-- 它的工作是在文件中搜索匹配的行。你想要grep -Fxq---F意味着搜索固定字符串(不是正则表达式模式),-x意味着需要匹配整行,而不仅仅是其中的一部分,并且-q意味着不费心打印结果,如果找到匹配,则以成功状态退出,否则失败。您甚至不需要显式return命令,因为该函数将隐式返回其中最后一个命令的状态:

check(){
    file=/root/Turkiye.txt
    local funkx=$1
    grep -Fxq "$funkx" "$file"
}

或者更简单:

check(){
    grep -Fxq "$1" /root/Turkiye.txt
}

答案2

在另一个文件上测试您的代码,它实际上有效,即使效率有点低。假设该/root/Turkiye.txt文件是您有权访问的非空文件,则truefalse调用(因为它们是函数中最后执行的命令)会将函数的退出状态设置为零或非零。

可能只是您在脚本中输入的字符串在您正在读取的文件中无法作为单独的行找到。不幸的是,目前尚不清楚您正在解析的文件是什么样子、您要在脚本中输入什么内容以及您希望在执行此操作时从脚本中获得什么响应。

另请注意,while read line不一定要读线从输入文件。参见例如“理解“IFS=读取-r行”",并且[ ... ]比较两个字符串的运算符中的 is =, not ==

您还需要$keyboard在调用中使用双引号以check避免分词和文件名生成(通配符)。


似乎您想使用函数来确定从用户读取的字符串是否作为特定文件中的一行出现。

这可以更容易地完成

grep -qxF -e "$keyboard" /root/Turkiye.txt

grep命令将在给定文件中搜索字符串并返回零退出状态(真的) 如果发现一行完全相同,否则将返回非零退出状态 (错误的)。这里使用的选项是不-q输出grep任何内容、-x比较整行(不是子字符串)以及-F进行字符串比较(不是正则表达式匹配)。告诉下一个参数是搜索模式(模式中的首字母否则将被视为引入命令行选项)-egrep-

您的脚本已修改:

printf 'Please enter the value: ' >&2
IFS= read -r keyboard

if grep -qxF -e "$keyboard" /root/Turkiye.txt; then
    echo 'yes'
else
    echo 'no'
fi

请注意,我输出提示用户输入字符串到标准错误流。这是按照惯例,允许重定向和使用脚本的输出而不包含提示。

在 中bash,你会使用

IFS= read -r -p 'Please enter the value: ' keyboard

(请注意,bash当您使用 时,也会将提示字符串输出到标准错误流read -p。)

如果您想grep在函数中使用:

check () {
    grep -qxF -e "$1" /root/Turkiye.txt
}

然后使用

if check "$keyboard"; then
    echo 'yes'
else
    echo 'no'
fi

相关内容