Я хочу извлечь поля из строки в переменные:

aaa bbb ccc

'aaa' => $ a, 'bbb' => $ b, 'ccc' => $ c. Как это сделать в баше?

Я не хочу конвейерно обрабатывать обработку, просто нужно извлечь их в переменные или массив.

7
Dagang 1 Июл 2011 в 07:07

2 ответа

Лучший ответ

Вы можете просто сделать:

read a b c <<<"aaa bbb ccc"

ВЫХОД

$ echo "a=[$a] b=[$b] c=[$c]"
a=[aaa] b=[bbb] c=[ccc]

Согласно руководству по bash:

   Here Strings
       A variant of here documents, the format is:
              <<<word
       The word is expanded and supplied to the command on its standard input.
7
anubhava 1 Июл 2011 в 07:45
В чем разница между "read a b c <<<" aaa bbb ccc "" и "echo aaa bbb ccc | read a b c"?
 – 
Dagang
1 Июл 2011 в 10:37
@Todd: echo aaa bbb ccc | read a b c даже не работает в bash, даже echo aaa | read x не работает.
 – 
anubhava
1 Июл 2011 в 10:40
Странно ведь эхо ааа | пока читал x; сделать $ echo $ x; сделано нормально.
 – 
Dagang
1 Июл 2011 в 11:22
Это нормально, но $ x недоступен за пределами цикла while. Если вы попытаетесь повторить $ x снаружи, вы получите пустое значение.
 – 
anubhava
1 Июл 2011 в 16:48

Самое простое это:

read a b c

С перенаправлением ввода-вывода с того места, где читается строка:

while read a b c
do
    # Process
done < $some_file

Если данные уже находятся в переменной, вы можете использовать:

read a b c < <(echo "$variable")

Здесь используется особенность Bash - подстановка процесса.

5
Jonathan Leffler 1 Июл 2011 в 07:22