複数の条件で「if」コマンドを使用する方法は?

複数の条件で「if」コマンドを使用する方法は?

どうすればいいですか?

if [ -f town-*.swf ]
then
mkdir towns
fi

これは存在するかどうかを確認しますtown-*.swfが、他のものを見つけるためにも必要なので、city-*.swf次のものが必要です。

if [ -f town-*.swf, city-*.swf ]
then
mkdir towns
fi

答え1

POSIXly、あなたは利用可能ですls

if ls town-*.swf >/dev/null 2>&1 &&
   ls city-*.swf >/dev/null 2>&1 
then
  mkdir towns
fi

条件が次の場合は短くなります。

if ls town-*.swf city-*.swf >/dev/null 2>&1

シェルがサポートしていても支柱の拡張:

if ls {town,city}-*.swf >/dev/null 2>&1

答え2

if stat -t city-*.swf >/dev/null 2>&1
then
    if stat -t town-*.swf >/dev/null 2>&1
    then
       mkdir towns
    fi
fi

ユーザーuweがコメントで指摘したように、前のコマンドはワイルドカード拡張を防ぎます。しかし、この新しいバージョンは機能します。

ループが必要な場合は、ifスクリプトを次のように変更できます。

if stat -t city-*.swf >/dev/null 2>&1 && stat -t town-*.swf >/dev/null 2>&1
then
     mkdir towns
fi

and条件の代わりにor条件を指定する必要がある場合は、に置き換える&&ことができます||

テスト

ls
city-1.swf  city-2.swf  city-3.swf  city-4.swf  city-5.swf  sc.sh  
town-1.swf  town-2.swf  town-3.swf  town-4.swf  town-5.swf

これで、名前付きスクリプトを実行するsc.shと表示できます。都市ディレクトリが正常に作成されました。

引用する

https://stackoverflow.com/questions/2937407/test-whether-a-glob-has-any-matches-in-bash

答え3

ほとんどの場合、コマンドはtest ( [ )演算子-aです。-o

EXPR1 -a EXPR2どちらも本当なら式1そして式2それは真実だ。
EXPR1 -o EXPR2もしそうなら式1または式2それは真実だ。

ただし、可能な複数行の場合は、条件付きで実行できるコマンドを使用する必要があります(例ls:)

ls {town,city}-*.swf &>/dev/null && mkdir town

事実を活用できます。ワイルドカード代替項目が見つからない場合、文字列はそのまま残ります(withの場合*)。したがって、その行にあることを確認してください。

set -- {city,town}-*.swf 
[[ ! "$*" =~ \* ]] && mkdir town

またはcase(上記の説明に記載されているように)

case $(ls) in
  *city-*.swf*town-*.swf*) mkdir town ;;
esac

答え4

lsこれは、外部コマンドを実行するよりも影響が少なく、statOSベースのソリューションよりも移植性に優れたソリューションです。

#!/bin/bash

found=false
for _ in town-*.swf, city-*.swf do
  found=true; break
done

if $found; then
  echo "Yup!"
fi

下線はワンタイム変数です。ループは、forファイルリストを拡張し、break長いファイルリストを繰り返すサイクルを無駄にしないようにする簡単な方法です。実行可能ファイルであるか、またはで見つけることができ、true次に置き換えることができます。false/bin//usr/bin/bash 組み込み関数または関数この最適化を好む場合。

これは.NETでも機能します/bin/sh。 (少なくとも他のオペレーティングシステムでは動作します。)

関連情報