を使用してデーモンを作成しようとしています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専用のfunction
キーワードを削除しました。これにはまだいくつかのBashismがありますが、POSIX移植可能なスクリプトに簡単にリファクタリングできます。
答え2
nc
バッファリングされていない呼び出しで次の2つの呼び出しをラップしますsed
。
sed -u "s/^/My name: /" | nc PARTNER_IP 2015
sed -u "s/^/Partner name: /" | nc -l 2015