bash script “pass through” para construção android, edição de espaço

1

Eu tenho uma versão do Android que preciso personalizar, A pergunta é ehre e não em stackoverflow porque o meu problema com o bash. Eu escrevi um script:

#!/bin/bash -xv
params=$@
if [ "$#" -ge "2" ]; then
    params=$1
    shift
    params="$params --custom-package com.some.package"
    while [ "$#" -gt "0" ]; do
        temp=$1
        echo $1 | grep ' ' > /dev/null
        if [ "$?" -eq "0" ]; then
            temp=\"$1\"
        fi
        params="$params $temp"
        shift
    done

fi
path=$(echo $0|xargs dirname)
echo $params
$path/aapt-orig $params

suponha que o script pegue os parâmetros que ele tem, adicione o parâmetro --custom-package com.some.package e mantenha o resto dos params, o primeiro ($ 1) param é a ação, então eu preciso mantê-lo primeiro.

O problema é com espaços nos nomes de diretórios './my android dir /' por exemplo. se eu passar o parâmetro completamente: param="$ param $ 1"; merda; se eu tiver espaços no nome ele não funciona porque o novo param não é escapado (com "), se eu usar o código acima ele ainda não funciona porque por alguma razão o bash ignora o" char e ainda considera o espaço no meio como um parâmetro separado! aqui está a saída da execução: './aapt action "/ Users / bankleumi / algum dir /" another_param'

'[' 0 -eq 0 ']'
+ temp='"/Users/bankleumi/some dir/"'
+ params='action --custom-package com.leumi.leumiwallet "/Users/bankleumi/some dir/"'
+ shift
+ '[' 1 -gt 0 ']'
+ temp=another_param
+ echo another_param
+ grep ' '
+ '[' 1 -eq 0 ']'
+ params='action --custom-package com.leumi.leumiwallet "/Users/bankleumi/some dir/" another_param'
+ shift
+ '[' 0 -gt 0 ']'
path=$(echo $0|xargs dirname)
echo $0|xargs dirname
++ echo ./aapt
++ xargs dirname
+ path=.
echo $params
+ echo action --custom-package com.leumi.leumiwallet '"/Users/bankleumi/some' 'dir/"' another_param
action --custom-package com.leumi.leumiwallet "/Users/bankleumi/some dir/" another_param
$path/aapt-orig $params
+ ./aapt-orig action --custom-package com.leumi.leumiwallet '"/Users/bankleumi/some' 'dir/"' another_param

Como você pode ver no final da impressão do echo bash, considere a string "/ Users / bankleumi / some dir" como duas strings, mesmo que existam \ "IN integradas na string! Como posso fazer bash deixar o espaço sozinho? (eu tentei jogar com o IFS e também não funcionou ...)

    
por codeScriber 04.10.2012 / 14:31

2 respostas

2

Não mexa em re-citar, não vai funcionar devido ao modo como sh / bash usa a divisão de palavras em variáveis - ou seja, elas dividem o valor sem considerar primeiro o aspas no valor.

Você poderia contornar isso usando eval "$path/aapt-orig $params" ...

Mas o Bash tem arrays, use-os:

#!/usr/bin/env bash
args=()
args+=("$1"); shift
args+=(--custom-package com.leumi.leumiwallet)
for arg in "$@"; do
    args+=("$arg")
done
exec "$(dirname "$0")/aapt-orig" "${args[@]}"

Ou ainda mais simples:

#!/usr/bin/env bash
exec "${0%/*}/aapt-orig" "$1" --custom-package com.leumi.leumiwallet "${@:2}"
    
por 04.10.2012 / 15:02
1

Isso deve funcionar com mais shells e pode ser mais fácil de entender:

#!/bin/sh
first="$1"; shift;
exec "'dirname '$0''/aapt-orig" "$first" --custom-package com.foo.bar "$@";

Note que ele funciona porque os shells tratam "$@" especialmente, veja a seção "Parâmetros especiais" na página do manual Bash.

    
por 04.10.2012 / 15:52