파일에서 문자열을 검색하면 일치 항목이 표시됩니다. 그러나 bash 스크립트에서 이 작업을 수행하면 작동하지 않습니다.
$ cat files_android.txt
000d07dfe5016314c98b869c19c7f986b5db57db49ac76d16a5d2f5861a35072
001c738f74acbf19e3f31c09f6017de99bf3009a0b6f889740da0302ad172472
0047423956b09dd56a8b9c917d8f3028ad32ee01efdd501afa11b0777f4c184f
$ grep 000d07dfe5016314c98b869c19c7f986b5db57db49ac76d16a5d2f5861a35072 android.txt
G:\000d07dfe5016314c98b869c19c7f986b5db57db49ac76d16a5d2f5861a35072 - a variant of Android/Gappusin.C trojan
그러나 첫 번째 매개변수에서 문자열을 읽고 두 번째 매개변수에 대해 grep을 수행하는 다음 스크립트를 사용하면 일치 항목이 보고되지 않습니다.
$ cat script.sh
#!/bin/bash
FILE1=$1
FILE2=$2
counter=0
for line in $(cat $FILE1); do
echo "$line"
if grep $line $FILE2; then
counter=$((counter+1))
echo "$counter"
fi
done
echo "counter=$counter"
$ ./script.sh files_android.txt android.txt
000d07dfe5016314c98b869c19c7f986b5db57db49ac76d16a5d2f5861a35072
001c738f74acbf19e3f31c09f6017de99bf3009a0b6f889740da0302ad172472
0047423956b09dd56a8b9c917d8f3028ad32ee01efdd501afa11b0777f4c184f
counter=0
이게 무슨 문제야?
[고쳐 쓰다]
Stephen Harris 덕분에 근본 원인은 파일이 dos
형식으로 저장된다는 것입니다. 그래서 dos2unix
변환으로 문제가 해결되었습니다.
답변1
코드에 정확히 어떤 문제가 있는지는 확실하지 않지만 인용되지 않은 변수로 인해 의도하지 않은 방식으로 무언가가 확장될 수 있습니다.
다음과 같이 개선했습니다.
#!/bin/bash
FILE1=$1
FILE2=$2
counter=0
while IFS= read -r line; do
printf '%s\n' "$line"
if grep -q "$line" "$FILE2"; then
printf '%d\n' "$((counter++))"
fi
done <"$FILE1"
printf 'counter=%d\n' "$counter"
- Bash를 사용하여 파일을 반복하는 것은 이상적이지 않지만, 이를 사용하려면 루프
while read
대신 루프를 사용해야 합니다for
. grep -q
grep이 생성할 수 있는 출력을 억제하는 데 사용됩니다.printf '%d\n' "$((counter++))"
행을 저장하는 데 사용됩니다.- 모든 변수가 참조됩니다.
printf
기술적으로 휴대성이 더 뛰어나지는 않지만echo
대부분 선호도의 문제입니다.