bash 스크립트 - 구문 도움이 필요합니다

bash 스크립트 - 구문 도움이 필요합니다

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

  1. 모든 변수 대체를 인용해야 합니다. 그렇지 않으면 값의 공백이나 기타 쉘 마법 문자가 이를 별도의 매개변수로 나누거나 원치 않는 효과를 갖게 됩니다.
  2. grep에는 두 번째 문자열 앞이 아니라 각 검색 문자열 앞에 "-e"가 있어야 합니다. 문자열은 동일해 보이기 때문에 물론 하나는 생략할 수 있습니다.
  3. 주석에서 언급했듯이 "cp"에서 "to"를 제거하십시오.
  4. $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

관련 정보