如何将Linux管道用于用户定义的Shell脚本

时间:2014-07-15 14:51:17

标签: linux shell

我有两个用户定义的shell脚本:

首先是添加

if [ $# -eq 3 ]
then
    sum=`expr  $1 + $2 `
    echo $sum
else
    echo "usage :$0 num1 num2"
    echo "num1 and num2 are two numbers"
    exit 1
fi

接下来是 Square

echo `expr $1 \* $1`

任何人都可以告诉我如何在这些shell脚本中使用Linux管道。我试过像:

add 10 20 | square                         

但是它给了我该目录中的文件列表。

3 个答案:

答案 0 :(得分:2)

使用管道会将第一个命令的输出传递给第二个命令的stdin。您希望输出用作第二个命令的参数。试试xargs:

add 10 20 | xargs square

当然,在这种情况下,你必须确保第一个命令的输出只是“10”。

更多解释:管道将获取第一个命令的输出并将其重定向到第二个命令的标准输入流。这意味着你必须使用像“read”这样的命令(正如其他一些答案那样)来使用输入流中的信息。

但是你的方形脚本不会从标准输入中读取任何内容:它需要参数。所以我们想要获取第一个命令的输出(10)并将其用作第二个命令的参数。 “xargs”实用程序就是这样:它接收的标准输入将作为参数传递给square命令。请参阅https://en.wikipedia.org/wiki/Xargs

顺便说一句,命令替换具有相同的效果:

square $(add 10 20)

语法$(add 10 20)将运行add脚本并将表达式替换为其输出。因此,在运行add脚本之后,该行看起来像这样:

square 30

而且,实际上,我们再次将add的输出转换为square的参数。

答案 1 :(得分:1)

如上所述,您希望使用命令替换,而不是管道(因为square采用命令行参数,而不是从标准输入读取):

square $(add 10 20)

要修改square以使add 10 20 | square有效,请使用内置的read

#!/bin/bash

read input
echo $(( $input * $input ))   # No need for the external expr command

add还应该将任何错误消息写入标准错误,而不是标准输出:

if [ $# -eq 2 ]
then
    sum=$(( $1 + $2 ))
    echo $sum
else
    echo "usage :$0 num1 num2" >&2
    echo "num1 and num2 are two numbers" >&2
    exit 1
fi

答案 2 :(得分:0)

如果没有指定参数,您可以使用“read”命令从STDIN读取值:

val="$1"
test -z "$1" && read val
echo `expr $val \* $val`