2014-07-15 98 views
0

我有兩個用戶自定義的shell腳本:如何使用Linux管道爲用戶自定義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 

接下來就是廣場

echo `expr $1 \* $1` 

燦任何一種理由都告訴我如何使用Linux管道管理這些shell腳本。我試過類似的東西:

add 10 20 | square       

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

+0

你的'add'函數只需要2個參數,但是你要檢查它是否接收到3. – chepner

回答

2

使用管將從所述第一命令的輸出傳遞到所述第二命令的標準輸入。您希望將輸出用作第二個命令的參數。嘗試xargs的:

add 10 20 | xargs square 

當然,你必須確保第一個命令的輸出僅僅是「10」,在這種情況下。

更多的解釋:管道將獲取第一個命令的輸出並將其重定向到第二個命令的標準輸入流。這意味着你將不得不使用像「read」這樣的命令(如其他一些答案所做的)來使用輸入流中的信息。

但是你的方形腳本不會從標準輸入中讀取任何東西:它需要一個參數來代替。所以我們想把你的第一個命令的輸出(10)作爲第二個命令的參數。 「xargs」實用程序完全如此:它接收到的標準輸入將作爲參數傳遞給square命令。見https://en.wikipedia.org/wiki/Xargs

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

square $(add 10 20) 

語法$(添加10 20)將運行該加載腳本,並用它的輸出替換的表達。所以在運行添加腳本之後的行看起來是這樣的:

square 30 

而且,實際上,我們已經再次轉向輸出從加入到方形的理由。

+0

你好它在工作,但是爲什麼我們必須給xargs?當我們用管道使用系統命令時,我們沒有使用任何xargs ?你可以請解釋或至少分享一個鏈接,這將是非常有用的幫助我
謝謝 – prasad

+0

@ PrasaD.Developer我添加了一些額外的解釋。 – rje

0

可以使用「讀」命令來讀取從STDIN的值,如果沒有指定參數:

val="$1" 
test -z "$1" && read val 
echo `expr $val \* $val` 
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