変数の値を抽出して他の変数にリンクする方法は?

変数の値を抽出して他の変数にリンクする方法は?

カーネル2.6.xの使用

前の質問を完成する解決策は次のとおりです。値の1つをスキップしながら変数を繰り返すには?

2つの変数から位置ごとの値を抽出し、それらを同じ場所の3番目の値に連結するにはどうすればよいですか?

このオペレーティングシステムでは、sh以外のシェルがEntware-NGパッケージとしてインストールされ、スクリプトの実行後にロードされるため、使用できません。したがって、ソリューションは、スクリプトの実行時に使用できる唯一のシェルであるPosix shに基づいている必要があります。

たとえば、次の変数を使用します。

NETID="10 20 30"
NAME="eth1 eth2 eth3"

...次の値を使用して3番目の変数を作成します。

NETS="eth1:10 eth2:20 eth3:30"

答え1

sh-only答えを好むかもしれません。 POSIXシェルで使用する方法は次のとおりです。

NETS=$(set -- $NETID; for iface in $NAME; do echo "$iface:$1"; shift; done)

コメントバージョン:

NETS=$(
    set -- $NETID            # Sets the shell parameters to the content of NETID
    for iface in $NAME; do   # For each interface name...
        echo "$iface:$1"
        shift                # First shell parameter is now the next NETID, if any
    done
)

構造により、$(...)すべてがサブシェルで発生し、親シェルのパラメータは影響を受けません。

答え2

NETID="10 20 30"
NAME="eth1 eth2 eth3"

NETS=$(awk -v name="$NAME" -v netid="$NETID" '
BEGIN {
    size=split(name, arr_names); 
    split(netid, arr_netids);
    for(i=1; i <= size; i++) {
        printf "%s:%s ", arr_names[i], arr_netids[i];
    }
}')

echo "$NETS"

出力

eth1:10 eth2:20 eth3:30 

関連情報