Bash 脚本分段错误

Bash 脚本分段错误

我的任务是编写一个 bash 脚本,该脚本读取目录并返回其中每个文件(包括所有子目录)的文件类型。不允许使用 find 命令。我尝试使用两个 for 循环来实现这一点,但出现了分段错误。但是,我发现当我传递没有子目录的目录时,该脚本确实有效。有人愿意查看菜鸟的代码并告诉我出了什么问题吗?非常感谢。

#!/bin/bash
func () {
for name in $1
do
  if [ -f "$name" ]
  then
    file "$name"
  elif [ -d "$name" ]
  then
    func "$1"
  fi
done
}

directory="$1/*"
for name in $directory
do
  if [ -f "$name" ]
  then
    file "$name"
  elif [ -d "$name" ]
  then
    func "$1"
  fi
done

答案1

如果它$name正在处理的“ ”是一个目录,则需要调用func其内容,而不是原始参数,否则会出现无限循环,从而出现段错误。

通过在原始参数上使用函数,并将该函数分别应用于每个项目,可以大大减少您的代码。无论如何,现在您正在重复主体函数中发生的大部分事情。

#!/bin/bash
func () {
    local arg="$1"
    if [[ -f "$arg" ]] ; then
        file -- "$arg"
        return
    fi
    if [[ -d "$arg" ]] ; then
        for file in "$arg"/* ; do
            func "$file"
        done
    fi
}

func "$1"

答案2

如果您可以使用 bash 功能,最简单的方法是启用globstar并使用它:

shopt -s globstar
for f in "$1"/**; do 
    if [ -f "$f" ]; then 
        file -- "$f"
    fi
done

使用原始脚本中的逻辑,您只需为其提供正确的输入:

#!/bin/bash
func () {
for name in "$1"/*
do
  if [ -f "$name" ]
  then
    file "$name"
  elif [ -d "$name" ]
  then
    func "$name"
  fi
done
}

directory="$1"
for name in "$directory"/*
do
  if [ -f "$name" ]
  then
    file "$name"
  elif [ -d "$name" ]
  then
    func "$name"
  fi
done

你使用的是func $1而不是func $name所以你进入了一个无限循环,导致了段错误。下次,只需添加一个echo即可查看您正在处理的内容,这会立即向您显示错误。

另外,您确实不需要重复这样的代码。函数的重点是避免这种重复,所以你可以简单地这样做:

#!/bin/bash
func () {
for name in "$1"/*
do
  echo "FF $name"
  if [ -f "$name" ]
  then
    file "$name"
  elif [ -d "$name" ]
  then
    func "$name"
  fi
done
}

directory="$1"
for name in "$directory"/*
do
  func "$name"
done

相关内容