【发布时间】:2018-02-15 09:02:42
【问题描述】:
我正在尝试在 bash 中编写一个简单的函数,它接受 2 个参数、一个字符串和一个数组。
在函数的最开始,我检查参数的数量
function is2args() {
if [ $# -le 1 ]; then
return 1
fi
return 0
}
然后我尝试以下操作
arr=()
is2args "" "${arr[@]}" # returns 1
这会触发 if 语句,因为 bash 认为只有一个参数,但是如果列表是空字符串,它可以工作
arr=()
is2args "" "" # returns 0
或用元素填充
arr=(
"element"
)
is2args "" "${arr[@]}" # returns 0
并默认为空字符串
arr=()
is2args "" "${arr[@]:-""}" # returns 0
我不太明白发生了什么。据我了解,这是传递列表的正确方法,但无论出于何种原因,似乎都忽略了一个空列表。
我真的应该在每次通过数组发送时设置一个默认的空字符串,还是有办法在函数本身中捕获它?
【问题讨论】:
-
如果将数组展开到命令行,数组的元素将成为您的后续参数。在单个固定命令之后传递一个零参数数组,总共有一个参数。您传递一个三参数数组,总共有四个参数。这是预期的行为——使用语言,而不是反对它。
-
shell 中没有数组 value 这样的东西。您可以传递 names 数组变量的字符串,也可以将数组的 元素 作为一个或多个参数传递。
-
@charles 如果你说的是真的,这让我非常困惑,因为我在将 2 个数组传递给函数之前编写了函数,并且我能够区分两者。是不是应该都混在一个大袋子里分不清?
-
@ByteFlinger,是的,这 是 实际上会发生什么。如果你要区分它们,你大概是在做类似
${array[*]}之类的事情,将它们转换为字符串——在这种情况下,它们不再是数组。 -
@ByteFlinger,如果你能展示这样一个函数,我可以描述它的实际行为(并提供一些样本数据,它会用这些数据来证明为什么这种行为是错误的/错误的)。