目标:检查是否存在包含今天日期的备份 .tgz 文件;输出 1 表示正常,0 表示无文件。
我很喜欢一个衬垫:) 例如在 PHP 中(在 Javascript 中非常相似),在各种场景中我喜欢做类似的事情
<?php
echo (date("d")==1)?"Monday":"Not Monday";
?>
Bash 中有类似的语法吗?我知道如何使用 -f FILENAME 检查常规文件是否存在,我只想命令打印 1 或 0 :)
答案1
你可以简单地这样做:
#to check if it's a regular file
[ -f "/you/file.file" ] && echo 1 || echo 0
#to check if a file exist
[ -e "/you/file.file" ] && echo 1 || echo 0
在 shell 中该字符[
表示测试, -e
如果文件存在则]
测试结束&&
如果命令返回 true 则执行后面的命令,||
如果命令返回 false 则执行后面的命令。
这应该适用于shell
和bash
答案2
if [ ! -f /tmp/foo.txt ]; then echo "File not found!"; else echo "file found"; fi
答案3
和zsh
:
(){echo $#} *"$(date +%Y-%m-%d)"*.tgz(DN)
将输出当前目录中名称包含当前日期的文件数,格式为 YYYY-mm-dd 并.tgz
以十进制数字结尾。如果您只需要 0 或 1,请替换(DN)
为。(DN[1])
要用作语句中的条件if
,您可以执行以下操作:
if ()(($#)) *"$(date +%Y-%m-%d)"*.tgz(DN); then
echo found
else
echo none found
fi
在bash
等价的可以是:
(shopt -s nullglob dotglob; set -- *"$(date +%Y-%m-%d)"*.tgz; echo "$#")
(替换"$#"
为"$(($#>0))"
得到 0 或 1)。
和
if (shopt -s nullglob dotglob; set -- *"$(date +%Y-%m-%d)"*.tgz; (($#))); then
echo found
else
echo none found
fi
和ksh93
:
(FIGNORE='@(.|..)'; set -- ~(N)*"$(date +%Y-%m-%d)"*.tgz; echo "$#")
和
if (FIGNORE='@(.|..)'; set -- ~(N)*"$(date +%Y-%m-%d)"*.tgz; (("$#"))); then...
POSIXly
ls -qA | grep -c "$(date +%Y-%m-%d).*\.tgz$"
为了计数。
ls -qA | grep -q "$(date +%Y-%m-%d).*\.tgz$"; echo "$(($? == 0))"
对于 0 或 1 并且:
和:
if ls -qA | grep -q "$(date +%Y-%m-%d).*\.tgz$"; then...
虽然常识是不解析 的输出ls
,但这里使用-q
,我们确保每行有一个文件,并且用 替换不可打印字符?
不会影响grep
我们模式的 ing,因此它应该相对安全。
如果文件名包含不构成有效字符的字节序列,您可能会看到差异。优点之一是,如果当前目录不可读,您将收到一条错误消息。
答案4
作为另一种变体,如果您知道要查找的文件名的确切格式,则可以使用
[ ! -f FILENAME ]; echo $?
或者
echo `[ ! -f FILENAME ]` $?
但是这无法处理通配符,因此包含今天日期的以 .tgz 结尾的文件将需要更复杂的内容,例如
echo $( for entry in *$(date --rfc-3339=date)*.tgz; do [ -f "$entry" ] && exit 1; done; exit 0 ) $?