Разверните переменные как часть команды в bash - PullRequest
0 голосов
/ 12 мая 2019

Есть ли способ расширить переменные внутри команд?Мне трудно объяснить, чего я хочу достичь, поэтому я продемонстрирую это:

Допустим, у меня есть эта конструкция:

var1="\${var2} -eq 7"

if [ ${var1} ]; do....

И желаемый результат:

if [ ${var2} -eq 7 ]; do....

Теперь, очевидно, это не работает, но как бы я сделал что-то вроде этой работы?

Ответы [ 3 ]

0 голосов
/ 12 мая 2019

За это зло eval:

var1="\${var2} -eq 7"
var2=7
if eval [ ${var1} ]; then
    echo var2 is 7
fi

Обратите внимание, что if ...; do недопустимо, после того, как выражение if приходит then, а не do.

0 голосов
/ 12 мая 2019

Поскольку численная оценка bash действительно расширяет переменные (и, в качестве бонуса, не требует, чтобы они сигнализировались с помощью $), вы можете легко добиться этого в bash:

$ comparison='x==7'
$ x=7
$ if ((comparison)); then echo yup; else echo nope; fi
yup
$ x=8
$ if ((comparison)); then echo yup; else echo nope; fi
nope

Это работает, потому что ((…)) и $((…)) являются числовыми контекстами.Так же как индекс массива и присвоение переменной, объявленной как числовой.(Однако эта функция почти такая же злая, как eval. Избегайте числовой оценки непроверенного ввода.)

0 голосов
/ 12 мая 2019

Вы должны использовать функции для такого рода вещей. Вы также можете использовать eval, но, пожалуйста, не используйте.

$ equalsSeven() (($1 == 7))
$ if equalsSeven 7; then echo Presto; fi
Presto

man bash, /Compound

...