2012-01-23 62 views
26

我想檢查是否存在這兩個文件,但我正在逐漸如何測試兩個文件是否存在?

test.sh: line 3: [: missing `]' 

任何人都可以看看有什麼不對嗎?

#!/bin/sh 

if [ -f .ssh/id_rsa && -f .ssh/id_rsa.pub ]; then 
    echo "both exist" 
else 
    echo "one or more is missing" 
fi 
+2

如果您使用'測試'而不是'[',問題更加明顯。 「如果測試-f .ssh/id_rsa && test -f .ssh/ir_rsa.pub;那麼」工作得很好。 –

回答

33

嘗試添加一個額外的方括號。

if [[ -f .ssh/id_rsa && -f .ssh/id_rsa.pub ]]; then 
+3

它特別是'[['(不含空格),而不是'[['(帶空格)「。無論出於何種原因,當我看到這個答案時,我認爲空間是可以的,但他們不是! – gusterlover6

27
[ -f .ssh/id_rsa -a -f .ssh/id_rsa.pub ] && echo both || echo not 

[[ -f .ssh/id_rsa && -f .ssh/id_rsa.pub ]] && echo both || echo not 

另外,如果你的[[ ]]解決方案,你可能要符合你的問題的標籤更改#!/bin/sh#!/bin/bash

+0

'[[]]'也受到'ksh','zsh'和其他shell的支持。但是最好使用'#!/ bin/bash'而不是'#!/ bin/sh'。 – olibre

+0

@oHessling,是的,我只是試圖限制我對問題中列出的一組shell的回答 - 一個在標籤中,另一個在shebang行中。 –

+0

是的,你的答案是完美的(簡短而正確)。只是缺少一條評論來指出一些shell的合規性。但是這個細節並不一定要在你的答案中,只是在下面的小評論中;-)乾杯 – olibre

11

[[是bash特有的語法。對於POSIX兼容的炮彈,你需要:

[ -f file1 ] && [ -f file2 ] 
5
if [ -e .ssh/id_rsa -a -e .ssh/id_rsa.pub ]; then 
echo "both exist" 
else 
echo "one or more is missing" 
fi 

這裏,

-e只檢查文件是退出或not.If退出,其返回true.else,它返回false。

-f也做同樣的事情,但它檢查給定的文件是否是普通文件或不是。基於它返回true/false。

然後你正在使用& &。所以,它需要兩個[[..]]括號來執行。

改爲您可以使用-a [與& &運算符相同] -o [與||相同]運營商。 如果您需要更多信息,請通過此鏈接

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

相關問題