- Вывод команды BASH в переменную
- Вывод одной команды в переменную
- Пример № 1:
- Пример № 2:
- Пример № 3:
- Пример №4:
- Использование подстановки команд в цикле
- Пример № 5:
- Использование вложенных команд
- Пример № 6:
- Использование пути к команде
- Пример № 7:
- Использование аргумента командной строки
- Пример № 8:
- Заключение:
- How do I redirect output to a variable in shell? [duplicate]
- 8 Answers 8
- The answer to the question is to use the read command.
- Here’s how you do it
- Here is what it is doing and why it is important:
- Сохранить результат команды в переменную
- Linux присвоить переменной результат выполнения команды
Вывод команды BASH в переменную
Различные типы команд bash необходимо запускать из терминала в зависимости от требований пользователя. Когда пользователь запускает любую команду с терминала, он показывает вывод, если ошибки не существует, в противном случае отображается сообщение об ошибке. Иногда выходные данные команды необходимо сохранить в переменной для использования в будущем. Для этой цели можно использовать функцию подстановки команд оболочки в bash. В этом руководстве показано, как с помощью этой функции можно сохранять различные типы команд оболочки в переменной.
variable = $ (command)
variable = $ ( команда [параметр…] аргумент1 аргумент2…)
переменная = $ (/путь/к/команде)
variable = `command`
variable =` command [option…] argument1 arguments2… `
variable =`/path/to/command`
*** Примечание. Не используйте пробелы до и после знака равенства при использовании приведенных выше команд.
Вывод одной команды в переменную
Команды Bash могут использоваться без каких-либо параметров и аргументов для тех команд, где эти части являются необязательными. В следующих двух примерах показано использование простой подстановки команд.
Пример № 1:
bash ` Команда date` используется для отображения текущей даты и времени. Следующий скрипт сохранит вывод команды ` date` в переменную $ current_date с помощью подстановки команд.
Пример № 2:
`pwd` команда показывает путь к текущему рабочему каталогу. Следующий скрипт сохраняет вывод команды `pwd` в переменную $ current_dir , а значение этой переменной печатается с использованием Команда `echo` .
Команда с параметром и аргументом
Параметр и аргумент являются обязательными для некоторых команд bash. В следующих примерах показано, как сохранить вывод команды с параметром и аргументом в переменной.
Пример № 3:
Команда Bash ` wc` используется для подсчета общего количества строк, слов и символов в любом файле. Эта команда использует -c, -w и -l в качестве параметра и имя файла в качестве аргумента для генерации вывода. Создайте текстовый файл с именем fruit.txt со следующими данными для проверки следующего скрипта.
fruit.txt
Выполните следующие команды для подсчета и сохранения общего количества слов в файле fruit.txt в переменной $ count_words и распечатайте значение, используя ` Команда echo` .
Пример №4:
` cut` — еще одна команда bash, которая использует параметр и аргумент для генерации вывода. Создайте текстовый файл с именем weekday.txt с названиями семи дней недели для запуска следующего скрипта.
Создайте файл bash с именем cmdsub1.sh с помощью следующего скрипта. В этом скрипте цикл while используется для построчного чтения содержимого файла weekday.txt и чтения первых трех символов каждой строки с помощью ` Команда cut` . После вырезания строковое значение сохраняется в переменной $ day . Затем, если оператор используется для проверки значения $ day , является « Sun» или нет. На выходе будет напечатано « Воскресенье — выходной », если условие истинно, в противном случае будет напечатано значение $ day .
#!/bin/bash
filename = ‘weekday.txt’
пока читаем строку; do
day = `echo $ line | cut -c 1-3`
if [$ day == «Sun»]
then
echo «Воскресенье — выходной»
else
echo $ day
fi
done
Использование подстановки команд в цикле
Вы можете сохранить результат подстановки команды в любой переменной цикла, показанной в следующем примере.
Пример № 5:
Создайте файл с именем cmdsub2.sh со следующим кодом. Здесь команда ` ls -d */` используется для получения всего списка каталогов из текущего каталога. Здесь цикл For используется для чтения каждого каталога из вывода и сохранения его в переменной $ dirname , которая печатается позже.
Использование вложенных команд
Как вы можете использовать несколько команд с помощью вертикальной черты (|), показано в предыдущем примере. . Но вы можете использовать вложенные команды при подстановке команд, где вывод первой команды зависит от вывода второй команды и работает противоположно команде pipe (|).
Синтаксис вложенных команд:
Пример № 6:
Две команды, ` echo ` и ` who ` используются в этом пример в качестве вложенной команды. Здесь сначала будет выполнена команда ` who `, которая распечатает информацию о текущем вошедшем в систему пользователе. Вывод команды ` who `команда будет выполняться командой` echo `, а вывод` echo `будет сохранен в переменной $ var . Здесь вывод команды ` echo ` зависит от вывода команды Команда ` who `.
Использование пути к команде
Если вы знаете путь к команде, вы можете запустить команду, указав команду путь при использовании подстановки команд. В следующем примере показано использование пути к команде.
Пример № 7:
`whoami` показывает имя пользователя, вошедшего в систему в данный момент. По умолчанию эта команда хранится в папке / usr/ bin/. Запустите следующий сценарий, чтобы запустить команду ` whoami` , используя путь и сохранить в переменной, $ output, и распечатать значение $ вывод .
Использование аргумента командной строки
Вы можете использовать аргумент командной строки с командой в качестве аргумента при подстановке команды.
Пример № 8:
Создайте файл bash с именем cmdsub3.sh с помощью следующего скрипта. Команда ` basename ` используется здесь для извлечения имени файла из 2 аргумента командной строки nd и сохраняется в переменной $ filename . Мы знаем, что аргумент командной строки 1 st — это имя исполняемого скрипта, которое обозначается символом $ 0.
Запустите сценарий со следующим значением аргумента.
Здесь базовое имя пути, Desktop/temp/hello.txt — это ‘ hello.txt ‘. Итак, значение $ filename будет hello.txt .
Заключение:
В этом руководстве показаны различные варианты использования подстановок команд. Если вам нужно работать с несколькими командами или зависимыми командами и временно сохранить результат для выполнения некоторых других задач позже, вы можете использовать эту функцию в своем скрипте, чтобы получить результат.
How do I redirect output to a variable in shell? [duplicate]
I want to get stream generated by genhash in a variable. How do I redirect it into a variable $hash to compare inside a conditional?
if [ $hash -ne 0 ] then echo KO exit 0 else echo -n OK exit 0 fi
This question is the older than the linked answer. Therefore the linked answer is the duplicate, and should be marked as «asked before», not this one.
Bash and Shell are different things, hence it’s no duplicate. Shell doesn’t support all of bash’s features.
8 Answers 8
hash=$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)
This captures the output of a command, but it does not use a redirect. If you actually need to use a redirect because of a more complex need, See my answer. Google brought you here, right? Why go somewhere else to find the answer you searched for?
@Kayvar when you use $( . ) it uses new subshell, so the result of command can be not the same as in the primary shell
It would be helpful to others if you made it clear whether this only captures STDOUT or if it also captures STDERR. It would also be very helpful if you could show how to print the exit code of the command inside $(. )
But, because pipes create forks, you have to use $foo before the pipe ends, so.
echo "abc" | ( read foo; date +"I received $foo on %D"; )
Sure, all these other answers show ways to not do what the OP asked, but that really screws up the rest of us who searched for the OP’s question.
The answer to the question is to use the read command.
Here’s how you do it
# I would usually do this on one line, but for readability. series | of | commands \ | \ ( read string; mystic_command --opt "$string" /path/to/file ) \ | \ handle_mystified_file
Here is what it is doing and why it is important:
- Let’s pretend that the series | of | commands is a very complicated series of piped commands.
- mystic_command can accept the content of a file as stdin in lieu of a file path, but not the —opt arg therefore it must come in as a variable. The command outputs the modified content and would commonly be redirected into a file or piped to another command. (E.g. sed , awk , perl , etc.)
- read takes stdin and places it into the variable $string
- Putting the read and the mystic_command into a «sub shell» via parenthesis is not necessary but makes it flow like a continuous pipe as if the 2 commands where in a separate script file.
There is always an alternative, and in this case the alternative is ugly and unreadable compared to my example above.
# my example above as a oneliner series | of | commands | (read string; mystic_command --opt "$string" /path/to/file) | handle_mystified_file # ugly and unreadable alternative mystic_command --opt "$(series | of | commands)" /path/to/file | handle_mystified_file
My way is entirely chronological and logical. The alternative starts with the 4th command and shoves commands 1, 2, and 3 into command substitution.
I have a real world example of this in this script but I didn’t use it as the example above because it has some other crazy/confusing/distracting bash magic going on also.
Сохранить результат команды в переменную
У меня создание переменной LINEFIO=$($|iconv -f ‘windows-1251’ -t ‘UTF-8′) заканчивается сообщением line 282: $’\317\340\342\353\376\352\345\342\350\367’: команда не найдена хотя просто echo «$|iconv -f ‘windows-1251’ -t ‘UTF-8′» проходит на ура, в чем дело ? L
test=$(curl -I ya.ru) % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 —:—:— —:—:— —:—:— 0
@HelloKatty curl выводит в STDERR прогресс загрузки. Это не попадает в переменную. Рабочий пример: TEST=$(curl https://ya.ru) Теперь в переменной $TEST находится куча HTML: echo $TEST
Команду в обратные апострофы:
RESULT=`ibus engine` echo $RESULT
$ engine="ibus engine" $ $engine xkb:ru::rus
@dimka3210, объясните, пожалуйста зачем в начале каждой строки доллар. Где можно почитать про это? У меня так не работает
Но это вы просто записали команду в переменную, а как мне записать результат команды, то есть xkb:ru::rus. Чтоб при echo «$engine» выдавало «xkb:ru::rus»?
Это то что я искал. Огромное спасибо! По незнаю допустил эту ошибку (только учусь) и не мог понять почему же у меня не работает переменная, почему не сравнивает. Было
и ещё несколько разных вариантов. Когда стало по примеру ниже — у меня всё заработало как нужно и я наконец-то приблизился к завершению своего скрипта. Всем успехов!
Linux присвоить переменной результат выполнения команды
оператор присваивания ( пробельные символы до и после оператора — недопустимы )
Обратите внимание: символ = может использоваться как в качестве оператора присваивания, так и в качестве оператора сравнения, конкретная интерпретация зависит от контекста применения.
Пример 4-2. Простое присваивание
#!/bin/bash # Явные переменные echo # Когда перед именем переменной не употребляется символ '$'? # В операциях присваивания. # Присваивание a=879 echo "Значение переменной \"a\" -- $a." # Присваивание с помощью ключевого слова 'let' let a=16+5 echo "Значение переменной \"a\" теперь стало равным: $a." echo # В заголовке цикла 'for' (своего рода неявное присваивание) echo -n "Значения переменной \"a\" в цикле: " for a in 7 8 9 11 do echo -n "$a " done echo echo # При использовании инструкции 'read' (тоже одна из разновидностей присваивания) echo -n "Введите значение переменной \"a\" " read a echo "Значение переменной \"a\" теперь стало равным: $a." echo exit 0
Пример 4-3. Присваивание значений переменным простое и замаскированное
#!/bin/bash a=23 # Простейший случай echo $a b=$a echo $b # Теперь немного более сложный вариант (подстановка команд). a=`echo Hello!` # В переменную 'a' попадает результат работы команды 'echo' echo $a # Обратите внимание на восклицательный знак (!) в подстанавливаемой команде #+ этот вариант не будет работать при наборе в командной строке, #+ поскольку здесь используется механизм "истории команд" BASH # Однако, в сценариях, механизм истории команд запрещен. a=`ls -l` # В переменную 'a' записывается результат работы команды 'ls -l' echo $a # Кавычки отсутствуют, удаляются лишние пробелы и пустые строки. echo echo "$a" # Переменная в кавычках, все пробелы и пустые строки сохраняются. # (См. главу "Кавычки.") exit 0
# Взято из /etc/rc.d/rc.local R=$(cat /etc/redhat-release) arch=$(uname -m)