시간이 지남에 따라 업데이트되는 데이터(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