たとえば、深さ1のパターンに一致するファイル数を数え、数字と比較して3つ以上のファイルがあるかどうかを確認したいと思います。しかし、if / then構文を使用せずにこれを実行したいと思います。
それは次のとおりです。
ls -1q -d *patternX* | wc -l | [ -ge 3]
if/then構文を使用してエスケープする方法があるかどうかを教えてください。ありがとうございます!
ベストアンサー1
一致する名前の数を数え、*patternX*
3以上であるかどうかをテストしたいようです。
これを行う方が良いです。
shopt -s nullglob
set -- *patternX*
if [ "$#" -ge 3 ]; then
echo 'More than 2 names match the pattern'
fi
これにより、位置パラメータがパターンと一致する名前に設定されます。一致する名前の数がに保存されます$#
。このnullglob
オプションは、名前が一致しない場合、パターンが拡張されていないまま残り、完全に削除されるように設定されます。
名前付き配列を使用して一致する名前を保存することもできます。
shopt -s nullglob
names=(*patternX*)
if [ "${#names[@]}" -ge 3 ]; then
echo 'More than 2 names match the pattern'
fi
また、見ることができますなぜ`ls`を解析しないのですか*(そしてどうすればいいですか?)
言葉なしif
とthen
:
shopt -s nullglob
set -- *patternX*
[ "$#" -ge 3 ] && echo 'More than 2 names match the pattern'
同様のアプローチが使用されますawk
。
shopt -s nullglob
awk 'BEGIN { if (ARGC > 3) print "more than 2" }' *patternX*
ARGC
inはawk
コマンド名($0
シェルの名前)を意味します。