zsh 中单括号中的字符串比较

zsh 中单括号中的字符串比较

打印所有文件夹的 Bash 代码:

for f in ~/*;
do
if [ $f  == '/home/sk/.' -o $f  == '/home/sk/..' ]; then
       true
  else
     echo "$f"
  fi
done

它适用于 bash。当我在 z shell 上运行代码时,它抛出错误:

 = not found

然后我将其转换[[[, ]into]]以避免在 z shell 中出现此错误,并在 z shell 上运行它。它引发了下一个错误:

condition expected: $f

使用[[]],bash 也会抛出错误:

syntax error in conditional expression
syntax error near `-o'

是否有一个 POSIX 标准可以在 shell 中进行字符串比较,并且可以跨 shell 工作?

答案1

这里有各种各样的问题。第一,==不标准。 POSIX 方式是=.同样适用于-o.这适用于 bash 和 zsh:

for f in ~/*;
do
if [ "$f"  = '/home/sk/.' ] || [ "$f"  = '/home/sk/..' ]; then
       true
  else
     echo "$f"
  fi
done

请注意,您if不需要,默认情况下 bash 和 zsh 中都会忽略点文件。你可以简单地写:

for f in ~/*; do echo "$f"; done

甚至

printf "%s\n" ~/*

答案2

尝试:

if [ "$f" = '/home/sk/.' ] || [ "$f" = '/home/sk/..' ]

答案3

不是对你的问题的直接答案,但条件是不必要的,因为在 POSIX 规范中*不会扩展到...

另外,您提到要打印所有文件夹,因此您需要/在模式中指定尾随

所以像这样的东西应该足以打印所有非隐藏目录。

for d in ~/*/
do
  [ -d "$f" ] && printf "%s\n" "${d%/}"
done

请注意目录条目的测试,否则如果没有目录,则会打印该模式。${d%/}用于消除/由模式引起的拖尾。

相关内容