Запишите массив по умолчанию в переменную в Bash

В основном, для нахождения всех файлов включая конкретную строку в каталоге можно использовать:

grep -lir "pattern" /path/to/the/dir
  • -l: сделать это сканирование остановится на первом соответствии
  • -i: проигнорировать различия случая и в шаблоне и во входных файлах
  • -r: ищите все файлы в соответствии с каталогом, рекурсивно

Для поиска двух шаблонов попробуйте это:

grep -lr "321" $(grep -lr "foo" /path/to/the/dir)
10
08.04.2011, 15:03
2 ответа

Вы можете создать массив из другого массива с помощью этого синтаксиса:

arr1=( "${arr2[@]}" )

Это можно преобразовать в этот синтаксис значения по умолчанию:

arr1=("${arr1[@]:-${arr2[@]}}")

Я протестировал некоторые граничные случаи, такие как элементы массива с пробелами или символами новой строки в них, и, кажется, обрабатывает их правильно.

9
27.01.2020, 20:02

Поскольку у меня были случаи, когда мой arr2 мог быть пустым, но установленным, я не мог найти простого решения. Поэтому мне пришлось использовать функцию и глобальную временную переменную. Но это работает во всех случаях, и в bash 3.2 и bash 4

function set_temp_array()
{ # 1 - source_array_name $2-* default_values
  local default="$1"
  shift
  if declare -p $default >& /dev/null; then
    default="${default}[@]"
    TEMP_VAR=("${!default}")
  else
    TEMP_VAR=("${@}")
  fi
}

set_temp_array arr1 "${arr2[@]}"
arr1="${TEMP_VAR[@]}"

я использую косвенную ссылку на массив для копирования значений в TEMP_VAR , но я не мог определить косвенное присвоение массива в bash, поэтому две строки и временная переменная

Для вас установите -eu fan out there

function set_temp_array()
{ # 1 - source_array_name $2-* default_values
  local default="$1"
  shift
  if declare -p $default >& /dev/null; then
    default="${default}[@]"
    TEMP_VAR=(${!default+"${!default}"})
  else
    TEMP_VAR=(${@+"${@}"})
  fi
}

set_temp_array arr1 ${arr2+"${arr2[@]}"}
arr1=(${TEMP_VAR+"${TEMP_VAR[@]}"})
2
27.01.2020, 20:02

Теги

Похожие вопросы