각 요소가 파일의 한 줄과 같도록 배열을 스크립트에 파일 인수로 제공하려면 어떻게 해야 합니까?

각 요소가 파일의 한 줄과 같도록 배열을 스크립트에 파일 인수로 제공하려면 어떻게 해야 합니까?

bash 스크립트가 인수가 파일일 것으로 예상한다고 가정합니다. 그러나 우리는 bash 배열을 가지고 있으며 마치 배열의 요소인 행이 있는 파일이 있는 것처럼 어떻게든 해당 배열을 스크립트에 대한 인수로 제공하려고 합니다. 무엇을 해야할지 알고 싶습니다.

myscrpt간단한 예로, 파일 매개변수가 필요한 단일 명령이 포함된 스크립트가 있습니다.

cat $1

배열이 있습니다

arr=( 1 3 5 )

arr인수가 실제로 내용이 다음과 같은 파일인 것처럼 스크립트에 인수로 제공하려면 어떻게 해야 합니까?

1
3
5

효과적인가요 myscript <(echo "${arr[@]}")?

감사해요.

답변1

bash셸이나 배열을 지원하는 다른 셸을 사용하는 경우 "${var[@]}"유형 구성을 사용할 수 있습니다.

a=(one two 'three four' five)
printf "%s\n" "${a[@]}"

printf예를 들어, 필요한 요소에 한 줄에 하나의 요소를 파이프하세요.

printf "%s\n" "${a[@]}" | myscript

배열 확장을 큰따옴표로 인용하는 것이 실제로 중요합니다. 그렇지 않으면 @문자가 처리되고 *배열 확장이 공백으로 분할된 단어로 (잘못) 처리됩니다.

답변2

따라서 스크립트가 있습니다(약간 수정하여 특이한 파일 이름을 가진 파일에서 읽기를 지원하도록 #!확장 주위에 -line 및 따옴표를 추가 ).$1

#!/bin/sh
cat "$1"

이제 배열을 사용하여 이 스크립트를 호출하려고 합니다.

arr=( 1 2 3 4 5 )

이렇게 하면 (스크립트가 수행하는) 파일을 읽지 않고 대신 배열에서 개행으로 구분된 값을 읽어서 다음을 생성합니다.

1
2
3
4
5

출력으로?

다음을 수행할 수 있습니다.

printf '%s\n' "${arr[@]}" | ./script -

또는

printf '%s\n' "${arr[@]}" | ./script /dev/stdin

그러면 스크립트에 읽을 파일로 -또는 가 전달됩니다. 표준 입력으로 해석되며 /dev/stdin, 주어지면 표준 입력에서도 읽혀집니다.cat-/dev/stdin

printf데이터는 배열에서 개행으로 구분된 요소로 제공되는 표준 입력으로 제공됩니다 .

같은 효과가 있을 것이다

( IFS=$'\n'; sh ./script.sh - <<<"${arr[*]}" )

여기에서 문자열을 통해 데이터가 제공됩니다. 를 사용하여 "${arr[*]}"배열의 요소를 $IFS첫 번째 문자(개행 문자로 설정)로 구분된 문자열로 연결합니다. IFS주변 환경의 수정을 피하기 위해 여기서는 하위 쉘을 사용하고 있습니다 .

관련 정보