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

У меня возникла проблема поместить содержимое команды pwd в переменную оболочки, которую я буду использовать позже.

Вот мой код оболочки (цикл не останавливается):

#!/bin/bash
pwd= `pwd`
until [ $pwd = "/" ]
    do
        echo $pwd
        ls && cd .. && ls 
        $pwd= `pwd` 
    done

Не могли бы вы заметить мою ошибку, пожалуйста?

Ответ 1

Пытаться:

pwd='pwd'

или же

pwd=$(pwd)

Обратите внимание, что после знака равенства не должно быть пробелов.

Также, как указывает г-н Вайс; вы не присваиваете $pwd, вы присваиваете pwd.

Ответ 2

В оболочке вы назначаете переменную без знака доллара:

TEST=`pwd`
echo $TEST

что лучше (и может быть вложенным), но не настолько переносим, ​​как выходы:

TEST=$(pwd)
echo $TEST

Всегда помните: знак доллара используется только при чтении переменной.

Ответ 3

В этом конкретном случае обратите внимание, что bash имеет переменную, называемую PWD, которая содержит текущий каталог: $PWD эквивалентен до `pwd`. (Так же, как и другие оболочки, это стандартная функция .) Итак, вы можете написать свой script следующим образом:

#!/bin/bash
until [ "$PWD" = "/" ]; do
  echo "$PWD"
  ls && cd .. && ls 
done

Обратите внимание на использование двойных кавычек вокруг ссылок на переменные. Они необходимы, если переменная (здесь, текущий каталог) содержит пробельные символы или подстановочные знаки (\[?*), поскольку оболочка разбивает результат разложения переменных на слова и выполняет подталкивание этих слов. Всегда разворачивать разметку переменных "$foo" и замену команд "$(foo)" (если вы специально не знаете, что вам не нужно).

В общем случае, как уже упоминались другие ответы:

  • Вы не можете использовать пробелы вокруг знака равенства в присваивании: var=value, not var = value
  • $ означает "принять значение этой переменной", поэтому вы не используете его при назначении: var=value, а не $var=value.

Ответ 4

Вы также можете делать более сложные команды, чтобы округлить примеры выше. Итак, скажем, я хочу получить количество процессов, запущенных в системе, и сохранить их в переменной ${NUM_PROCS}.

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

Это выглядит примерно так:

NUM_PROCS=$(ps -e | sed 1d | wc -l)

Я надеюсь, что это поможет добавить некоторую полезную информацию в это обсуждение.

Ответ 5

Здесь ваш script...

DIR=$(pwd)
echo $DIR
while [ "$DIR" != "/" ]; do
    cd ..
    DIR=$(pwd)
    echo $DIR
done

Обратите внимание на пробелы, использование кавычек и знака $.