공백이 있어도 각 줄이 무제한으로 유지되도록 파일에서 bash 스크립트로 줄을 전달하려면 어떻게 해야 합니까?

공백이 있어도 각 줄이 무제한으로 유지되도록 파일에서 bash 스크립트로 줄을 전달하려면 어떻게 해야 합니까?

반면:

$ cat lines.txt
a/b
'c/d e/f'

$ cat 1.sh
#!/bin/sh
./2.sh `cat lines.txt`

$ cat 2.sh
#!/bin/sh
echo p1=$1
echo p2=$2
echo p3=$3

$ ./1.sh
p1=a/b
p2='c/d
p3=e/f'

두 개의 인수만 받도록 lines.txt또는 변경 1.sh하려면 어떻게 해야 합니까 ?2.sh

  • a/b
  • c/d e/f

?

답변1

IFS(내부 필드 구분 기호)를 줄 바꿈으로 설정합니다.

$ cat 1.sh 
#!/bin/sh
OLD_IFS=$IFS
IFS="
"
./2.sh `cat lines.txt`
IFS=$OLD_IFS

$ ./1.sh
p1=a/b
p2='c/d e/f'
p3=

답변2

cat을 사용하여 파일 길이만큼 많은 인수를 보내는 아이디어에 얽매이지 않는다면 이 방법이 매우 유연하다는 것을 알 수 있습니다. 파일을 2.sh로 직접 파이프할 수 있습니다.

# echo -e "a/b\n'c/d e/f'" >lines.txt

fn2.sh() { set -f              # disable pathname expansion 
   while IFS= read -r line; do # -r prevents expansion of such things as \n
       printf "%s\n" "$line"   # printf is more robust than echo (when dealing with unknown data)
   done 
}
< lines.txt fn2.sh             # using redirection 

답변3

입력 파일에 해당 행이 포함되어 'c/d e/f'있고 항목을 처리하려는 경우 c/d e/f(따옴표 없이) 아마도 다음을 찾고 있을 것입니다.xargs. 입력 형식은 문자 '"구분된 리터럴 문자열을 포함하는 공백으로 구분된 문자열 목록입니다 . 또한 \다음 문자가 문자 그대로 해석되지만 문자열 외부에서만 해석됩니다. 예를 들어 다음은 입력 파일입니다.

how\'dy 'hello world' aaa\
bbb

이 파일의 항목은 how'dy, hello worldaaa␤bbb( 개행 문자는 어디에 있습니까?)입니다.

관련 정보