В основном, для нахождения всех файлов включая конкретную строку в каталоге можно использовать:
grep -lir "pattern" /path/to/the/dir
-l
: сделать это сканирование остановится на первом соответствии-i
: проигнорировать различия случая и в шаблоне и во входных файлах-r
: ищите все файлы в соответствии с каталогом, рекурсивноДля поиска двух шаблонов попробуйте это:
grep -lr "321" $(grep -lr "foo" /path/to/the/dir)
Вы можете создать массив из другого массива с помощью этого синтаксиса:
arr1=( "${arr2[@]}" )
Это можно преобразовать в этот синтаксис значения по умолчанию:
arr1=("${arr1[@]:-${arr2[@]}}")
Я протестировал некоторые граничные случаи, такие как элементы массива с пробелами или символами новой строки в них, и, кажется, обрабатывает их правильно.
Поскольку у меня были случаи, когда мой 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[@]}"})