どうすればいいですか?
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
これは、外部コマンドを実行するよりも影響が少なく、stat
OSベースのソリューションよりも移植性に優れたソリューションです。
#!/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
。 (少なくとも他のオペレーティングシステムでは動作します。)