2016-01-05 2 views
0

Возможно ли, и если да, как преобразовать следующее выражение в однострочный?

DEV=$(lsblk -no KNAME,MODEL | grep 'ModelNAME') 
DEV=${DEV%%'ModelNAME'} 

Простой DEV=${(lsblk -no KNAME,MODEL | grep 'ModelNAME')%%'ModelNAME'} не работает

+1

Правильно, это не так. Нет, вы не можете произвольно комбинировать разложения параметров в bash. –

+1

Вы можете написать однострочную команду, которая делает то же самое, если вам действительно нужно. Вы также можете заменить новую строку символом ';', если вы просто хотите их на одной визуальной линии. Какова реальная цель здесь? –

+0

Что такое вывод 'lsblk -no KNAME, MODEL | grep 'ModelNAME''? –

ответ

2

ЗШ позволяет комбинировать расширения параметров. У Баша нет.

Для bash или POSIX sh (оба из которых поддерживают это конкретное расширение параметра), вам нужно сделать это как две отдельные команды.


Тем не менее, есть есть другие варианты. Например:

# tell awk to print first field and exit on a match 
dev=$(lsblk -no KNAME,MODEL | awk '/ModelNAME/ { print $1; exit }') 

... или, еще проще (но требующей Баш или другой современной производной КШ):

# read first field of first line returned by grep; _ is a placeholder for other fields 
read -r dev _ < <(lsblk -no KNAME,MODEL | grep -e ModelNAME) 
+0

'read' - интересное решение, спасибо! –

Смежные вопросы