bash script "pass through" untuk android build, masalah ruang angkasa

1

Saya memiliki android build yang perlu saya sesuaikan, pertanyaannya adalah ehre dan tidak di stackoverflow karena masalah saya dengan bash. Saya menulis sebuah skrip:

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

skrip mengira untuk mengambil parameter yang didapatnya, tambahkan --custom-package com.some.package parameter dan simpan sisa params, param pertama ($ 1) adalah tindakan jadi saya harus menyimpannya terlebih dahulu.

Masalahnya adalah dengan spasi pada nama direktori './ my android dir /' misalnya jika saya hanya melewati parameter melalui: param = "$ param $ 1"; kotoran; jika saya memiliki spasi dalam nama itu tidak berfungsi karena param baru tidak lolos (dengan "), jika saya menggunakan kode di atas itu masih tidak berfungsi karena untuk beberapa alasan bash mengabaikan" char dan masih mempertimbangkan spasi di tengah sebagai parameter terpisah! di sini adalah keluaran dari proses: './aapt action "/ Users / bankleumi / 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

Seperti yang Anda lihat di akhir pencetakan bash echo, anggap string "/ Users / bankleumi / some dir" sebagai dua string walaupun ada \ "terintegrasi dalam string! Bagaimana saya bisa membuat bash meninggalkan ruang sendirian? (Saya mencoba bermain dengan IFS dan tidak berhasil ...)

codeScriber
sumber

Jawaban:

2

Jangan macam-macam dengan mengutip ulang, itu tidak akan berfungsi karena cara sh / bash menggunakan pemisahan kata pada variabel - yaitu, mereka membagi nilai tanpa terlebih dahulu mempertimbangkan tanda kutip dalam nilai.

Anda bisa menyiasatinya dengan menggunakan eval "$path/aapt-orig $params"...

Tapi Bash memiliki array, gunakan itu sebagai gantinya:

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

Atau bahkan lebih sederhana:

#!/usr/bin/env bash
exec "${0%/*}/aapt-orig" "$1" --custom-package com.leumi.leumiwallet "${@:2}"
grawity
sumber
2
Catatan: echo $0 | xargs dirname? Benarkah?
grawity
Untuk beberapa alasan yang saya yakin @grawity akan mengerti lebih baik daripada saya, menggunakan tanda kutip ganda juga berfungsi:./aapt action ""/Users/bankleumi/some dir/"" another_param
terdon
@terdon: Saya tidak yakin bagaimana cara kerjanya. Setelah tanda kutip bash, ""foo bar"" bazpersis sama dengan foo bar baz, dan aapt menerimanya sebagai tiga argumen satu kata.
grawity
Tidak tahu, @grawity, coba saja dengan iseng dan berhasil. Saya menggunakan script di OP dan hanya dua kali lipat mengutip argumen CLI seperti yang ditunjukkan di atas. Output yang relevan adalah: + echo action --custom-package com.some.package /Users/bankleumi/some dir/ another_param. Versi Bash:GNU bash, version 4.2.36(1)-release (x86_64-pc-linux-gnu)
terdon
1

Ini harus bekerja dengan lebih banyak cangkang, dan mungkin lebih mudah dimengerti:

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

Perhatikan bahwa ini bekerja karena shell memperlakukan "$@"secara khusus, lihat bagian "Parameter Khusus" di halaman manual Bash.

Rainer Blome
sumber