Условное присвоение Bash, которое проверяет переменную при построении строки

Я нашел этот вопрос о том, как сделать условное присвоение в bash, но то, что я пытаюсь сделать, немного сложнее, и я не могу понять правильный синтаксис. В моем случае условие состоит в том, чтобы проверить переменную, чтобы увидеть, существует ли она, и выходные данные объединены в строку.

Вот что у меня так далеко:

fwversion="${BASH_REMATCH[1]}.$(( [[ BASH_REMATCH[2] ]] ? BASH_REMATCH[2] : 0 ))"

Который выдает это сообщение об ошибке:

bash: line 41: [[ BASH_REMATCH[2] ]] ? BASH_REMATCH[2] : 0 : syntax error: 
operand expected (error token is "[[ BASH_REMATCH[2] ]] ? BASH_REMATCH[2] : 0 ")

Вот то, что я пытаюсь достичь как код C++:

std::string fwversion = BASH_REMATCH[1] + "." + ((BASH_REMATCH[2]) ? : BASH_REMATCH[2] : 0);

Какой правильный синтаксис для этого в bash? Благодарю.

1 ответ

Решение

Похоже [[ ... ]] не понимаются в арифметическом выражении.

Я бы сделал это:

fwversion=${BASH_REMATCH[1]}
[[ ${BASH_REMATCH[2]} ]] && fwversion+=${BASH_REMATCH[2]} || fwversion+=0

или же

[[ ${BASH_REMATCH[2]} ]] && ext=${BASH_REMATCH[2]} || ext=0
fwversion="${BASH_REMATCH[1]}.$ext"

Если подумать, я бы вообще этого не делал, я бы использовал силу расширения параметров оболочки

str="foo:bar"
if [[ $str =~ ^([a-z]+):([a-z]*)$ ]]; then
    echo "${BASH_REMATCH[1]}.${BASH_REMATCH[2]:-0}"
fi
foo.bar
str="foo:"
if [[ $str =~ ^([a-z]+):([a-z]*)$ ]]; then
    echo "${BASH_REMATCH[1]}.${BASH_REMATCH[2]:-0}"
fi
foo.0
Другие вопросы по тегам