4개의 서로 다른 파일의 마지막 줄을 읽고 특정 문자열을 찾고 있습니다. 해당 문자열을 기반으로 소스 파일의 이름을 바꿔야 합니다. 4개 파일 모두 grep 문자열과 최종 대상 이름이 다릅니다.
if tail -n1 $f | grep $string -e $string; then cp $f to file.new
else tail -n1 $f |grep $sting2 -e $string2; then cp $f to file2.new
답변1
- 모든 변수 대체를 인용해야 합니다. 그렇지 않으면 값의 공백이나 기타 쉘 마법 문자가 이를 별도의 매개변수로 나누거나 원치 않는 효과를 갖게 됩니다.
- grep에는 두 번째 문자열 앞이 아니라 각 검색 문자열 앞에 "-e"가 있어야 합니다. 문자열은 동일해 보이기 때문에 물론 하나는 생략할 수 있습니다.
- 주석에서 언급했듯이 "cp"에서 "to"를 제거하십시오.
- $string2의 첫 번째 항목에 오타(r 누락)가 있습니다. 복사하여 붙여넣은 경우 원본 코드에 동일한 오타가 있을 수 있습니다.
if tail -n1 "$f" | grep -e "$string"; then cp "$f" file.new
else tail -n1 "$f" |grep -e "$string2"; then cp "$f" file2.new
else ... string3 file3
else ... string4 file4
fi
답변2
tail -n1 $f
경로가 저장된 파일의 마지막 줄을 가져오는 올바른 구문이 아닙니다 $f
. 올바른 구문은 tail -n1 -- "$f"
다음과 같습니다(따라서 이름이 지정된 파일에도 작동함 -
): tail -n1 < "$f"
.
마찬가지로 행에 $string
또는 이 포함되어 있는지 확인하려면 $string2
구문은 다음과 같습니다 grep -F -e "$string" -e "$string2"
.
어쨌든 bash 및 대부분의 다른 Bourne 유사 쉘에서는 따옴표 없이 인수를 확장하는 것이 거의 의미가 없습니다.
여기서는 다음 명령문을 사용해야 할 것 같습니다 case
.
case "$(tail -n1 < "$f")" in
(*"$string"*) cp -- "$f" file.new;;
(*"$string2"*) cp -- "$f" file2.new;;
esac