URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 74477
[ Назад ]

Исходное сообщение
"BASH: маленький вопрос"

Отправлено stakado , 05-Июн-07 12:15 
Драсти!
Подскажите, плиз, как сделать следующее:
есть переменная $xyz следующего содержания:
1 2 3
4 5 6

Как сделать из нее массив из 2х элементов: 1 2 3 --- первый элемент. 4 5 6 - второй элемент?
xyz=($xyz) не катит, потому что получается массив из 6 элементов: первый эл-т: 1, второй: 2 и т.д.


Содержание

Сообщения в этом обсуждении
"BASH: маленький вопрос"
Отправлено silent_ion , 05-Июн-07 12:58 
>есть переменная $xyz следующего содержания:
>1 2 3
>4 5 6

как ты получил такую переменную?
Покажи с помощью какого кода такую переменную можно получить...



"BASH: маленький вопрос"
Отправлено perece , 05-Июн-07 13:28 
>как ты получил такую переменную?
>Покажи с помощью какого кода такую переменную можно получить...
легко, например

xyz='1 2 3
4 5 6'

или

xyz="`cat file`"
#где file содержит несколько строк с пробелами

\^P^/


"BASH: маленький вопрос"
Отправлено vic , 05-Июн-07 13:33 
>>есть переменная $xyz следующего содержания:
>>1 2 3
>>4 5 6
>
>как ты получил такую переменную?
>Покажи с помощью какого кода такую переменную можно получить...


если строки в переменной разбиты \n например так:
xyz=`echo -e "1 2 3\n4 5 6"

то

$line1=`printf "$xyz\n" | head -1`
$line2=`printf "$xyz\n" | tail -1`
$res_array=("$line1" "$line2")

если пробелы, то надо еще подумать ;) т.к. в общем случае размерности все таки неизвестны :)


"BASH: маленький вопрос"
Отправлено Oyyo , 05-Июн-07 16:17 
Драсти!
Подскажите, плиз, как сделать следующее:
есть переменная $xyz следующего содержания:
1 2 3
4 5 6

Как сделать из нее массив из 2х элементов: 1 2 3 --- первый элемент. 4 5 6 - второй элемент?
xyz=($xyz) не катит, потому что получается массив из 6 элементов: первый эл-т: 1, второй: 2 и т.д.

при создании массива
xyz=($xyz)
все елементы разбиваются разделителями содержащимися в переменной $IFS , по умолчанию пробел, табулятор, перевод строки
следующий скрипт решает твою проблему


xyz="1 2 3
4 5 6"

IFS=$'\n'
xyz=( $xyz )

echo ${xyz[0]}
echo ${xyz[1]}


"BASH: маленький вопрос"
Отправлено stakado , 06-Июн-07 02:43 
>при создании массива
>xyz=($xyz)
>все елементы разбиваются разделителями содержащимися в переменной $IFS , по умолчанию пробел,
>табулятор, перевод строки
>следующий скрипт решает твою проблему
>
>
 
>xyz="1 2 3
>4 5 6"
>
>IFS=$'\n'
>xyz=( $xyz )
>
>echo ${xyz[0]}
>echo ${xyz[1]}
>

Самое элегантное решение! Спасибо большое за помощь!


"BASH: маленький вопрос"
Отправлено perece , 05-Июн-07 13:26 
for i in `echo $xyz | tr ' ' '~'`
do echo xyz=`echo $i | tr '~' ' '`
done

иначе никак, имхо. хотя мож и я чего не знаю..
(вместо тильды может быть любой _non-whitespace_ символ, гарантированно не встречающийся в xyz. если такового в природе не имеется (там любой символ встретиться может) то вместо tr можно использовать sed, типа sed -e 's/ /=-tuta_+_probel-=/g' , ну и обратно соотв.

\^P^/


"BASH: маленький вопрос"
Отправлено bill , 05-Июн-07 22:47 
>Драсти!
>Подскажите, плиз, как сделать следующее:
>есть переменная $xyz следующего содержания:
>1 2 3
>4 5 6
>
>Как сделать из нее массив из 2х элементов: 1 2 3 ---
>первый элемент. 4 5 6 - второй элемент?
>xyz=($xyz) не катит, потому что получается массив из 6 элементов: первый эл-т:
>1, второй: 2 и т.д.

c=0
xyz="1 2 3
4 5 6"

echo -e "$xyz" |
while read line
do
    arr[$c]=$line
    echo "$c - ${arr[c]}"
    c=$((c+1))
done


0 - 1 2 3
1 - 4 5 6