如何在bash中使用变量管道?

时间:2012-03-01 19:10:56

标签: bash variables pipeline

我想将第一个命令的输出保存为管道前面的变量,并将它们发送到管道。

例如:find -type d | grep -E '^\./y'。在我的变量中将输出find -type d

感谢您的帮助

EDIT 也许我可以用另一种方式解决这个问题,但我站在另一个问题面前。如何用管道中的参数调用我自己的函数?

EX:find -type d | MyFunction

4 个答案:

答案 0 :(得分:0)

您可以使用$()(以前是`)语法轻松捕获变量中任何命令的输出,如下所示:

VARIABLE = $(命令)

然后你可以将“echo $ VARIABLE”的输出传输到下一个命令中。

但是,请记住,shell变量值的长度受到限制,并且不能保证足够大以容纳任意值 - 通常,尝试尝试的不是一个好主意。

答案 1 :(得分:0)

根据安德鲁对佩里的评论,或许

find . -type d -print0 | while IFS= read -r -d "" dir; do
  # do something with $dir
  case "$dir" in
    ./y*) echo "$dir" ;;
    *) : ;;
  esac
done

答案 2 :(得分:0)

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不起作用,那么该函数可能不会在stdin上寻找输入。

答案 3 :(得分:0)

您可以使用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