저는 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/test
Bash 스크립트):
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/"test
1
2
3"/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