bash script "pass through" per Android build, problema di spazio


1

Ho una build Android che ho bisogno di personalizzare, la domanda è qui e non nello stack overflow perché il mio problema è stato con bash. Ho scritto una sceneggiatura:

#!/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

lo script suppone di prendere i parametri ottenuti, aggiungere il parametro --custom-package com.some.package e mantenere il resto dei params, il primo parametro ($ 1) è l'azione quindi ho bisogno di tenerlo prima.

Il problema è con gli spazi nei nomi delle directory './my android dir /' per esempio. se passo il parametro attraverso: param = "$ param $ 1"; merda; se ho spazi nel nome non funziona perché il nuovo parametro non è sfuggito (con "), se uso il codice sopra ancora non funziona perché per qualche motivo bash ignora il" char e considera ancora lo spazio nel mezzo come parametro separato! ecco l'output della corsa: './aapt action' / Users / bankleumi / some 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

Come puoi vedere alla fine nella stampa di echo bash considera la stringa "/ Users / bankleumi / some dir" come due stringhe anche se ci sono "integrati" nella stringa! come posso fare in modo che bash lasci lo spazio da solo? (Ho provato a giocare con IFS e non ha funzionato neanche ...)

Risposte:


2

Non scherzare con il re-quoting, non funzionerà a causa del modo in cui sh / bash usa la suddivisione in parole delle variabili - cioè, divide il valore senza prima considerando le virgolette nel valore.

Potresti andare in giro usando eval "$path/aapt-orig $params"...

Ma Bash ha array, li usa invece:

#!/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[@]}"

O ancora più semplice:

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

2
Nota a margine: echo $0 | xargs dirname? Veramente?
grawity

Per qualche motivo, sono sicuro che @grawity comprenderà meglio di me, usando anche le virgolette doppie: ./aapt action ""/Users/bankleumi/some dir/"" another_param
terdon

@terdon: non ne sono sicuro Come quello funzionerebbe. Dopo lo smembramento di bash, ""foo bar"" baz è esattamente lo stesso di foo bar baze aapt lo riceve come tre argomenti di una sola parola.
grawity

Nessuna idea, @grawity, l'ho appena provata per un capriccio e ha funzionato. Ho usato lo script nell'OP e ho semplicemente citato l'argomento CLI come mostrato sopra. L'output rilevante era: + echo action --custom-package com.some.package /Users/bankleumi/some dir/ another_param. Versione di Bash: GNU bash, version 4.2.36(1)-release (x86_64-pc-linux-gnu)
terdon

1

Questo dovrebbe funzionare con più shell e potrebbe essere più facile da capire:

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

Nota che funziona perché le conchiglie trattano "$@" specialmente, vedi la sezione "Parametri speciali" nella manpage di Bash.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.