Como extrair e concatenar valores de variáveis em outra variável?

1

Usando o kernel 2.6.x

Isso é para completar uma solução de uma pergunta anterior - Como iterar por meio de uma variável enquanto pula um dos valores? .

Como você pode extrair um valor, por posição, de duas variáveis e concatená-las em um terceiro valor com as mesmas posições?

Neste SO, as shells não-sh são instaladas como pacotes Entware-NG e não podem ser usadas, pois são carregadas após a execução do script. Como resultado, a solução precisa ser baseada em um Posix sh, pois é o único shell disponível quando o script é executado.

Por exemplo, use as seguintes variáveis ...

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

... e crie uma terceira variável com os seguintes valores.

NETS="eth1:10 eth2:20 eth3:30"
    
por uihdff 13.09.2017 / 01:15

2 respostas

3

Você pode preferir uma resposta sh -only. Aqui está um que funciona com um shell POSIX:

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

Versão comentada:

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
)

Por favor, note que, devido à construção $(...) , tudo ocorre em um sub-shell e que os parâmetros do shell pai não são afetados.

    
por 13.09.2017 / 19:40
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"

Resultado

eth1:10 eth2:20 eth3:30 
    
por 13.09.2017 / 03:09