#!/bin/bash
if [ $# -gt 0 ]; then
snum=( $@ )
echo $snum
fi
./testscript.sh 1234 4568
当我像The output of echo command is only那样运行脚本时1234
,所以我想我没有构建所有位置参数的数组?
#!/bin/bash
if [ $# -gt 0 ]; then
snum="$@"
echo $snum
fi
并运行./testscript.sh 1234 4568
输出是1234 4568
我想知道为什么snum=( $@ )
只采用第一个位置参数?
在列表上下文中使用
"$@"
(包括双引号)来获取位置参数列表,单独引用。在标量上下文中使用
"$*"
(包括双引号) 将位置参数连接成单个字符串,其中第一个字符$IFS
(通常是空格) 作为分隔符。使用
$@
未引用(如在您的第一个示例中)或"$@"
在标量上下文中使用(如在您的第二个示例中)很少有意义。在bash
shell 中,"$@"
在标量上下文中使用与使用设置为空格"$*"
的第一个字符相同。$IFS
使用时
snum=( "$@" )
,您创建数组snum
。如果您访问变量 as$snum
,您将获得数组的第一个元素。实际上,它与访问${snum[0]}
. Using"${snum[@]}"
以类似的方式为您提供单独引用的元素的列表"$@"
。Using"${snum[*]}"
给你相当于"$*"
, 但对于数组snum
。假设您想
snum
从位置参数列表中创建一个数组,然后打印该数组(如果它不为空),您可以使用snum
如果给脚本提供了参数,这将在单独的行上打印元素。示例运行:
请注意,该
hello world
参数保留为单个参数,如果您忘记了$@
.在单个字符串中打印位置参数列表,由冒号分隔。通过修改
$IFS
字符串在位置参数之间插入冒号。这里的区别
snum
是现在是单个字符串,而不是元素数组。如果该字符串为非空,则脚本输出该字符串,即,如果脚本被赋予至少一个非空参数。或者,稍微修改我们的第一个示例以继续
snum
用作数组,示例运行:
是数组变量赋值
是一个标量变量赋值(并且
var="$@"
,var
被赋值为一个字符串,因为它是一个标量,所以位置参数的空间串联)$var
在数组上扩展为索引 0${var[0]}
的元素,与您需要的数组的所有元素相同,这${var[@]}
是从 Korn shell 复制的错误设计。另请注意:
echo
不能用于输出任意数据bash
。在这里,你想要:
在
zsh
其数组设计更接近于的csh
比中ksh
,您可以这样做:(
print -r
本身来自ksh)但需要注意的是,即使在该 shell 中参数扩展时没有 split+glob,但像这样不加引号的数组扩展仍然会删除空元素。要保留它们,您需要使用 ksh 语法:
(虽然
"${snum[@]}"
可以缩短为"$snum[@]"
)。请注意, in
var="$@"
或var="${array[@]}"
,var
最终包含一个由位置参数组成的字符串,该字符串与 in 的第一个字符$IFS
连接,zsh
并与空格连接bash
。POSIX 在那里未指定行为,$@
仅用于引用和列表上下文。要获取与$IFS
可移植的第一个字符连接的位置参数,请使用"$*"
(在列表或非列表上下文中)。要将数组的元素与任意字符串(与 的第一个字符相反
$IFS
)连接,请使用:中的j
参数扩展标志。没有等价物。有。zsh
${(j[that-string])array}
bash
fish
string join -- that-string $array