檢查輸入參數並執行對應的操作

檢查輸入參數並執行對應的操作

我的腳本需要兩個輸入,一個是,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)。

相關內容