2012-01-23 12 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

यदि आप '[' के बजाय 'test' का उपयोग करते हैं, तो समस्या अधिक स्पष्ट है। "अगर test -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/bash को #!/bin/sh बदलने के लिए चाहता हूँ।

+0

'[[]]' 'ksh',' zsh' और शायद अन्य गोले द्वारा भी समर्थित है। लेकिन '#!/Bin/sh' से बेहतर '#!/Bin/bash' का उपयोग करें। – olibre

+0

@oHessling, हाँ, मैं सिर्फ प्रश्न में सूचीबद्ध शैल के सेट पर अपना जवाब प्रतिबंधित करने की कोशिश कर रहा था - एक टैग में, दूसरा शेबांग लाइन में। –

+0

हां, आपका उत्तर सही है (छोटा और सही)। कुछ खोल अनुपालन को इंगित करने के लिए बस एक टिप्पणी गायब थी। लेकिन इस विवरण को आपके उत्तर में होना जरूरी नहीं है, बस नीचे एक छोटी टिप्पणी में ;-) चीयर्स – olibre

11

[[ बैश-विशिष्ट वाक्यविन्यास है। 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 जांच केवल फ़ाइल बाहर निकलता है या बाहर निकलता है नहीं.अगर, यह true.else लौटने के लिए, यह गलत लौट आते हैं।

-f भी एक ही बात है, लेकिन, यह जाँच करें कि क्या दिए गए फ़ाइल नियमित रूप से फ़ाइल या पर not.based कि इसे वापस सही/गलत है।

फिर आप & & का उपयोग कर रहे हैं। इसलिए, इसे निष्पादित करने के लिए दो [[..]] ब्रैकेट की आवश्यकता है।

इसके बजाय आप -a [& & ऑपरेटर के रूप में उपयोग कर सकते हैं] -o [जैसा कि || ऑपरेटर]। यदि आपको अधिक जानकारी चाहिए तो इस लिंक के माध्यम से

http://linux.die.net/man/1/bash पर जाएं।

संबंधित मुद्दे