Все версии bash правильно обрабатывают массивы, если массиву задан список ()
.
Или элементу массива присваивается значение (даже null ).
Этот код (использует набор текста для запуска в ksh):
unset ar; typeset -a ar=()
printf '%-20s%s ' "$(typeset -p ar)" '--'
unset ar; typeset -a ar; ar[3]=""
printf '%-30s%s ' "$(typeset -p ar)" '@@'
unset ar; typeset -a ar; ar[3]="val"
printf '%-31s ' "$(typeset -p ar)"
Распечатает эти результаты:
zsh/sh : typeset -a ar=( ) -- typeset -a ar=( '' '' '' '' ) @@ typeset -a ar=( '' '' '' val )
b203sh : declare -a ar='()' -- declare -a ar='([3]="")' @@ declare -a ar='([3]="val")'
b204sh : declare -a ar='()' -- declare -a ar='([3]="")' @@ declare -a ar='([3]="val")'
b205sh : declare -a ar='()' -- declare -a ar='([3]="")' @@ declare -a ar='([3]="val")'
b30sh : declare -a ar='()' -- declare -a ar='([3]="")' @@ declare -a ar='([3]="val")'
b32sh : declare -a ar='()' -- declare -a ar='([3]="")' @@ declare -a ar='([3]="val")'
b41sh : declare -a ar='()' -- declare -a ar='([3]="")' @@ declare -a ar='([3]="val")'
b42sh : declare -a ar='()' -- declare -a ar='([3]="")' @@ declare -a ar='([3]="val")'
b43sh : declare -a ar='()' -- declare -a ar='([3]="")' @@ declare -a ar='([3]="val")'
b44sh : declare -a ar=() -- declare -a ar=([3]="") @@ declare -a ar=([3]="val")
ksh93 : typeset -a ar -- typeset -a ar=([3]='') @@ typeset -a ar=([3]=val)
attsh : typeset -a ar -- typeset -a ar=([3]='') @@ typeset -a ar=([3]=val)
zsh/ksh : typeset -a ar=( ) -- typeset -a ar=( '' '' '' '' ) @@ typeset -a ar=( '' '' '' val )
zsh : typeset -a ar=( ) -- typeset -a ar=( '' '' '' ) @@ typeset -a ar=( '' '' val )
Как видите, все оболочки (с некоторыми отличиями )запускают код и дают эквивалентные результаты.
Кроме того,все оболочки работают с этим кодом:
unset ar; typeset -i ar ; printf '%-17s%s ' "$(typeset -p ar)" '=='
unset ar; typeset -a ar ; printf '%-19s%s ' "$(typeset -p ar)" '++'
И распечатать:
zsh/sh : typeset -i ar=0 == typeset -a ar=( ) ++
b203sh : declare -i ar="" == declare -a ar='()' ++
b204sh : declare -i ar="" == declare -a ar='()' ++
b205sh : declare -i ar="" == declare -a ar='()' ++
b30sh : declare -i ar="" == declare -a ar='()' ++
b32sh : declare -i ar="" == declare -a ar='()' ++
b44sh : declare -i ar == declare -a ar ++
ksh93 : typeset -i ar == typeset -a ar ++
attsh : typeset -i ar == typeset -a ar ++
zsh/ksh : typeset -i ar=0 == typeset -a ar=( ) ++
zsh : typeset -i ar=0 == typeset -a ar=( ) ++
Черновой патч есть в bash серии 4. И 4.1, и 4.2 работают с массивом:
b41sh : declare -a ar='()' ++
b42sh : declare -a ar='()' ++
Но не для простой переменной. И bash 4.3 не проходит оба теста :
.b43sh : script: line 3: typeset: ar: not found ==
script: line 4: typeset: ar: not found ++
Итак, для этих тестов отмените Bash 4.3 --.
Введите cat (имя вашего текстового файла) | grep (слово, которое вы хотите выделить)
, например cat текстовый файл | grep в
.