Dado o parâmetro bash
foo='ab "cd" "e f" x="1 2" '
Desejo produzir um array equivalente a
foo_transformed=( ab '"cd"' '"e f"' 'x="1 2"' )
de forma portátil, ou seja, usar recursos internos do bash (v3 +) ou programas disponíveis para a maioria dos sistemas operacionais (Linux, Unix, Cygwin) por padrão. Simplicidade e segurança, dada a sequência de entrada (quase) arbitrária, são desejáveis.
Você pode assumir que a entrada não contém aspas simples '
ou barras invertidas \
, mas pode conter um número arbitrário de caracteres de espaço em branco, tanto onde desejo que delimitem a string quanto onde não o fazem (quando entre aspas duplas).
Se tentarmos:
foo_transformed=( $foo )
então as aspas internas de foo
não são respeitadas ( for k in "${foo_transformed[@]}"; do echo "- $k"; done
):
- ab
- "cd"
- "e
- f"
- x="1
- 2"
Se tentarmos:
eval foo_transformed=( $foo )
então as aspas são perdidas:
- ab
- cd
- e f
- x=1 2