参数扩展可以一步在命令替换输出上运行吗?

时间:2014-06-09 18:25:09

标签: bash

我不断获得bad substitution

pages1=${`pdftk "$1" dump_data | grep NumberOfPages`#*:}

是否可以保留这一陈述而不必执行以下操作?

pages1=`pdftk "$1" dump_data | grep NumberOfPages`
pages1=${pages1#*:}

3 个答案:

答案 0 :(得分:1)

您可以使用内置read的进程替换而不是赋值语句。

IFS=: read pages1 _ < <(pdftk "$1" dump_data | grep NumberOfPages)

第一个:的所有内容都将分配给pages1;第一次冒号后的所有内容都将分配给_,您可以忽略其值。 (名称_没有什么特别之处;您可以使用任何您喜欢的名称,例如resttail等。

如果您使用的是bash 4.2或更高版本,则可以打开lastpipe选项,只需将grep的输出传输到内置读取内容。

shopt -s lastpipe
pdftk "$1" dump_data | grep NumberOfPages | IFS=: read pages1 _

bash无关,但zsh支持此类参数扩展链接。

% pages1=${$(echo a:b:c)#*:}
% echo $pages1
b:c

答案 1 :(得分:0)

不可能按照您的方式进行,但您可以使用此grep替换awk以使用单个命令获取输出:

pages1=$(pdftk "$1" dump_data | awk '/NumberOfPages/{sub(/^[^:]*:/, ""); print}')

答案 2 :(得分:0)

您可以使用sed:

而不是使用grep
pages1=$(pdftk "$1" dump_data | sed -ne '/NumberOfPages/{ s/^.\?[^:]*://; p; }')

注意:s/^.\?[^:]*://模仿${1#*:}以上s/^.*://