在这里,bash
有一个小问题
我用简单的array
编写了function
,我需要使用return
命令将array
作为read
,并且还需要call
不知何故。
function myData {
echo 'Enter the serial number of your items : '
read -a sn
return ${sn[@]}
}
例如这样???
$ ./myapp.sh
输入您的商品的序列号:92467 90218 94320 94382
myData
echo ${?[@]}
为什么我们没有其他语言那样的返回值? 谢谢您的帮助...
答案 0 :(得分:3)
正如其他人提到的那样,内置命令return
旨在将exit status
发送给调用方。
如果要将函数中的处理结果传递给
呼叫者,将有几种方式:
使用标准输出
如果您在函数中的标准输出中写入内容,则输出
重定向到呼叫者。标准输出只是非结构化的
字节流。如果要使其具有特殊含义,例如
array
,您需要通过为某些对象分配定界符来定义结构
字符。如果您确定每个元素都不包含空格,制表符或
换行符,您可以依靠IFS
的默认值:
myfunc() {
echo "92467 90218 94320 94382"
}
ary=( $(myfunc) )
for i in "${ary[@]}"; do
echo "$i"
done
如果数组的元素可能包含空格或其他特殊字符 字符,您需要保留它们(例如您正在处理的情况 文件名),则可以使用空字符作为分隔符:
myfunc() {
local -a a=("some" "elements" "contain whitespace" $'or \nnewline')
printf "%s\0" "${a[@]}"
}
mapfile -d "" -t ary < <(myfunc)
for i in "${ary[@]}"; do
echo ">$i" # The leading ">" just indicates the start of each element
done
通过引用传递
与其他语言一样,bash
> = 4.3具有通过以下方式传递变量的机制:
参考或按名称:
myfunc() {
local -n p="$1" # now p refers to the variable with the name of value of $1
for (( i=0; i<${#p[@]}; i++ )); do
((p[i]++)) # increment each value
done
}
ary=(0 1 2)
myfunc "ary"
echo "${ary[@]}" # array elements are modified
将数组用作全局变量
无需解释其用法和优点/缺点。
希望这会有所帮助。