入力パラメータを確認し、適切なアクションを実行してください。

入力パラメータを確認し、適切なアクションを実行してください。

私のスクリプトには2つの入力が必要です。 1つはfindコマンドを使用してファイルが存在することを確認すること、もう1つはファイルが存在することを確認filepathすることです。filename

#!/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を報告します。

また、stdoutの代わりにstderrに「見つかりません」というメッセージを印刷し、終了状態でファイルが見つからないことを報告します。

@ThomasNが指摘したように、一般的な問題は、ファイル/ディレクトリ名を確実に渡すことができないことですfind。 BSDの場合(呼び出し前に)、次の手順を実行してこの問題を解決できます。-deletethat-script name -deletefindfind

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

おすすめ記事