Как получить выходные значения в массиве bash, вызвав другую программу из bash? - PullRequest
0 голосов
/ 31 марта 2020

Я застрял в особой ситуации, когда из python я печатаю две строки одну за другой и читаю это в скрипте bash (который вызывает фрагмент кода python). Я ожидаю, что размер массива будет 2, но почему-то bash рассматривает пробелы также как разделитель элементов и возвращает размер 3.

Примеры сценариев

Файл multi_line_return.py имеет следующее содержимое

print("foo bar")
print(5)

multi_line_call. sh имеет следующее содержимое

#!/bin/bash

PYTHON_EXE="ABSOLUTE_PATH TO PYTHON EXECUTABLE IN LINUX"
CURR_DIR=$(cd $(dirname ${BASH_SOURCE[0]}) && pwd)/

array=()
while read line ; do
  array+=($line)
done < <(${PYTHON_EXE} ${CURR_DIR}multi_line_return.py)

echo "array length --> ${#array[@]}"
echo "each variable in new line"
for i in "${array[@]}"
do
    printf $i
    printf "\n"
done

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

bash multi_line_call.sh

Как видите в результате

I am getting 
  array length = 3  
  1.foo, 2.bar & 3. 5

The expectation is 
One complete line of python output (stdout) as one element of bash array
  array length = 2
  1. foo bar & 2. 5

1 Ответ

2 голосов
/ 31 марта 2020

Поместите кавычки вокруг $line, чтобы предотвратить его разделение:

array+=("$line")

Вы также можете сделать это без al oop, используя readarray:

readarray array < <(${PYTHON_EXE} ${CURR_DIR}multi_line_return.py)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...