$1 변수를 설정 해제할 수 있나요?

$1 변수를 설정 해제할 수 있나요?

$1 변수를 설정 해제할 수 있나요? 그렇지 않다면 어디서도 설명을 찾을 수 없습니다 man.

[root@centos2 ~]# set bon jour
[root@centos2 ~]# echo $1$2
bonjour
[root@centos2 ~]# unset $1
[root@centos2 ~]# echo $1$2
bonjour
[root@centos2 ~]#

편집하다:

마지막으로 모든 위치 인수를 설정 해제하기 위해 man()에서 찾은 내용은 다음과 같습니다 man set option double-dash(man은 "unset"이라는 단어를 사용합니다!).

이 옵션 뒤에 인수가 없으면 위치 인수가 설정 해제됩니다.

[root@centos2 ~]# echo $1

[root@centos2 ~]# set bon jour
[root@centos2 ~]# echo $1$2
bonjour
[root@centos2 ~]# set --
[root@centos2 ~]# echo $1$2

[root@centos2 ~]#

@Jeff Schaller의 답변은 이것을 이해하는 데 도움이 되었습니다.

답변1

위치 매개변수를 설정 해제할 수는 없지만 해당 매개변수 $2로 이동하여 $1이전 값을 효과적으로 삭제할 수는 있습니다 $2.

$ set -- bon jour
$ echo "$1$2"
bonjour

$ shift
$ echo "$1$2"  # $2 is now empty (i.e. "unset" or "not set")
jour

shift명령은 모든 위치 매개변수를 한 수준 낮춥니다. 명령줄 구문 분석 루프(이것은아니요getopt/ )를 사용하면 getopts일반적으로 값을 반복적으로 확인하면서 각 반복마다 위치 매개변수가 이동됩니다 $1. 위치 매개변수를 설정 해제하려는 경우는 드뭅니다.

그런데, unset변수를 허용합니다이름, 값이 아니라 unset $1변수가 bon이전에 설정된 경우 실제로 설정이 해제됩니다.

답변2

당신은 할 수비어 있는매개변수를 "빈 문자열" 뒤에 "두 번째 매개변수부터 시작하는 매개변수"로 재설정하면 됩니다.

$ set -- 1 2 3 4
$ printf -- "->%s<-\n" "$@"
->1<-
->2<-
->3<-
->4<-
$ set -- "" "${@:2}"
$ printf -- "->%s<-\n" "$@"
-><-
->2<-
->3<-
->4<-

답변3

모든 올바른 기술적 답변 외에도 귀하의 질문에는 논리적 결함이 있다는 점에도 유의해야 합니다. $1, $2,...는 $A, $B,...와 같이 명명된 변수의 값이 아니라 값 목록의 첫 번째, 두 번째,... 값입니다. 목록의 첫 번째 값이 빈 문자열일 수도 있지만 내 목록에 첫 번째 값이 없다고 말하는 것은 의미가 없습니다. 목록에 첫 번째 값이 없으면 값이 전혀 없으므로 빈 목록입니다.

따라서 목록의 첫 번째 값을 "설정 해제"할 수 없습니다. 목록에서 첫 번째 값만 제거할 수 있습니다. 그런 다음 목록의 첫 번째 두 번째 값은 이제 목록의 첫 번째 값이 되고, 첫 번째 세 번째 값은 이제 두 번째 값이 되는 식입니다. 이것이 바로 시프트 연산자가 하는 일입니다.

답변4

아니요, 적어도 직접적으로는 아닙니다. 이 구문은 작동하지만 오류가 발생합니다.

$ set bon jour
$ echo $1 $2
$ unset 1
1: not a valid identifier

unset $variable일반적으로 오류이지만 unset variable예상된 결과입니다. 불행히도 여기서는 작동하지 않습니다.

관련 정보