쉘 스크립트에서 큰따옴표와 역따옴표를 사용하는 이유는 무엇입니까?

쉘 스크립트에서 큰따옴표와 역따옴표를 사용하는 이유는 무엇입니까?

이 대본을 보고 있어요 mysql 백업 스크립트명령 이름 주위에 백틱과 큰따옴표를 사용하는 이유가 무엇인지 이해할 수 없습니다.

379 WHICH="`which which`"
380 AWK="`${WHICH} gawk`"
381 LOGGER="`${WHICH} logger`"
382 ECHO="`${WHICH} echo`"
383 CAT="`${WHICH} cat`"
384 BASENAME="`${WHICH} basename`"
385 DATEC="`${WHICH} date`"
386 DU="`${WHICH} du`"
387 EXPR="`${WHICH} expr`"
388 FIND="`${WHICH} find`"
389 RM="`${WHICH} rm`"
390 MYSQL="`${WHICH} mysql`"
391 MYSQLDUMP="`${WHICH} mysqldump`"
392 GZIP="`${WHICH} gzip`"
393 BZIP2="`${WHICH} bzip2`"
394 CP="`${WHICH} cp`"
395 HOSTNAMEC="`${WHICH} hostname`"
396 SED="`${WHICH} sed`"
397 GREP="`${WHICH} grep`"

고쳐 쓰다:

"`${WHICH} gawk`"

거의 같다

"${${WHICH} gawk}"

답변1

WHICH="`which which`"WHICH=`which which`또는 WHICH=$(which which)와 정확히 동일합니다 WHICH="$(which which)". 이 모든 것은 명령을 실행 which which하고 해당 출력(문자열)을 변수로 캡처하여 WHICH출력에서 ​​최종 줄 바꿈을 제거합니다. 마찬가지로 AWK="`${WHICH} gawk`"로도 쓸 수 있습니다 AWK=`$WHICH gawk`.

일반적으로 결과에 공백이나 쉘 와일드카드 문자( )가 포함된 경우 명령 대체( `command`또는 $(command))를 큰따옴표로 묶어야 합니다 *?[\. 이는 명령 대체(예: 변수 대체( $foo또는 )) 의 결과가 ${foo}단어 분리 및 파일 이름 생성(와일드카드라고도 함)을 거치기 때문입니다. 그러나 이는 간단한 변수 할당에는 작동하지 않습니다. 컨텍스트에 단일 단어가 필요하므로 대체 결과는 그대로 사용됩니다. 따라서 할당은 변수와 명령을 큰따옴표로 대체해야 한다는 일반 규칙의 예외입니다. (이 예외는 큰따옴표가 필요한 큰따옴표로 확장되지 않는다는 점에 유의하십시오 export var="$value".) 그러나 항상 큰따옴표를 사용하는 것은 건전한 쉘 프로그래밍 관행입니다. 꼭 해야 한다는 것을 알 때뿐만 아니라 꼭 해야 한다는 것을 알 때에만 생략하십시오. 그것을 써.

which which공백이나 와일드카드가 포함된 경로가 반환되는 (드문 경우) 경우 ${WHICH}다음 줄에서 큰따옴표로 묶어야 합니다. 즉, 다음 중 하나입니다.

AWK="`"${WHICH}" gawk`"
AWK=`"${WHICH}" gawk`
AWK="$("${WHICH}" gawk)"
AWK=$("${WHICH}" gawk)

( 내부적으로 중첩된 참조를 얻기 어렵기 때문에 $(…)more를 사용하는 것이 좋습니다 . 그러나 매우 오래된 쉘은 이를 인식하지 못하므로 이전 시스템에서 실행해야 하는 스크립트는 이를 사용해야 합니다.)`…``…`$(…)`…`

당신은 또한 볼 수 있습니다$VAR 대 ${VAR} 및 인용 여부

답변2

역따옴표를 붙인 경우 공백이 포함된 문자열을 반환합니다. 따옴표는 완전한 단일 값이 변수에 할당되도록 합니다.

답변3

백틱 연산자는 "백틱 사이의 영역을 백틱 안에 있는 명령의 출력으로 바꿉니다. 큰따옴표는 이를 수행합니다. 해당 출력에 공백이 포함되어 있으면 관련 변수가 첫 번째 공백뿐만 아니라 전체 결과로 설정됩니다. 모든 결과.

예를 들어 어떤 이유로 grep 명령이 '/usr/local/bin/real grep'인 경우 실행 후

GREP=`which grep`

GREP에는 "/usr/local/bin/real"이 포함됩니다.

반면,

GREP="`which grep`"

GREP에는 "/usr/local/bin/real grep"이 포함됩니다.

이러한 명령에 대한 경로에 공백이 포함될 가능성은 없지만 쉘 스크립팅의 일반적인 모범 사례는 변수에 할당할 때 항상 큰따옴표를 사용하는 것입니다.

관련 정보