Bash에서 따옴표로 묶은 문자열 내에서 환경 변수를 사용하는 방법
다음과 같은 다양한 형태의 bash 스크립트를 사용해 보았습니다.
#!/bin/bash
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
그러나 정확하게 확장할 구문을 가져올 수 없습니다.COLUMNS
환경 변수입니다.
다음과 같은 다양한 형태를 시도해 보았습니다.
svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'
그리고.
svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'
그리고.
eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
제안?
구글을 통해 여기에 온 사람들이 (나처럼) 제목에서 질문한 일반적인 질문에 대한 답을 찾기 위해 간단한 메모/요약을 드립니다.다음 중 하나는 따옴표 내부의 셸 변수에 액세스하는 데 사용할 수 있습니다.
echo "$VARIABLE"
echo "${VARIABLE}"
단일 따옴표 사용이 주요 문제입니다.Bash 참조 설명서에 따르면:
문자를 작은 따옴표로 묶습니다(
'
따옴표 안에 있는 각 문자의 리터럴 값을 유지합니다.백슬래시가 선행되는 경우에도 단일 따옴표는 단일 따옴표 사이에 발생할 수 없습니다. [...] 문자를 큰따옴표로 묶습니다("
따옴표 안에 있는 모든 문자의 리터럴 값을 보존합니다.$
,`
,\
기록 확장이 활성화되면!
캐릭터들$
및 '는 큰따옴표 내에서 특별한 의미를 유지합니다(셸 확장 참조).백슬래시는 다음 문자 중 하나가 이어지는 경우에만 특별한 의미를 유지합니다.$
,`
,"
,\
또는 새 줄.큰따옴표 안에서 이러한 문자 중 하나 뒤에 오는 백슬래시가 제거됩니다.특별한 의미가 없는 문자 앞의 백슬래시는 수정되지 않은 채로 남아 있습니다.이중 따옴표는 백슬래시로 앞에 붙여서 큰따옴표 내에서 따옴표로 묶을 수 있습니다.활성화된 경우 기록 확장이 수행됩니다. 그렇지 않은 경우!
백슬래시를 사용하여 큰따옴표로 표시되지 않습니다.이전의 백슬래시!
제거되지 않습니다.특수 매개 변수*
그리고.@
큰따옴표로 묶은 경우 특별한 의미가 있습니다(셸 매개 변수 확장 참조).
질문에서 질문한 구체적인 경우 $COLUMNS는 비표준 속성을 가진 특수 변수입니다(위의 lunath 답변 참조).
확실하지 않으면 터미널에서 'cols' 요청을 사용하고 COLUMNS:
COLS=$(tput cols)
참고:COLUMNS
다음과 같습니다.
- 환경 변수가 아닙니다.bash 자체가 설정하는 일반 bash 매개 변수입니다.
- 수신 시 자동으로 설정
SIGWINCH
신호.
그 두 번째 포인트는 보통 당신의COLUMNS
변수는 대화형 셸에서만 설정되고 bash 스크립트에서는 설정되지 않습니다.
스립트인 stdin
되어 있습니다할 수 . 터미널에 문의하여 터미널의 너비를 수동으로 조회할 수 있습니다.
tput cols
SVN 명령에서 이 명령을 사용하려면 다음을 수행합니다.
svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"
(참고: 인용해야 합니다. "$@"
그리고 멀리 떨어져 있습니다.eval
;-))
는 다스크트다여음값러있수다니습사용대의 나에게 됩니다.$COLUMNS
당신이 설정하고 있지 않은지 궁금합니다.COLUMNS
전화하기 전에?
#!/bin/bash
COLUMNS=30
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
메아리칠 수 있습니까?$COLUMNS
스크립트 내부에서 올바르게 설정되었는지 확인하십시오.
당신은 그것을 제대로 하고 있기 때문에 (컬럼을 내보내는 것이 아니라) 다른 문제가 있는 것 같습니다.
이러한 경우를 디버깅하는 방법은 특수 명령(프로그래밍 언어 사용자를 위한 종료)을 만드는 것입니다.다음을 수행하여 diff-columns라는 셸 스크립트를 만듭니다.
exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"
그리고 그냥 사용.
svn diff "$@" --diff-cmd diff-columns
이렇게 하면 코드를 더 읽기 쉽고 모듈식으로 읽을 수 있으며(하향식 접근법), diff-columns 코드를 철저히 별도로 테스트할 수 있습니다(하향식 접근법).
이 경우 단일 따옴표 자체를 유지하는 또 다른 방법은 일반적으로 큰따옴표를 사용하는 방법 대신 변수를 하나의 따옴표로 묶을 수 있습니다.
X='abc'
>echo 'preceeding text ---"${X}"---- succeesing text'
preceeding text ---"${X}"---- succeesing text
>echo 'preceeding text ---"$X"---- succeesing text'
preceeding text ---"$X"---- succeesing text
>echo 'preceeding text ---'$X'---- succeesing text'
preceeding text ---abc---- succeesing text
>echo 'preceeding text ---'${X}'---- succeesing text'
preceeding text ---abc---- succeesing text
언급URL : https://stackoverflow.com/questions/840536/how-to-use-an-environment-variable-inside-a-quoted-string-in-bash
'programing' 카테고리의 다른 글
Ruby에서 임의 문자열을 생성하는 방법 (0) | 2023.05.31 |
---|---|
Android에서 내 응용 프로그램의 메시지만 가져오려면 LogCat을 필터링하시겠습니까? (0) | 2023.05.31 |
기본적으로 빠른 전달을 해제할 수 있습니까? (0) | 2023.05.26 |
mongodb ObjectId 생성 시간에 사용 (0) | 2023.05.26 |
jQuery DataTables 플러그인에서 추가한 검색 모음과 바닥글을 제거하려면 어떻게 해야 합니까? (0) | 2023.05.26 |