Opções de passagem / args / parameters com espaços do script para uma função dentro

2

Olá pessoal e obrigado antecipadamente.

Eu procurei no fórum por minha situação e não consegui localizar uma solução. Eu tenho um script que estou passando argumentos / opções / parâmetros para a linha de comando. Um dos valores tem um espaço nele, que eu coloquei entre aspas duplas. Pode ser mais fácil fornecer um exemplo. Perdoe meu uso de argumentos / opções / parâmetros.

$:  ./test1.ksh -n -b -d "Home Videos"

Meu problema é definir uma variável como "Home Videos" e ela ser usada em conjunto. No meu exemplo, o -d é para especificar um diretório. Nem todos os diretórios têm espaços, mas alguns fazem no meu caso.

Este é um exemplo do código que tenho e que não está funcionando como eu esperava.

#!/bin/ksh

Function1()
{
echo "Number of Args in Function1: $#"
echo "Function1 Args: $@"
SetArgs $*
}

SetArgs()
{
echo -e "\nNumber of Args in SetArgs: $#"
echo "SetArgs Args: $@"
while [ $# -gt 0 ]
do
  case $1 in
    -[dD])
    shift
    export DirectoryName=$1
    ;;
    -[nN])
    export Var1=No
    shift
    ;;
    -[bB])
    export Var2=Backup
    shift
    ;;
    *)
    shift
    ;;
  esac
done
Function2
}

Function2()
{
echo "Directory Name: ${DirectoryName}"
}

Function1 $*

Quando executo isso, estou recebendo apenas o Home para o DirectoryName em vez de Home Videos. Visto abaixo.

 $ ./test1.ksh -n -b -d "Home Videos"
 Number of Args in Function1: 5
 Function1 Args: -n -b -d Home Videos

 Number of Args in SetArgs: 5
 SetArgs Args: -n -b -d Home Videos
 Var1 is set to:  No
 Var2 is set to:  Backup
 Directory Name: Home

O que estou esperando e não consegui que isso aconteça é:

 $ ./test1.ksh -n -b -d "Home Videos"
 Number of Args in Function1: 4
 Function1 Args: -n -b -d "Home Videos"

 Number of Args in SetArgs: 4
 SetArgs Args: -n -b -d "Home Videos"
 Var1 is set to:  No
 Var2 is set to:  Backup
 Directory Name: Home Videos     <-- Without double quotes in the final usage.

Qualquer ajuda que eu puder fazer sobre isso será muito apreciada ... Eu tentei escapar das aspas duplas, sem sucesso algum.

Obrigado pelo seu tempo e esforços para me ajudar a descobrir isso.

Atenciosamente, Daniel

    
por DNadler 21.11.2017 / 12:05

1 resposta

2

Usar $* ou $@ não citado nunca faz sentido.

"$*" é a concatenação dos parâmetros posicionais com o primeiro caractere (ou byte dependendo do shell) de $IFS , "$@" é a lista de parâmetros posicionais.

Quando não estiver marcado, é o mesmo, mas sujeito a split + glob (ou apenas remoção vazia com zsh ) como qualquer outra expansão de parâmetro sem aspas (alguns shells também separam argumentos em $* mesmo se $IFS estiver vazio ).

Aqui você deseja passar a lista de argumentos como-é para sua função, por isso é:

SetArgs "$@"
[...]
Function1 "$@"

Note que com o ksh88, $IFS tem que conter o caractere de espaço (o que ele faz por padrão) para que funcione corretamente (um bug herdado do shell Bourne, corrigido em ksh93).

Observe também que, com algumas implementações de ksh (como versões anteriores de zsh in ksh emulation),

export DirectoryName=$1

é um caso de invocação split + glob. export é um desses comandos em shells semelhantes ao Korn que podem avaliar o código do shell através da avaliação aritmética em índices de array ), então é um daqueles casos em que é importante citar variáveis para evitar a introdução de vulnerabilidades de injeção de comando .

Exemplo:

$ (exec -a ksh zsh-4.0.1 -c 'export x=$a' ksh 'foo psvar[0'uname>&2']')
Linux

Observe que [ $# -gt 0 ] é outra chamada split + glob que não faz sentido (é menos provável que seja um problema pelo menos com o valor padrão de $IFS ).

    
por 21.11.2017 / 12:21