是否可以取消设置 $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
是预期的结果。不幸的是它在这里不起作用。