programing

Bash에서 따옴표로 묶은 문자열 내에서 환경 변수를 사용하는 방법

abcjava 2023. 5. 26. 20:24
반응형

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다음과 같습니다.

  1. 환경 변수가 아닙니다.bash 자체가 설정하는 일반 bash 매개 변수입니다.
  2. 수신 시 자동으로 설정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

반응형