ZSH中如何按换行分割字符串为数组并排除空元素?
ZSH处理命令空输出时数组空元素的解决办法
当你用("${(@f)$(icalbuddy ...)}")拆分命令输出到数组时,若命令返回空字符串,ZSH会把空字符串解析成一行,导致数组包含一个空元素(长度为1),直接判断${#events[@]} -eq 0自然不会生效。这里给你两种实用的解决方式:
方法1:生成数组后过滤空元素
利用ZSH的参数扩展特性,直接移除数组中的空元素:
# 先按换行拆分生成数组 events=("${(@f)$(icalbuddy your_command_args)}") # 过滤掉数组中的空元素 events=("${(@)events:#}") # 现在可以正常判断数组是否为空 if [[ ${#events[@]} -eq 0 ]]; then say "当前没有日历事件" else # 用逗号拼接事件后播报 say "今日日历事件:${(j:,:)events}" fi
这里${(@)events:#}是ZSH专属语法:#后面的空字符串表示匹配空元素,@确保数组元素被独立处理,最终会移除所有空元素。
方法2:提前判断命令输出是否为空
直接先捕获命令输出,判断为空后再决定是否生成数组,更直观:
cal_result=$(icalbuddy your_command_args) if [[ -z $cal_result ]]; then say "当前没有日历事件" else # 仅当输出非空时才拆分数组 events=("${(@f)cal_result}") say "今日日历事件:${(j:,:)events}" fi
这种方式从根源避免了生成含空元素的数组,逻辑更清晰,适合不需要提前操作数组的场景。
内容的提问来源于stack exchange,提问作者Paladine
相关产品推荐
相关产品推荐

