배쉬 매뉴얼에서
-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 및 모든 표준 셸에서 작동합니다.