• Ephera@lemmy.ml
    link
    fedilink
    English
    arrow-up
    11
    ·
    2 days ago

    Here’s an example, I have looked up many times (like just now), which checks whether a string is empty:

    var=""
    if [ -z "$var" ]; then
        echo "empty"
    else
        echo "not empty"
    fi
    

    Why -z? I have no idea. I will also routinely forget the ]; then part. I believe, if you write the then onto the next line, then you don’t need the semicolon. And then someone’s probably gonna tell me to use double-brackets [[ ]] instead, which probably does something.

    Arguably, I never fully learned Bash syntax, but it also is just a stupid if-statement. There shouldn’t be that much complexity in it.

    • Anna@lemmy.ml
      link
      fedilink
      arrow-up
      3
      ·
      19 hours ago

      -z means zero length and mostly [[ ]] are used when you want to add multiple conditions. But there are also few test cases which are only in bash so they also need double brackets

    • Oriel Jutty@infosec.exchange
      link
      fedilink
      arrow-up
      10
      ·
      2 days ago

      Arguably, I never fully learned Bash syntax, but it also is just a stupid if-statement. There shouldn’t be that much complexity in it.

      There isn’t. The syntax is

      if COMMANDthenCOMMAND(s)...elseCOMMAND(s)...fi
      

      I believe, if you write the then onto the next line, then you don’t need the semicolon.

      Yes, but that’s true of all commands.

      foo; bar; baz
      

      is the same as

      foobarbaz
      

      All the ] and -z stuff has nothing to do with if. In your example, the command you’re running is literally called [. You’re passing it three arguments: -z, "$var", and ]. The ] argument is technically pointless but included for aesthetic reasons to match the opening ] (if you wanted to, you could also write test -z "$var" because [ is just another name for the test command).

      Since you can logically negate the exit status of every command (technically, every pipeline) by prefixing a !, you could also write this as:

      if ! test "$var"; then ...
      

      The default mode of test (if given one argument) is to check whether it is non-empty.

      Now, if you don’t want to deal with the vagaries of the test command and do a “native” string check, that would be:

      case "$var" in  "") echo "empty";;  *) echo "not empty";;esac
      
      • N0x0n@lemmy.ml
        link
        fedilink
        arrow-up
        6
        ·
        2 days ago

        My god… I’m so confused by your comment XD ! OP’s command is something I already came across, so I somehow got it… But your comment put me in total brain rot !

    • balsoft@lemmy.ml
      link
      fedilink
      arrow-up
      11
      arrow-down
      1
      ·
      edit-2
      2 days ago

      Why -z? I have no idea.

      From man test (note that [ <expr> ] is just sugar for test <expr>):

             -n STRING
                    the length of STRING is nonzero
      
             -z STRING
                    the length of STRING is zero
      

      So, -z stands for Zero.

      Hope this helps you remember it!