Bash에서 추출된 값을 변수로 유지하는 방법

Bash에서 추출된 값을 변수로 유지하는 방법

디렉토리의 특정 파일명에서 특정 값을 추출해야 하는데 추출된 값을 변수에 보관하는 명령을 갖고 싶습니다. 내 파일의 형식이 다음 과 같고 place.type-date.log이를 추출하여 라는 변수에 저장하려고 한다고 가정합니다 first. 어떻게 해야 합니까?

나는 사용하려고

first=$($file | awk -F'[.-]' '{print $1}')

그러나 성공하지 못했습니다.

보통 내가 하면

echo " place.type-date.log" | awk -F'[.-]' '{print $1}'

결과는 가 됩니다 . for 루프를 사용하여 특정 디렉터리의 여러 파일에 대해 이 작업을 수행해야 하기 때문에 명령을 로 place바꿨습니다 .place.type-date.log$file

place추출된 값을 변수에 저장하고 싶기 first때문에 extract 명령을 변수와 동일시했습니다 first. 따라서 스크립트를 실행하려고 하면 echo first아무 것도 표시되지 않습니다. 이는 추출된 값이 아직 변수에 저장되지 않았음을 의미합니다.

답변1

place.type-date.log이와 같은 변수에 파일 이름이 있고 이라는 file다른 변수의 첫 번째 점 앞에 파일 이름 부분을 저장하려고 한다고 가정합니다 first. 이 경우 표준 매개변수 대체를 사용하여 이를 수행할 수 있습니다.

first=${file%%.*}

위의 내용은 .*값에서 쉘 패턴과 일치하는 가장 긴 접미사를 제거하고 $file결과를 first.

%대신에 를 사용하면 %%가장 짧은 일치 접미사가 제거되고 대신에 or 를 place.type-date사용하면 접미사 문자열은 제거되지만 접미사 문자열은 제거되지 않습니다.###%%%

이러한 대체를 사용하는 또 다른 예는 다음을 참조하세요.내 대답도착하다이전 질문.


$file귀하의 코드는 명령이 아니라 문자열이기 때문에 작동하지 않습니다 place.type-date.log. 당신은 다음과 같은 일을 시도했을 수도 있습니다

first=$( echo "$file" | awk -F '[.-]' '{ print $1 }' )

그러나 이것은 필요한 것보다 더 복잡합니다. 또한 파일 이름( echo확장 가능) 의 이스케이프 시퀀스 와 개행 문자가 포함된 파일 이름( awk줄 기반 텍스트 처리 도구)에 몇 가지 문제가 있습니다.

관련 정보