是否可以取消设置 $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)
除了所有正确的技术答案外,您还应该注意到您的问题存在逻辑缺陷。$1, $2,... 不是诸如 $A, $B, ... 之类的命名变量的值,而是值列表的第一个、第二个、... 值。也许列表的第一个值是一个空字符串,但说我的列表没有第一个值是没有意义的。如果列表没有第一个值,则它根本没有值,因此它是一个空列表。
所以你不能“取消设置”列表的第一个值。您只能从列表中删除第一个值。然后列表的前第二个值现在是列表的第一个值,前第三个现在是第二个值,依此类推。这正是移位运算符所做的。