Eli Schwartz wrote:
> On 7/1/25 10:41 PM, Grant Edwards wrote:
>> On 2025-07-02, Eli Schwartz <eschwa...@gentoo.org> wrote:
>>
>>> if [ "$?" -eq "0" ] ; then
>>>     echo "Crypt file system is open"
>>> else
>>>     echo "Crypt is not open.  Please enter passphrase."
>>>     cryptsetup open $LVM_DEV crypt
>>> fi
>>>
>>> This makes your eyes get drawn to the lines that are aligned left, which
>>> have the "when shall I run it?" logic. You can easily tell that
>>> "cryptsetup open" happens AFTER the "else".
>> Maybe it's just me, but I've switched from using [ ] to [[ ]].  I find
>> it works right the first try way more often. It's a bash built-in, and
>> the quoting and whitespace handling seems to work more like my brain
>> expects.  After decades of using [ ], I was still regularly tripped up
>> in ways that I don't seem to be using [[ ]].
> Yes, in general [[ is better than [
>
> The practical difference is that it is parsed as a keyword, not as an
> ordinary command, hence it knows what is inside of it without whitespace
> handling. i.e.
>
> [[ $FOO = bar ]]
>
> $FOO does not need quotes because [[ runs *before* word splitting.
>
> It also supports regex!
>
>
> $ FOO="something"
>
> $ [[ $FOO =~ ^s(.*)e(.*)n ]]
>
> $ declare -p BASH_REMATCH
> declare -a BASH_REMATCH=([0]="somethin" [1]="om" [2]="thi")
>
>
> It's very powerful and purely additive over [
>
> But it doesn't matter when pointing out how bash does whitespace
> splitting of commands. :)
>
>
>>  [And it's even support
>> by busybox's ash shell.]
>
> Beware that busybox ash supports [[ "partially".
>
> From the busybox source code comments:
>
>
>
> /* BASH_TEST2: [[ EXPR ]]
>  * Status of [[ support:
>  *   && and || work as they should
>  *   = is glob match operator, not equality operator: STR = GLOB
>  *   == same as =
>  *   =~ is regex match operator: STR =~ REGEX
>  * TODO:
>  * singleword+noglob expansion:
>  *   v='a b'; [[ $v = 'a b' ]]; echo 0:$?
>  *   [[ /bin/n* ]]; echo 0:$?
>  * quoting needs to be considered (-f is an operator, "-f" and ""-f are
> not; etc)
>  * ( ) < > should not have special meaning (IOW: should not require quoting)
>  * in word = GLOB, quoting should be significant on char-by-char basis:
> a*cd"*"
>  */
> #define    BASH_TEST2           (ENABLE_ASH_BASH_COMPAT * ENABLE_ASH_TEST)
>
>
>
> -- Eli Schwartz


Should I change mine from a single [ ] to a double [[ ]]?  For future
compatibility if nothing else? 

Dale

:-)  :-) 

Reply via email to