我正在尝试使用 编写一个守护进程bash
。我将输入我合作伙伴的 IP 地址,连接将开始使用nc partner_ip 2015
,同样在服务器上我将使用 开始连接nc -l -p 2015
。
我想在每次发送消息时打印我的名字,并在我的伴侣的消息之前打印他的名字。因此,首先我需要计算出我合作伙伴的用户名和 IP 地址。
#! /bin/bash
function readPip()
{
echo "Enter your partener IP"
read ip
export PIP= $ip
}
function readMip()
{
mip=ip addr list eth0 |grep "inet " |cut -d' ' -f6|cut -d/ -f1
echo -n "'my IP is"$mip"
export MIP=$mip
}
function chat()
{
[[ $PIP != " " ]]&& nc $PIP 2015
[[ $PIP == " " ]] && nc -l -p 2015
}
function testConnect()
{
nc $PIP 2015 > /dev/null
echo "am here"
return $1
}
readPip
testConnect
readMip
echo "$1"
答案1
function readPip()
{
echo "Enter your partener IP"
read ip
export PIP= $ip
}
等号后面的空格是语法错误。但除此之外,所有这些都可以重构为
readPip () {
read -p "Enter your partner's IP: " PIP
}
这export
是不必要的,因为您不需要外部子进程来访问此变量。
function readMip()
{
mip=ip addr list eth0 |grep "inet " |cut -d' ' -f6|cut -d/ -f1
echo -n "'my IP is"$mip"
export MIP=$mip
}
同样,这包含一个错误;您分配给mip
值ip
,然后(尝试)运行命令addr list ...
,显然其意图是运行ip addr list ...
并将结果分配给MIP
。
readMip () {
ip addr list eth0 |grep "inet " |cut -d' ' -f6|cut -d/ -f1`
}
在这里,我只是将分配留给调用者(readPip
可以以相同的方式重构以保持一致性)。
在主代码中,你会有
MIP=$(readMip)
同样,这export
既没有必要也没有用。
function chat()
{
[[ $PIP != " " ]]&& nc $PIP 2015
[[ $PIP == " " ]] && nc -l -p 2015
}
这显然是“if - then - else”,应该相应地写。
chat () {
if [[ "$PIP" == " " ]]; then
nc -l -p 2015
else
nc "$PIP" 2015
fi
}
甚至
[[ "$PIP" == " " ]] && nc -l -p 2015 || nc "$PIP" 2015
另请注意,我删除了 Bash-onlyfunction
关键字。这里仍然有一些 Bashism,但这些可以轻松地重构为 POSIX 可移植脚本。
答案2
nc
用无缓冲的调用包装这两个调用sed
:
sed -u "s/^/My name: /" | nc PARTNER_IP 2015
sed -u "s/^/Partner name: /" | nc -l 2015