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
해당 범위에서 // 미리 선언되지 않은 경우).typeset
declare
다음을 수행할 수 있습니다.
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의 경우 이러한 문자는 로케일에서 공백으로 분류되며 공백, 탭 및 때로는 줄바꿈하지 않는 공백 문자를 포함하는 단일 바이트로 인코딩됩니다).
아마도 printf
C와 유사한 기능 때문에 혼란스러울 수도 있습니다. 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\n
is debug
쉼표를 따옴표 안팎으로 옮기는 것이 전혀 차이가 없는 이유를 명확히 설명하길 바랍니다. 쉼표는 중괄호 확장이나 산술 표현식의 일부로 사용되지 않기 때문에 쉘 구문에서 특별한 의미가 없습니다.
다양한 셸의 특수 문자 및 따옴표 연산자에 대한 자세한 내용은 다음을 참조하세요.Unix 쉘에서 일반 문자와 같은 특수 문자를 사용하는 방법은 무엇입니까?