парсинг значений в массив - PullRequest
1 голос
/ 18 февраля 2011

У меня простой вопрос, я думаю, но я не могу найти решение для него.
Простой Perl-скрипт выводит следующую строку "tests - Blub" "tests - Blub - Abc", и я присваиваю ее переменной типа var=$(perl ...), но почему я не могу разобрать ее в массив с varArray=( $var ), и эта команда varArray=( "tests - Blub" "tests - Blub - Abc" ) работает?

Ожидаемый результат должен быть таким:

tests - Blub
tests - Blub - Abc

И не так:

"tests
-
Blub"
"tests
-
Blub
-
Abc"

Спасибо за любые советы.

Ответы [ 3 ]

2 голосов
/ 19 февраля 2011

Вот немного каракулей:

$ bash
$ a='"tests - Blub" "tests - Blub - Abc"'
$ ary=( $a ); echo ${#ary[@]}
8
$ ary=( "$a" ); echo ${#ary[@]}
1
$ eval ary=( $a ); echo ${#ary[@]}
2

Очевидно, что третий результат - это то, что вы хотите.Когда вы заполняете свою переменную из выходных данных скрипта Perl, двойные кавычки внутри нее не имеют особого значения для оболочки: это просто символы.Вы должны получить оболочку для анализа (с eval), чтобы их значение было открыто.

1 голос
/ 18 февраля 2011

Я сделал следующее:

$ cat >/tmp/test.sh
echo '"tests - Blub" "tests - Blub - Abc"'

$ chmod +x /tmp/test.sh

$ /tmp/test.sh
"tests - Blub" "tests - Blub - Abc"

$ a=`/tmp/test.sh`

$ echo $a
"tests - Blub" "tests - Blub - Abc"

$ arr=($a)

$ echo $arr[1]
"tests[1]

Это говорит мне о том, что конструкция () игнорирует двойные кавычки после раскрытия переменных. Более того, когда я делаю

for i in $a; do echo $i; done

Я получаю похожий результат:

"tests
-
Blub"
"tests
-
Blub
-
Abc"

Похоже, кавычки обрабатываются до подстановки переменных и не рассматриваются снова.

0 голосов
/ 19 февраля 2011

Как насчет использования xargs в сочетании с sh -c '...'?

line='"tests - Blub" "tests - Blub - Abc"'
printf '%s' "$line" | xargs sh -c 'printf "%s\n" "$@"' argv0
IFS=$'\n'
ary=( $(printf '%s' "$line" | xargs sh -c 'printf "%s\n" "$@"' argv0) )
echo ${#ary[@]}
printf '%s\n' "${ary[@]}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...