Как я могу заменить все пространства вне двойных кавычек \ N?

Значит, вам действительно нужна только средняя часть объявления -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
1
29.06.2018, 03:30
1 ответ

Если элементы всегда двойные кавычки, то вы можете заменить кавычку -пробел -кавычка на кавычку -новую строку -кавычку:

$ 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"
2
27.01.2020, 23:32

Теги

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