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