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
相关产品推荐
相关产品推荐

