큰따옴표로 묶인 변수나 에코의 전체 줄 사이에 차이점이 있습니까?

큰따옴표로 묶인 변수나 에코의 전체 줄 사이에 차이점이 있습니까?

예를 들어 다음을 입력할 때:

echo Variable "$var" is not initialised.

그리고

echo "Variable $var is not initialised."

프런트 엔드 결과는 (적어도 내가 아는 한) 정확히 동일합니다. 하지만 echo의 관점에서 명령이 실행되는 방식에 차이가 있는지 알고 싶습니다 .

echo모든 매개변수가 한 번에 수신되므로 성능 측면에서 후자가 더 빠릅니까 ?

답변1

존재하다

echo Variable "$var" is not initialised.

echo5개의 인수를 (계산하는 경우 6개 ) 전달 echo하면 공백 문자로 구분되어 출력되고 개행 문자로 종료됩니다.argv[0]echo

존재하다:

echo "Variable $var is not initialised."

1개의 매개변수를 전달합니다(계산하면 2개 echo).

이 특별한 경우와 대부분의 경우 이는 기능적으로 동일합니다.

두 번째는 셸이 명령을 구문 분석하고 실행하기 전에 인수에 저장하는 작업이 적고 echo인수를 확인하는 작업이 적다는 것을 의미합니다.echo

이는 성능에 큰 차이를 가져올 가능성이 없습니다. 내 테스트에서 일부 echo/ 조합( 내장된 shell것과 같은 ) 에서는 약간의 차이가 있었지만 다른 조합에서는 거의 차이가 없다는 것을 발견했습니다 .bash

여러 매개변수 대신 하나의 매개변수를 전달하려는 다른 이유는 다음과 같습니다.

  • 인수 사이에 여러 개의 공백을 원할 경우 echo a b출력됩니다 . 출력이 a b필요합니다 .echo 'a b'a b

  • echo "$opt" is an invalid option와 같은 일부 echo구현(예: echo내장 )의 경우 while과 함께 (또는 또는 ...)을 사용할 bash수 없습니다 .opt=-e-E-neEecho "$opt is an invalid option"

  • 2개의 매개변수( 첫 번째 매개변수 echo foo bar제외)를 전달할 때 각 매개변수의 길이는 3바이트입니다. 즉, 포인터 2개(64비트 시스템에서는 포인터당 8바이트)와 8바이트( 실제 문자열의 문자열 구분 기호 포함)이므로 총 길이는 다음과 같습니다. 64비트 시스템에서는 24바이트입니다.echo\0

    비록 포인터이고 8바이트 echo 'foo bar'(총 16바이트)입니다. 이를 echo통해 많은 수의 매개변수가 포함된 외부 실행 파일을 호출할 때 매개변수 크기 제한에 더 빨리 도달할 수 있습니다(단, Linux에도 단일 매개변수의 최대 크기(128KiB)에 대한 제한이 있습니다).

어쨌든 임의의 데이터(예: $var내용을 모르는 데이터(비록 여기 문맥에서 숫자와 밑줄만 포함되어 있음을 알 수 있음)) 의 경우 printf대신 다음 을 사용하려고 합니다 echo.

printf >&2 '%s\n' "Variable $var is not initialised."

또는:

printf >&2 'Variable %s is not initialised.' "$var"

(이것은 사용자에게 오류로 나타나며 스크립트에서 생성된 일반 출력의 일부가 아니기 때문에 여기에서 stderr로 전송됩니다.)

이 경우 형식 외에도 에 전달해야 합니다 printf.

이 접근 방식의 또 다른 장점은 메시지를 사용자의 언어로 번역하고, Variable %s is not initialised.지원되는 모든 언어로 해당 형식으로 미리 만들어진 번역을 제공할 수 있다는 것입니다(그리고 이를 검색하려면 gettextksh93/bash를 사용하세요).$"..."

관련 정보