如何测试是否存在两个文件?

San*_*ing 38 linux bash

我想检查两个文件是否存在,但我得到了

test.sh: line 3: [: missing `]'
Run Code Online (Sandbox Code Playgroud)

任何人都可以看到什么是错的?

#!/bin/sh

if [ -f .ssh/id_rsa && -f .ssh/id_rsa.pub ]; then
   echo "both exist"
else
   echo "one or more is missing"
fi
Run Code Online (Sandbox Code Playgroud)

Rag*_*ram 52

尝试添加额外的方括号.

if [[ -f .ssh/id_rsa && -f .ssh/id_rsa.pub ]]; then
Run Code Online (Sandbox Code Playgroud)

  • 它特别是`[[`(没有空格)而不是`[[`(带空格).无论出于什么原因,当我看到这个答案时,我认为空间还可以,但它们不是! (4认同)

Mic*_*ker 30

[ -f .ssh/id_rsa -a -f .ssh/id_rsa.pub ] && echo both || echo not
Run Code Online (Sandbox Code Playgroud)

要么

[[ -f .ssh/id_rsa && -f .ssh/id_rsa.pub ]] && echo both || echo not
Run Code Online (Sandbox Code Playgroud)

此外,如果您使用该[[ ]]解决方案,您可能希望更改#!/bin/sh#!/bin/bash符合您的问题标签.


jør*_*sen 13

[[是特定于bash的语法.对于POSIX兼容的shell,您需要:

[ -f file1 ] && [ -f file2 ]
Run Code Online (Sandbox Code Playgroud)


sat*_*sat 7

if [ -e .ssh/id_rsa -a -e .ssh/id_rsa.pub ]; then
 echo "both exist"
else
 echo "one or more is missing"
fi
Run Code Online (Sandbox Code Playgroud)

这里,

-e只检查文件是否退出.如果退出,则返回true.else,返回false.

-f也做同样的事情,但它检查给定的文件是否是常规文件.基于它返回true/false.

然后你正在使用&&.所以,它需要两个[[..]]括号来执行.

相反,你可以使用-a [与&&运算符相同] -o [与||相同 运营商.如果您需要更多信息,请通过此链接

http://linux.die.net/man/1/bash.