변수 시작 부분에서 공백을 제거할 수 없습니다.

변수 시작 부분에서 공백을 제거할 수 없습니다.

녹음에 사용하는 다른 플래시 드라이브에 폴더를 만들고 미디어 장치의 레이블과 uuid를 이름으로 삽입하려고 합니다. 다음 코드가 있습니다.

LOGDEVICELABEL=FLASHDRIVENAME
MD=`lsblk -I 8 -o label,uuid -n|sed -e '/^$/ d' -e '/^$LOGDEVICELABEL.*$/ d'`
MDLOGDIR=/media/$LOGDEVICELABEL/Log/$MD
mkdir $MDLOGDIR

문제는 변수 값의 $MD시작 부분에 공백이 있는데 이를 제거할 수 없다는 것입니다. 공백으로 인해 mkdir은 /media/$LOGDEVICELABEL/Log/$MD두 개의 별도 인수로 처리됩니다.

나는 시도했다:

MDLOGDIR=`sed 's/ // g' <<</media/$LOGDEVICELABEL/Log/$MD` 

UUID와 Label(필수 사항) 사이의 공백만 제거하고 /media/$LOGDEVICELABEL/Log/와 사이의 공백 은 제거하지 않습니다 $MD.

답변1

내가 하고 싶은 한 가지는 echo원하지 않는 공백을 제거하는 것입니다. 이 경우 따옴표를 생략하는 것이 중요합니다.

LOGDEVICELABEL=FLASHDRIVENAME
MD=$(lsblk -I 8 -o label,uuid -n|sed -e '/^$/ d' -e '/^$LOGDEVICELABEL.*$/ d')
MD=$(echo $MD) # <-- This line
MDLOGDIR=/media/$LOGDEVICELABEL/Log/$MD
mkdir $MDLOGDIR

쉘은 이 명령을 호출 하고 명령이 공백 문자로 구분하여 인쇄하는 echo일련의 토큰을 제공합니다 . echo그 효과는 (1) 선행 및 후행 공백을 건너뛰고 (2) 토큰 사이의 하나 이상의 공백 문자를 단일 공백으로 변환하는 것입니다.

이 경우 $(...)백틱 버전 대신 동등한 백틱 버전을 사용합니다. 일반적으로 말해서 이 버전이 읽기 더 쉽다고 생각합니다. $(...$(...))백틱 버전은 중첩될 수 없지만 ( ) 중첩될 수 있다는 장점도 있습니다 .

답변2

"매개변수 확장"과 같은 것을 사용하면 어떨까요?

MDLOGDIR=/media/$LOGDEVICELABEL/Log/${MD# }
MDLOGDIR=/media/$LOGDEVICELABEL/Log/${MD/ }

또는 sed다음과 같은 것을 확장

s /^ //

관련 정보