チャットクライアントサーバーモデルにnetcat(nc)を使用するには?

チャットクライアントサーバーモデルにnetcat(nc)を使用するには?

を使用してデーモンを作成しようとしています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移植可能なスクリプトに簡単にリファクタリングできます。

おすすめ記事