.txt
저는 파일 이름을 인수로 사용하여 파일을 한 줄씩 읽고 각 줄을 명령에 전달하는 스크립트를 작성하고 있습니다 . 예를 들어 , command --option "LINE 1"
then command --option "LINE 2"
등을 실행합니다 . 명령의 출력은 다른 파일에 기록됩니다. 어떻게 해야 하나요? 어디서부터 시작해야할지 모르겠습니다.
답변1
또 다른 옵션은 입니다 xargs
.
GNU 사용 xargs
:
xargs -a file -I{} -d'\n' command --option {} other args
{}
텍스트 줄에 대한 자리 표시자입니다.
다른 것들은 일반적으로 가 xargs
없지만 일부는 NUL로 구분된 입력을 가지고 있습니다. 이를 통해 다음을 수행할 수 있습니다.-a
-d
-0
< file tr '\n' '\0' | xargs -0 -I{} command --option {} other args
Unix 호환 시스템( -I
POSIX에서는 선택 사항, UNIX 호환 시스템에만 해당)에서는 입력을 전처리해야 합니다.인용하다예상되는 형식의 행 xargs
:
< file sed 's/"/"\\""/g;s/.*/"&"/' |
xargs -E '' -I{} command --option {} other args
그러나 일부 xargs
구현에서는 인수의 최대 크기에 대한 제한이 매우 낮습니다(예: Unix 사양에서 허용하는 최소값인 Solaris의 경우 255).
답변2
while read
루프를 사용하십시오 .
: > another_file ## Truncate file.
while IFS= read -r line; do
command --option "$line" >> another_file
done < file
또 다른 방법은 출력을 청크로 리디렉션하는 것입니다.
while IFS= read -r line; do
command --option "$line"
done < file > another_file
마지막으로 파일을 엽니다.
exec 4> another_file
while IFS= read -r line; do
command --option "$line" >&4
echo xyz ## Another optional command that sends output to stdout.
done < file
명령 중 하나가 입력을 읽는 경우 명령이 입력을 먹지 않도록 입력에 다른 fd를 사용하는 것이 좋습니다(이것은 대신 ksh
휴대용 대안이 사용된다고 가정 합니다 ).zsh
bash
-u 3
<&3
while IFS= read -ru 3 line; do
...
done 3< file
최종적으로 매개변수를 승인하려면 다음을 수행하십시오.
#!/bin/bash
file=$1
another_file=$2
exec 4> "$another_file"
while IFS= read -ru 3 line; do
command --option "$line" >&4
done 3< "$file"
어느 것이 다음과 같이 실행될 수 있습니까?
bash script.sh file another_file
추가 생각. 와 함께 bash
사용 readarray
:
readarray -t lines < "$file"
for line in "${lines[@]}"; do
...
done
참고: IFS=
행 값에서 선행 및 후행 공백을 제거해도 괜찮다면 이 항목을 생략할 수 있습니다.
답변3
이 질문에 정확하게 답하십시오.
#!/bin/bash
# xargs -n param sets how many lines from the input to send to the command
# Call command once per line
[[ -f $1 ]] && cat $1 | xargs -n1 command --option
# Call command with 2 lines as args, such as an openvpn password file
# [[ -f $1 ]] && cat $1 | xargs -n2 command --option
# Call command with all lines as args
# [[ -f $1 ]] && cat $1 | xargs command --option
답변4
sed "s/'/'\\\\''/g;s/.*/\$* '&'/" <<\FILE |\
sh -s -- command echo --option
all of the{&}se li$n\es 'are safely shell
quoted and handed to command as its last argument
following --option, and, here, before that echo
FILE
산출
--option all of the{&}se li$n\es 'are safely shell
--option quoted and handed to command as its last argument
--option following --option, and, here, before that echo