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

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

Входные данные:

echo '1+1' | bc -l

Выход:

2

Попытки:

(не работал)

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

1 ответ

Решение

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

Есть 2 формы замены CMD

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

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

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

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

Ваша линия "она взрыва" говорит, #!/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).

Другие вопросы по тегам