You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

zsh脚本中如何比较字符串?附脚本missing ']'报错问题

报错解决方法

报错的根本原因是:[ 是shell的内置命令,而非语法标记,命令和参数之间必须用空格分隔,同时]是[命令要求的必填收尾参数,前后也需要加空格。你写的["$1" == "--all"]没有加对应空格,shell会将["$1"识别为一个整体命令,找不到对应的闭合参数],因此抛出缺失]的错误。

修正后的代码如下:

if [ "$1" == "--all" ]
then
  sayOS
  sayUptime
  sayMemory
  sayDirectory
  sayTime
fi
zsh 正确的字符串比较方式

分为通用兼容写法和zsh专属写法两类:

  • POSIX通用兼容写法(适配所有shell,包括zsh/bash/sh)
    使用[命令实现,要求所有参数和运算符两侧都加空格,字符串变量建议用双引号包裹,避免空值、带空格的字符串引发语法错误:
    • 相等比较:[ "$str1" = "$str2" ],=是POSIX标准的相等运算符,==是zsh/bash的扩展兼容写法
    • 不等比较:[ "$str1" != "$str2" ]
    • 字典序大于/小于:[ "$str1" \> "$str2" ]、[ "$str1" \< "$str2" ],大于小于号需要转义,避免被识别为文件重定向符号
    • 空值判断:[ -z "$str" ]判断字符串为空,[ -n "$str" ]判断字符串非空
  • zsh专属写法(仅zsh环境可用,更简便安全,推荐使用)
    使用[[关键字实现,不需要转义特殊符号,变量也不需要强制加双引号包裹:
    • 相等比较:[[ $str1 == $str2 ]]
    • 不等比较:[[ $str1 != $str2 ]]
    • 字典序大于/小于:[[ $str1 > $str2 ]]、[[ $str1 < $str2 ]]
    • 通配符模式匹配:[[ $str1 == *.log ]],可直接判断字符串是否匹配对应通配符规则
  • 注意事项:不要使用-eq/-gt这类算术运算符做字符串比较,这类运算符仅适用于数值对比,用于字符串会引发报错。

内容的提问来源于stack exchange,提问作者Flowerfist.rkt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:15:08