我可以取消设置 $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, ... 这样的命名变量的值,而是值列表中的第 1 个,第 2 个,... 值。也许列表的第一个值是空字符串,但说我的列表没有第一个值是没有意义的。如果列表没有第一个值,那么它根本没有值,因此它是一个空列表。

所以你不能“取消设置”列表的第一个值。您只能从列表中删除第一个值。那么列表的前第二个值现在是列表的第一个值,前第三个值现在是第二个,依此类推。这正是移位运算符所做的事情。

答案4

不,至少不是直接。此语法应该有效,但会产生错误:

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

unset $variable通常是一个错误,但却unset variable是预期的结果。不幸的是它在这里不起作用。

相关内容