Как сделать переменную перед конвейером в bash? - PullRequest
2 голосов
/ 01 марта 2012

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

Например: find -type d | grep -E '^\./y'. И в моей переменной будет вывод find -type d.

Спасибо за помощь

EDIT Может быть, я могу решить эту проблему по-другому, но я стою перед другой проблемой. Как вызвать мою собственную функцию с параметром из конвейера?

EX: find -type d | MyFunction

Ответы [ 4 ]

0 голосов
/ 02 марта 2012

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

$ read -a array <<< $(find 2>/dev/null -type d | grep -E 'test_[0-9]+')

$ echo ${array[@]} 
./test_003.t ./test_002.t ./test_001.t

$ echo ${array[1]} 
./test_002.t
0 голосов
/ 01 марта 2012

Основываясь на комментариях Эндрю к Перри, возможно

find . -type d -print0 | while IFS= read -r -d "" dir; do
  # do something with $dir
  case "$dir" in
    ./y*) echo "$dir" ;;
    *) : ;;
  esac
done
0 голосов
/ 02 марта 2012

RE:

EDIT Maybe I can solve this problem another way, but I am standing in front of another problem. How to call my own function with parameter from pipeline?

EX: find -type d | MyFunction

Следующие все работают:

$ cat ./blah.sh
#!/bin/bash
function blah {
        while read i; do
                echo $i
        done
}    
find ~/opt -type d | blah
blah <<< $(find ~/opt -type d)
blah < <(find ~/opt -type d)

$ ./blah.sh
/home/me/opt
/home/me/opt/bin
/home/me/opt /home/me/opt/bin
/home/me/opt
/home/me/opt/bin

Итак, я думаю, что если find -type d | MyFunction не работает, то функция, вероятно, не ищетввод на стандартный ввод.

0 голосов
/ 01 марта 2012

Вы можете легко получить выходные данные любой команды в переменной, используя синтаксис $ () (раньше это был `), например:

VARIABLE = $ (команда)

Вызатем можно просто передать вывод «echo $ VARIABLE» в следующую команду.

Однако имейте в виду, что длина значений переменных оболочки ограничена и не гарантируется, что она будет достаточно большой, чтобы содержать произвольныеценности - в общем, не стоит пытаться делать то, что вы пытаетесь.

...