Expansão Variável Adicionando Chaves ao Valor Original da Cadeia [closed]

0

NOTA: perdi um problema de sintaxe no meu script que estava causando isso. Eu estava passando $ {bar} como {$ bar}. Isso pode ser removido ou bloqueado ou o que for feito com esses tipos de perguntas.

Estou tentando testar um script que estou escrevendo. Para visualizar o conteúdo de uma variável, estou tentando fazer o eco da função para a qual ela é passada. Quando isso acontece, a variável expandida tem chaves adicionadas ao redor. Alguma idéia de por que está fazendo isso e indicações de como eu posso evitar isso? Estou assumindo que, se eu passasse a variável para um comando, ela incluiria as chaves que provavelmente causariam um erro. Por favor, corrija-me se estiver errado nesta suposição. Código é algo assim:

editncopy()
{
  for i in {1..5}; do echo ${!i}; done
}

s=myserver
adir=/another/dir/
foo=/some/path/to/file.sh
bar=username@${s}:${adir}

editncopy string1 string2 ${foo} ${bar} ${s}

A saída é assim:

[me@home dir]$ ./myscript.sh
string1
string2
/some/path/to/file.sh
{username@server:/another/dir/}
myserver
[me@home dir]$

É sempre a variável $ 4 na função que adiciona chaves ({username @ server: / another / dir /} deve ser apenas username @ server: / another / dir /). Eu tentei ecoar por conta própria (eco $ 4), mas isso não importava.

Em poucas palavras, o script vai modificar o conteúdo de outro script usando sed e copiá-lo para outros servidores usando scp.

    
por lightwing 22.02.2018 / 20:08

1 resposta

2

Para iterar os argumentos passados para uma função (isso também funciona para iterar os argumentos em scripts):

#!/bin/sh

foo () {
    for i in "$@"; do
        printf 'Argument is "%s"\n' "$i"
    done
}

foo a b "c d" e "f g h"

Saída:

Argument is "a"
Argument is "b"
Argument is "c d"
Argument is "e"
Argument is "f g h"

Ou com seus valores:

s=myserver
adir=/another/dir/
foo=/some/path/to/file.sh
bar=username@${s}:${adir}
foo string1 string2 ${foo} ${bar} ${s}

que gera

Argument is "string1"
Argument is "string2"
Argument is "/some/path/to/file.sh"
Argument is "username@myserver:/another/dir/"
Argument is "myserver"

É provável que você tenha um erro de digitação no código que troque a $ e { em ${bar} :

$ foo {$bar}
Argument is "{username@myserver:/another/dir/}"
    
por 22.02.2018 / 20:17