Как установить переменную на вывод команды в Bash?

У меня есть довольно простой сценарий, который выглядит примерно следующим образом:

#!/bin/bash

VAR1="$1"
MOREF='sudo run command against $VAR1 | grep name | cut -c7-'

echo $MOREF

Когда я запускаю этот скрипт из командной строки и передаю ему аргументы, я не получаю никакого вывода. Однако когда я запускаю команды, содержащиеся в переменной $MOREF, я могу получить результат.

Как можно получить результаты команды, которую нужно выполнить в сценарии, сохранить их в переменной, а затем вывести эту переменную на экран?

Комментарии к вопросу (4)
Решение

В дополнение к обратным символам command вы можете использовать $(command) или "$(command)", которые я считаю более удобными для чтения и позволяющими вложенность.

OUTPUT="$(ls -1)"
echo "${OUTPUT}"

MULTILINE=$(ls \
   -1)
echo "${MULTILINE}"

Кавычки (```) имеют значение для сохранения многострочных значений.

Комментарии (14)

Правильный путь - это

$(sudo run command)

Если вы собираетесь использовать апостроф, то вам нужен , а не. Этот символ называется "backticks" (или "grave accent").

Например:

#!/bin/bash

VAR1="$1"
VAR2="$2"

MOREF=`sudo run command against "$VAR1" | grep name | cut -c7-`

echo "$MOREF"
Комментарии (4)

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

Предложенная альтернатива $(command) работает так же хорошо, и ее легче читать, но обратите внимание, что она действительна только для Bash или KornShell (и оболочек, производных от них), Так что если ваши скрипты должны быть действительно переносимыми на различных Unix-системах, вам следует предпочесть старую нотацию backticks.

Комментарии (7)

Некоторые [тег:Баш] уловок, которые я использую, чтобы установить переменные из команды

2-е изд 2018-02-12: добавление различных пути, поиск на дне этого для долго выполняющихся задач!

2018-01-25 редактирования: добавить пример функции (для заполнения Варс про использование диска)

Первая просто старая и совместимой

myPi=`echo '4*a(1)' | bc -l`
echo $myPi 
3.14159265358979323844

В основном совместимы, второй способ

В качестве вложения может стать тяжелым, скобочки был реализован для этого


myPi=$(bc -l 
Комментарии (3)

Я знаю три способа это сделать:

1) функции предназначены для выполнения таких задач:

func (){
ls -l
}

Вызвать его, сказав Функ

2) и еще одно подходящее решение может быть ивал:

var="ls -l"
eval $var

3) третий-использование переменных напрямую:

var=$(ls -l)
OR
var=`ls -l`

вы можете получить выход третьего решения в добрый путь:

echo "$var"

а также в неприятную сторону:

echo $var
Комментарии (3)

Просто быть разной:

MOREF=$(sudo run command against $VAR1 | grep name | cut -c7-)
Комментарии (0)

При определении переменной убедитесь, что у вас без пробелов до и/или после = знак. Буквально потратил час, пытаясь разобраться в этом, стараясь всех видов решений! Это не круто.

Правильно:<БР>

WTFF=`echo "stuff"`
echo "Example: $WTFF"

Будет не с ошибкой: (вещи: не найден или похожие)

WTFF= `echo "stuff"`
echo "Example: $WTFF"
Комментарии (1)

Если вы хотите сделать это с многострочным/несколько команд/с то вы можете сделать это:


output=$( bash 
Комментарии (16)

Вы должны использовать либо

$(команда-здесь)

или

`command-here`

пример

#!/bin/bash

VAR1="$1"
VAR2="$2"

MOREF="$(sudo run command against "$VAR1" | grep name | cut -c7-)"

echo "$MOREF"
Комментарии (2)

Вы можете использовать обратно-клещей(также известный как акцент могил) или $(). Вроде как-

OUTPUT=$(x+2);
OUTPUT=`x+2`;

Оба имеют тот же эффект. Но выход=$(х+2) является более читаемым и последний один.

Комментарии (2)

Это еще один способ, хорошо использовать С некоторые текстовые редакторы, которые не в состоянии правильно выделить каждую запутанный код, который вы создаете.


read -r -d '' str < 
Комментарии (2)

Некоторые могут найти это полезным. Число значений в переменную подстановки, где "фишка" - использование $(()) двойные скобки:

N=3
M=3
COUNT=$N-1
ARR[0]=3
ARR[1]=2
ARR[2]=4
ARR[3]=1

while (( COUNT < ${#ARR[@]} ))
do
  ARR[$COUNT]=$((ARR[COUNT]*M))
  (( COUNT=$COUNT+$N ))
done
Комментарии (5)

Вот еще два способа:

Пожалуйста, имейте в виду, что пространство является очень важным в [тег:Баш]. Поэтому, если вы хотите, чтобы ваша команда для запуска, использовать как есть, не вводя больше никаких пробелов.

  1. следующим назначает harshil до L, а затем выводит его

Я л=$&; harshil и" Эхо " на&quot$Л;

  1. следующим назначает вывод команды ТР в Л2. тр эксплуатируется на другую переменную Л1.

Л2=$(Эхо " Л1 и quot$; | тр [:верх:] [:нижняя:])

Комментарии (2)

Если команда, которую вы пытаетесь выполнить не удается, он будет писать вывод в поток ошибок и потом будет напечатано в консоли. Чтобы избежать этого, необходимо перенаправить поток ошибок

result=$(ls -l something_that_does_not_exist 2>&1)
Комментарии (0)