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

数组 – 惊人的数组扩展行为

发布时间:2020-12-15 18:40:02 所属栏目:安全 来源:网络整理
导读:在以下示例中,我已经对标有(!!)的行感到惊讶: log1 () { echo $@; }log2 () { echo "$@"; }X=(a b)IFS='|'echo ${X[@]} # prints a becho "${X[@]}" # prints a becho ${X[*]} # prints a becho "${X[*]}" # prints a|becho "---"log1 ${X[@]} # prints a b
在以下示例中,我已经对标有(!!)的行感到惊讶:
log1 () { echo $@; }
log2 () { echo "$@"; }

X=(a b)
IFS='|'

echo ${X[@]}   # prints a b
echo "${X[@]}" # prints a b
echo ${X[*]}   # prints a b
echo "${X[*]}" # prints a|b
echo "---"
log1 ${X[@]}   # prints a b
log1 "${X[@]}" # prints a b
log1 ${X[*]}   # prints a b
log1 "${X[*]}" # prints a b (!!)
echo "---"
log2 ${X[@]}   # prints a b
log2 "${X[@]}" # prints a b
log2 ${X[*]}   # prints a b
log2 "${X[*]}" # prints a|b

这是我对行为的理解:

> ${X [*]}和${X [@]}都扩展为b
>“${X [*]}”扩展为“a | b”
>“${X [@]}”扩展为“a”“b”
> $*和$@与${X [*]}和${X [@]}具有相同的行为,除了它们的内容是程序或函数的参数

这似乎得到了bash manual的证实.

在行log1“${X [*]}”中,因此我期望引用的表达式展开为“a | b”,然后传递给log1函数.该函数具有显示的单个字符串参数.为什么会发生其他事情?

如果您的答案是手动/标准参考的支持,那将会很酷!

IFS不仅用于加入${X [*]}的元素,还用于拆分未引用的扩展$@.对于log1“${X [*]}”,会发生以下情况:

>“${X [*]}”按预期展开为| b,所以$1设置为log1内的一个| b.>当$@(未引用)被扩展时,生成的字符串是一个| b.>无争议的扩张与…分开作为分隔符(由于IFS的全局值),所以echo接收两个参数a和b.

(编辑:李大同)

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

    推荐文章
      热点阅读