我编写了以下代码来搜索当前工作目录中包含字母“f”的所有文件名。
for i in *
do
echo $i
if [ $i = "*f*" ]
then
echo "no"
else
echo "yes"
fi
done
Run Code Online (Sandbox Code Playgroud)
这将为该目录中存在的每个文件打印“是”,无论它是否包含“f”。请帮忙。
[ $i = "*f*" ]
将存储在变量中的文件名i
在空格处拆分为单独的单词,将每个单词解释为通配符模式并在匹配时扩展它,然后将生成的单词列表解析为[ … ]
. 为避免这种繁琐,而是使用文件名,请在变量 expand 周围加上双引号。
[ "$i" = "*f*" ]
测试变量中的文件名是否i
为三字符 name *f*
。如果您没有具有此名称的文件,则所有文件都将触发 else 分支,因此yes
打印出来。
在 ksh、bash 或 zsh 中,您可以使用双括号构造测试字符串是否与通配符模式匹配。不引用模式中的通配符。
if [[ "$i" = *f* ]]; then …
Run Code Online (Sandbox Code Playgroud)
在普通 sh 中,没有双括号语法。要测试字符串是否与模式匹配,您可以使用case
结构。
case "$i" in
*f*) echo "no";;
*) echo "yes";;
esac
Run Code Online (Sandbox Code Playgroud)