簡體   English   中英

如何將Linux管道用於用戶定義的Shell腳本

[英]How to use Linux pipe for Userdefined Shell Scripts

我有兩個用戶定義的外殼腳本:

首先是添加

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

接下來是廣場

echo `expr $1 \* $1`

誰能告訴我如何對這些shell腳本使用Linux管道。 我嘗試了類似的東西:

add 10 20 | square                         

但這給了我該目錄中文件的列表。

使用管道會將第一個命令的輸出傳遞給第二個命令的標准輸入。 您希望將輸出用作第二個命令的參數。 試試xargs:

add 10 20 | xargs square

當然,在這種情況下,您必須確保第一個命令的輸出僅為“ 10”。

進一步說明:管道將獲取第一個命令的輸出,並將其重定向到第二個命令的標准輸入流。 這意味着您將必須使用“讀取”之類的命令(就像其他答案一樣)才能使用輸入流中的信息。

但是,您的方形腳本不會從標准輸入中讀取任何內容:它需要一個參數。 因此,我們要獲取第一個命令(10)的輸出並將其用作第二個命令的參數。 “ xargs”實用程序正是這樣做的:它將收到的標准輸入作為參數傳遞給square命令。 參見https://en.wikipedia.org/wiki/Xargs

順便說一句,命令替換具有相同的效果:

square $(add 10 20)

語法$(add 10 20)將運行add腳本並將表達式替換為其輸出。 因此,運行添加腳本后,該行如下所示:

square 30

實際上,我們再次將輸出從add轉換為square的參數。

如所寫,您要使用命令替換,而不是管道(因為square命令行參數,而不是從標准輸入中讀取):

square $(add 10 20)

修改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

如果未指定任何參數,則可以使用“ read”命令從STDIN讀取值:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM