Tenho um problema de script BASH que reduzi, mas não consigo entender o que estou vendo. Quero obter uma substring de um array de forma sucinta. Aqui está o que estou vendo no bash, com 'set -x' para que os comandos sejam impressos conforme são executados:
$: read -a colours
+ read -a colours
blue green red yellow pink purple
$: echo ${colours[@]}
+ echo blue green red yellow pink purple
blue green red yellow pink purple
$: expr substr "${colours[@]}" 16 6
+ expr substr blue green red yellow pink purple 16 6
expr: syntax error: unexpected argument ‘yellow’
$: expr substr \"${colours[@]}\" 16 6
+ expr substr '"blue' green red yellow pink 'purple"' 16 6
expr: syntax error: unexpected argument ‘yellow’
A última tentativa do expr substr
comando retornou aspas estranhas para os elementos do array, então de onde isso veio? Ajude-me a entender o que expr substr
está acontecendo aqui ou isso é um bug?
EDIT: Listei abaixo alguns comportamentos desejados em uma string entre aspas simples, mas por que não posso citar um array da mesma maneira?
$: all_colours=${colours[@]}
+ all_colours='blue green red yellow pink purple'
$: expr substr $all_colours 16 6
+ expr substr blue green red yellow pink purple 16 6
expr: syntax error: unexpected argument ‘yellow’
$: expr substr "$all_colours" 16 6
+ expr substr 'blue green red yellow pink purple' 16 6
yellow
Expr é uma ferramenta de linha de comando, é independente do bash. Ela não sabe nada sobre arrays. Ela obtém argumentos de linha de comando, exatamente aqueles que chamamos de
$1
,$2
,$3
etc em nossos scripts.O importante é: o bash conhece matrizes, mas como você chama um binário, ele só pode obter uma lista de argumentos como parâmetros.
Se você chamar
expr
com um array expandido em sua sintaxe, você obterá o que disse.expr substr
esperará números, você dá a ele muitas palavras de texto, então ele reclamará sobre muitos argumentos e seus tipos ruins.Não tenho certeza do que você está tentando fazer com essa substring - uma matriz pode ter um intervalo, ou uma "submatriz", ou um intervalo, mas não tenho certeza de como você define a substring de uma matriz.