2015-10-09 4 views
0

Я нашел this question для выполнения условного задания в 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? Благодарю.

+0

Это на самом деле C++ кода –

ответ

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" 

На второй мысли, я бы не сделать это на всех, я хотел бы использовать силу оболочечному parameter expansion

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 
+0

Хммм, имеет смысл, хотя и не очень читаемый. Честно говоря, я испытываю соблазн сделать это с if then else заявлениями. –

+0

О! Просто подумал о лучшей альтернативе. Подождите для редактирования ... –

+0

Хорошо, что выглядит намного приятнее. Есть ли ссылка для этого: - построить? –