Bash:安全删除所有出现在方括号内的-n吗?

时间:2019-03-29 07:10:59

标签: bash shell boolean is-empty truthiness

我最近在我的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中采用这种模式。这样做是否有任何危险,即两组语法不相等的极端情况?

2 个答案:

答案 0 :(得分:1)

所以我们替代:

-n "$var"   ->    "$var" 
-z "$var"   ->    ! "$var"

看起来还可以,有人这样做。在极少数情况下,删除操作将有害并导致语法错误。这些极端情况特别包括时间,其中var等于有效的test自变量。例如var=-nvar="!"

例如:

$ 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 ]