我无法理解如何有效地使用全局变量。根据我对bash的理解,除非根据http://tldp.org/LDP/abs/html/localvar.html显式声明为local,否则每个变量都是全局变量。因此,我的理解是,如果我构建这样的函数:
# This function will determine which hosts in network are up. Will work only with subnet /24 networks
is_alive_ping() # Declare the function that will carry out given task
{
# declare a ip_range array to store the range passed into function
declare -a ip_range=("${!1}")
# declare active_ips array to store active ip addresses
declare -a active_ips
for i in "${ip_range[@]}"
do
echo "Pinging host: " $i
if ping -b -c 1 $i > /dev/null; then # ping ip address declared in $1, if succesful insert into db
# if the host is active add it to active_ips array
active_ips=("${active_ips[@]}" "$i")
echo "Host ${bold}$i${normal} is up!"
fi
done
}
一旦调用了is_alive_ping函数,我就能够访问active_ips
变量。像这样:
# ping ip range to find any live hosts
is_alive_ping ip_addr_range[@]
echo ${active_ips[*]}
stackoverflow中的这个问题进一步强化了这一点:Bash Script-Returning array from function。但是我对active_ips数组的回显没有返回任何内容。这对我来说很令人惊讶,因为我知道阵列实际上包含一些IP。关于为什么失败的任何想法?
答案 0 :(得分:4)
declare
创建局部变量。使用declare -g
将其设为全局,或者只是完全跳过declare
关键字。
declare -ga active_ips
# or
active_ips=()
此外,您可以使用+=
附加到数组:
active_ips+=("$i")