[英]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.