Який тип операцій / # / - у "$ {my_array [@] / # / -}"?


17

Прийнята відповідь на Перетворити масив в аргументи команди? використовує таку команду Bash:

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

Я намагаюся розібратися, що саме /#/-робить. На жаль, я не знаю, як це назвати, тому у мене виникають проблеми з пошуком будь-якої документації. Я переглянув розділ сторінки чоловіка Bash на масивах та кількох веб-сайтах, але нічого не можу знайти.

Відповіді:


24

Це приклад заміни шаблону в розширенні оболонки параметра : ${parameter/pattern/replacement}розширюється ${parameter}, замінивши перший екземпляр patternз replacement. У контексті такого шаблону #особливий: він прив’язує шаблон до початку параметра. Кінцевим результатом усього цього є розширення всіх значень my_arrayмасиву, попередньо -до кожного (замінивши порожній шаблон на початку кожного параметра).


2

Так, це заміна шаблону в розширенні параметра оболонки як:

${parameter/pattern/replacement}

Але якщо перший символ після першого /або /або #або %воно має особливе значення all(повторюється), startі end.

з:

$ str='one_#two_two_three_one'

Сингл /замінить перший екземпляр. Перший примірник one:

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

Або перший екземпляр two:

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

Примірник oneв кінці:

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

Усі повтори two:

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

Екземпляр oneна початку:

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

Рядок, що починається з #(цитуйте #):

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

Але якщо ви залишите # (без котирування) у спокої, заміна встановлюється на початку змінної:

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

Крім того, якщо параметр є масивом, заміна виконується на всіх елементах:

$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three

Формулювання трохи вводить в оману , як #і %є частиною шаблону , а //це інший оператор з /і використовувати одні і ті ж зразки. Ви можете мати pattern='#x'; echo "${var/$pattern}"(або ${var//$pattern}), але pattern=/x; echo "${var/$pattern}"це не те саме, що echo "${var//x}". Зауважте, що #і %їх можна комбінувати zsh, але ні, bashні ksh.
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.