2012-01-23 4 views
26

私は両方のファイルが存在するかどうかを確認したいのですが、誰もが間違っているものを見ることができます私は2つのファイルが存在するかどうかテストする方法は?

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'を使用すると、問題がより明確になります。 "if test -f .ssh/id_rsa && test -f .ssh/ir_rsa.pub; then"うまく動作します。 –

答えて

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、はい、私は、質問に記載されているシェルセットへの回答を制限しようとしていました。タグは1つで、もう1つはシバンラインです。 –

+0

はい、あなたの答えは完璧です(短く正確です)。いくつかのシェルコンプライアンスを指摘するコメントがありませんでした。しかし、この細部はあなたの答えにある必要はありません、ちょっとしたコメントの下で;-)乾杯 – 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、それはfalseを返し、true.else返します。

-fも同じことをしますが、指定されたファイルが正規のファイルであるかどうかをチェックします。それに基づいて、true/falseを返します。

次に、& &を使用しています。そのため、実行するには[[..]]括弧が必要です。

代わりに、-a [& &演算子と同じ] -o [||と同じです。オペレーター]。 さらに詳しい情報が必要な場合は、

http://linux.die.net/man/1/bashをご覧ください。

関連する問題