代码之家  ›  专栏  ›  技术社区  ›  Jonah

为什么带引号的空数组不是参数,而是带引号的空字符串?

  •  1
  • Jonah  · 技术社区  · 5 年前

    考虑:

    双引号使空变量计为参数
    
    emptyvar:“”
    printf%s%s%发送$emptyvar a b c
    回音“
    printf%s%s%发送“$emptyvar”a b c
    
    回音“
    回音“
    
    #但是空数组不算数,即使使用双引号
    
    空=()
    printf%s%s%send${empty[@]}a c b
    回音“
    printf%s%s%send“${empty[@]}”a b c
    

    哪些输出:

    abcend
    阿本森德
    
    弯曲
    阿本德
    

    在线试用!

    我明白第一个例子。

    我知道在第二个例子中,由于分词的工作原理,双引号以某种方式迫使空字符串被视为arg,但我对细节还不清楚。

    我认为第三个示例的工作原理与第一个类似:在分词过程中它只是作为空白处理。

    我也不清楚为什么在第四种情况下要特别处理阵列。

    我想解释一下引擎盖下发生的事情,以便更好地理解它,并附上ManBash的相关引述(我找不到任何解释这种行为的东西,但可能遗漏了它)。

    哪些输出:

    abcEND
    abENDcEND
    
    acbEND
    abcEND
    

    上网试试吧!

    我明白第一个例子。

    我知道在第二个例子中,双引号以某种方式迫使空字符串被认为是一个参数,因为分词是如何工作的——但是我对细节还不清楚。

    认为 第三个示例的工作方式与第一个类似:它只是在分词过程中作为空白处理。

    我也不清楚为什么在第四种情况下阵列会被特别处理。

    为了更好地理解这一点,我想解释一下在幕后发生的事情,同时引用man bash的相关话(我找不到任何解释这一行为的东西,但可能遗漏了它)。

    1 回复  |  直到 5 年前
        1
  •  3
  •   oguz ismail FCulig    5 年前

    man bash 以下内容:

    数组的任何元素都可以使用 ${name[subscript]} 是的。需要大括号以避免与路径名扩展冲突。 如果下标是 @ * ,该词扩展到name的所有成员。只有当单词出现在双引号中时,这些下标才会有所不同。 如果这个词是双引号, ${name[*]} 展开为单个单词,每个数组成员的值由ifs特殊变量的第一个字符分隔,并且 ${name[@]} 将名称的每个元素展开为一个单独的单词。 如果没有数组成员, ${name[@]} 膨胀成虚无。