我是一个新手Linux用户,我遇到了这个问题。
如果执行了以下命令
set 10 20 30 40 50
shift
shift
我如何找到 的价值$*
?
找到 的值的最简单方法$*
是回显它:
echo $*
鉴于显示的三个步骤,它将回显:
30 40 50
不带引号的值与$*
不带引号的值相同$@
,并且由 shell 脚本的所有位置参数或由set
命令设置的值组成,例如您显示的命令(由任何后续shift
命令修改)。用双引号括起来,"$*"
表示包含所有位置参数的单个字符串,但"$@"
表示多个字符串,每个字符串都与一个位置参数相同。它是更常见的正确形式。
printf
您可以使用以下命令查看这些形式之间的区别:
printf "%s\n" $*
printf "%s\n" "$*"
printf "%s\n" $@
printf "%s\n" "$@"
如果您使用以下方法,您会更深入地了解它们:
set -- 10 '20 30' ' 40 50 '
没有任何班次,然后使用了 4 个printf
命令:
printf "X%sX\n" $*
printf "X%sX\n" "$*"
printf "X%sX\n" $@
printf "X%sX\n" "$@"
X 用于标记打印值的开始和结束。输出是:
X10X
X20X
X30X
X40X
X50X
X10 20 30 40 50 X
X10X
X20X
X30X
X40X
X50X
X10X
X20 30X
X 40 50 X
Bash 手册的相关部分是特殊参数。
从bash
手册页:
set
: 处理选项后剩余的任何参数都被视为位置参数的值,并按顺序分配给$1
,$2
, ...$n
。
和:
shift [n]
:位置参数 fromn+1 ...
被重命名为$1 ....
由数字表示的参数$#
未$#-n+1
设置...如果n
未给出,则假定为 1。
所以你的set
套装:
$1 = 10
$2 = 20
$3 = 30
$4 = 40
$5 = 50
然后shift
命令抛出$1
并将其他$n
变量向下移动。你做了两次,所以你有:
$1 = 30
$2 = 40
$3 = 50
您可以使用:echo $*
查看输出:
30 40 50
它有点奇怪......问题说,$ * 的值......嗯,它代表了放入命令中的所有内容,因此被传递到位置参数上。
shift 命令只会将原始命令行中的所有内容向左推一个位置 .... 所以从 10 20 30 40 50 ..... 在两次 sahifts 之后(向左推 2 次)你有 30 40 50现在可以通过使用 $ 像 $1 ... $2 指定它们的位置/出现来访问它
$ set 10 20 30 40 50
$ shift 2
$ echo $*
30 40 50
简而言之 ....
如果您想访问单个值 .... 只需使用 $1 , $2 .... 同样明智的是,这里 $1 将有 30,$2 将有 40。
你想知道你有多少参数使用 $#
$ echo $#
3
这有帮助吗?