web-dev-qa-db-ja.com

ifコマンド構文

シェルスクリプトの私のコードは次のとおりです。

echo "Enter file name";
read fname;
if [-f$fname];
then
    echo "File already exists";
fi`

ただし、スクリプトを実行すると、次のエラーが表示されます。

[-ffile]: not found

間隔を空けてみました-f $fnameしかし、私はまだ同じエラーを受け取ります。なぜこれが起こっているのですか、どうすれば修正できますか?

3
Prachi

スペースを含む値を追加した可能性があります。これを防ぐには、常に変数を引用してください。

if [ -f "$fname" ]

また、[]にはスペースが必要です。どうして? [はコマンドであるため、前のステートメントとは空白で区切る必要があります。 man testと入力すると、それについて読むことができます。

すべて一緒に:

echo "Enter file name";
read -r fname;
if [ -f "$fname" ]; then
   echo "File already exists";
fi

引用符の重要性に関するテストをご覧ください。

$ touch "a b"
$ filename="a b"
$ [ -f $filename ] && echo "exists!"
bash: [: a: binary operator expected
$ [ -f "$filename" ] && echo "exists!"
exists!
9
fedorqui

-e "$fname"またはif [[ -e $fname ]](最後のシェルはシェル間で普遍的ではありません)。

そう

echo "Enter file name"; read fname; if [ -e "$fname" ]; then echo "File already exists"; fi

いずれにしても、確認するために:常に引用符を使用してください;)

4
Rinzwind

スクリプトは次のようになります

echo "Enter file name";
read fname;
if [ -f "$fname" ];
then 
  echo "File already exists";
fi

括弧の周りにスペースが必要であり、変数を引用する必要があります。

0
TellMeWhy