如果特定文件存在则显示任意消息的命令

jam*_*mes 11 command-line

如果存在特定文件,是否有显示消息“是”的命令?如果文件不存在,则无需提供功能。

Byt*_*der 25

使用这个简单的 Bash one-liner:

if [ -e FILENAME ] ; then echo Yes ; fi
Run Code Online (Sandbox Code Playgroud)

-e检查的计算结果为真,如果FILENAME存在,不管它是什么(文件,目录,链接,设备,...)。

如果您只想检查常规文件,请-f改用,正如@Arronical所说。

  • `[ -e 文件名] && 回声是` (18认同)
  • 如果`FILENAME` 是一个变量扩展,或者包含任何特殊字符,那么不要忘记引用它。例如,在脚本中,`[ -e "$1" ] && echo Yes`。 (3认同)

gro*_*lex 10

您可以使用这个简单的脚本:

#!/bin/bash

if [[ -f $1 ]]; then
    echo "Yes"
    exit 0
else
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

将其另存为file-exists.sh. 然后,在终端中,键入chmod +x file-exists.sh

像这样使用它:用要检查的文件./file-exists.sh FILE替换FILE的位置,例如:

./file-exists.sh file.txt
Run Code Online (Sandbox Code Playgroud)

如果file.txt存在,Yes将打印到终端,并且程序将以状态 0(成功)退出。如果文件不存在,则不会打印任何内容,程序将以状态 1(失败)退出。

如果您好奇我为什么包含该exit命令,请继续阅读...


有什么用的最多exit的命令?

exit导致正常进程终止。这基本上意味着:它停止脚本。它接受一个可选的(数字)参数,该参数将是调用它的脚本的退出状态。

此退出状态使您的其他脚本能够使用您的file-exists脚本,并且是它们知道文件存在与否的方式。

使用此脚本的一个简单示例是此脚本(将其另存为file-exists-cli.sh):

#!/bin/bash

echo "Enter a filename and I will tell you if it exists or not: "
read FILE
# Run `file-exists.sh` but discard any output because we don't need it in this example
./file-exists.sh $FILE &>> /dev/null
# #? is a special variable that holds the exit status of the previous command
if [[ $? == 0 ]]; then
    echo "$FILE exists"
else
    echo "$FILE does not exist"
fi
Run Code Online (Sandbox Code Playgroud)

做通常的chmod +x file-exists-cli.sh然后运行它:./file-exists-cli.sh。你会看到这样的东西:

文件存在 ( exit 0):

?  ~ ./file-exists-cli.sh 
Enter a filename and I will tell you if it exists or not: 
booleans.py
booleans.py exists
Run Code Online (Sandbox Code Playgroud)

文件不存在 ( exit 1):

?  ~ ./file-exists-cli.sh
Enter a filename and I will tell you if it exists or not: 
asdf
asdf does not exist
Run Code Online (Sandbox Code Playgroud)

  • 很好,但是你应该引用像“$1”这样的变量引用。如果它有空格,它会在没有引号的情况下中断,并且可能会发生其他不好的事情。 (2认同)

Arr*_*cal 9

在命令行的 bash shell 中。

if [[ -f /path/to/file ]]; then echo "Yes"; fi
Run Code Online (Sandbox Code Playgroud)

这使用 bash 条件运算符-f,并检查文件是否存在并且是常规文件。如果要测试任何文件,包括目录和链接,请使用-e.

这是 bash 条件的一个很好的资源。

  • @ByteCommander:双大括号通常比单大括号好。它们是 shell 语法的一部分(而不是调用 `[` 命令,该命令通常调用内置函数。)它们纠正了单括号版本的不一致和愚蠢行为。[ 内置函数仍然是为了兼容性,但我看不出有什么好的理由在新的 bash 代码中使用它。(如果您需要编写可以在古老的 shell 或其他东西上运行的符合 POSIX 的脚本,那就不同了。) (7认同)

use*_*ser 5

做你想做的最短命令是:

test -e FILENAME && echo Yes
Run Code Online (Sandbox Code Playgroud)

test -e将测试给定的名称是否存在于文件系统中。(您可以使用test -f限制为仅常规文件。有关man test更多信息,请参见。)

如果给定的条件评估为真,则test返回成功退出状态(否则返回失败状态)。我们使用 组合这两个命令&&,这意味着“如果前一个命令以成功状态退出,则执行下一个命令”。下一个命令只是Yes在标准输出上打印;在交互式 shell 的情况下,在终端上。

这避免了if语句的额外文本材料,但给出了相同的结果。当仅涉及单个命令时&&,使用(或其相反的||)将命令联系在一起效果很好。如果您想要做的不仅仅是执行单个命令来响应单个命令的退出状态,那么使用该if语法很快就会变得更具可读性。

正如其他答案中已经指出的那样,等效的if样式结构是:

if test -e FILENAME; then echo Yes; fi
Run Code Online (Sandbox Code Playgroud)

或者:

if test -e FILENAME
then
    echo Yes
fi
Run Code Online (Sandbox Code Playgroud)

出于这些目的,[test是等效的,除了[需要终止].