bash – 当“nounset”选项生效时,获取空数组或未设置数组的长度
由于
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标准. 上述建议将增加跨平台一致性的可能性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |