我最近在我的bash脚本中发现了这个“错误”;
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
string password = value.ToString();
var errorMessage = "";
if (password.Length < 8)
{
errorMessage += "Password must contain at least 8 characters.";
}
if (password.Count(c => char.IsLower(c)) == 0)
{
errorMessage += "Password must contain a lowercase character.";
}
//other rules
if(String.IsNullOrEmpty(errorMessage))
{
return ValidationResult.Success;
}
else
{
return new ValidationResult(errorMessage);
}
}
我的意思是检查if [ "$var" ]; then
echo "Condition is true"
fi
是否为非空,即$var
。碰巧的是,在没有[ -n "$var" ]
的情况下,代码似乎可以正常工作。同样,我发现可以将-n
替换为[ -z "$var" ]
。
基于其他语言中变量的(非)空性,我倾向于喜欢这种隐式的虚假性(真实性),因此我也可能在bash中采用这种模式。这样做是否有任何危险,即两组语法不相等的极端情况?
答案 0 :(得分:1)
所以我们替代:
-n "$var" -> "$var"
-z "$var" -> ! "$var"
看起来还可以,有人这样做。在极少数情况下,删除操作将有害并导致语法错误。这些极端情况特别包括时间,其中var
等于有效的test
自变量。例如var=-n
或var="!"
等
例如:
$ v1="-n" v2=""; [ -n "$v1" -o -z "$v2" ]; echo $?
0
但是
$ v1="-n" v2=""; [ "$v1" -o ! "$v2" ]; echo $?
bash: [: too many arguments
2
也就是说,在不使用-o
和-a
的情况下,我无法在系统(bash 5.0.0)上找到破坏它的方法。而且无论如何,测试手册页建议使用&&
和||
而不是-a
和-o
。
但是在POSIX specification test中,我们可以找到以下应用笔记:
两个命令:
测试“ $ 1”
测试! “ $ 1”在某些历史系统上无法可靠使用。意外 如果使用这样的字符串表达式和$ 1,则会出现结果 扩展为'!','('或已知的一元基数。更好的构造方法是:
test -n“ $ 1”
测试-z“ $ 1”
因此,我认为只要您不使用“某些历史系统”,就可以安全。但这值得冒险吗?你必须自己回答。
那是主观的:我更重视可维护性和可读性,然后保存第3个字符并发现-n
和-z
更具可读性。 -n
的意图很明确-测试字符串的长度是否为-n
为零。 -z
的意图也很明确-测试字符串是否具有-z
ero长度。我发现写[ "$var" ]
和[ ! "$var" ]
会使其他人感到困惑。起初,$var
在[
]
内部看起来有些特殊含义。
我最近在我的bash脚本中发现了这个“错误”
这不是错误,而是功能!
答案 1 :(得分:0)
首先,您使用单括号。这意味着您正在使用test
命令,而不是Bash内置函数。从手册中:
test EXPRESSION
或[ EXPRESSION ]
:这将以EXPRESSION
返回的状态退出
-n STRING
:STRING
的长度不为零。
STRING
:等同于-n STRING
来源:
man test
这应该回答您的问题。
此外:
! EXPRESSION
:test
返回EXPRESSION
中的 true 为 false
-z STRING
:如果test
的长度为零,则STRING
返回 true 。
这暗示[ ! STRING ]
等同于[ -z STRING ]
。