たとえば、深さ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
シェルの名前)を意味します。
答え2
の場合、zsh
通常は次の匿名関数を使用します。
()(( $# >= 3 )) *patternX*(N)
本体が(( $# >= 3 ))
(返される)匿名関数を呼び出します。本物引数の数が3つ以上の場合)*patternX*(N)
globの拡張が引数として使用されます。
(N)
nullglob
一致するファイルがない場合は、エラーを報告するのではなく、globが空になるようにこのglobを有効にするオプションです。
あなたが要求した質問に対するより直接的な答えは次のとおりです。
ls -1q -d -- *patternX* | wc -l | xargs -IN test N -ge 3
(すべてのシェルでは、パターンがどのファイルとも一致しない場合、他のシェルは動作が異なります。)
または:
[ "$(( $(ls -1q -d -- *patternX* | wc -l) ))" -ge 3 ]
(POSIXまたはKornに似たシェルで)
答え3
これが実際の問題だと信じるのは難しいですが、解決策は次のとおりです。
ls -1q -d *patternX* | wc -l | egrep '^[3-9][0-9]*|[0-9][0-9]+' && echo JA