test -v가 위치 매개변수와 함께 작동합니까?

test -v가 위치 매개변수와 함께 작동합니까?

배쉬 매뉴얼에서

-v varname

쉘 변수 varname이 설정된 경우(값이 할당된 경우) 참입니다.

bash 스크립트에 위치 매개변수가 1설정되어 있는지 테스트 -v 1하지만 명령줄 매개변수를 제공하면 테스트가 통과되지 않습니다. 이유를 알고 싶습니다.

#! /bin/bash

if [ -v 1 ]; then
    echo "1 exists"
fi

감사해요.

답변1

Bash에서는 Bash 5.1부터 작동하지만 이전 버전에서는 자동으로 실패합니다. (zsh에서도 작동합니다.)

$ ./bash-5.1/bash -c 'set -- aa bb; for i in 1 2 3; 
                      do [ -v $i ] && echo y || echo n; done'
y
y
n

소스 코드의 CHANGES 파일에는 5.1-alpha의 이러한 변경 사항이 언급되어 있습니다.

3. New Features in Bash
...
x. `test -v N' can now test whether or not positional parameter N is set.

그럼에도 불구하고 둘 사이에는 약간의 섬뜩한 차이점이 있습니다.변하기 쉬운그리고매개변수.

Bash 참조 매뉴얼은 이를 정의합니다.이와 같이:

범위값을 저장하는 엔터티입니다. name, 숫자 또는 아래 나열된 특수 문자 중 하나 일 수 있습니다 . ㅏ바꾸다로 표시되는 매개변수입니다 name.

아직 하나 있어요name 다음과 같이 정의됩니다.~처럼

A는 word문자, 숫자, 밑줄로만 구성되며 문자 또는 밑줄로 시작됩니다. Names쉘 변수 및 함수 이름으로 사용됩니다. 또한 ~으로 알려진 identifier.

따라서 모든 변수는 매개변수이지만 모든 매개변수가 변수는 아닙니다. 그리고 돌아오다test -vvarname

쉘 변수가 True인 경우변수 이름설정되었습니다

따라서 기술적으로는 실제 변수 이외의 어떤 것도 기록하지 않습니다. 이제 위치 매개변수에서도 작동하지만 문서에는 여전히 다음과 같은 내용만 언급되어 있는 것 같습니다.변하기 쉬운.


어쨌든 우리는 ${1+x}빈 문자열 $1과 다른 문자열을 확장하고 테스트할 수 있습니다.범위(모든 것을 포함변하기 쉬운.) 인수가 설정된 경우(설정되었지만 비어 있는 경우에도) ${par+value}주어진 문자열로 확장되고 , 그렇지 않으면 빈 문자열로 확장됩니다.value

$ bash -c 'set -- aa bb; [ ${1+x} ] && echo y || echo n'
y

이는 모든 버전의 Bash 및 모든 표준 셸에서 작동합니다.

관련 정보