Подтвердить что ты не робот

Как назначить вывод переменной shellscript?

Как назначить этот результат переменной оболочки?

Input:

echo '1+1' | bc -l

Вывод:

2

Попытки

(не работает)

#!bin/sh
a=echo '1+1' | bc -l
echo $a
4b9b3361

Ответ 1

Вы ищете функцию оболочки, называемую командной подстановкой.

Существует 2 формы замены cmd

  • Оригинал, вернувшийся к каменному возрасту, но полностью портативный и доступный во всех Unix-подобных оболочках (ну почти все).

    Вы включаете команды генерирования значения внутри символов обратного тика, т.е.

    $ a=`echo 1+1 | bc -l`
    $ echo $a
    2
    $
    
  • Современная, менее неуклюжая, легко устанавливаемая cmd-подстановка, снабженная $( cmd ), т.е.

    $ a=$(echo 1+1 |  bc -l)
    $ echo $a
    2
    $
    

В строке "she-bang" говорится: #!/bin/sh, поэтому, если вы работаете на реальной платформе Unix, скорее всего, ваш /bin/sh является исходной оболочкой Bourne и потребует, чтобы вы использовали опцию 1 выше.

Если вы попробуете вариант 2 при использовании #!/bin/sh, и он работает, тогда у вас есть современная оболочка. Попробуйте ввести echo ${.sh.version} или /bin/sh -c --version и посмотреть, есть ли у вас какая-либо полезная информация. Если вы получите номер версии, вам нужно узнать о дополнительных функциях, которые содержат более новые оболочки.

Говоря о новых функциях, если вы действительно используете bash, zsh, ksh93 +, тогда вы можете переписать свой пример кода как

a=$(( 1+1 ))

Или, если вы делаете больше математических операций, все это останется в пределах области действия, вы можете использовать арифметику с оболочкой, например:

(( b=1+1 ))
echo $b
2

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