Bash에서 공백이 있는 디렉토리 주위에 큰따옴표를 사용하는 방법

Bash에서 공백이 있는 디렉토리 주위에 큰따옴표를 사용하는 방법

저는 Raspberry Pi OS에서 작업하고 있습니다.

#!/bin/bash이름에 공백이 포함된 디렉터리에 파일(캡처한 그림)을 저장해야 하는 Bash 스크립트를 실행하고 있습니다 .

내 경우 디렉토리는 다음과 같습니다./media/pi/test 1 2 3

내가 실행하고 원하는 작업을 수행하는 명령은 다음과 같습니다.

raspistill -awb greyworld -vf -hf -o /media/pi/"test 1 2 3"/test.jpg

사진을 찍고 거기에 저장하면 아주 잘 작동합니다.

내 문제는 "test 1 2 3"이 다음과 같은 변수 안에 있기를 원한다는 것입니다.

usbToSave="\"test 1 2 3\"" #usbToSave is now "test 1 2 3"
raspistill -awb greyworld -vf -hf -o /media/pi/$usbToSave/test.jpg

그러나 위의 내용은 나에게 다음과 같은 오류를 제공합니다.

Invalid command line option (1)

이유를 모르겠습니다. 포럼 어딘가에 비슷한 질문에 대한 답변이 있는 것 같은데 찾을 수 없습니다. 검색할 때 적절한 키워드를 사용하지 않는 것 같습니다.

노트:

내 디렉토리에 공백이 없는 경우(예: /media/pi/testBash 스크립트):

usbToSave="test"
raspistill -awb greyworld -vf -hf -o /media/pi/$usbToSave/test.jpg

오류 없이 작동합니다.

답변1

usbToSave="\"test 1 2 3\""
raspistill -awb greyworld -vf -hf -o /media/pi/$usbToSave/test.jpg

여기서 변수 값에 따옴표를 입력하면 할당 후에 가 포함됩니다 "test 1 2 3". 그런 다음 큰따옴표를 사용하지 않고 변수를 확장하므로 단어 분리 문제가 발생합니다(아래 링크 참조). 결과는 , 및 를 다른 명령줄 인수로 raspistill가져오는 것 입니다./media/pi/"test123"/test.jpg

변수에 넣은 따옴표는 결과 단어( 에 대한 인수)에서 리터럴입니다 raspistill.변수 확장은아니요일반 텍스트 대체 또는 매크로 확장: 일반적으로 변수에서 나오는 모든 것은 쉘 구문으로 간주되지 않습니다. 따옴표 외에도 쉘 연산자(예 &&: >, 등 |)는 ;변수에서 확장될 때 일반 문자일 뿐입니다. 여기서는 단어 분할 및 파일 이름 생성이 유일한 예외입니다.

당신이 해야 할 일은:

usbToSave="test 1 2 3"
raspistill -awb greyworld -vf -hf -o "/media/pi/$usbToSave/test.jpg"

즉, 변수 확장은 큰따옴표 내에서 수행되므로 단어 분리(및 파일 이름 생성)가 방지됩니다.

바라보다:

답변2

변수와 참조가 셸에서 작동하는 방식을 알아보세요. 읽다확장하다존재하다 man bash.

usbToSave="test 1 2 3"
raspistill -awb greyworld -vf -hf -o /media/pi/"$usbToSave"/test.jpg

셸의 변수는 프로그래밍 언어에서 알고 있는 실제 변수가 아닙니다. 이는 값으로 확장되는 매크로와 다소 유사합니다. 변수가 인용되지 않은 경우,분사결과적으로 이런 일이 발생하면 큰따옴표를 사용하여 이를 방지할 수 있습니다.

답변3

또는 다음을 수행할 수 있습니다.탈출하다usbToSave="test 1 2 3"변수 정의 시 공백: 이전 답변의 문자 usbToSave=test\ 1\ 2\ 3와 동일\탈출하다다음 공백(또는 문자열에 사용할 수 있는 기타 특수 문자(예: $))

편집: 이스케이프된 문자열 주위에 큰따옴표와 따옴표를 추가하여 수행 방법을 명확히 했습니다.

$ usbToSave_A="test 1 2 3"
$ usbToSave_B=test\ 1\ 2\ 3
$ echo $usbToSave_A
test 1 2 3
$ echo $usbToSave_B
test 1 2 3
$ echo /media/pi/"$usbToSave_A"/test.jpg
/media/pi/test 1 2 3/test.jpg
$ echo /media/pi/"$usbToSave_B"/test.jpg
/media/pi/test 1 2 3/test.jpg
$ echo "/media/pi/$usbToSave_A/test.jpg"
/media/pi/test 1 2 3/test.jpg
$ echo "/media/pi/$usbToSave_B/test.jpg"
/media/pi/test 1 2 3/test.jpg

$ usbToSave_C='"test 1 2 3"'
$ usbToSave_D="test\ 1\ 2\ 3"
$ echo $usbToSave_C
"test 1 2 3"
$ echo $usbToSave_D
test\ 1\ 2\ 3
$ echo "/media/pi/$usbToSave_C/test.jpg"
/media/pi/"test 1 2 3"/test.jpg
$ echo "/media/pi/$usbToSave_D/test.jpg"
/media/pi/test\ 1\ 2\ 3/test.jpg
$ echo "/media/pi/"$usbToSave_C"/test.jpg"
/media/pi/'test 1 2 3'/test.jpg
$ echo "/media/pi/"$usbToSave_D"/test.jpg"
/media/pi/test\ 1\ 2\ 3/test.jpg

관련 정보