for filename in *
do
if [ "$filename" -ne even ] && [ "$filename" -ne odd ]
then
echo "$filename"
fi
done
Run Code Online (Sandbox Code Playgroud)
上面是一个简单的shell脚本,它检查当前存储库中的文件并输出名称不是“偶数”和“奇数”的文件
行不通
比较运算符-ne
是算术运算符,即它只比较整数:
i=7
if [ "$i" -ne 6 ] && [ "$i" -ne 8 ]; then
echo 'i is neither 6 nor 8'
fi
Run Code Online (Sandbox Code Playgroud)
要比较字符串的不等式,请使用!=
:
if [ "$filename" != 'even' ] && [ "$filename" != 'odd' ]; then
printf '%s\n' "$filename"
fi
Run Code Online (Sandbox Code Playgroud)
或者,使用case
:
case "$filename" in
even|odd) ;;
*) printf '%s\n' "$filename"
esac
Run Code Online (Sandbox Code Playgroud)
另请注意,*
将匹配当前目录中的任何名称,而不仅仅是常规文件的名称。要确保您只处理循环中的常规文件,请使用
for name in *; do
test -f "$name" || continue
# other code here using "$name"
done
Run Code Online (Sandbox Code Playgroud)
test -f "$name"
可以替换为
if [ ! -f "$name" ]; then
continue
fi
Run Code Online (Sandbox Code Playgroud)
要不就
[ ! -f "$name" ] && continue
Run Code Online (Sandbox Code Playgroud)
或者
[ -f "$name" ] || continue
Run Code Online (Sandbox Code Playgroud)
该continue
语句跳到循环的下一次迭代。
将行更改if
为:
if [ "$filename" != even ] && [ "$filename" != odd ]
Run Code Online (Sandbox Code Playgroud)
在bash
shell 中,整个脚本(即从for
到done
包括在内)可以简化为:
GLOBIGNORE=even:odd ; printf "%s\n" *
Run Code Online (Sandbox Code Playgroud)
另一种bash
方法:
shopt -s extglob # only needs to be done once, if not set already.
printf "%s\n" !(odd|even)
Run Code Online (Sandbox Code Playgroud)