2

ディレクトリ内のいくつかのファイル (AB で始まる名前) を処理する必要があるスクリプトがあります。コードは次のとおりです。

for file in AB*
do
  cp ...
  ...
done

フォルダーに *.txt ファイルがない場合、コードはとにかく 1 回実行されます。しかし、存在しないファイルをコピーしようとしたため、エラーが発生しました。ls コマンドの結果が空の場合に do コマンドが実行されないようにするにはどうすればよいですか?

私はすでにlsを使用してみましたが、組み合わせを引用しています>何も望んでいない結果が得られます。

4

3 に答える 3

3

たぶん、前に条件を追加できます:

if [ $(ls AB* 2>/dev/null) ]; then
     for ...

fi

2>/dev/null印刷されないエラーをキャッチします。

于 2013-08-09T08:48:32.380 に答える
1

他の答えは、Bashでは明らかに間違っています。それらを使用しないでください!常に次のルールを守ってください。

Bash で glob を使用するたびに、shopt -s nullglobまたはと一緒に使用してくださいshopt -s failglob

このルールを守れば、いつでも安全です。実際、この規則を守らないたびに、神は子猫を殺します。

  • shopt -s nullglob: この場合、一致しないグロブは何も展開されません。見て:

    $ mkdir Test; cd Test
    $ shopt -u nullglob # I'm explicitly unsetting nullglob
    $ echo *
    *
    $ for i in *; do echo "$i"; done
    *
    $ # Dear, God has killed a kitten :(
    $ # but it was only for demonstration purposes, I swear!
    $ shopt -s nullglob # Now we're going to save lots of kittens
    $ echo *
    
    $ for i in *; do echo "$i"; done
    $ # Wow! :)
    
  • shopt -s failglob: この場合、グロブに展開がない場合、Bash は明示的なエラーを発生させます。見て:

    $ mkdir Test; cd Test
    $ shopt -u nullglob # Unsetting nullglob
    $ shopt -s failglob # Setting failglob for the love of kittens
    $ echo *
    bash: no match: *
    $ # cool :) what's the return code of this?
    $ echo $?
    1
    $ # who cares, anyway? and a for loop?
    $ for i in *; do echo "$i"; done
    bash: no match: *
    $ # cool :)
    

または のいずれnullglobかを使用するfailglobと、制御されていない引数を使用してランダムなコマンドを起動しないようにすることができます!

乾杯!

于 2013-11-02T21:52:24.263 に答える
0

おそらく bash test builtinが必要で、しばしば と省略され[ます。

if [ -f output.txt ] ; then

注意: 上ではスペースが重要です。

于 2013-08-09T08:48:25.093 に答える