![接受日志文件作为参数,如果传递文件名但文件不存在则调用函数](https://linux22.com/image/143919/%E6%8E%A5%E5%8F%97%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%E4%BD%9C%E4%B8%BA%E5%8F%82%E6%95%B0%EF%BC%8C%E5%A6%82%E6%9E%9C%E4%BC%A0%E9%80%92%E6%96%87%E4%BB%B6%E5%90%8D%E4%BD%86%E6%96%87%E4%BB%B6%E4%B8%8D%E5%AD%98%E5%9C%A8%E5%88%99%E8%B0%83%E7%94%A8%E5%87%BD%E6%95%B0.png)
我目前对问题的参数和参数有点困惑。
我目前必须接受日志文件名作为参数(例如, ),但如果没有给出参数则/var/log/secure-<yyyymmdd>
默认为。/var/log/secure
如何接受日志文件名作为参数?我认为这可能是问题的措辞,但我不太明白它的意思。
这是我在这个问题之前迄今为止所做的当前代码的片段:
#!/bin/bash
grep " su: " /var/log/secure | while read -r abc; do
echo "$abc"
done
对于第二部分,我必须创建一个以代码 2 退出的函数(我当前正在处理该函数),然后,如果传递了文件名但文件不存在,则调用该函数。我会做这样的事情吗?感觉不对,但又不知道哪里不对。
IF [ -d /var/log/secure ]
then
else
runfunction
答案1
要将变量设置为第一个命令行参数,您可以这样做
pathname=$1
要将其设置为默认值,以防参数不可用或为空,请使用
pathname=${1:-/var/log/secure}
一般形式为${parameter:-word}
.这是一个标准 POSIX 参数扩展,并且它也记录在您的 shell 手册中。
该-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"