LINUX.ORG.RU

bash, построчно запихнуть строку в массив

 


1

2

в общем, пробую изобразить на баше подобие byobu для тмукса.
Конкретно, того функционала, когда если при нескольких сессий запускаешь тмукс, он предлагает или приаттачиться к уже существующей, либо создать новую.
Решил запихнуть списко активных сессий в массив
Родил такую конструкцию

declare -a activeSessionsArray

function loadActiveSessions( ) {
    local activeSessionsStr="$(tmux list-sessions)"
    local activeSessionNumber=0
    for activeSession in "$(echo \"${activeSessionsStr}\")" ; do
        activeSessionsArray[$activeSessionNumber]="${activeSession}"
        ((activeSessionNumber += 1))  # increment
    done
    echo "array[0]: ${activeSessionsArray[0]}"
}

и такая фигня. Как бы я не пытался, весь выхлоп tmux list-sessions или разбивается поп пробелам, либо пишется в одну стоку.

есть вариант использовать
echo $activeSessionsStr |
while read session ; do
    ...
done
но тогда массив пустой получается. Нашел в интернетах, что это потому что используется пайп.

еще вариант - писать во временный файл в /tmp, например, читать его, предварительно поставив $IFS, потом удалять, но мне это как-то не особо нравится.

в общем, мне нужны советы, как это сделать :)
спасибо

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

а можно выхлоп, а то у меня получается, что-то вроде

[den-laden ~ ]$ ls -l ./
total 4
drwxr-xr-x 2 den-laden den-laden  151 Apr  2 22:09 bin
drwxrwxr-- 3 den-laden den-laden   16 Apr 18 23:37 downloads
drwx------ 9 den-laden den-laden 4096 Mar 21 07:45 Dropbox

[den-laden ~ ]$ LIST=$(ls -l ./)
[den-laden ~ ]$ echo $LIST
total 4 drwxr-xr-x 2 den-laden den-laden 151 Apr 2 22:09 bin drwxrwxr-- 3 den-la
den den-laden 16 Apr 18 23:37 downloads drwx------ 9 den-laden den-laden 4096 Ma
r 21 07:45 Dropbox drwxrwxr-- 3 den-laden den-laden 55 Apr 18 23:25 ltcminer lrw
xrwxrwx 1 den-laden den-laden 23 Oct 3 2012 src -> /home/public/share/src/ drwxr
-xr-x 2 den-laden den-laden 6 Dec 17 00:05 www
[den-laden ~ ]$ for i in $LIST; do
> echo $i
> done
total
4
drwxr-xr-x
2
den-laden
den-laden
151
Apr
2
22:09
bin
drwxrwxr--
3

ii343hbka ★★★
() автор топика

В баше есть такая функция, readarray…
man -P"less -p'^\s+readarray'" bash
Вы бы его хоть открывали иногда.

Deleted
()
Ответ на: комментарий от gh0stwizard

тоже работает? пробовали? у меня ругается на File name too long. Что, в принципе, логично. Это ж не файл.

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

Пробовал, работает. Для sh пайпы и перенаправления вывода через «<», «>» равносильны загрузке из файла непосредственно. Пример корректен в таком синтаксисе.

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от Deleted

ну да, удобная штука, мне теперь не городить цикл. Но все равно, как его заполнить без пайпа?
Никак.
Ну тоесть, я думаю в сторону временного файла.

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

мой выхлоп

[den-laden ~ ]$ /usr/bin/env sh
$ while read str; do echo -e"\nhello\n $str"; done < "$(ls -l ./)"
sh: 1: cannot open total 8
drwxr-xr-x 2 den-laden den-laden  151 Apr  2 22:09 bin
drwxrwxr-- 3 den-laden den-laden   16 Apr 18 23:37 downloads
drwx------ 9 den-laden den-laden 4096 Mar 21 07:45 Dropbox
drwxrwxr-- 3 den-laden den-laden   55 Apr 18 23:25 ltcminer
-rw-r--r-- 1 den-laden den-laden  268 Apr 24 22:32 readarray
lrwxrwxrwx 1 den-laden den-laden   23 Oct  3  2012 src -> /home/public/share/src/
drwxr-xr-x 2 den-laden den-laden    6 Dec 17 00:05 www: File name too long
$

hello я там не вижу

ii343hbka ★★★
() автор топика

простите, вы не это ищете?

#!/bin/bash

IFS=$'\n'
array=($(echo -e "123\nqwe\na s d\nzxc"))
for((i=0;i<${#array[@]};i++)); do
  echo "$i: ${array[$i]}"
done

anonymous
()
Ответ на: комментарий от Deleted

ура :)
про такую штуку не знал.
как эта конструкция называется? Или тоже перенаправление вывода?

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

нет, думал в эту сторону, но не нравится изменять разделитель.

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

видимо, раньше угловые скобки «елкой» съедались

Нет, я проскимил быстренько man bash :)

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

как эта конструкция называется?

man -P"less -p'^\s+Process Substitution'" bash

Маны читай и вопросов не будет. По крайней мере наивных.

Deleted
()
IFS0=$IFS; IFS="|"; a=(`tmux list-sessions|sed 's/$/|/'`); IFS=$IFS0
yozan
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.