shell 是否可以将管道放在变量中

k0pti3hp  于 2022-11-25  发布在  Shell
关注(0)|答案(2)|浏览(206)

我有一个很长的管道,我经常在我的脚本中重用它,为了让它更容易阅读,我想把管道放在一个变量中。这可能吗?

cat miami.tmp | grep -A5 "$date" | grep -A3 "$nexthour" | grep "celsius" | grep -E -o  '[-]?[0-9].[0-9]' | head -n 1 >> miami.txt

我试过了

temperature=$( | grep -A5 "$date" | grep -A3 "$nexthour" | grep "celsius" | grep -E - 
o  '[-]?[0-9].[0-9]' | head -n 1 )

temperature="| grep -A5 "$date" | grep -A3 "$nexthour" | grep "celsius" | grep -E -o  '[-]?[0-9].[0-9]' | head -n 1"

但收到错误消息,说找不到命令。

h4cxqtbf

h4cxqtbf1#

你应该把它放在一个函数里。

temperature ()  {
    grep -A5 "$date" |
    grep -A3 "$nexthour" |
    grep "celsius" |
    grep -E -o  '[-]?[0-9].[0-9]' |
    head -n 1
}

也许您想将日期和小时设置为参数。

temperature ()  {
    grep -A5 "$1" |
    grep -A3 "$2" |
    grep "celsius" |
    grep -E -o  '[-]?[0-9].[0-9]' |
    head -n 1
}

另外,它看起来非常希望被重构为Awk。

temperature () {
    awk -v date="$1" nexthour="$2" '
       $0 ~ date { p=5 }
       p && p-- && ($0 ~ nexthour) { p=3 }
       p && p-- && /celsius/ { n = split($0, a, /[^-.0-9]/, a);
           for(i=1; i<=n; ++i) if (a[i] ~ /^-?[0-9]\.[0-9]$/)
               { print(a[i]); exit }'
}

(未测试,因为您没有提供测试数据。我不得不猜测一些事情。如果您通过系统地循环日期和小时来调用它,可能也要将其重构到Awk脚本中。)
用法:

temperature 2022-11-24 04 <miami.tmp >>miami.txt

可能参见https://mywiki.wooledge.org/BashFAQ/050

lokaqttq

lokaqttq2#

这是使用bash shell函数的一个很好的例子。

function temperature() { grep foo | grep bar | grep baz; }

只需确保最后一个命令以分号结尾。

cat file.tmp | temperature

函数也可以有参数,用通常的$1$2等表示法访问,这些参数可以传入(以空格分隔)到函数中。

$ function hello() { echo "Hello $1!"; }
$ hello world
Hello world!

相关问题