А как насчет этого, который работает как минимум на bash 3.x и выше:
astr=(a b c)
str=astr[@] # Our reference to an array
local arr=("${!str}") # Copy into an array using indirect ref
echo ${#arr[*]}
# 3
bstr=("a foo" "a bar" "a fox" "a buzz")
str=bstr[@]
local arr=("${!str}")
echo ${#arr[*]}
# 4
Мы используем ключевое слово local
, чтобы наша рабочая переменная arr
оставалась локальной для функции, но это необязательно. На самом деле, из-за ограничений bash, arr
можно также использовать для доступа к элементам в косвенном )массиве (, например:
echo ${arr[1]} # Print 2nd element
echo ${#arr[1]} #... print its size
(Проверено на bash 3.1.23 , bash 4.3.48 и 4.4.12)
Grep в основном ищет строки, содержащие совпадения с заданным шаблоном. В зависимости от шаблона может быть невозможно определить, соответствует ли строка, не глядя на всю строку. С grep Match
это возможно, а с grep 'Match$'
— нет. С grep -o Match
grep мог бы напечатать Match
, как только увидит его, но с grep -E -o '(Match)+'
, если grep прочитал MatchMa
, он не знает, последует tch
или нет.
Grep не реализует особые случаи, когда можно было бы записать некоторый вывод до того, как будет видна вся строка. (Я думаю, что он не реализует какой-либо такой особый случай, но я не совсем уверен, :GNU grep имеет несколько режимов, зависящих от шаблона, которые ведут себя несколько по-разному. )Он просто читает целую строку перед попыткой сопоставления.
Если есть символ, который никогда не появляется в совпадающем тексте и всегда (или, по крайней мере, часто )появляется между совпадениями, преобразуйте этот символ в новую строку. (Или в нулевой байт и используйте grep -z
.)
while true; do printf "Match Unmatch"; sleep 1s; done | stdbuf -o0 tr ' ' '\n' | grep -o "Match"
Обратите внимание на использование stdbuf -o0
для предотвращения буферизации вывода tr
. И если вы передаете вывод grep, вам понадобится это и для grep, или используйте grep --line-buffered
.(--line-buffered
буферизует вывод команды grep; это не влияет на то, как grep читает ввод, и по умолчанию включено, когда grep печатает на терминал.)