使用bash脚本在目录中搜索文件

The*_*ock 5 shell wildcards

我编写了以下代码来搜索当前工作目录中包含字母“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”。请帮忙。

Gil*_*il' 5

[ $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)

  • @TheHardRock 如果条件为假,则采用 `else` 分支。如果采用 then 分支,您的代码将打印“no”,如果采用 else 分支,则打印“yes”。请注意,与许多其他编程语言不同,在 shell 中,状态 0 被视为真,非零状态被视为假。 (2认同)