Bash에서 파일 콘텐츠를 여러 매개변수로 전달하는 방법

Bash에서 파일 콘텐츠를 여러 매개변수로 전달하는 방법

시간이 지남에 따라 업데이트되는 데이터(mydata)가 포함된 파일이 있습니다. 파일은 다음과 같습니다.

1 2 3

이 파일을 사용하여 다음을 수행하고 싶습니다(기본적으로 각 숫자를 별도의 인수로 처리).

myscript.sh 1 2 3

데이터는 정적이 아니지만 시간이 지남에 따라 업데이트되므로 다음 명령을 실행하고 싶습니다.

myscript.sh "$(cat mydata)"

하지만 ./myscript.sh: 1행: 1: 명령을 찾을 수 없습니다.

어떻게 해야 합니까?

답변1

"$(cat mydata)"mydata파일 내용에서 후행 줄 바꿈을 뺀 문자열을 평가합니다 . 원하는 것은 파일에서 공백으로 구분된 단어 목록입니다. 따라서 이번에는 큰따옴표 밖에서 명령 대체를 사용하십시오.

myscript.sh $(cat mydata)

견고성을 강화하려면 와일드카드를 꺼서 열에 mydata이러한 문자 중 하나가 포함되어 있으면 \[*?파일 이름 패턴으로 해석되지 않도록 하세요. 설정하고 싶을 수도 있습니다.IFS단어 구분 기호가 포함되어 있지만 기본값(ASCII 공백)이 필요한 것이어야 합니다.

(set -f; myscript.sh $(cat mydata))

또는 read내장된 기능을 사용할 수도 있습니다. 이는 첫 번째 줄을 읽고 나머지는 무시합니다(위의 내용으로 대체하면 됩니다 cat) head -n 1.

read -r one two three rest <mydata
myscript.sh "$one" "$two" "$three"

답변2

이는 일반적 xargs으로 다음과 같은 경우에 수행됩니다.

xargs myscript.sh < mydata

xargs입력을 공백이나 개행으로 구분된 단어로 처리합니다. 여기서 작은따옴표, 큰따옴표 또는 백슬래시를 사용하여 구분 기호를 이스케이프합니다. xargs명령은 명령에 전달된 인수(및 환경)의 크기에 대한 제한을 피하기 위해 필요한 만큼 여러 번 실행됩니다.

답변3

매개변수를 여러 매개변수로 전달하는 대신 단일 배열로 전달한 다음 매개변수로 원하는 작업을 수행합니다.

#This is the function which takes a variable length array as an input. 
function function_call() 
{
    all_array_values=$1[@]
    a=("${!all_array_values}")
    for i in "${a[@]}" ; do
        echo "$i"
    done
}


#Here I add all the file contents to the variable named input.  
input=$(cat filename)
#In this step I convert the file contents to an array by splitting on space. 
input_to_array=(${input//' '/ })
#I call the function here. 
function_call input_to_array

시험

아래와 같은 입력 파일이 있습니다.

cat filename
1 2 3 4
5
6
7
8

보시다시피 테스트 목적으로 입력에 여러 줄을 사용하고 있습니다.

이제 위 스크립트를 실행하면 다음과 같은 결과가 나타납니다.

1
2
3
4
5
6
7
8

더 적은 수의 매개변수를 갖도록 입력 파일을 변경했으며 더 적은 수의 매개변수로 실행하면 다음과 같은 출력을 얻습니다.

1
2
3
4

인용하다

https://stackoverflow.com/questions/16461656/bash-how-to-pass-array-as-an-argument-to-a-function https://stackoverflow.com/a/5257398/1742825

관련 정보