【问题标题】:Command line bash variables in pipeline管道中的命令行 bash 变量
【发布时间】:2018-03-20 23:03:22
【问题描述】:

有没有办法在 bash 函数中使用 STDIN?

例如

# echo "somevar = (100)" >> test.txt
# grep -Eo "\([[:digit:]]+\)$" test.txt
(100)

所以没关系,我有我的号码,接下来我想删除括号。 我所做的是:

string=`grep -Eo "\([[:digit:]]+\)$" test.txt`; echo ${string:1:-1}
100

所以我的问题解决了,但是我花了很长时间做的是:

grep -Eo "\([[:digit:]]+\)$" test.txt | echo ${$1:1:-1}
grep -Eo "\([[:digit:]]+\)$" test.txt | ${$1:1:-1}
grep -Eo "\([[:digit:]]+\)$" test.txt | xargs echo ${:1:-1}
grep -Eo "\([[:digit:]]+\)$" test.txt | xargs -I 's' echo ${s:1:-1}

等等,等等……这些都不起作用。

假设有可能,我如何在 bash 命令中使用管道输入值?

【问题讨论】:

  • 不清楚你打算写的语法是什么/意思。
  • ...也就是说,关于读取输入流以供 shell 本机使用的一般性讨论,请参阅 BashFAQ #1 -- 和 BashFAQ #24 讨论一个常见的警告。
  • 我想知道我是否可以使用管道而不是将其存储在变量中来实现与工作示例相同的效果。尽管您指向 BashFAQ 的链接似乎回答了我的问题。

标签: bash command-line pipe


【解决方案1】:

假设您想使用来自管道的一些输入,并且每行输入要单独处理,您可以尝试:

echo "somevar = (100)" | grep -Eo "\([[:digit:]]+\)$" | while read in
do
  echo $in
done

while 循环将使用read 命令一次读取变量IN 中的一行。在循环中,您可以进行任何您需要的治疗。在这种情况下,我使用了echo 来表明您获得了输入值。

【讨论】:

  • 这个特殊的公式很容易受到BashFAQ #24的攻击。
  • (顺便说一句,全大写变量名用于对操作系统或 shell 有意义的变量,而具有至少一个小写字符的名称保留供应用程序使用 -- 参见 pubs.opengroup.org/onlinepubs/9699919799/basedefs/…,第四段; 因此,如果您不想破坏反斜杠或前导/尾随空格,最好使用 while read line -- 或 while IFS= read -r line。
  • @Charles Duffy 声明 IN 变量在循环外不可用,但如果在循环内使用则很好。我也按照建议将其更改为小写。
  • 比我希望的要冗长一点(我偷偷地认为 perl-esq $_ 可能存在于 bash 中)但它完全符合我的要求,还要感谢 Charles Duffy,你清楚地知道你的狂欢!
【解决方案2】:

您使用的语法是用于变量的。将grep 的输出保存在变量中是使用它的自然方式。

如果你想使用管道,你需要使用修改标准输入的东西,而不是变量。考虑sed。

grep -Eo "\([[:digit:]]+\)$" test.txt | sed 's/^(\|)$//g'

【讨论】:

    猜你喜欢
    • 2022-11-04
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多