2017-10-09 43 views
2

是否有方法可以在bash函數中使用STDIN?流水線中的命令行bash變量

例如

# 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命令中使用管道值?

+0

目前還不清楚你打算編寫的語法的意思。 –

+0

......這就是說,對於閱讀shell本地使用的輸入流的一般性討論,請參閱[BashFAQ#1](http://mywiki.wooledge.org/BashFAQ/001) - 和[BashFAQ#24 ](http://mywiki.wooledge.org/BashFAQ/024)討論一個常見的警告。 –

+0

我想知道是否可以使用管道而不是將其存儲在變量中來實現與使用管道的工作示例相同的功能。儘管你與BashFAQ的鏈接似乎回答了我的問題。 – Martin

回答

1

假設你想使用管道和輸入的每一行要單獨處理一些輸入,你可以嘗試:

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

while循環將使用read命令一次在變量IN中讀取一行。在循環內,你可以做任何你需要的治療。在這種情況下,我使用了一個echo來顯示您獲得輸入值。

+0

這個特殊的配方容易受到[BashFAQ#24](http://mywiki.wooledge.org/BashFAQ/024)的影響。 –

+0

(順便說一下,全大寫變量名用於具有OS或shell含義的變量,而至少包含一個小寫字符的名稱保留供應用程序使用 - 請參閱http://pubs.opengroup.org/onlinepubs/9699919799 /basedefs/V1_chap08.html,第四段;因此,如果你不想修改反斜槓或前導/尾隨空格,最好在'read line'或'while IFS = read -r line'時'。 –

+0

@Charles Duffy指出'IN'變量在循環之外是不可用的,但是如果在內部使用它,它是很好的。建議我也將它改爲小寫。 –

0

您使用的語法是用於變量。在變量中保存grep的輸出是使用它的自然方式。

如果你想使用管道,你需要使用修改stdin而不是變量的東西。考慮sed

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