bash для запуска второй команды с выбором вывода из первой команды как переменной

Если вы хотите быть root в терминале, это sudo su.

1
задан 23 May 2017 в 15:39

2 ответа

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

var2=$(expr substr "${var1}" 1 7)

причина кавычек состоит в том, что var1 имеет пробелы, которые путают substr, а 0 -> 1, потому что он начинает отсчет с 1.

Также есть некоторые проблемы с вашими цитатами:

#!/bin/bash

var1=$(lspci | grep -E "VGA|3D")
var2=$(expr substr "${var1}" 1 7)
var3=$(sudo lspci -v -s "${var2}")
echo "$var3"
1
ответ дан 23 May 2018 в 11:08
  • 1
    Он работал только с обновлением котировок для второй строки (var2). Почему это? Можете ли вы использовать только кавычки один раз в строке? – conman253 13 May 2016 в 23:42
  • 2
    если вы установите var1 в i.e «hello world», тогда команда станет expr substr hello world 1 7, что приведет к ошибке. С кавычками 'hello world' рассматривается как один аргумент. – user 13 May 2016 в 23:54

Использование grep с помощью PCRE (-P):

lspci | grep -Po '^\s*\K\S+(?=\s+VGA\s)'

и

lspci -v -s 00:01.0 | grep -Po '^\s*\K\S+(?=\s+VGA\s)'
^\s* совпадает с нулевым или большим пробелом в начале и \K отбрасывает совпадение, это необходимо для решения второго случая, когда пробелы в начале \S+ соответствуют любому количеству символов без пробелов, это наша желаемая часть. Положительный шаблон с нулевой шириной, (?=\s+VGA\s), гарантирует, что желаемое совпадение выдается VGA после пробелов после желаемой части.

Чтобы сохранить вывод в переменной, используйте команду substitution ($()):

value=$(lspci | grep -Po '^\s*\K\S+(?=\s+VGA\s)')

Аналогично:

value=$(lspci -v -s 00:01.0 | grep -Po '^\s*\K\S+(?=\s+VGA\s)')

Теперь вы можете получить значение с помощью $value.

Пример (в моей системе):

$ lspci | grep -Po '^\s*\K\S+(?=\s+VGA\s)'
00:02.0

$ lspci -v -s 00:02.0 | grep -Po '^\s*\K\S+(?=\s+VGA\s)'
00:02.0
1
ответ дан 23 May 2018 в 11:08
  • 1
    Мне нравится, как вы учитываете пробелы и просматриваете VGA по-другому. Это сработало для меня: user@host:~$ cat lspciVGA2 var1=$(lspci | grep -Po '^\s*\K\S+(?=\s+VGA\s)') var2=$(lspci -v -s "${var1}") echo "$var2" – conman253 14 May 2016 в 18:15
  • 2
    @ conman253 Отлично .. – heemayl 14 May 2016 в 19:11

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

Похожие вопросы: