ログファイルを引数として受け取り、ファイル名が渡されたがファイルが存在しない場合は関数を呼び出します。

ログファイルを引数として受け取り、ファイル名が渡されたがファイルが存在しない場合は関数を呼び出します。

私は現在の質問の主張とパラメータについて少し混乱しています。

現在は、ログファイル名をパラメータ(たとえば)として受け入れる必要がありますが、パラメータが指定されていない場合、/var/log/secure-<yyyymmdd>デフォルト値はです。/var/log/secure

ログファイル名をパラメータとして受け入れる方法は?質問の表現かもしれませんが、それが何を意味するのかよく理解していません。

以下は、この質問の前に私が行った現在のコードの一部です。

#!/bin/bash
grep " su: " /var/log/secure | while read -r abc; do   
echo "$abc"
done

2番目の部分では、コード2(現在の作業中)で終了する関数を作成し、ファイル名が渡され、ファイルが存在しない場合はその関数を呼び出す必要があります。私はそのようなことをしますか?間違っているようでしたが、何が間違っているのかわかりませんでした。

IF [ -d /var/log/secure ]
then

else
runfunction

答え1

変数を最初のコマンドライン引数に設定するには、次の手順を実行します。

pathname=$1

パラメータが利用できないか空の場合、デフォルト値に設定するには、次を使用します。

pathname=${1:-/var/log/secure}

一般的な形態はです${parameter:-word}標準POSIXパラメータ拡張、シェルマニュアルにも文書化されています。

この-dテストは、指定された文字列が既存のディレクトリパスに対応するか(または既存のディレクトリパスへのシンボリックリンクか)テストします。テスト-fは通常​​のファイルに対して同じように機能し、-eすべての項目を扱います(名前が何であれ、名前が存在する場合はtrue)。

テストの重要性を無効にするには、を使用します!

if [ ! -f "$pathname" ]; then
    myfunction
fi

または段落構文を使用して

[ ! -f "$pathname" ] && myfunction

myfunctionこの関数は、変数の文字列がpathname既存の一般ファイル(またはそれへのリンク)を指定しない場合に呼び出されます。


デフォルトでコマンドライン引数(パス)を使用し、指定されたパスが既存の一般ファイルと一致しない場合は終了ステータス2で終了する完全なスクリプト。

#!/bin/bash

pathname=${1:-/var/log/secure}

if [ ! -f "$pathname" ]; then
    printf 'There is no file called "%s"\n' "$pathname"
    exit 2
fi

printf 'The file "%s" exists\n' "$pathname"

関連情報