• tetris11@lemmy.ml
    link
    fedilink
    arrow-up
    0
    ·
    edit-2
    21 hours ago

    I prefer good ole regex test of a binary num

    function isEven(number){
       binary=$(echo "obase=2; $number" | bc)
       if [ "${binary:-1}" = "1" ]; then
             return 255
       fi
       return 0
    }
    
    • balsoft@lemmy.ml
      link
      fedilink
      arrow-up
      0
      ·
      edit-2
      21 hours ago

      Amateur! I can read and understand that almost right away. Now I present a better solution:

      even() ((($1+1)&1))
      

      (I mean, it’s funny cause it’s unreadable, but I suspect this is also one of the most efficient bash implementations possible)

      (Actually the obvious one is a slight bit faster. But this impl for odd is the fastest one as far as I can tell odd() (($1&1)))

      • tetris11@lemmy.ml
        link
        fedilink
        arrow-up
        0
        ·
        20 hours ago

        woah your bash is legit good. I thought numeric pretexts needed $(( blah )), but you’re ommiting the $ like an absolute madman. How is this wizardy possible

          • tetris11@lemmy.ml
            link
            fedilink
            arrow-up
            0
            ·
            16 hours ago

            Oh I see it, but for some reason I was taught to always use $(( arith )) instead of (( arith )) and I guess I’m just wondering what the difference is

            • balsoft@lemmy.ml
              link
              fedilink
              arrow-up
              0
              ·
              edit-2
              16 hours ago

              The difference is that (( is a “compound command”, similar to [[ (evaluate conditional expression), while $(( )) is “aritmetic expansion”. They behave in almost exactly the same way but are used in different contexts - the former uses “exit codes” while the latter returns a string, so the former would be used where you would expect a command, while the latter would be used where you expect an expression.

              This is similar to how there is ( compound command (run in a subshell), and $( ) (command substitution). You can actually use the former to define a function too (as it’s a compound command):

              real_exit() { exit 1; }
              fake_exit() ( exit 1 )
              

              Calling real_exit will exit from the shell, while calling fake_exit will do nothing as the exit 1 command is executed in a separate subshell. Notice how you can also do the same in a command substition (because it runs in a subshell):

              echo $(echo foo; exit 1)
              

              Will run successfully and output foo.

              It is another one of those unknown, very rarely useful features of bash.