Bash의 작은따옴표 문제

Bash의 작은따옴표 문제

dzen2를 초기화하는 sh 스크립트가 있고 거기에서 Source Code Pro 글꼴을 사용하고 싶습니다. 코드는 다음과 같습니다.

param="-p -dock -fn 'Source Code Pro-10'"

# the generated_output function is not important
generated_output | dzen2 $param

문제는 스크립트가 작동하지 않는다는 것입니다! dzen2가 시작되지 않습니다... 몇 번 검색한 결과 '작은따옴표 또는 큰따옴표 문제로 인해 문제가 발생할 수 있다는 것을 알았지 "만 잘 이해가 되지 않습니다...

나는 이것을 사용해 보았습니다 :

param=$'-p -dock -fn \'Source Code Pro-10\''
# or something like this
param='-p -dock -fn '"'"'Source Code Pro-10'"'"

여전히 작동하지 않습니다...
이 스크립트에 어떤 문제가 있나요?

답변1

여러 개의 개별 문자열(매개변수)을 추적하고 나중에 별도의 문자열로 사용하려면 동일한 문자열에 저장하지 마세요. 대신 배열을 사용하십시오.

param=(-p -dock -fn 'Source Code Pro-10')
generated_output | dzen2 "${param[@]}"

인용된 확장은 "${param[@]}"배열의 문자열 목록으로 확장됩니다 param. 이는 다음과 같은 의미 Source Code Pro-10임을 참고하세요.하나의논쟁, 그것이 당신이 원하는 것입니다. 주변의 따옴표를 확장하는 것을 잊어버린 경우 쉘은 계속해서 $IFS각 문자열을 문자(기본적으로 공백, 탭 및 줄 바꿈)별로 분할한 다음 각 결과 단어에 파일 이름 글로빙을 적용합니다.

코드는 셸을 사용하여 문자열을 -p -dock -fn 'Source Code Pro-10'명령에 대한 인수로 분할합니다. 쉘은 기본적으로 공백, 탭 및 개행 문자로 분할하므로 하위 문자열이 'Source Code Pro-10'별도의 인수 가 됩니다 'Source. (단일따옴표도 문자열에 포함된다는 점에 유의하세요)CodePro-10'

관련된:


sh스크립트 에서는 위치 인수 목록을 사용할 수 있습니다.

set -- -p -dock -fn 'Source Code Pro-10'
generated_output | dzen2 "$@"

이것은 쉘에서도 작동합니다 bash.

관련 정보