LinuxForum.Fans
Тема

Не работает присваивание через скобки в bash

Автор: trivium 18 сообщений 4931 просмотров
#314231

Доброго времени суток.
Пытаюсь запустить на bash и там есть присваивание значения переменной через скобки:

text
ORIG_SIZES=( $( ffmpeg -i "$PATH_BASE_SOURCE/$file" 2>&1 | grep -o "[0-9]\{2,\}x[0-9]\{2,\}[, ]" | tr -d , | cut -d "x" -f1,2 --output-delimiter=" " ) )

И shell ругается так:

./queueListine.sh: 26: ./queueListine.sh: Syntax error: "(" unexpected (expecting "done")

Но если заменять открывающие скобки на кавычки, то скрипт идёт дальше:

text
ORIG_SIZES=" $( ffmpeg -i "$PATH_BASE_SOURCE/$file" 2>&1 | grep -o "[0-9]\{2,\}x[0-9]\{2,\}[, ]" | tr -d , | cut -d "x" -f1,2 --output-delimiter=" " ) "

В инете прочитал, что скобки это новый способ присвоения, а кавычки старый. Надо что-то доставить или поменять в настройках, чтобы скобки стали поддерживаться? Ubuntu последняя стоит.

#314235

можете т даже кавычки не ставить...)))
возможно в каком-то шелле () - это присваивание значения(есть подозрение на csh), а в баше такого нет...
В баше () - это обьединение вывода нескольких команд...

#314240
Харитон написал:
можете т даже кавычки не ставить...)))
возможно в каком-то шелле () - это присваивание значения(есть подозрение на csh), а в баше такого нет...
В баше () - это обьединение вывода нескольких команд...

А можно как-то не меняя скрипта решить эту проблему? Потому-как в OpenSUSE этот скрипт запускается без этой ошибки.

#314244

А как отличаются версии bash "в" и "не в" OpenSUSE?

#314245
"bormant" написал:
А как отличаются версии bash "в" и "не в" OpenSUSE?

Походу тем, что имеется ввиду dash.


Вроде бы так можно сменить dash на bash в убунте:

text
$dpkg-reconfigure bash
#314247
bormant написал:
А как отличаются версии bash "в" и "не в" OpenSUSE?

Честно говоря без понятия, я с башем только начал разбираться.

#314248
"trivium" написал:
Честно говоря без понятия, я с башем только начал разбираться.

Cообщение выше прочитайте. Не оно?

#314252
verg написал:
[quote="trivium"]Честно говоря без понятия, я с башем только начал разбираться.

Cообщение выше прочитайте. Не оно?[/quote]
Ввёл только что эту команду, выдало:

update-alternatives: using /usr/share/man/man7/bash-builtins.7.gz to provide /usr/share/man/man7/builtins.7.gz (builtins.7.gz) in автоматический режим

Но баг тот со скобками остался.

#314254
"trivium⇓" написал:
Пытаюсь запустить на bash и там есть присваивание значения переменной через скобки:

это не присваивание через скобки, это создание массива. смотри abs: http://tldp.org/LDP/abs/html/arrays.html

в данной строке синтаксической ошибки нет.... да и по логике вроде правильно... разве что в пореве из tr'ов и grep'ов что-то закралось...

"trivium⇓" написал:
А можно как-то не меняя скрипта решить эту проблему? Потому-как в OpenSUSE этот скрипт запускается без этой ошибки.

телепаты как обычно все куда-то разбежались... что за скрипт то?

"Харитон⇓" написал:
В баше () - это обьединение вывода нескольких команд...

врёшь. это запуск сабшела, объединение команд это {}... но это из другой оперы...

#314257
Fat-Zer написал:
[quote="trivium⇓"]Пытаюсь запустить на bash и там есть присваивание значения переменной через скобки:

это не присваивание через скобки, это создание массива. смотри abs: http://tldp.org/LDP/abs/html/arrays.html

в данной строке синтаксической ошибки нет.... да и по логике вроде правильно... разве что в пореве из tr'ов и grep'ов что-то закралось...

"trivium⇓" написал:
А можно как-то не меняя скрипта решить эту проблему? Потому-как в OpenSUSE этот скрипт запускается без этой ошибки.

телепаты как обычно все куда-то разбежались... что за скрипт то?

"Харитон⇓" написал:
В баше () - это обьединение вывода нескольких команд...

врёшь. это запуск сабшела, объединение команд это {}... но это из другой оперы...[/quote]
Это скрипт конвертации видео через ffmpeg. В той строчке должен определяться оригинальный размер видео, но если скобки заменять кавычками, то переменная ORIG_SIZE получается пустой, а со скобками выдаёт синтаксичекскую ошибку.
И там точно не tr или grep, т.к. если написать ORIG_SIZE=() то выходит та же ошибка.

#314263
"trivium⇓" написал:
Это скрипт конвертации видео через ffmpeg. В той строчке должен определяться оригинальный размер видео

спасибо, кэп...

"trivium⇓" написал:
но если скобки заменять кавычками, то переменная ORIG_SIZE получается пустой, а со скобками выдаёт синтаксичекскую ошибку.

ошибка может быть в другой строчке...

уж не знаю, как ещё намекнуть, что его надо выложить... и выложить полностью...

ладно... попробую телепатом побыть: подозреваю, что в начале кто-то умный в хеш-банге написал #!/bin/sh вмисто #!/bin/bash.

"trivium⇓" написал:
И там точно не tr или grep, т.к. если написать ORIG_SIZE=() то выходит та же ошибка.

просто заметил, что это плохо-читаемое порево, которое может глючить, в котором можно леко пропустить ошибку итд... вместо этого лучше освоить sed/awk или хотя бы баш получше...

#314356
Fat-Zer написал:
[quote="trivium⇓"]Это скрипт конвертации видео через ffmpeg. В той строчке должен определяться оригинальный размер видео

спасибо, кэп...

"trivium⇓" написал:
но если скобки заменять кавычками, то переменная ORIG_SIZE получается пустой, а со скобками выдаёт синтаксичекскую ошибку.

ошибка может быть в другой строчке...

уж не знаю, как ещё намекнуть, что его надо выложить... и выложить полностью...

ладно... попробую телепатом побыть: подозреваю, что в начале кто-то умный в хеш-банге написал #!/bin/sh вмисто #!/bin/bash.

"trivium⇓" написал:
И там точно не tr или grep, т.к. если написать ORIG_SIZE=() то выходит та же ошибка.

просто заметил, что это плохо-читаемое порево, которое может глючить, в котором можно леко пропустить ошибку итд... вместо этого лучше освоить sed/awk или хотя бы баш получше...[/quote]

О, да точно) Поменял на #!/bin/bash и заработало) Спасибо)

#314407

Ещё вопрос...
Как правильно работать с if?
Пишу вот так:

text
if [ $TARGETHEIGHT >= $ORIG_SIZES[1] ]

И выводится сообщение:

ожидается использование унарного оператора

И скрипт не отваливается и идёт дальше.

#314470

Вместо «>=» используйте «-ge».

"trivium" написал:
И скрипт не отваливается и идёт дальше.

set -e на второй-третьей строке после sha-bang'а добавьте.

#314483
yars написал:
Вместо «>=» используйте «-ge».
[quote="trivium"]И скрипт не отваливается и идёт дальше.

set -e на второй-третьей строке после sha-bang'а добавьте.[/quote]

Спасибо, уже решил так:

text
            tmpheight=${ORIG_SIZES[1]}
            if [ "$tmpheight" -lt "$TARGETHEIGHT" ]
#314511
"trivium⇓" написал:
tmpheight=${ORIG_SIZES[1]}
if [ "$tmpheight" -lt "$TARGETHEIGHT" ]

временная переменная тут совершенно ни к чему....

#314633
Fat-Zer написал:
[quote="trivium⇓"] tmpheight=${ORIG_SIZES[1]}
if [ "$tmpheight" -lt "$TARGETHEIGHT" ]

временная переменная тут совершенно ни к чему....[/quote]
Но зато заработало так...

#314634
"trivium⇓" написал:
Но зато заработало так...
text
 if [ "${ORIG_SIZES[1]}" -lt "$TARGETHEIGHT" ]

так тоже прекрасно работало бы...

Войдите или зарегистрируйтесь, чтобы ответить.