On 16/02/2020 18.25, Wolfgang Denk wrote:
> Dear Rasmus,
> 
> In message <20200216152427.e80c7240...@gemini.denx.de> I wrote:
>>
>> So lets change my little script to add setting "left":
>>
>>      slot=none
>>      for i in $BOOT_ORDER ; do
>>      setenv tmp_cmd 'setexpr tmp_val sub '^' "" $'BOOT_${i}_LEFT
>>      run tmp_cmd
>>      test $slot = none && test $tmp_val -gt 0 && slot=$i && left=$tmp_val
>>      done
>>      echo "## Chosen Slot = $slot ; Left = $left"
>>
>> Result:
>>
>>      ## Chosen Slot = C ; Left = 2
> 
> Actually I'm stupid. 

No, but I did notice the above seemed needlessly obfuscated :)

 It's much easier this way, and without the
> ugly printed messages:
> 
>       setenv BOOT_ORDER A B C D
>       setenv BOOT_A_LEFT 0
>       setenv BOOT_B_LEFT 0
>       setenv BOOT_C_LEFT 2
>       setenv BOOT_D_LEFT 5
> 
>       slot=none
>       for i in $BOOT_ORDER ; do
>       setenv tmp_cmd 'setenv tmp_val $'BOOT_${i}_LEFT
>       run tmp_cmd

Nice. So the trick I was missing was to get a literal $, followed by the
("computed") name of the env var I wanted, all embedded in a command to
be run (to invoke the second expansion).

It's a bit tricky, but it does get the job done. There should be some
catalogue of things like this, mentioning "U-Boot shell doesn't directly
have $that feature, but you can often emulate it with something like $this".

>       test $slot = none && test $tmp_val -gt 0 && slot=$i && left=$tmp_val

If performance matters, one can move the tmp_cmd handling after the
slot=none test - then one can also use left directly instead of tmp_val,
so the line only grows by one clause:

        test $slot = none && setenv tmp_cmd 'setenv left $'BOOT_${i}_LEFT &&
run tmp_cmd && test $left -gt 0 && slot=$i

Or as a more readable alternative that still avoids the "run" overhead
and saves one line (and the tmp_var)

        setenv tmp_cmd 'setenv left $'BOOT_${i}_LEFT
        test $slot = none && run tmp_cmd && test $left -gt 0 && slot=$i

Thanks, Wolfgang. Consider both "env set -E" and the alternative "env
get" withdrawn.

Rasmus

Reply via email to