Условное присвоение 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