1

これが私のbashスクリプトです:

#!/bin/bash -x
for file in /home/sam/Desktop/RecoveredPix/*
do
  model=$(exif -m -t Model $file)
  if ["$model"=="Canon EOS REBEL T3i"]; then
    echo $file >> /home/sam/Desktop/mypix.txt;
  fi
done

こんにちは、私は回復したたくさんの写真を持っており、特に私のカメラである T3i で撮影した写真を探しています。私はこのスクリプトを書いて、exif データのモデルを見て、「Canon EOS REBEL T3i」と一致する場合、そのパスをファイルに追加します。ただし、このスクリプトを実行すると、ターミナルに次のように返されます。

+ for file in '/home/sammeh/Desktop/100CANON/*'
++ exif -m -t Model /home/sammeh/Desktop/100CANON/IMG_0019.JPG
+ model='Canon EOS REBEL T3i'
+ '[Canon EOS REBEL T3i==Canon EOS REBEL T3i]'
/home/sammeh/Desktop/Search Pix.sh: line 5: [Canon EOS REBEL T3i==Canon EOS REBEL T3i]: command not found

これは、機能の検証のためだけに撮影された既知の写真に対して行われました。ただし、何らかの理由で bash が if ステートメントをコマンドとして解析していることがわかります。何か助けはありますか?ありがとう!

Ubuntu 13.04 x64 を実行しています

4

2 に答える 2

2

と の前後にそれぞれスペースがありませ[]。おそらく次のあたりにもあり==ます。

if [ "$model" == "Canon EOS REBEL T3i" ]; then
于 2013-04-29T23:52:00.883 に答える
0

bash によって解釈されるシェル スクリプト言語はかなり奇妙です。[ここでの問題は、 の後と の前にスペースを入れる必要があることです]=また、のようなペアではなく、単一の を使用する必要があります==。それを一緒に入れて:

if [ "$model" = "Canon EOS REBEL T3i" ]; then

実際、[シェル スクリプトでは、コマンドのシンタックス シュガーがありtestます。でできることとできないことを確認するには[、 test のマニュアル エントリをお読みください。

# man 1 test

私の知る限りでは、元の Bourne シェルで[は組み込みではなく、 がshシェル スクリプトを実行しているときは、実際の実行可能プログラムに依存しています/usr/bin/[。しかし、Bash ではビルトインです。したがって[、Bash を使用すると、追加のプロセスを実行するオーバーヘッドが回避されます。ビルトインなので、マニュアルページbashが合法的な構文の最終的な権威であると考える必要がありますが、実際には、コマンドについて文書化されているものと同じだと思いますtest.

とにかく、Bourne シェルでは実際に実行されるコマンドだったので、コマンドとその引数を区切るために、コマンドの後に空白を入れる必要がありました。Bash では、Bash スクリプトを使用するシステムにより移植しやすくするために、その構文を強制し続けたと思います。shの代わりにbash

PS 重要なスクリプトには、より現代的な言語を使用するのが好きです。スクリプトの作業を続けていて、シェル スクリプトの構文が難しくなった場合は、Python またはその他の最新の言語で書き直すことを検討してください。

于 2013-04-30T00:05:41.547 に答える