Python 스크립트의 출력을 반복할 때 bash의 "echo" 문제

Python 스크립트의 출력을 반복할 때 bash의 "echo" 문제

파이썬 스크립트가 주어지면

if __name__ == '__main__':
    print("first")
    print("second")
    print("third")

배쉬 스크립트

#!/usr/bin/env bash

declare -a choice=$( python3 test.py )
echo "You chose "
for c in "${choice[@]}"; do
    echo "> ${c}"
done

인쇄해야 함

You chose
> first
> second
> third

하지만 대신에 인쇄됩니다.

You chose
> first
second
third

왜 이런 일이 발생하며 어떻게 해결할 수 있나요?

답변1

Python 스크립트는 세 줄의 텍스트를 인쇄합니다. 배열로 읽으려면 다음을 bash사용하십시오 readarray.

readarray -t chose < <( python3 test.py )
printf '> %s\n' "${chose[@]}"

readarray -t명령은 표준 입력의 행을 주어진 배열로 읽습니다. 프로세스 대체를 사용하여 Python 스크립트에서 표준 입력을 리디렉션합니다. 기본적으로 유틸리티는 readarray개행 문자로 끝나는 텍스트 문자열과 같은 개별 행을 읽으며, 이 -t옵션을 사용하면 유틸리티가 읽은 데이터에서 종료 개행 문자를 제거합니다.

printf호출은 각 배열 요소를 선행 >및 공백과 함께 인쇄합니다. (이와 같은 배열 확장을 제공하여) 여러 인수를 제공하면 printf형식 지정 문자열을 재사용하여 각 개별 인수를 출력합니다. 이는 루핑이 필요하지 않음을 의미합니다.


스크립트의 문제는 Python 스크립트의 출력을 단일 문자열로 읽는다는 것입니다. 명령 대체는 $( python3 test.py )문자열로 확장되며, 그런 다음 수동으로 구문 분석하고 개행을 올바른 배열 요소로 분할해야 합니다.

넌 할 수있어Da Bomber가 제안한대로쉘이 이 분할을 수행하도록 합니다 choice=( $( python test.py ) )(필수는 아님 declare -a). 그러나 이렇게 하면 문자열이 다음으로 분할됩니다.어느공백(기본적으로 공백, 탭 및 줄 바꿈(의 내용 $IFS)). 이는 개별 배열 요소에 공백을 포함하려는 경우 원하는 것이 아닐 수 있습니다.

IFS그런 다음 하나의 옵션은 쉘이 개행에서 데이터를 분할하도록 개행으로 설정하는 것입니다 .오직read, 또는 다음 을 사용하여 readarrayPython bash코드 의 출력을 읽습니다.


코드의 변수 이름과 기타 텍스트를 보면 일종의 대화형 메뉴를 구현하려는 것 같습니다.

select이 작업은 다음을 통해 수행할 수도 있습니다 bash.

readarray -t options < <( python3 test.py )

echo 'Please select your option' >&2
PS3='Your selection: '
select ch in "${options[@]}"; do
    [ -n "$ch" ] && break
    echo 'Invalid, try again' >&2
done

printf 'You chose option %d ("%s")\n' "$REPLY" "$ch"

그러면 Python 스크립트의 출력이 select루프의 옵션으로 사용됩니다. 사용자가 유효한 옵션을 선택할 때까지 루프가 계속됩니다. 마지막으로 선택한 옵션(및 해당 번호)이 인쇄됩니다.

이 프롬프트는 PS3에서 사용되는 프롬프트입니다. 기본값 뒤에는 공백이 옵니다.selectbash#?

답변2

declare -a choice=$( python3 test.py )1 길이 배열을 만드는 것처럼 보입니다 .

choice[0]='first
second
third'

노력하다declare -a choice=( $( python3 test.py ) )

관련 정보