0

簡単なスクリプトがあります。

#!/bin/sh
cd /tmp/pics
for pic in *.jpg;
do
  php -f /tmp/pics/covert.php $pic;
done

写真の名前に空白が含まれていると、そのスクリプトは機能しません。どうすれば修正できますか?

空白を適切に処理し、「JPG」、「JPEG」、「jpeg」などの他のJPEG拡張子も処理するようにスクリプトを修正するにはどうすればよいですか?

4

3 に答える 3

2

bashを使用して、大文字と小文字を区別しないファイル照合を行うには、次のようにします。

shopt -s nocaseglob nullglob
for pic in *{jpg,jpeg}
do
    php5 -f ./convert.php "$pic"
done
于 2012-09-18T20:57:44.180 に答える
2

このような短いスクリプトの場合、私は使用します

#!/bin/sh
cd /tmp/pics
for pic in *.[jJ][pP][gG] *.[jJ][pP][eE][gG]; do
  php -f /tmp/pics/covert.php "$pic"
done

prettygirl.JpeGこれは、 :-)のような奇妙なキャメルケース拡張機能も処理します

于 2012-09-18T14:10:01.780 に答える
2

やその他のシェルの引用規則はbash、Ruby や Python や Perl などの「通常の」スクリプト言語とは異なるため、最初は戸惑うかもしれませんが、二重引用符で囲む$picと、bash は変数の内容を適切に処理します。スペースが含まれています。

1 つの修正で、スクリプトは次のようになります。

#!/bin/sh
cd /tmp/pics
for pic in *.jpg;
do
  php -f /tmp/pics/covert.php "$pic";
done

また、各行の末尾にあるセミコロンも削除します。これらは、複数の行を 1 行に詰め込む場合にのみ必要です。これらは、PHP や (それほどではありませんが) JavaScript の場合とは異なり、bash では必要ありません。

書かれているように、これは bash の代わりに Bourne シェルを使用しています。(当面は、Bourne シェルをエミュレートするためにシステムで bash が使用される可能性があるという事実を無視します。) bash を使用する場合は、上部の「shebang」行を変更します。通常は です#!/bin/bash

複数のファイル拡張子を処理するには、次のように、間にスペースを入れて隣同士に積み重ねることができます。

for pic in *.jpg *.jpeg *.JPEG *.JPG

Jens が指摘するように、ファイル拡張子が大文字と小文字が混在する奇妙なケースが発生する可能性があります。文字をグループ化するために括弧でそれを処理できます

for pic in *.[jJ][pP][gG] *.[jJ][pP][eE][gG]

または、シェル オプションを設定して大文字と小文字 (および一致しないパターン)を無視する glenn のアプローチを使用してから、より単純なグロブ パターンを使用することもできます。

shopt -s nocaseglob nullglob
for pic in *.jpg *.jpeg

後者のアプローチを取ると、最終的なスクリプトは次のようになります。

#!/bin/bash
cd /tmp/pics
shopt -s nocaseglob nullglob
for pic in *.jpg *.jpeg
do
  php -f /tmp/pics/covert.php "$pic"
done

お役に立てれば!

于 2012-09-18T14:04:59.097 に答える