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