1
#!/bin/sh
 for f in `ls *.png`
  do
convert $f -fill gray(50%) -opaque black ./background_change/$f
  done
  for f in `ls *.PNG`
   do
  convert $f -fill gray(50%) -opaque black ./background_change/$f
  done

上記のシェル スクリプトの場合、次のようなエラーが表示されます。

[gsamanth@cngfile Acsady]$ sh background_change.sh 
'ackground_change.sh: line 3: syntax error near unexpected token `do
'ackground_change.sh: line 3: `do
[gsamanth@cngfile Acsady]$ 

どうしてこんなことに?

4

4 に答える 4

1

チップ:

  • LS を解析しないでください。予想以上に頻繁に問題に遭遇します。forループまたはコマンドを使用してファイルを処理しますfind
  • 常に変数を引用してください。あなたのスクリプトには次のものがあります: convert $f -file .... ファイル名にハイフンが続くスペースが含まれているとどうなりますか?
 #!/bin/sh

 for f in *.png *.PNG; do
     convert "$f" -fill "gray(50%)" -opaque black background_change/"$f"
 done

fill パラメーターを引用符で囲む必要があることに注意してください。そうしないと、シェルが括弧をオプションとして渡す代わりに解釈してしまうからです。また、括弧をバックスラッシュ (つまり ) でエスケープすることによっても、これを実現できますgray\(50%\)。ただし、引用符は、エスケープすることを知らない可能性のある他の文字からも保護されるため、少し安全です。

于 2012-11-12T17:15:42.143 に答える
0

do句の前にセミコロンが必要です。

for f in `ls *.png`; do
                   ^
                   +- here

シェルスクリプト自体でワイルドカードを使用することもできます。を呼び出す必要はありませんls。全体として、スクリプトは次のようになります。

#!/bin/sh
for f in *.png *.PNG; do
    convert $f -fill gray(50%) -opaque black ./background_change/$f
done
于 2012-11-12T16:03:43.980 に答える
0

試す

for f in `ls *.PNG`; do

または(さらに良い)

for f in *.PNG; do

過度の呼び出しを回避するため(後でソートなどの機能lsを利用したい場合を除きますが、そうではないと思います)ls

于 2012-11-12T16:04:26.373 に答える