加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 当“nounset”选项生效时,获取空数组或未设置数组的长度

发布时间:2020-12-15 22:39:18 所属栏目:安全 来源:网络整理
导读:由于 Bash在set -o nounset模式(又名set -u)中运行时,可能会认为空数组未设置,无论它们是否实际上已分配空值,因此在尝试扩展数组时必须小心 – 其中一个解决方法是检查数组长度是否为零.更不用说获取数组中的元素数量本身就是一种常见的操作. 在openSUSE 42.
由于 Bash在set -o nounset模式(又名set -u)中运行时,可能会认为空数组未设置,无论它们是否实际上已分配空值,因此在尝试扩展数组时必须小心 – 其中一个解决方法是检查数组长度是否为零.更不用说获取数组中的元素数量本身就是一种常见的操作.

在openSUSE 42.1中使用Bash 4.2.47(1) – release发展时,我习惯于当数组为空或未设置时,使用${#ARRAY_NAME [@]}获取数组大小成功.但是,在FreeBSD 10.3中使用Bash 4.3.46(1)-release检查我的脚本时,结果发现此操作可能会失败并显示通用的“未绑定变量”错误消息.提供扩展的默认值似乎不适用于数组长度.提供替代命令链似乎有效,但不能在通过子shell扩展调用的函数内部 – 函数只在第一次失败后退出.还有什么可以帮到这里?

请考虑以下示例:

function Size ()
{
    declare VAR="$1"
    declare REF="${#${VAR}[@]}"
    eval "echo "${REF}" || echo 0" 2>/dev/null || echo 0
}

set -u
declare -a MYARRAY

echo "size: ${#MYARRAY[@]}"
echo "size: ${#MYARRAY[@]-0}"
echo "Size: $(Size 'MYARRAY')"
echo -n "Size: "; Size 'MYARRAY'

在openSUSE环境中,所有回显线都按预期输出0.在FreeBSD中,只有在数组明确赋值为空值时才能得到相同的结果:MYARRAY =();否则,前两行中的内联查询都会失败,第三行只输出Size :(表示扩展结果为空),只有最后一行完全成功,这要归功于外部|| echo 0 – 然而,将结果传递到屏幕并不是通常在尝试获取数组长度时的意图.

以下是我的观察摘要:

Bash 4.2  Bash 4.3
                                    openSUSE  FreeBSD

counting elements of?unset array       OK      FAILED
counting elements of?empty array       OK        OK

content expansion of?unset array     FAILED    FAILED
content expansion of?unset array(*)    OK        OK
content expansion of?empty array     FAILED    FAILED
content expansion of?empty array(*)    OK        OK
    (*?with fallback value supplied)

对我来说,这看起来很不一致.有没有真正面向未来的跨平台解决方案呢?

解决方法

bash的Linux和BSD风格之间存在已知(记录)的差异.我建议按照POSIX标准编写代码.您可以从这里开始获取更多信息 – > www2.opengroup.org.

考虑到这一点,您可以使用–posix命令行选项启动bash,也可以在bash运行时执行命令set -o posix.两者都会导致bash符合POSIX标准.

上述建议将增加跨平台一致性的可能性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读