我可以取消设置 $1 变量吗?

Poz*_*nux 7 bash variable set

是否可以取消设置 $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 ~]#
Run Code Online (Sandbox Code Playgroud)

编辑:

最后,这是我在 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 ~]#
Run Code Online (Sandbox Code Playgroud)

@Jeff Schaller 的回答帮助我理解了这一点。

Kus*_*nda 20

您无法取消设置,但您可以转换$2$1

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

$ shift
$ echo "$1$2"  # $2 is now empty
jour
Run Code Online (Sandbox Code Playgroud)

shift会将所有位置参数降低一级。例如,命令行解析循环(使用getopt/ getopts)在每次迭代中移动位置参数,同时重复检查 的值是很常见的$1。想要取消设置位置参数的情况并不常见。

顺便说一句,unset接受一个变量name,而不是它的值,所以unset $1实际上会取消设置变量bon(如果之前已经设置过)。


Jef*_*ler 16

您可以通过将参数重新设置为:“空字符串”后跟“参数,从第二个开始”来清空它:

$ set -- 1 2 3 4
$ printf -- "->%s<-\n" "$@"
->1<-
->2<-
->3<-
->4<-
$ set -- "" "${@:2}"
$ printf -- "->%s<-\n" "$@"
-><-
->2<-
->3<-
->4<-
Run Code Online (Sandbox Code Playgroud)


mir*_*173 6

除了所有正确的技术答案外,您还应该注意到您的问题存在逻辑缺陷。$1, $2,... 不是诸如 $A, $B, ... 之类的命名变量的值,而是值列表的第一个、第二个、... 值。也许列表的第一个值是一个空字符串,但说我的列表没有第一个值是没有意义的。如果列表没有第一个值,则它根本没有值,因此它是一个空列表。

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