파일을 한 줄씩 읽고 다른 문자열을 넣습니다.

파일을 한 줄씩 읽고 다른 문자열을 넣습니다.

파일을 한 줄씩 읽고 그 내용을 특정 위치의 다른 문자열에 넣고 싶습니다. 다음 스크립트를 만들었지만 해당 문자열에 파일 내용을 넣을 수 없습니다.

파일: cat /testing/spamword

spy
bots
virus

스크립트:

#!/bin/bash

file=/testing/spamword

cat $file | while read $line;

do

echo 'or ("$h_subject:" contains "'$line'")'

done

산출:

or ("$h_subject:" contains "")

or ("$h_subject:" contains "")

or ("$h_subject:" contains "")

출력은 다음과 같아야 합니다.

or ("$h_subject:" contains "spy")
or ("$h_subject:" contains "bots")
or ("$h_subject:" contains "virus")

답변1

첫 번째 문제는 "변수 var의 값"을 의미하기 while read $var때문에 잘못된 구문입니다 . $var당신이 원하는 것은 while read var그 반대입니다. 그런 다음 변수는 작은따옴표가 아닌 큰따옴표 내에서만 확장되며 불필요하게 복잡한 방식으로 처리하려고 합니다. 또한 파일 이름을 하드코딩하는 것은 일반적으로 좋은 생각이 아닙니다. 마지막으로 스타일의 문제로 다음을 피하십시오.우루크. 이 모든 것을 종합하면 다음과 같은 작업을 수행할 수 있습니다.

#!/bin/bash

file="$1"    
## The -r ensures the line is read literally, without 
## treating backslashes as an escape character for the field
## and line delimiters. Setting IFS to the empty string makes
## sure leading and trailing space and tabs (found in the
## default value of $IFS) are not removed.
while IFS= read -r line
do
    ## By putting the whole thing in double quotes, we 
    ## ensure that variables are expanded and by escaping 
    ## the $ in the 1st var, we avoid its expansion. 
    echo "or ('\$h_subject:' contains '$line')"
done < "$file"

이는일반적으로 더 좋음printf대신 사용하세요 echo. 그리고 이 경우에는 echo위의 내용을 다음으로 대체할 수 있으므로 작업이 더 간단해집니다.

printf 'or ("$h_subject:" contains "%s")\n' "$line" 

그것을 foo.sh실행 가능하게 만들고 파일을 인수로 사용하여 실행하십시오.

./foo.sh /testing/spamword

답변2

이렇게 사용하세요

echo "or (\$h_subject: contains $line)"

while..에서 $line을 사용하면 안 됩니다. 다음 코드를 사용할 수 있습니다.

#!/bin/bash

file=/testing/spamword
while read line;
do
echo "or (\"\$h_subject:\" contains \"$line\")"
done < ${file}

관련 정보