egrep을 사용하여 변수의 스크립트에서 정규식

egrep을 사용하여 변수의 스크립트에서 정규식

변수 A_DESTINATION(디렉토리)을 구문 분석하고 /.../ 사이의 단어만 호출하려고 합니다.

case "$TR_TORRENT_INFO" in
    *test1.com*)
    A_DESTINATION=${A_DESTINATION}/Books/
    ;;
    *test2.com*)
    A_DESTINATION=${A_DESTINATION}/Movies/
    ;;
    *test3.com*)
    A_DESTINATION=${A_DESTINATION}/Music/
    ;;
    *)
    A_DESTINATION=${A_DESTINATION}/Miscellaneous/
    ;;
esac

test="$(egrep '\/([^/.]+)\/$' $A_DESTINATION)"
echo test

스크립트에 정규 표현식이 있지만 로그에 폴더(예: 이 경우 /Miscellaneous/)가 성공적으로 반환되지 않습니다. 다음 내용만 표시됩니다.

+ A_DESTINATION=/mnt/sda1/Miscellaneous/
+ egrep \/([^/.]+)\/$ /mnt/sda1/Miscellaneous/
+ test=
+ echo test
test

내가 뭘 잘못했나요? 감사해요!

답변1

최종 디렉터리 접미사를 추가한 $A_DESTINATION다음 grep다른 방법을 사용하여 다시 추출하는 대신 명령문에 별도의 변수(예: $final) 를 사용한 다음 끝에 case추가하는 것은 어떨까요? $A_DESTINATION예를 들어:

case "$TR_TORRENT_INFO" in
    *test1.com*) final='Books' ;;
    *test2.com*) final='Movies' ;;
    *test3.com*) final='Music' ;;
              *) final='Miscellaneous' ;;
esac

A_DESTINATION="$A_DESTINATION/$final/"

echo "$final"

이것은 효과가 있고, 더 간단하며, 제 생각에는 읽기에도 더 쉽습니다.

그런데 책, 영화 등을 둘러싼 작은 따옴표는 꼭 필요한 것은 아니지만(문자열에 공백이나 쉘 메타 문자가 없기 때문에) 문제가 되지 않으며 IMO 작은 따옴표로 문자열을 수정하는 것이 좋은 습관입니다. 또한 최종 디렉터리 이름에 공백이 포함된 다른 대소문자를 추가하려면 final='Other Junk' ;;작은따옴표를 사용해야 합니다 (예: 다음과 같은 이름일 수 있음).

답변2

다음과 같은스틸 드라이브 권장사항/작업에서 후행을 생략합니다.

case "$TR_TORRENT_INFO" in
    *test1.com*) A_DESTINATION="$A_DESTINATION/Books"  ;;
    *test2.com*) A_DESTINATION="$A_DESTINATION/Movies" ;;
    *test3.com*) A_DESTINATION="$A_DESTINATION/Music"  ;;
    *) A_DESTINATION="$A_DESTINATION/Miscellaneous"
esac

...또는 변수를 사용하여 추가된 경로 요소를 보유합니다.Kass가 제안한대로, 읽기가 더 쉬울 것입니다.

이를 통해 basename유틸리티나 매개변수 대체를 사용하여 ${parameter##word}얻을 수 있습니다 $A_DESTINATION.

경로명의 기본 이름은 파일일 필요는 없습니다. 이는 경로의 마지막 부분입니다.

printf 'basename is "%s"\n' "${A_DESTINATION##*/}"

또는

printf 'basename is "%s"\n' "$( basename "$A_DESTINATION" )"

나중에 경로에 파일 이름을 추가하면그 다음에경로 구분 기호를 포함합니다 /.

filepath="$A_DESTINATION/$filename"

당신의 egrep명령:

egrep '\/([^/.]+)\/$' $A_DESTINATION

egrep이는 파일을 읽고 $A_DESTINATION주어진 정규식을 적용하도록 지시합니다 .

다음은 작동하지만(후행이 없다고 가정 /) 위에서 언급한 솔루션을 사용해야 합니다.

printf '%s\n' "$A_DESTINATION" | grep -o '[^/]*$'

test표준 명령의 이름이기도 하므로 변수 이름으로 사용하지 마십시오 . 명령을 "오버로딩"할 위험은 없지만 test코드를 읽기 어렵게 만들 수 있습니다.

관련 정보