Bash에서 길이가 0이 아닌 문자열 테스트: [ -n "$var" ]또는 [$var"]
Bash 스크립트가 길이가 0이 아닌 문자열을 테스트하는 방법은 두 가지가 있습니다.는 ""를 합니다.-n
★★★★
#!/bin/bash
# With the -n option
if [ -n "$var" ]; then
# Do something when var is non-zero length
fi
그러나 -n 옵션은 실제로 필요하지 않습니다.
# Without the -n option
if [ "$var" ]; then
# Do something when var is non-zero length
fi
어떤 방법이 더 나을까요?
마찬가지로 제로렝스 테스트에는 다음과 같은 방법이 적합합니다.
if [ -z "$var" ]; then
# Do something when var is zero-length
fi
또는
if [ ! "$var" ]; then
# Do something when var is zero-length
fi
편집: 이 버전은 보다 완전한 버전으로, (일명,test
) 및 를 참조해 주세요.
되었는지 여부, 또는 괄호를 하는지 여부, 되어 있는지 을 미치는 .-n/-z
변수를 확인하는 데 적합합니다.
| 1a 2a 3a 4a 5a 6a | 1b 2b 3b 4b 5b 6b
| [ [" [-n [-n" [-z [-z" | [[ [[" [[-n [[-n" [[-z [[-z"
-----+------------------------------------+------------------------------------
unset| false false true false true true | false false false false true true
null | false false true false true true | false false false false true true
space| false true true true true false| true true true true false false
zero | true true true true false false| true true true true false false
digit| true true true true false false| true true true true false false
char | true true true true false false| true true true true false false
hyphn| true true true true false false| true true true true false false
two | -err- true -err- true -err- false| true true true true false false
part | -err- true -err- true -err- false| true true true true false false
Tstr | true true -err- true -err- false| true true true true false false
Fsym | false true -err- true -err- false| true true true true false false
T= | true true -err- true -err- false| true true true true false false
F= | false true -err- true -err- false| true true true true false false
T!= | true true -err- true -err- false| true true true true false false
F!= | false true -err- true -err- false| true true true true false false
Teq | true true -err- true -err- false| true true true true false false
Feq | false true -err- true -err- false| true true true true false false
Tne | true true -err- true -err- false| true true true true false false
Fne | false true -err- true -err- false| true true true true false false
변수의 길이가 0이 아닌지를 확인하려면 다음 중 하나를 수행합니다.
- 변수를 단일 괄호로 묶습니다(열 2a).
-n
4a 안에 로 묶어서 (열 4a)- 를 붙이거나 붙이거나
-n
1b - 게시판: 1b - 4b)
"하는 1a 열의 는 "2"가 "1a"임을 .[
는 조건식의 일부인 것처럼 변수의 내용을 평가하고 있습니다(결과는 설명란의 "T" 또는 "F"에 의해 암시된 어설션과 일치합니다).언제[[
1b라고 합니다. 변수 내용은 문자열로 표시되며 평가되지 않습니다.
3a 및 5a 열의 오류는 변수 값에 공백이 포함되어 있고 변수가 따옴표로 묶이지 않았기 때문에 발생합니다.에 나와 처럼 3b와 5b에 나와 [[
는 변수의 내용을 문자열로 평가합니다.
이에 대응하여 길이 0 문자열 테스트의 경우 열 6a, 5b 및 6b에 올바른 방법이 나와 있습니다.또한 부정하는 것이 반대 연산을 사용하는 것보다 더 명확한 의도를 보일 경우 이러한 테스트 중 하나를 부정할 수 있습니다.를 들면, '먹다'와 같이요.if ! [[ -n $var ]]
.
★★★★★★★★★를 사용하고 있는 경우는[
예기치 않은 결과를 초래하지 않도록 하려면 변수를 인용하는 것이 중요합니다.「」를 사용합니다.[[
하지 않다츠요시
억제되고 있는 에러 메세지는, 「단항 연산자 예상」또는 「바이너리 연산자 예상」입니다.
위의 표를 작성한 스크립트입니다.
#!/bin/bash
# by Dennis Williamson
# 2010-10-06, revised 2010-11-10
# for http://stackoverflow.com/q/3869072
# designed to fit an 80 character terminal
dw=5 # description column width
w=6 # table column width
t () { printf '%-*s' "$w" " true"; }
f () { [[ $? == 1 ]] && printf '%-*s' "$w" " false" || printf '%-*s' "$w" " -err-"; }
o=/dev/null
echo ' | 1a 2a 3a 4a 5a 6a | 1b 2b 3b 4b 5b 6b'
echo ' | [ [" [-n [-n" [-z [-z" | [[ [[" [[-n [[-n" [[-z [[-z"'
echo '-----+------------------------------------+------------------------------------'
while read -r d t
do
printf '%-*s|' "$dw" "$d"
case $d in
unset) unset t ;;
space) t=' ' ;;
esac
[ $t ] 2>$o && t || f
[ "$t" ] && t || f
[ -n $t ] 2>$o && t || f
[ -n "$t" ] && t || f
[ -z $t ] 2>$o && t || f
[ -z "$t" ] && t || f
echo -n "|"
[[ $t ]] && t || f
[[ "$t" ]] && t || f
[[ -n $t ]] && t || f
[[ -n "$t" ]] && t || f
[[ -z $t ]] && t || f
[[ -z "$t" ]] && t || f
echo
done <<'EOF'
unset
null
space
zero 0
digit 1
char c
hyphn -z
two a b
part a -a
Tstr -n a
Fsym -h .
T= 1 = 1
F= 1 = 2
T!= 1 != 2
F!= 1 != 1
Teq 1 -eq 1
Feq 1 -eq 2
Tne 1 -ne 2
Fne 1 -ne 1
EOF
보다 강력한 것을 사용하는 것이 좋다. [[
배쉬에 관한 한요
통상의 경우
if [[ $var ]]; then # var is set and it is not empty
if [[ ! $var ]]; then # var is not set or it is set to an empty string
위의 두 가지 구성은 깨끗하고 읽기 쉬워 보입니다.그들은 대부분의 경우에 충분할 것이다.
, 이 안에 있는 가 없습니다.[[
단어 분할과 지구본의 위험이 없기 때문이다.
Shell Check의 소프트한 불만 사항을 방지하기 위해[[ $var ]]
★★★★★★★★★★★★★★★★★」[[ ! $var ]]
, 을 할 수 있습니다.-n
★★★★★★ 。
드문 경우
드물게 "빈 문자열로 설정"과 "전혀 설정되지 않음"을 구분해야 하는 경우 다음을 사용할 수 있습니다.
if [[ ${var+x} ]]; then # var is set but it could be empty
if [[ ! ${var+x} ]]; then # var is not set
if [[ ${var+x} && ! $var ]]; then # var is set and is empty
,도 쓸 수 요.-v
예:
if [[ -v var ]]; then # var is set but it could be empty
if [[ ! -v var ]]; then # var is not set
if [[ -v var && ! $var ]]; then # var is set and is empty
if [[ -v var && -z $var ]]; then # var is set and is empty
관련 투고 및 문서
이 주제와 관련된 많은 게시물이 있습니다.다음은 몇 가지 예입니다.
- Bash에 변수가 설정되어 있는지 확인하는 방법
- 환경변수가 존재하는지 확인하고 그 값을 얻는 방법
- Bash에서 변수가 비어 있는지 확인하는 방법
- 셸 스크립트 식에서 "plus colon"("+:")은 무엇을 의미합니까?
- Bash에서는 단일 대괄호 [ ]보다 이중 대괄호 [[ ]가 더 좋습니까?
- Bash에서는 싱글 대괄호와 더블 대괄호의 차이점은 무엇입니까?
- mklement0에 의한 훌륭한 답변입니다.
[[
»[
- Wiki - Bash © Wiki -
[
»[[
여기 몇 가지 테스트가 더 있습니다.
문자열이 비어 있지 않으면 True:
[ -n "$var" ]
[[ -n $var ]]
test -n "$var"
[ "$var" ]
[[ $var ]]
(( ${#var} ))
let ${#var}
test "$var"
문자열이 비어 있으면 True:
[ -z "$var" ]
[[ -z $var ]]
test -z "$var"
! [ "$var" ]
! [[ $var ]]
! (( ${#var} ))
! let ${#var}
! test "$var"
유감스럽게도 애초에 이 구문이 두 개 있는 이유를 알 수 없었습니다.둘 다 1979년 버전7 Unix에서 동시에 도입된 것으로 보입니다.
1994 싱글 유닉스 사양은-n
★★★★★★★★★★★★★★★★★」-z
구문을 사용합니다.이후 최신 버전 POSIX.1-2017을 포함한 모든 버전의 POSIX에 동일한 권장 사항이 그대로 복사되었습니다.
다음 두 가지 명령어가 있습니다.
test "$1" test ! "$1"
일부 과거 시스템에서는 안정적으로 사용할 수 없습니다.이러한 문자열 식이 사용되고 $1이 '!', '(), 또는 알려진 단항 프라이머리로 확장되면 예기치 않은 결과가 발생합니다.더 나은 구조는 다음과 같습니다.
test -n "$1" test -z "$1"
각각 다음과 같다.
하세요.-n
★★★★★★★★★★★★★★★★★」-z
28년 이상 된 시스템과의 호환성이 필요한가요?
제제 in in in in in in in in의 이라고 생각합니다.if [ "$var" ]
★★★★★★★★★★★★★★★★★」if [ ! "$var" ]
그 구문이 확실한 승자가 됩니다.하지만 중요한 것은 기능적으로 차이가 없기 때문에 개인 취향대로 하세요.
정답은 다음과 같습니다.
if [[ -n $var ]] ; then
blah
fi
「 」의 .[[...]]
변수 견적을 올바르게 처리합니다.
빈 환경변수를 보다 투명하게 평가하는 대체 방법은 다음을 사용하는 것입니다.
if [ "x$ENV_VARIABLE" != "x" ] ; then
echo 'ENV_VARIABLE contains something'
fi
case/esac
다음 중 하나:
case "$var" in
"") echo "zero length";;
esac
언급URL : https://stackoverflow.com/questions/3869072/test-for-non-zero-length-string-in-bash-n-var-or-var
'programing' 카테고리의 다른 글
WPF 코드 배후에 의한 리소스 액세스 (0) | 2023.04.09 |
---|---|
Ruby에서 어레이의 일부를 반환하려면 어떻게 해야 합니까? (0) | 2023.04.09 |
Xcode 빌드 옵션의 영향 "비트 코드 활성화" 예/아니오 (0) | 2023.04.09 |
목표 C의 MD5 알고리즘 (0) | 2023.04.09 |
루프 vba에서 다음 반복으로 건너뜁니다. (0) | 2023.04.09 |