Passando argumentos com espaços em branco para um comando de dentro de um script de shell? [duplicado]

0

Veja a edição abaixo, obrigado

Eu tenho o seguinte script de teste ( nota importante: não posso alterar esta parte ):

while (($#)); do
  echo $1
  shift
done

Executando o comando %código% fornece a seguinte saída:

aaa
bbbb cccc
ddd

que é o que qualquer pessoa sensata esperaria.

Eu tenho outro script:

mode="good"
status="okay"
name="bro"
description="very good man dood"
extra=""

# ----

PARAMS=""

// $1: key, $2: value
function addParam {
    if [ ! -z "$2" ]; then
        PARAMS="$PARAMS --$1 \"$2\""
    fi
}

addParam "mode" "$mode"
addParam "status" "$status"
addParam "name" "$name"
addParam "description" "$description"
addParam "extra" "$extra"

echo ./test $PARAMS
./test $PARAMS

A saída de ./test aaa "bbbb cccc" ddd é echo , então eu esperaria que a saída de ./test --mode "good" --status "okay" --name "bro" --description "very good man dood" fosse

--mode
good
--status
okay
--name
bro
--description
very good man dood

mas, por algum motivo, recebo a seguinte saída:

--mode
"good"
--status
"okay"
--name
"bro"
--description
"very
good
man
dood"

Se eu copiar a saída de ./test $PARAMS e colá-la, obtenho a saída esperada de echo ./test $PARAMS . Então tentei remover a última linha que executa ./test e deixar a última linha ./test , mas aparentemente echo ainda não funciona e estou além das idéias.

O que estou fazendo de errado?

Editar: a solução da steeldriver funciona, mas há outra constelação - eu tenho que permitir que os usuários enviem seus próprios argumentos.

Então, com este script (obrigado @steeldriver):

#!/bin/bash

mode="good"
status="okay"
name="bro"
description="very good man dood"
extra=""
arguments="--config \"blablabla=yes\" --config2 \"bla2=no problem\""

# ----

declare -a PARAMS

# $1: key, $2: value
function addParam {
    if [ ! -z "$2" ]; then
        PARAMS+=("--$1" "$2")
    fi
}

addParam "mode" "$mode"
addParam "status" "$status"
addParam "name" "$name"
addParam "description" "$description"
addParam "extra" "$extra"

# (1)
PARAMS+=("$arguments")

# (2)
PARAMS+=($arguments)

echo ./test "${PARAMS[@]}" 
./test "${PARAMS[@]}"

A saída desejada é:

--mode
good
--status
okay
--name
bro
--description
very good man dood
--config
blablabla=yes
--config2
bla2=no problem

No entanto, a saída que recebo é:

com $(./script) :

--mode
good
--status
okay
--name
bro
--description
very good man dood
--config "blablabla=yes" --config2 "bla2=no problem"

com (1) :

--mode
good
--status
okay
--name
bro
--description
very good man dood
--config
"blablabla=yes"
--config2
"bla2=no
problem"

Muito apreciado!

    
por Adi Gerber 13.10.2016 / 14:50

2 respostas

0

Graças ao heads-up do @steeldriver, consegui adicionar os argumentos do usuário corretamente e obter a saída desejada. Este é o meu script agora:

#!/bin/bash

mode="good"
status="okay"
name="bro"
description="very good man dood"
extra=""
arguments="--config \"blablabla=yes\" --config2 \"bla2=no problem\""

# ----

declare -a PARAMS

# $1: key, $2: value
function addParam {
    if [ ! -z "$2" ]; then
        PARAMS+=("--$1" "$2")
    fi
}

# This function right here
function addUserArguments {
    while (($#)); do
      PARAMS+=("$1")
      shift
    done
}

addParam "mode" "$mode"
addParam "status" "$status"
addParam "name" "$name"
addParam "description" "$description"
addParam "extra" "$extra"

# And this line right here
eval addUserArguments $arguments

./test "${PARAMS[@]}"

E a saída é

--mode
good
--status
okay
--name
bro
--description
very good man dood
--config
blablabla=yes
--config2
bla2=no problem
    
por 13.10.2016 / 17:20
1

Use uma matriz em vez de uma variável de string:

#!/bin/bash

mode="good"
status="okay"
name="bro"
description="very good man dood"
extra=""

# ----

declare -a PARAMS

# $1: key, $2: value
function addParam {
    if [ ! -z "$2" ]; then
        PARAMS+=("--$1" "$2")
    fi
}

addParam "mode" "$mode"
addParam "status" "$status"
addParam "name" "$name"
addParam "description" "$description"
addParam "extra" "$extra"

echo ./test "${PARAMS[@]}"
./test "${PARAMS[@]}"

Teste

$ ./other.sh
./test --mode good --status okay --name bro --description very good man dood
--mode
good
--status
okay
--name
bro
--description
very good man dood
    
por 13.10.2016 / 15:06