我正在检查变量中是否存在当前字符串:
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?
- 如果在列表中找到一个或定义的文件,则返回 0?
- 如果在列表中找到所有定义的文件,则返回 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"