LINUX.ORG.RU

bash. массив + строки_с_пробелами = месиво


0

1

всем привет.

есть скрипт(подгружаемый в другой скрипт) с таким содержанием:

VAR=(
   "cd some_dir && cp file dir/"
   "cd some_dir && cp file file2"
)

далее, в основном скрипте он подгружается в функции вызываемой рекурсивно:

func() {
   . ./script.sh
   echo "len: ${#VAR[@]}, arr: ${VAR[@]}" # тут все правильно
   # но ввиду того что функция рекурсивная, нужно сохранить VAR в локальную переменную
   local _VAR=(${VAR[@]})
   echo "len: ${#_VAR[@]}, arr: ${_VAR[@]}" # тут все НЕ правильно. len=12 оО
}

подскажите как исправить?

спасибо.

★★★

Ответ на: комментарий от niXman

УМВР


[c0_c4] ~/tmp$ bash ./t.sh 
len: 2, arr: cd some_dir && cp file dir/ cd some_dir && cp file file2
len: 2, arr: cd some_dir && cp file dir/ cd some_dir && cp file file2
len2: 12, arr: cd some_dir && cp file dir/ cd some_dir && cp file file2

[c0_c4] ~/tmp$ cat t.sh 
#!/bin/bash
VAR=(
   "cd some_dir && cp file dir/"
   "cd some_dir && cp file file2"
)

func() {
   echo "len: ${#VAR[@]}, arr: ${VAR[@]}" # тут все правильно
   # но ввиду того что функция рекурсивная, нужно сохранить VAR в локальную переменную
   local _VAR=("${VAR[@]}")
   echo "len: ${#_VAR[@]}, arr: ${_VAR[@]}" # 2 <<<
   local _VAR2=(${VAR[@]})
   echo "len2: ${#_VAR2[@]}, arr: ${_VAR2[@]}" # тут все НЕ правильно. len=12 оО
}

func

cx ★★
()
Ответ на: комментарий от cx

local _VAR=(«${VAR[@]}»)

все именно так и сделал. возможно причина в том, что исходный VAR находится в другом скрипте?

niXman ★★★
() автор топика
Ответ на: комментарий от cx

а нет.. простите.

разделил ваш пример на два скрипта, и все правильно. значит это я где-то накосячил..

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

ха!

как оказалось, проблема в том что в своем примере между квадратных скобок я использую * (звездочку), а тут на форуме - собаку. ибо последний, звездочку в квадратных скобках трактует как элемент таблицы.

да и в общем я полагал что разницы нет...

зы: кто-то в курсе в чем разница?

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

http://tldp.org/LDP/abs/html/internalvariables.html#APPREF

Там куча примеров

$*

All of the positional parameters, seen as a single word

$@

Same as $*, but each parameter is a quoted string, that is, the parameters are passed on intact, without interpretation or expansion. This means, among other things, that each parameter in the argument list is seen as a separate word.

cx ★★
()
Ответ на: комментарий от cx

да-да-да! уже въехал!

благодарю.

niXman ★★★
() автор топика
Ответ на: комментарий от cx

позвольте еще такой микровопрос: при итерации по массиву строк, пытаюсь выполнить каждую строку как последовательность команд:

for it in "${_VAR[@}"; do
   ${it} || return 1
done
и получаю ошибку: «cd: comand not found

т.е. обратите внимание на двойные кавычки в начале. как от них можно избавиться?

спасибо.

niXman ★★★
() автор топика
Ответ на: умвр от uzbl

хм... значит ошибка не в этом %)

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

for it in «${_VAR[@}»; do

ты закрывающую ] случайно пропустил, когда набирал, или так в коде?

ananas ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.