파일의 각 줄을 명령에 옵션으로 전달하려면 어떻게 해야 합니까?

파일의 각 줄을 명령에 옵션으로 전달하려면 어떻게 해야 합니까?

파일을 읽고 각 줄을 다음과 같은 명령에 옵션(또는 "옵션 인수")으로 전달하는 스크립트를 작성하고 싶습니다.

command -o "1st line" -o "2nd line" ... -o "last line" args

이를 수행하는 가장 쉬운 방법은 무엇입니까?

답변1

# step 1, read the lines of the file into a shell array
mapfile -t lines < filename

# build up the command
cmd_ary=( command_name )
for elem in "${lines[@]}"; do
    cmd_ary+=( -o "$elem" )
done
cmd_ary+=( other args here )

# invoke the command
"${cmd_ary[@]}"

답변2

이것은 한 가지 가능성입니다.

$ cat tmp
1st line
2nd line
3rd line
4th line
$ command $(sed 's|.*|-o "&"|' tmp | tr '\n' ' ')

Glennjackman이 주석에서 지적했듯이 eval 로 감싸면 단어 분리를 피할 수 있습니다.보안 영향이 점을 높이 평가해야 합니다.

$ eval "command $(sed 's|.*|-o "&"|' tmp | tr '\n' ' ')"

편집하다:sedGlenn jackman의 mapfile/ readarray접근 방식과 어셈블리 매개 변수 사용에 대한 내 제안을 결합하면 다음과 같은 간결한 형식이 제공됩니다.

$ mapfile -t args < <(sed 's|.*|-o\n&|' tmp) && command "${args[@]}"

간단한 데모로 위의 tmp파일, 명령 grep및 파일을 고려하십시오 text.

$ cat text
some text 1st line and
a 2nd nonmatching line
some more text 3rd line end
$ mapfile -t args < <(sed 's|.*|-e\n&|' tmp) && grep "${args[@]}" text
some text 1st line and
some more text 3rd line end
$ printf "%s\n" "${args[@]}"
-e
1st line
-e
2nd line
-e
3rd line
-e
4th line

관련 정보