Que tipo de operação é / # / - em “$ {my_array [@] / # / -}”?

17

A resposta aceita para Transforma uma matriz em argumentos de um comando? usa o seguinte comando Bash:

command "${my_array[@]/#/-}" "$1"

Estou tentando descobrir exatamente o que a parte /#/- faz. Infelizmente, não sei como chamá-lo, por isso estou tendo problemas para encontrar qualquer documentação. Eu examinei a seção da página man do Bash em arrays e alguns sites, mas não consigo encontrar nada.

    
por Justin 03.10.2018 / 15:22

2 respostas

24

Esta é uma instância de substituição de padrão no shell expansão de parâmetro : ${parameter/pattern/replacement} expande ${parameter} , substituindo a primeira instância de pattern por replacement . No contexto de um padrão desse tipo, # é especial: ele ancora o padrão no início do parâmetro. O resultado final de tudo isso é expandir todos os valores na matriz my_array , prefixando - para cada um (substituindo o padrão vazio no início de cada parâmetro).

    
por 03.10.2018 / 15:30
2

Sim, é uma substituição de padrão no shell expansão de parâmetros como:

${parameter/pattern/replacement}

Mas se o primeiro caractere após o primeiro / for / ou # ou % , ele terá o significado especial de all (repetido), start e end .

com:

$ str='one_#two_two_three_one'

Um único / substituirá a primeira instância. A primeira instância de one :

$ echo "${str/one/x-x}"
x-x_#two_two_three_one

Ou a primeira instância de two :

$ echo "${str/two/x-x}"
one_#x-x_two_three_one

A instância de one no final:

$ echo "${str/%one/x-x}"
one_#two_two_three_x-x

Todas as repetições de two :

$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one

A instância de one no início:

$ echo "${str/#one/x-x}"
x-x_#two_two_three_one

Uma string que começa com # (cite o # ):

$ echo "${str/\#two/x-x}"
one_x-x_two_three_one

Mas se você deixar o # (sem aspas) sozinho, a substituição será definida no início da variável:

$ echo "${str/#/====}"
====one_#two_two_three_one

Além disso, se o parâmetro for uma matriz, a substituição será feita em todos os elementos:

$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three
    
por 06.10.2018 / 03:10

Tags