Лучшее, что я могу придумать:
if [ "${tag:+A}" != "${flag:+A}" ]; then
echo yes
else
echo no
fi
"${foo:+bar}"
расширяется до bar
, если foo
не пусто, и пустая строка в противном случае.
"${tag:+A}"
нормализует значение $tag
: если оно пустое, оно остается пустым;если оно не пустое, оно превращается в A
.
xor
- это просто неравенство по логическим значениям.Здесь мы используем неравенство для нормализованных строк вместо этого, что обеспечивается оператором !=
[
.
Для общего решения с двумя произвольными командами foo
и bar
(не только тесты is-string-empty), вы можете использовать следующее:
if if foo; then ! bar; else bar; fi; then
...
else
...
fi
Это выглядит немного ужасно, и вам нужно повторить bar
дважды, но я не могу придумать более краткогоспособ выразить это.
Вы можете запустить обе команды заранее и сохранить их состояния выхода в переменных, что уберет повторение bar
, но в целом увеличит код.