Передать массив из одной функции в другую и выполнить расширение параметров - PullRequest
0 голосов
/ 30 марта 2020

Приведенный ниже служебный скрипт выполняет все виды тарирования для клиентских скриптов. Он многократно выполняет преобразование абсолютного в относительный путь, поэтому я извлек это в отдельную функцию (_convertToRelative).

#!/bin/bash

_convertToRelative() {
  local -n arr1=$1
  local arr2=( "${arr1[@]/#\//}" )  # ( /foo/bar /foo/baz ) -> ( foo/bar foo/baz )
  echo $arr2 
}

tarPaths() {
  local -n paths_absolute=$1
  local paths_relative=${_convertToRelative paths_absolute}   # fails here
  # ...run tar
}

Клиентский скрипт сделает это

paths=( '/foo/bar/baz/a' '/foo/bar/baz/b' '/foo/bar/baz/c' )
tarPaths paths

Но происходит сбой с:

paths_relative = $ {_ convertToRelative paths_absolute}: неправильная замена

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Вы также можете передать переменную paths_relative в качестве ссылки. Тогда вам не нужно echo массив в виде строки и преобразовать его обратно в массив, что может привести к проблемам, если путь содержит пробелы, табуляции или переводы строк:

#!/bin/bash

_convertToRelative() {
  local -n arr1=$1 arr2=$2
  arr2=( "${arr1[@]#/}" )  # <- remove shortest prefix `/` from each array element
}

tarPaths() {
  local -n paths_absolute=$1
  local -a paths_relative
  _convertToRelative paths_absolute paths_relative
  # ...run tar
}
1 голос
/ 30 марта 2020

Кажется, что это опечатка: вместо ${...} вам нужно набрать $(...) (скобки вместо похвал).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...