셸: -n/-z에서 큰따옴표만 테스트하시겠습니까? [복사]

셸: -n/-z에서 큰따옴표만 테스트하시겠습니까? [복사]

예를 들어 다음과 같은 경우입니다 test -e.

VAR="<this is a file path: /path/to/file/or/dir"
test -e $VAR && do_something || do_anotherthing

"$VAR"질문: 이것을 여기서 사용해야 합니까 ? 필요하지 않은 경우 여기에서 자세한 내용을 좋아하지 않습니다. 왜냐하면 $VAR분명히 이 경우에는 경로이므로 빈 문자열이면 경로가 빈 문자열이 아니기 때문에 항상 실패해야 하고 내 논리에 따르면 큰 따옴표가 필요하지 않기 때문입니다.

그러나 문자열 테스트의 경우 test -n 예를 들면 다음과 같습니다.

VAR="<this is a string"
test -n $VAR && do_something || do_anotherthing

그런 다음 내 논리에 따르면 $VAR큰따옴표로 묶어야 합니다. "$VAR"빈 문자열로 확장될 수 있으므로 큰따옴표가 아닌 경우 매개변수로만 확장되고 -n항상 true입니다.

그래서 실제 질문은 테스트 명령에서 문자열 -n과 문자열에만 -z큰따옴표를 사용해야 하는지 의심스럽습니다.

답변1

일반적인 규칙은 쉘이 해당 내용에 대해 토큰 분할 및 와일드카드 확장을 수행하도록 원하지 않는 한 모든 변수를 큰따옴표로 묶는 것입니다.

분명히 $VAR이 경우에는 경로이므로 빈 문자열이면 항상 실패해야 하며 [...] 내 논리에 따르면 큰따옴표는 필요하지 않습니다.

정반대. 피연산자가 없는 동작은 test -e이 특별한 경우에 변수를 인용해야 하는 또 다른 이유입니다.

$ unset foo      # or foo=""
$ test -e $foo   # note this is equivalent to `test -e'
$ echo $?
0
$ test -e "$foo"
$ echo $?
1
$

답변2

바라보다이 Q&A,그렉의 위키그리고수동설명을 위해. 요약: 그것이 어떻게 작동하는지 확실하지 않습니다. More Quotes™를 사용해야 합니다. 또는 다르게 말하면: 목표가 정확성과 유지 관리 용이성이라면 올바르게 인용하는 것은 (올바르고 간결한 쉘 스크립트를 작성하는 데 필요한 다른 모든 이상한 점을 배운 후) 약 5번째이며, 단일 문자를 저장하는 우선 순위는 999,999+입니다.

답변3

이것이 더 좋고 명확할 것입니다:

if [[ "$VAR" ]]; then
    do_something
else
    do_anotherthing
fi

관련 정보