추가 쉼표가 있는 bash 선언

추가 쉼표가 있는 bash 선언

Bash의 "문"이란 무엇입니까?

declare -r is_debug true
if [ "$is_debug" = true ]; then
    printf "%s\n", "is debug"
else
    printf "%s\n", "is not debug"
fi

declare -p is_debug
echo "${is_debug-isunset}"

산출:

jian@jian:~/Desktop/pg_src/src4/postgres$ bash /home/jian/scratch/scratchpads/47a6066b9dfaca1c2b13ea2e99f4e929/scratch.sh
is not debug
,declare -r is_debug
isunset
jian@jian:~/Desktop/pg_src/src4/postgres$ bash --version
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


declare -p is_debug
echo "${is_debug-isunset}"

출력이 혼란스러워요 ,declare -r is_debug. 다시 돌아오길 바랍니다 declare -r is_debug.

답변1

declare -r is_debug true

두 개의 읽기 전용 변수를 선언하고 is_debug해당 true값을 설정하지 마십시오. 함수 내에서 호출되지 않는 한 원래 값(있는 경우)을 유지합니다. 함수 내에서 호출되면 값이 없는 새 지역 변수가 인스턴스화됩니다(변수가 local해당 범위에서 // 미리 선언되지 않은 경우).typesetdeclare

다음을 수행할 수 있습니다.

declare -r is_debug=true

또는 더 이식성이 뛰어납니다(함수 내에서 호출되는 경우 변수를 로컬로 만들지 않음).

readonly is_debug=true
printf "%s\n", "is debug"

그것은 다음과 같습니다:

printf '%s\n,' "is debug"

또는

printf 'is debug\n,'

Print is debug뒤에는 개행 문자가 오고 그 뒤에는 쉼표가 옵니다. 그 뒤에는 개행 문자가 오지 않으므로 출력의 다음 내용이 해당 쉼표에 추가됩니다.

다음을 수행할 수 있습니다.

printf '%s\n' 'is debug'

또는:

printf 'is debug\n'

또는:

echo 'is debug'

(개행 자체를 추가합니다)

또는:

echo is debug

echo매개변수를 인쇄하기 전에 공백으로 연결하는 경우 도 마찬가지 입니다.

하지만printf보통보다echo, 이 경우 사용하는 데 문제가 없습니다. echo왜냐하면 첫 번째 매개변수가 로 시작하지 않고 -모든 매개변수에 백슬래시가 없고 순수 ASCII 문자가 포함되어 있기 때문입니다.

쉼표는 csh 스타일 중괄호 확장에서 항목을 구분하는 데 사용됩니다.

$ echo {a,b}c
ab ac

여기에서는 zsh 대신 다음과 같이 작성할 수 있습니다.

$ {echo,is,debug}
is debug

및 Korn 스타일 산술 표현식(C와 유사한 구문)

$ echo "$(( (a = 6), (b = 7), a * b ))"
42

(모든 쉘이 ,산술 표현식을 지원하는 것은 아닙니다. ksh93에서는 ,점이 대신 쉼표인 로케일의 부동 소수점 기수 문자와 충돌할 수 있습니다.)

그러나 명령 매개변수를 구분하는 데는 사용되지 않습니다. 명령에 대한 인수는 공백으로 구분됩니다(Bash의 경우 이러한 문자는 로케일에서 공백으로 분류되며 공백, 탭 및 때로는 줄바꿈하지 않는 공백 문자를 포함하는 단일 바이트로 인코딩됩니다).

아마도 printfC와 유사한 기능 때문에 혼란스러울 수도 있습니다. awk에서는 awk다음을 작성할 수 있습니다.

BEGIN{printf "%s %d\n", "string", number}

C에서와 마찬가지로 다음과 같이 작성할 수 있습니다.

printf("%s %d\n", "string", number);

(괄호를 사용할 수도 있습니다 awk.)

하지만 쉘 언어의 구문은 대부분의 다른 언어(특히 C/awk)의 구문과 매우 다릅니다.

셸에서 따옴표는 문자열 상수(셸의 모든 내용은 문자열임)를 소개하는 데 사용되지 않고 특정 문자가 언어에서 갖는 특별한 의미를 제거하는 데 사용됩니다.

예를 들어:

printf '%s\n' 'is debug'

따옴표(여기서는 "..."확장된 내용을 포함하기 위해 더 잘 예약되어 있으므로 작은 따옴표가 사용됨)는 백슬래시 문자(셸 구문의 따옴표 연산자이기도 함) 및 공백 문자와 같은 셸에 대한 특별한 의미를 제거하는 데 사용됩니다. , 인수는 명령을 구분하는 데 사용됩니다.

특별한 의미를 보존해야 하는 문자를 제외한 모든 내용을 인용할 수도 있습니다.

'printf' '%s\n' 'is debug'

또는:

\p\r\i\n\t\f \%\s\\\n \i\s\ \d\e\b\u\g

세 개의 매개변수를 구분하는 두 개의 공백을 제외한 모든 문자는 따옴표로 묶입니다.

아니면 특별한 의미를 잃어버릴 필요가 있는 것들을 인용해 보세요:

printf %s'\'n is' 'debug

또는:

printf %s\\n is\ debug

이것은 궁극적으로 정확히 동일한 작업을 수행하는 쉘 구문입니다. 즉 , 및 세 개의 별도 인수를 printf사용하여 명령을 실행합니다.printf%s\nis debug

쉼표를 따옴표 안팎으로 옮기는 것이 전혀 차이가 없는 이유를 명확히 설명하길 바랍니다. 쉼표는 중괄호 확장이나 산술 표현식의 일부로 사용되지 않기 때문에 쉘 구문에서 특별한 의미가 없습니다.

다양한 셸의 특수 문자 및 따옴표 연산자에 대한 자세한 내용은 다음을 참조하세요.Unix 쉘에서 일반 문자와 같은 특수 문자를 사용하는 방법은 무엇입니까?

관련 정보