打印所有文件夹的 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%/}
用于消除/
由模式引起的拖尾。