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 ...)
sumber
echo $0 | xargs dirname
? Benarkah?./aapt action ""/Users/bankleumi/some dir/"" another_param
""foo bar"" baz
persis sama denganfoo bar baz
, dan aapt menerimanya sebagai tiga argumen satu kata.+ 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)
Ini harus bekerja dengan lebih banyak cangkang, dan mungkin lebih mudah dimengerti:
Perhatikan bahwa ini bekerja karena shell memperlakukan
"$@"
secara khusus, lihat bagian "Parameter Khusus" di halaman manual Bash.sumber