如果是负数或bash中的函数?

如果是负数或bash中的函数?

我正在检查变量中是否存在当前字符串:

check_string() {
    if [[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]];
    then
        return 0
    else
        return 1
    fi
}
check_string

问题是第二个条件[[ ! "$FILES" =~ "xyz" ]]永远不会被评估。

但是当我不否定它时,就会评估第二个条件[[ "$FILES" =~ "xyz" ]]

check_string() {
    if [[ "$FILES" =~ "abcd" ]] || [[ "$FILES" =~ "xyz" ]];
    then
        return 0
    else
        return 1
    fi
}
check_string

有任何想法吗 ?

答案1

如果第一个条件始终为真,则永远不会评估第二个条件。

您没有提到 的内容$FILES,但似乎$FILES永远不会与“abcd”相似,因此否定始终为真。

答案2

你的测试

[[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]]

是由于德摩根定律, 相当于

! [[ "$FILES" =~ "abcd" && "$FILES" =~ "xyz" ]]

只要字符串与$FILES两个正则表达式都不匹配,测试就始终为真。

另请注意,您的函数不必显式返回一或零。就足够了

check_string() {
    [[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]]
}

函数的退出状态将是函数中最后执行的命令的退出状态。


如果您正在对列表进行操作文件名或路径名,然后不要将它们存储在字符串中。这将阻止您的脚本处理包含空格的文件名。相反,使用适当的数组来存储路径名。

答案3

我想这是一个逻辑上的误解。如果你能说出你想做什么就好了。

  1. 如果定义的文件之一缺少列表,则返回 1?
  2. 如果一个或所有定义的文件缺少列表,则返回 1?
  3. 如果在列表中找到一个或定义的文件,则返回 0?
  4. 如果在列表中找到所有定义的文件,则返回 0?

Atm 我可以告诉你这两个条件都会被执行。

如果您输入set -x脚本,bash 将向您打印评估的内容。

$ cat check_string.sh
#!/usr/bin/env bash
set -x
check_string() {
if [[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]];
then
    return 0
else
    return 1
fi

这是我的支票。

$ FILES="abcd lmo xyz" ./check_string.sh                 
+ check_string
+ [[ ! abcd lmo xyz =~ abcd ]]
+ [[ ! abcd lmo xyz =~ xyz ]]
+ return 1
$ FILES="abcd lmo" ./check_string.sh    
+ check_string
+ [[ ! abcd lmo =~ abcd ]]
+ [[ ! abcd lmo =~ xyz ]]
+ return 0
$ FILES="lmo xyz" ./check_string.sh
+ check_string
+ [[ ! lmo xyz =~ abcd ]]
+ return 0
$ FILES="abcd" ./check_string.sh
+ check_string
+ [[ ! abcd =~ abcd ]]
+ [[ ! abcd =~ xyz ]]
+ return 0
$ FILES="lmo" ./check_string.sh
+ check_string
+ [[ ! lmo =~ abcd ]]
+ return 0
$ FILES="xyz" ./check_string.sh
+ check_string
+ [[ ! xyz =~ abcd ]]
+ return 0
}
check_string

另外:我觉得条件可以写清楚一点。改变

if [[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]];

if [[ ! "$FILES" =~ "abcd" || ! "$FILES" =~ "xyz" ]];

答案4

替代实现(不是 bash 特定的)

check_string() {
    case "$1" in  
        *abcd*|*xyz*) return 1 ;;
        *) return 0
    esac
}
check_string "$FILES"

相关内容