Как присвоить значения нескольким переменным в командной строке с помощью баров

10

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

Для простоты предположим, что команда на оболочке при выполнении печатает

one two three four

который может быть смоделирован с

echo "one two three four"

(хотя фактическая команда отличается)

Теперь я хотел бы назначить второе и четвертое слово вывода (в данном случае два и четыре ) переменным w1 и w2 .

Я думал, что мог бы использовать команду чтения так:

echo "one two three four" | awk '{print $2 " " $4}' | read w1 w2

но это не работает, вероятно, потому что команда чтения выполняется в подпроцессе.

Итак, как мне достичь того, чего я хочу?

Рене Ниффенеггер
источник

Ответы:

17

Это не работает, потому что readзапускается в дочернем процессе, который не может повлиять на среду родителя.

У вас есть несколько вариантов:

Вы можете преобразовать вашу команду в:

w1=$(echo "one two three four" | awk '{print $2}')
w2=$(echo "one two three four" | awk '{print $4}')

Или измените IFS и используйте set:

OIFS="$IFS"
IFS=' '
set -- $(echo "one two three four" | awk '{print $2" "$4}')
IFS="$OIFS"
w1=$1 w2=$2

или здесь строка:

read w1 w2 w3 w4 <<< "one two three four"
кендырь
источник
4
Исходя из строки Here: прочитайте a1 a2 a3 <<< $ (эхо раз два три)
Петр Узел,
Большое спасибо. Я не знал о<<< Here String
Рене Ниффенеггер
1
Для обеспечения безопасности следует использовать: read -r:do not allow backslashes to escape any characters
Том Хейл