for filename in *
do
if [ "$filename" -ne even ] && [ "$filename" -ne odd ]
then
echo "$filename"
fi
done
上面是一个简单的shell脚本,它检查当前存储库中的文件并输出名称不是“偶数”和“奇数”的文件
行不通
答案1
比较运算符-ne
是一个算术测试运算符,即它仅比较整数:
i=7
if [ "$i" -ne 6 ] && [ "$i" -ne 8 ]; then
echo 'i is neither 6 nor 8'
fi
比较字符串对于不平等,请使用!=
:
if [ "$filename" != 'even' ] && [ "$filename" != 'odd' ]; then
printf '"%s" is neither of the strings "even" or "odd"\n' "$filename"
fi
或者,使用case
:
case "$filename" in
even|odd)
# the filename is "even" or "odd"
;;
*)
# the filename is neither "even" nor "odd"
printf '%s\n' "$filename"
esac
另请注意,它将*
匹配当前目录中的任何名称,而不仅仅是常规文件的名称。为了确保您只处理循环中的常规文件,请使用
for name in *; do
if [ ! -f "$name" ] || [ -L "$name" ]; then continue; fi
# other code here using "$name"
done
该continue
语句跳至循环的下一次迭代。-f file
检查常规的文件后符号链接解析,所以如果我们想要类型的文件符号链接为了无论它们是否指向常规文件也被排除,我们还需要额外的|| [ -L "$name" ]
.
答案2
将行更改if
为:
if [ "$filename" != even ] && [ "$filename" != odd ]
在bash
shell 中,整个脚本 (IE从for
到done
包括),可以简化为:
GLOBIGNORE=even:odd ; printf "%s\n" *
另一种bash
方法:
shopt -s extglob # only needs to be done once, if not set already.
printf "%s\n" !(odd|even)
答案3
或者一对带有 -a 的括号
for filename in *
do
if [ "$filename" != even -a "$filename" != "odd" ]
then
echo "$filename"
fi
done
或者
for filename in *
do
case "$filename" in
(even|odd) ;;
*) echo "$filename" ;;
esac
done
答案4
find -maxdepth 1 -not -name even -not -name odd
可能是最短的解决方案,尽管有冗长的“-maxdepth 1”,但在目录叶子中,您可以省略它。
为每个文件调用一个程序非常简单:
find -maxdepth 1 -not -name even -not -name odd -exec wc {} ";"
(如 wc 所示,它需要一个文件名,其中使用了花括号。此处依赖于 GNU-find。)