检查输入参数并执行相应的操作

检查输入参数并执行相应的操作

我的脚本需要两个输入,一个是,filepath另一个是filename用于使用 find 命令检查文件是否存在。

#!/bin/bash

Filepath=$1
Filename=$2

if [ -z "$Filepath" ] && [ -z "$Filename" ]
then
        echo "Requires Input"
elif [ ! -z "$Filepath" ] && [ ! -z "$Filename" ]
then
        Found=`find "$Filepath" -iname "$Filename"`
                if [ -z "$Found" ]
                then
                        echo "Not Found"
                else
                        echo $Found
                fi
fi

这完全符合预期。后来我不得不向这个脚本添加更多条件,即如果我们只获得filename作为输入参数,我们就可以在整个文件系统中搜索该文件,如下所示

find / -iname "$Filename"

如果仅将filepath输入参数传递给此脚本,则它必须回显还需要文件名参数,或者只需输出即可。

答案1

我会做:

#! /bin/sh -
pattern=${1?Please provide a file name}
shift

[ "$#" -gt 0 ] || set /

find "$@" -iname "$pattern" | grep '^' && exit

echo >&2 "Not found"
exit 1

也就是说,通过姓名(请注意,find将其视为(由于 不区分大小写-iname)模式来匹配文件名,而不是作为要查找的确切文件名)作为第一个参数。任何其他参数都是要搜索的目录或文件,如果没有给出,则在 中搜索/

不要将输出存储在变量中并在最后显示它,而是将其grep用作传递,并在找到文件时报告 true。

另外,我在 stderr 而不是 stdout 上输出“未找到”消息,并报告在退出状态下找不到文件。

正如 @ThomasN 所指出的,通常存在的问题是您无法将文件/目录名称可靠地传递给find.如果您想在名为 的目录中搜索-delete,则调用that-script name -delete例如 会产生灾难性的影响。对于 BSD find,可以通过执行以下操作来解决(在调用之前find):

for i do
  set -- "$@" -f "$i"
  shift
done

可移植(但请注意,-iname不可移植),您需要添加./可能有问题的相对路径,例如:

for i do
  case $i in
    (. | ./* | /*) ;; # /foo, ./foo are not a problem
    (*) i=./$i
  esac
  set -- "$@" "$i"
  shift
done
find "$@"...

但这确实会影响输出(正如您将看到的./delete/name那样-delete/name)。

相关内容