예를 들어 다음과 같은 경우입니다 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
답변3
이것이 더 좋고 명확할 것입니다:
if [[ "$VAR" ]]; then
do_something
else
do_anotherthing
fi