接受日志文件作为参数并在传递文件名但文件不存在时调用函数

Zan*_*001 1 linux bash shell-script

我目前对问题的参数和参数有点困惑。

我目前必须接受日志文件名作为参数(例如,/var/log/secure-<yyyymmdd>),但/var/log/secure如果没有给出参数,则默认为。

如何接受日志文件名作为参数?我认为这可能是问题的措辞,但我不太明白它的意思。

这是我在此问题之前完成的当前代码的片段:

#!/bin/bash
grep " su: " /var/log/secure | while read -r abc; do   
echo "$abc"
done
Run Code Online (Sandbox Code Playgroud)

对于第二部分,我必须创建一个以代码 2 退出的函数(我目前正在处理该函数),然后,如果传递了文件名但文件不存在,则调用该函数。我会做这样的事情吗?感觉不对,但不知道哪里不对。

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

else
runfunction
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 5

要将变量设置为第一个命令行参数,您可以这样做

pathname=$1
Run Code Online (Sandbox Code Playgroud)

要将其设置为默认值,以防参数不可用或为空,请使用

pathname=${1:-/var/log/secure}
Run Code Online (Sandbox Code Playgroud)

一般形式是${parameter:-word}。这是一个标准的 POSIX 参数扩展,它也记录在你的 shell 手册中。

-d测试测试给定的字符串是否对应于现有目录路径(或者是指向存在的目录路径的符号链接)。该-f测试以相同的方式针对常规文件,并-e涵盖任何内容(如果名称存在,则为真,无论它是什么名称)。

为了否定测试的意义,你会使用!,所以你得到

if [ ! -f "$pathname" ]; then
    myfunction
fi
Run Code Online (Sandbox Code Playgroud)

或者,使用短路语法,

[ ! -f "$pathname" ] && myfunction
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)