Modificando a variável de string vazia dentro da instrução switch na função bash

2

Então eu tenho essa função no bash que recebe como primeiro parâmetro uma variável de string vazia e como segundo parâmetro um caractere,

function check_cases {
    case $2 in
        r) $1=$(echo "$1 Read");;
        w) $1=$(echo "$1 Write");;
        x) $1=$(echo "$1 Execution");;
    esac
}

Eu tentei todas as maneiras diferentes de concatenar a variável de string, mas ela sempre diz que

=: command not found

sobre o operador =. Eu crio e esvazio a variável de string local dentro de uma função como

local var=""

E passe com uma variável de caractere

check_cases "$var" "$char"

Eu quero entender o que está acontecendo e como resolver esse problema.

    
por Baratao00 28.08.2016 / 17:00

2 respostas

2

Parece que você está tentando fazer uma função do tipo passar por referência .

Estes não são realmente adequados para bash scripting. Podemos fingir com o comando eval , mas isso tem muito comportamento de risco (avaliação potencial de comandos incorporados em strings) e, portanto, não é recomendável.

Em este exemplo, o código seria parecido com:

function check_cases {
    case $2 in
        r) eval $1=\"\$$1 Read\" ;;
        w) eval $1=\"\$$1 Write\" ;;
        x) eval $1=\"\$$1 Execution\" ;;
    esac
}

check_cases var r
check_cases var w
check_cases var x

echo $var

Em vez disso, normalmente é melhor usar a semântica passar por valor ; basta retornar o valor desejado e fazer com que o chamador o acrescente à variável.

por exemplo,

function check_cases {
    case $1 in
        r) echo " Read" ;;
        w) echo " Write" ;;
        x) echo " Execution" ;;
    esac
}

var="$var$(check_cases r)"
var="$var$(check_cases w)"
var="$var$(check_cases x)"

echo $var
    
por 28.08.2016 / 17:25
0

Não está claro o que você quer alcançar, mas de qualquer forma ...

Em primeiro lugar, a sintaxe para atribuição de valor não é

$val=value

mas

val=value

De qualquer forma

1=value

não funciona, porque o nome da variável não pode começar com um número.

Para atribuir valores a parâmetros posicionais, faça o seguinte:

function check_cases {
    case $2 in
        r) append=' Read';;
        w) append=' Write';;
        x) append=' Execution';;
    esac
    set "$1""$append" "$2" # notice no space between "$1" and "$append"
    echo "$@" # print all parameters
    echo Number of parameters: $#
}
    
por 28.08.2016 / 17:22