Значит, вам действительно нужна только средняя часть объявления -p
без мусора вокруг нее?
Вы могли бы написать макрос, например:
readonly VARTYPE='{ read __;
case "`declare -p "$__"`" in
"declare -a"*) echo array;;
"declare -A"*) echo hash;;
"declare -- "*) echo scalar;;
esac;
} <<<'
, чтобы вы могли:
a=scalar
b=( array )
declare -A c; c[hashKey]=hashValue;
######################################
eval "$VARTYPE" a #scalar
eval "$VARTYPE" b #array
eval "$VARTYPE" c #hash
(Простая функция не подойдет, если вы захотите использовать ее для локальных переменных функции).
shopt -s expand_aliases
alias vartype='eval "$VARTYPE"'
vartype a #scalar
vartype b #array
vartype c #hash
Если элементы всегда двойные кавычки, то вы можете заменить кавычку -пробел -кавычка на кавычку -новую строку -кавычку:
$ sed 's/" "/"\n"/g' <<< "$variable"
"/home/myuser/example of name with spaces"
"/home/myuser/another example with spaces/myfile"
или (с использованием подстановки параметров оболочки)
$ printf '%s\n' "${variable//\" \"/\"$'\n'\"}"
"/home/myuser/example of name with spaces"
"/home/myuser/another example with spaces/myfile"
Но было бы проще, если бы вы могли модифицировать свой скрипт для использования массива:
$ vararray=("/home/myuser/example of name with spaces" "/home/myuser/another example with spaces/myfile")
$ printf '"%s"\n' "${vararray[@]}"
"/home/myuser/example of name with spaces"
"/home/myuser/another example with spaces/myfile"