2016-03-20 38 views
1

我想編寫一個偵聽某個端口(比如端口22222)的命令,接收一行文本,並將該行按空格分隔爲端口,主機和文本。文本也可以有空格。因此,例如,1234 localhost blah de blah將被拆分爲端口1234,主機localhost和文本blah de blah。如果端口爲0,則程序退出。否則,程序會將該文本的值發送到端口處的主機並循環回到監聽。如何在bash中將給定的文本分成3個變量併發送給端口主機?

所以我在終端:

nc -k -l localhost 22222|some code goes here I think 

echo 2016 localhost blah blah|nc localhost 22222 

會導致發送等等等等,在端口爲localhost 2016 和

echo 0 localhost blah blah|nc localhost 22222 

將導致退出程序

我的問題是什麼到「一些代碼在這裏我認爲」部分?

回答

2

在收到nc將數據回顯到標準輸出,所以你可以按如下處理它:

nc -k -l localhost 22222 | while read line 
do 
    # "$line" contains the received text, do whatever you need with it 
    ... 
done 
+0

您可能需要考慮在讀取'r'時添加'-r',即''讀取'',以防止反斜槓轉義任何字符。 –

+0

這似乎是迄今爲止最接近的。 – ilikecats

1

由於您將netcat(nc)的輸出管道輸入爲「我認爲某些代碼在這裏,我認爲」,「某些代碼在這裏我認爲」需要是一個程序或腳本,它讀取標準輸入並執行所需操作該數據。 在命令行上使用管道並不是唯一的方法,也不是獲取netcat的輸出並對其執行任何操作。既然你提到你使用的是bash,可能最簡單的事情就是將輸出放在nc上,然後將它存儲在一個變量中,然後你可以使用另一個程序,如cut或awk來分割字符串:

raw=`nc -k -l localhost 22222` 
part1=`echo $raw | cut -f 1` 
part2=`echo $raw | cut -f 2` 
part3=`echo $raw | cut -f 3-` 

哪個應該得到你想要存儲在bash環境變量中的部分,你可以隨後做你喜歡的部分(例如,如果$ part1 = 0,則退出)。 請注意,這些在我的例子中反引號,而不是引號。在bash中的反引號將命令的結果放在它們中並以字符串形式返回。

+0

不要把命令中的變量。變量保存數據。 *功能*保存代碼。看看[我試圖把一個命令放在一個變量中,但複雜的情況總是失敗!](http://mywiki.wooledge.org/BashFAQ/050)此外''echo $ raw | cut -f 1'可以通過**參數擴展**在Bash中實現。見'男人bash | less +/Parameter \ Expansion' –

+0

我的示例沒有「將命令放入變量中」,它將命令的結果(stdout)存儲在變量中。 – prushik

+0

你是對的。那是我的錯誤。我爲此道歉。 –

相關問題